X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fshared%2Futil.c;h=e1a11684565f4bc8780422af492238271a988fa1;hp=cffa1abb3061c507e2c239626f238379bd4e4160;hb=e0333c7314e89c0bc268bd20c5e247a7c907ab34;hpb=059cb3858acd038ff2cef10a3a99119bf71a8fc6 diff --git a/src/shared/util.c b/src/shared/util.c index cffa1abb3..e1a116845 100644 --- a/src/shared/util.c +++ b/src/shared/util.c @@ -921,16 +921,9 @@ char *delete_chars(char *s, const char *bad) { } 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; + return s[strspn(s, charset)] == '\0'; } char *file_in_same_dir(const char *path, const char *filename) { @@ -3198,19 +3191,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) { @@ -3519,25 +3520,21 @@ int signal_from_string_try_harder(const char *s) { static char *tag_to_udev_node(const char *tagvalue, const char *by) { _cleanup_free_ char *t = NULL, *u = NULL; - char *dn; size_t enc_len; u = unquote(tagvalue, "\"\'"); - if (u == NULL) + if (!u) return NULL; enc_len = strlen(u) * 4 + 1; t = new(char, enc_len); - if (t == NULL) + if (!t) return NULL; if (encode_devnode_name(u, t, enc_len) < 0) return NULL; - if (asprintf(&dn, "/dev/disk/by-%s/%s", by, t) < 0) - return NULL; - - return dn; + return strjoin("/dev/disk/by-", by, "/", t, NULL); } char *fstab_node_to_udev_node(const char *p) { @@ -6339,3 +6336,20 @@ uint64_t physical_memory(void) { return (uint64_t) mem * (uint64_t) page_size(); } + +char* mount_test_option(const char *haystack, const char *needle) { + + struct mntent me = { + .mnt_opts = (char*) haystack + }; + + assert(needle); + + /* Like glibc's hasmntopt(), but works on a string, not a + * struct mntent */ + + if (!haystack) + return NULL; + + return hasmntopt(&me, needle); +}