summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorHarald Hoyer <harald@redhat.com>2014-03-06 09:12:57 +0100
committerLennart Poettering <lennart@poettering.net>2014-03-11 04:34:06 +0100
commit9d9951a460a90ef0e1e0384742cefdcf85193f8c (patch)
tree4f9287f3923fa0f0ddf02f0bf8a69bafb831ea13 /src
parent756461fd560b4603703661913cfde6685cc96c38 (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
Diffstat (limited to 'src')
-rw-r--r--src/shared/util.c24
-rw-r--r--src/shared/util.h2
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);