return s;
}
-bool in_charset(const char *s, const char* charset) {
- const char *i;
-
- assert(s);
- assert(charset);
-
- for (i = s; *i; i++)
- if (!strchr(charset, *i))
- return false;
-
- return true;
-}
-
char *file_in_same_dir(const char *path, const char *filename) {
char *e, *r;
size_t k;
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) {
return found_online || !found_offline;
}
-static int search_and_fopen_internal(const char *path, const char *mode, char **search, FILE **_f) {
+static int search_and_fopen_internal(const char *path, const char *mode, const char *root, char **search, FILE **_f) {
char **i;
assert(path);
assert(mode);
assert(_f);
- if (!path_strv_canonicalize_absolute_uniq(search, NULL))
+ if (!path_strv_canonicalize_absolute_uniq(search, root))
return -ENOMEM;
STRV_FOREACH(i, search) {
return -ENOENT;
}
-int search_and_fopen(const char *path, const char *mode, const char **search, FILE **_f) {
+int search_and_fopen(const char *path, const char *mode, const char *root, const char **search, FILE **_f) {
_cleanup_strv_free_ char **copy = NULL;
assert(path);
if (!copy)
return -ENOMEM;
- return search_and_fopen_internal(path, mode, copy, _f);
+ return search_and_fopen_internal(path, mode, root, copy, _f);
}
-int search_and_fopen_nulstr(const char *path, const char *mode, const char *search, FILE **_f) {
+int search_and_fopen_nulstr(const char *path, const char *mode, const char *root, const char *search, FILE **_f) {
_cleanup_strv_free_ char **s = NULL;
if (path_is_absolute(path)) {
if (!s)
return -ENOMEM;
- return search_and_fopen_internal(path, mode, s, _f);
+ return search_and_fopen_internal(path, mode, root, s, _f);
}
char *strextend(char **x, ...) {