IGNORE_PATH = 'x',
REMOVE_PATH = 'r',
RECURSIVE_REMOVE_PATH = 'R',
+ RELABEL_PATH = 'z',
RECURSIVE_RELABEL_PATH = 'Z'
} ItemType;
#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) {
return r;
}
-static int recursive_relabel_children(const char *path) {
+static int item_set_perms(Item *i, const char *path) {
+ /* not using i->path directly because it may be a glob */
+ if (i->mode_set)
+ if (chmod(path, i->mode) < 0) {
+ log_error("chmod(%s) failed: %m", path);
+ return -errno;
+ }
+
+ if (i->uid_set || i->gid_set)
+ if (chown(path,
+ i->uid_set ? i->uid : (uid_t) -1,
+ i->gid_set ? i->gid : (gid_t) -1) < 0) {
+
+ log_error("chown(%s) failed: %m", path);
+ return -errno;
+ }
+
+ return label_fix(path, false);
+}
+
+static int recursive_relabel_children(Item *i, const char *path) {
DIR *d;
int ret = 0;
} else
is_dir = de->d_type == DT_DIR;
- r = label_fix(entry_path, false);
+ r = item_set_perms(i, entry_path);
if (r < 0) {
if (ret == 0 && r != -ENOENT)
ret = r;
}
if (is_dir) {
- r = recursive_relabel_children(entry_path);
+ r = recursive_relabel_children(i, entry_path);
if (r < 0 && ret == 0)
ret = r;
}
int r;
struct stat st;
- r = label_fix(path, false);
+ r = item_set_perms(i, path);
if (r < 0)
return r;
return -errno;
if (S_ISDIR(st.st_mode))
- r = recursive_relabel_children(path);
+ r = recursive_relabel_children(i, path);
return r;
}
return r;
}
-static int item_set_perms(Item *i) {
- if (i->mode_set)
- if (chmod(i->path, i->mode) < 0) {
- log_error("chmod(%s) failed: %m", i->path);
- return -errno;
- }
-
- if (i->uid_set || i->gid_set)
- if (chown(i->path,
- i->uid_set ? i->uid : (uid_t) -1,
- i->gid_set ? i->gid : (gid_t) -1) < 0) {
-
- log_error("chown(%s) failed: %m", i->path);
- return -errno;
- }
-
- return label_fix(i->path, false);
-}
-
static int create_item(Item *i) {
int r;
mode_t u;
return -EEXIST;
}
- r = item_set_perms(i);
+ r = item_set_perms(i, i->path);
if (r < 0)
return r;
return -EEXIST;
}
- r = item_set_perms(i);
+ r = item_set_perms(i, i->path);
if (r < 0)
return r;
return -EEXIST;
}
- r = item_set_perms(i);
+ r = item_set_perms(i, i->path);
if (r < 0)
return r;
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);
case CREATE_DIRECTORY:
case CREATE_FIFO:
case IGNORE_PATH:
+ case RELABEL_PATH:
case RECURSIVE_RELABEL_PATH:
break;
case CREATE_DIRECTORY:
case CREATE_FIFO:
case IGNORE_PATH:
+ case RELABEL_PATH:
case RECURSIVE_RELABEL_PATH:
break;
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;