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; }
const char * ni_config_backupdir(void) { ni_config_fslocation_t *fsloc = &ni_global.config->backupdir; static ni_bool_t firsttime = TRUE; if (firsttime) { if (ni_mkdir_maybe(fsloc->path, fsloc->mode) < 0) ni_fatal("Cannot create backup directory \"%s\": %m", fsloc->path); firsttime = FALSE; } return fsloc->path; }
/* * Copy file for backup */ int ni_backup_file_to(const char *srcpath, const char *backupdir) { const char *dstpath; if (!(dstpath = __ni_build_backup_path(srcpath, backupdir))) return -1; if (ni_mkdir_maybe(backupdir, 0700) < 0) return -1; if (access(dstpath, F_OK) == 0) { ni_debug_readwrite("%s(%s, %s): backup copy already exists", __FUNCTION__, srcpath, backupdir); return 0; } ni_debug_readwrite("%s(%s, %s)", __FUNCTION__, srcpath, backupdir); return ni_copy_file_path(srcpath, dstpath); }
static ni_bool_t ni_config_extension_statedir(const char *extension_dirname, const int mode) { static ni_bool_t res = FALSE; char pathname[PATH_MAX]; if (!res) { snprintf(pathname, sizeof(pathname), "%s/%s", ni_config_statedir(), extension_dirname); if (ni_mkdir_maybe(pathname, mode) < 0) { ni_error("Cannot create extension state directory \"%s\": %m", pathname); res = FALSE; } else { res = TRUE; } } return res; }