static void rmdir_p(struct pkgdb *db, struct pkg *pkg, char *dir, const char *prefix_r) { char *tmp; int64_t cnt; char fullpath[MAXPATHLEN]; if (unlinkat(pkg->rootfd, dir, AT_REMOVEDIR) == -1 && errno != ENOTEMPTY && errno != EBUSY) { pkg_emit_errno("unlinkat", dir); } tmp = strrchr(dir, '/'); if (tmp == dir) return; tmp[0] = '\0'; tmp = strrchr(dir, '/'); tmp[1] = '\0'; snprintf(fullpath, sizeof(fullpath), "/%s", dir); if (pkgdb_is_dir_used(db, dir, &cnt) != EPKG_OK) return; if (cnt > 1) return; if (strcmp(prefix_r, dir) == 0) return; rmdir_p(db, pkg, dir, prefix_r); }
static void pkg_effective_rmdir(struct pkgdb *db, struct pkg *pkg) { char prefix_r[MAXPATHLEN]; const char *prefix; size_t i; pkg_get(pkg, PKG_PREFIX, &prefix); snprintf(prefix_r, sizeof(prefix_r), "%s/", prefix + 1); for (i = 0; i < pkg->dir_to_del_len; i++) rmdir_p(db, pkg, pkg->dir_to_del[i], prefix_r); }
/** * Executes a rule. Contains evaluation of all conditions prior * to execution. * * @1 Hotplug event structure * @2 The rule to be executed * * Returns: 0 if success, -1 if the whole event is to be * discared, 1 if bail out of this particular rule was required */ int rule_execute(struct hotplug2_event_t *event, struct rule_t *rule) { int i, last_rv, res; char **env; for (i = 0; i < rule->conditions_c; i++) { if (rule_condition_eval(event, &(rule->conditions[i])) != EVAL_MATCH) return 0; } res = 0; last_rv = 0; env = xmalloc(sizeof(char *) * event->env_vars_c); for (i = 0; i < event->env_vars_c; i++) { env[i] = alloc_env(event->env_vars[i].key, event->env_vars[i].value); putenv(env[i]); } for (i = 0; i < rule->actions_c; i++) { switch (rule->actions[i].type) { case ACT_STOP_PROCESSING: res = 1; break; case ACT_STOP_IF_FAILED: if (last_rv != 0) res = 1; break; case ACT_NEXT_EVENT: res = -1; break; case ACT_NEXT_IF_FAILED: if (last_rv != 0) res = -1; break; case ACT_MAKE_DEVICE: last_rv = make_dev_from_event(event, rule->actions[i].parameter[0], strtoul(rule->actions[i].parameter[1], NULL, 0)); break; case ACT_CHMOD: last_rv = chmod_file(event, rule->actions[i].parameter[0], rule->actions[i].parameter[1]); break; case ACT_CHOWN: case ACT_CHGRP: last_rv = chown_chgrp(event, rule->actions[i].type, rule->actions[i].parameter[0], rule->actions[i].parameter[1]); break; case ACT_SYMLINK: last_rv = make_symlink(event, rule->actions[i].parameter[0], rule->actions[i].parameter[1]); break; case ACT_RUN_SHELL: last_rv = exec_shell(event, rule->actions[i].parameter[0]); break; case ACT_RUN_NOSHELL: last_rv = exec_noshell(event, rule->actions[i].parameter[0], rule->actions[i].parameter); break; case ACT_SETENV: last_rv = setenv(rule->actions[i].parameter[0], rule->actions[i].parameter[1], 1); break; case ACT_REMOVE: last_rv = unlink(rule->actions[i].parameter[0]); rmdir_p(rule->actions[i].parameter[0]); break; case ACT_DEBUG: print_debug(event); last_rv = 0; break; } if (res != 0) break; } for (i = 0; i < event->env_vars_c; i++) { unsetenv(event->env_vars[i].key); free(env[i]); } free(env); return res; }