chiark / gitweb /
sd-login: teach sd_pid_get_unit() proper handling of instantiated services
[elogind.git] / src / tmpfiles.c
index 13950824e087116e0fff8a3b373e3ebbfbdc0a8c..44e5c9d28d01788fcb738cc4ac7b07bc92f5e3ad 100644 (file)
@@ -62,6 +62,7 @@ typedef enum ItemType {
         IGNORE_PATH = 'x',
         REMOVE_PATH = 'r',
         RECURSIVE_REMOVE_PATH = 'R',
+        RELABEL_PATH = 'z',
         RECURSIVE_RELABEL_PATH = 'Z'
 } ItemType;
 
@@ -92,7 +93,7 @@ static const char *arg_prefix = NULL;
 #define MAX_DEPTH 256
 
 static bool needs_glob(ItemType t) {
-        return t == IGNORE_PATH || t == REMOVE_PATH || t == RECURSIVE_REMOVE_PATH || t == RECURSIVE_RELABEL_PATH;
+        return t == IGNORE_PATH || t == REMOVE_PATH || t == RECURSIVE_REMOVE_PATH || t == RELABEL_PATH || t == RECURSIVE_RELABEL_PATH;
 }
 
 static struct Item* find_glob(Hashmap *h, const char *match) {
@@ -116,41 +117,50 @@ static void load_unix_sockets(void) {
         /* We maintain a cache of the sockets we found in
          * /proc/net/unix to speed things up a little. */
 
-        if (!(unix_sockets = set_new(string_hash_func, string_compare_func)))
+        unix_sockets = set_new(string_hash_func, string_compare_func);
+        if (!unix_sockets)
                 return;
 
-        if (!(f = fopen("/proc/net/unix", "re")))
+        f = fopen("/proc/net/unix", "re");
+        if (!f)
                 return;
 
-        if (!(fgets(line, sizeof(line), f)))
+        /* Skip header */
+        if (!fgets(line, sizeof(line), f))
                 goto fail;
 
         for (;;) {
                 char *p, *s;
                 int k;
 
-                if (!(fgets(line, sizeof(line), f)))
+                if (!fgets(line, sizeof(line), f))
                         break;
 
                 truncate_nl(line);
 
-                if (strlen(line) < 53)
+                p = strchr(line, ':');
+                if (!p)
+                        continue;
+
+                if (strlen(p) < 37)
                         continue;
 
-                p = line + 53;
+                p += 37;
                 p += strspn(p, WHITESPACE);
-                p += strcspn(p, WHITESPACE);
+                p += strcspn(p, WHITESPACE); /* skip one more word */
                 p += strspn(p, WHITESPACE);
 
                 if (*p != '/')
                         continue;
 
-                if (!(s = strdup(p)))
+                s = strdup(p);
+                if (!s)
                         goto fail;
 
                 path_kill_slashes(s);
 
-                if ((k = set_put(unix_sockets, s)) < 0) {
+                k = set_put(unix_sockets, s);
+                if (k < 0) {
                         free(s);
 
                         if (k != -EEXIST)
@@ -646,6 +656,13 @@ static int create_item(Item *i) {
 
                 break;
 
+        case RELABEL_PATH:
+
+                r = glob_item(i, item_set_perms);
+                if (r < 0)
+                        return 0;
+                break;
+
         case RECURSIVE_RELABEL_PATH:
 
                 r = glob_item(i, recursive_relabel);
@@ -670,6 +687,7 @@ static int remove_item_instance(Item *i, const char *instance) {
         case CREATE_DIRECTORY:
         case CREATE_FIFO:
         case IGNORE_PATH:
+        case RELABEL_PATH:
         case RECURSIVE_RELABEL_PATH:
                 break;
 
@@ -707,6 +725,7 @@ static int remove_item(Item *i) {
         case CREATE_DIRECTORY:
         case CREATE_FIFO:
         case IGNORE_PATH:
+        case RELABEL_PATH:
         case RECURSIVE_RELABEL_PATH:
                 break;
 
@@ -808,15 +827,19 @@ static int parse_line(const char *fname, unsigned line, const char *buffer) {
                 goto finish;
         }
 
-        if (type != CREATE_FILE &&
-            type != TRUNCATE_FILE &&
-            type != CREATE_DIRECTORY &&
-            type != TRUNCATE_DIRECTORY &&
-            type != CREATE_FIFO &&
-            type != IGNORE_PATH &&
-            type != REMOVE_PATH &&
-            type != RECURSIVE_REMOVE_PATH &&
-            type != RECURSIVE_RELABEL_PATH) {
+        switch(type) {
+        case CREATE_FILE:
+        case TRUNCATE_FILE:
+        case CREATE_DIRECTORY:
+        case TRUNCATE_DIRECTORY:
+        case CREATE_FIFO:
+        case IGNORE_PATH:
+        case REMOVE_PATH:
+        case RECURSIVE_REMOVE_PATH:
+        case RELABEL_PATH:
+        case RECURSIVE_RELABEL_PATH:
+                break;
+        default:
                 log_error("[%s:%u] Unknown file type '%c'.", fname, line, type);
                 r = -EBADMSG;
                 goto finish;
@@ -1045,7 +1068,8 @@ int main(int argc, char *argv[]) {
         Item *i;
         Iterator iterator;
 
-        if ((r = parse_argv(argc, argv)) <= 0)
+        r = parse_argv(argc, argv);
+        if (r <= 0)
                 return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
 
         log_set_target(LOG_TARGET_AUTO);