const char * ni_extension_statedir(const char *ex_name) { ni_extension_t *ex = NULL; ni_config_fslocation_t *fsloc = NULL; const char *extension_dirname = "extension"; const int mode = 0700; char pathname[PATH_MAX]; if (!(ni_config_extension_statedir(extension_dirname, mode))) return NULL; if (!(ex = ni_config_find_system_updater(ni_global.config, ex_name))) return NULL; fsloc = &ex->statedir; if (fsloc->path == NULL) { snprintf(pathname, sizeof(pathname), "%s/%s/%s", ni_config_statedir(), extension_dirname, ex->name); if (ni_mkdir_maybe(pathname, mode) < 0) { ni_error("Cannot create extension state directory \"%s\": %m", pathname); } else { ni_config_fslocation_init(fsloc, pathname, mode); } } return fsloc->path; }
/* * Initialize the system updaters based on the data found in the config * file. */ void ni_system_updaters_init(void) { static int initialized = 0; unsigned int kind; if (initialized) return; initialized = 1; for (kind = 0; kind < __NI_ADDRCONF_UPDATER_MAX; ++kind) { ni_updater_t *updater = &updaters[kind]; const char *name = ni_updater_name(kind); ni_extension_t *ex; updater->enabled = FALSE; updater->kind = kind; if (name == NULL) continue; if (!(ex = ni_config_find_system_updater(ni_global.config, name))) continue; updater->enabled = TRUE; updater->format = ni_updater_format_type(ex->format); updater->proc_backup = ni_extension_script_find(ex, "backup"); updater->proc_restore = ni_extension_script_find(ex, "restore"); updater->proc_install = ni_extension_script_find(ex, "install"); updater->proc_remove = ni_extension_script_find(ex, "remove"); /* Create runtime directories for resolver and hostname extensions. */ if (!(ni_extension_statedir(name))) { updater->enabled = 0; } else if (updater->proc_install == NULL) { ni_warn("system-updater %s configured, but no install script defined", name); updater->enabled = 0; } else if (updater->proc_backup == NULL || updater->proc_restore == NULL) { ni_warn("system-updater %s configured, but no backup/restore script defined", name); updater->proc_backup = updater->proc_restore = NULL; } else if (updater->proc_remove == NULL) { ni_warn("system-updater %s configured, but no remove script defined", name); updater->enabled = 0; } } }