diff options
author | Harald Hoyer <harald@redhat.com> | 2014-03-06 09:12:57 +0100 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2014-03-11 04:34:06 +0100 |
commit | 9d9951a460a90ef0e1e0384742cefdcf85193f8c (patch) | |
tree | 4f9287f3923fa0f0ddf02f0bf8a69bafb831ea13 | |
parent | 756461fd560b4603703661913cfde6685cc96c38 (diff) |
util: add files_same() helper function
files_same() returns
1, if the files are the same
0, if the files have different inode/dev numbers
errno, for any stat error
-rw-r--r-- | src/shared/util.c | 24 | ||||
-rw-r--r-- | src/shared/util.h | 2 |
2 files changed, 18 insertions, 8 deletions
diff --git a/src/shared/util.c b/src/shared/util.c index d28caae6c2..10f113bd24 100644 --- a/src/shared/util.c +++ b/src/shared/util.c @@ -3198,19 +3198,27 @@ bool on_tty(void) { return cached_on_tty; } -int running_in_chroot(void) { - struct stat a = {}, b = {}; +int files_same(const char *filea, const char *fileb) { + struct stat a, b; - /* Only works as root */ - if (stat("/proc/1/root", &a) < 0) + if (stat(filea, &a) < 0) return -errno; - if (stat("/", &b) < 0) + if (stat(fileb, &b) < 0) return -errno; - return - a.st_dev != b.st_dev || - a.st_ino != b.st_ino; + return a.st_dev == b.st_dev && + a.st_ino == b.st_ino; +} + +int running_in_chroot(void) { + int ret; + + ret = files_same("/proc/1/root", "/"); + if (ret < 0) + return ret; + + return ret == 0; } static char *ascii_ellipsize_mem(const char *s, size_t old_length, size_t new_length, unsigned percent) { diff --git a/src/shared/util.h b/src/shared/util.h index c2bc9771b9..11d28665b6 100644 --- a/src/shared/util.h +++ b/src/shared/util.h @@ -451,6 +451,8 @@ static inline const char *ansi_highlight_off(void) { return on_tty() ? ANSI_HIGHLIGHT_OFF : ""; } +int files_same(const char *filea, const char *fileb); + int running_in_chroot(void); char *ellipsize(const char *s, size_t length, unsigned percent); |