aboutsummaryrefslogtreecommitdiff
path: root/src/config_global.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/config_global.c')
-rw-r--r--src/config_global.c375
1 files changed, 0 insertions, 375 deletions
diff --git a/src/config_global.c b/src/config_global.c
deleted file mode 100644
index 16d97cf..0000000
--- a/src/config_global.c
+++ /dev/null
@@ -1,375 +0,0 @@
-/**
- * @file config_global.c
- */
-#include "spm.h"
-
-/**
- * Get path to user's local configuration directory
- * (The path will be created if it doesn't exist)
- * @return
- */
-char *get_user_conf_dir(void) {
- char *result = NULL;
- wordexp_t wexp;
- wordexp("~/.spm", &wexp, 0);
- if (wexp.we_wordc != 0) {
- result = (char *)calloc(strlen(wexp.we_wordv[0]) + 1, sizeof(char));
- if (!result) {
- wordfree(&wexp);
- return NULL;
- }
- strncpy(result, wexp.we_wordv[0], strlen(wexp.we_wordv[0]));
- if (access(result, F_OK) != 0) {
- mkdirs(result, 0755);
- }
- }
- wordfree(&wexp);
- return result;
-}
-
-/**
- * Get path to user's local configuration file
- * @return
- */
-char *get_user_config_file(void) {
- const char *filename = "spm.conf";
- char template[PATH_MAX];
- char *ucd = get_user_conf_dir();
- if (!ucd) {
- return NULL;
- }
- // Initialize temporary path
- template[0] = '\0';
-
- sprintf(template, "%s%c%s", ucd, DIRSEP, filename);
- if (access(template, F_OK) != 0) {
- // No configuration exists, so fail
- return NULL;
- }
- free(ucd);
- // Allocate and return path to configuration file
- return strdup(template);
-}
-
-/**
- * Determine location of temporary storage location
- * @return
- */
-char *get_user_tmp_dir(void) {
- char *template = NULL;
- char *ucd = get_user_conf_dir();
- template = join_ex(DIRSEPS, ucd, "tmp", NULL);
-
- if (access(template, F_OK) != 0) {
- if (mkdirs(template, 0755) != 0) {
- return NULL;
- }
- }
-
- free(ucd);
- return template;
-}
-
-/**
- * Determine location of package directory
- * @return
- */
-char *get_user_package_dir(void) {
- char *template = NULL;
- char *ucd = get_user_conf_dir();
-
- template = join_ex(DIRSEPS, ucd, "pkgs", SPM_GLOBAL.repo_target, NULL);
-
- if (access(template, F_OK) != 0) {
- if (mkdirs(template, 0755) != 0) {
- return NULL;
- }
- }
-
- free(ucd);
- return template;
-}
-
-/**
- * Determine location of the package manifest
- * @return
- */
-char *get_package_manifest(void) {
- Manifest *manifest = NULL;
- char *template = NULL;
- char *ucd = get_user_conf_dir();
-
- //free(ucd);
- //return strdup(template);
-
- template = join_ex(DIRSEPS, SPM_GLOBAL.package_dir, SPM_MANIFEST_FILENAME, NULL);
- if (access(template, F_OK) != 0) {
- fprintf(stderr, "Package manifest not found: %s\n", template);
- manifest = manifest_from(PKG_DIR);
- if (manifest == NULL) {
- perror("manifest generator");
- fprintf(SYSERROR);
- return NULL;
- }
- manifest_write(manifest, PKG_DIR);
- manifest_free(manifest);
- }
-
- free(ucd);
- return template;
-}
-
-
-/**
- * Check whether SPM has access to external programs it needs
- */
-void check_runtime_environment(void) {
- int bad_rt = 0;
- char *required[] = {
- "file",
- "patchelf",
- "objdump",
- "rsync",
- "tar",
- "bash",
- "reloc",
- NULL,
- };
-
- if (getenv("SHELL") == NULL) {
- fprintf(stderr, "Required environment variable 'SHELL' is not defined\n");
- bad_rt = 1;
- }
-
- for (int i = 0; required[i] != NULL; i++) {
- char *result = find_executable(required[i]);
- if (!result) {
- fprintf(stderr, "Required program '%s' is not installed\n", required[i]);
- bad_rt = 1;
- }
- free(result);
- }
- if (bad_rt) {
- exit(1);
- }
-}
-
-/**
- *
- * @param basepath
- * @return
- */
-SPM_Hierarchy *spm_hierarchy_init(char *basepath) {
- SPM_Hierarchy *fs = calloc(1, sizeof(SPM_Hierarchy));
- fs->rootdir = strdup(basepath);
- fs->bindir = join((char *[]) {fs->rootdir, "bin", NULL}, DIRSEPS);
- fs->includedir = join((char *[]) {fs->rootdir, "include", NULL}, DIRSEPS);
- fs->libdir = join((char *[]) {fs->rootdir, "lib", NULL}, DIRSEPS);
- fs->datadir = join((char *[]) {fs->rootdir, "share", NULL}, DIRSEPS);
- fs->localstatedir = join((char *[]) {fs->rootdir, "var", NULL}, DIRSEPS);
- fs->sysconfdir = join((char *[]) {fs->rootdir, "etc", NULL}, DIRSEPS);
- fs->mandir = join((char *[]) {fs->datadir, "man", NULL}, DIRSEPS);
- fs->tmpdir = join((char *[]) {fs->rootdir, "tmp", NULL}, DIRSEPS);
- fs->dbdir = join((char *[]) {fs->localstatedir, "db", NULL}, DIRSEPS);
- fs->dbrecdir = join((char *[]) {fs->dbdir, "records", NULL}, DIRSEPS);
-
- return fs;
-}
-
-/**
- *
- * @param fs
- */
-void spm_hierarchy_free(SPM_Hierarchy *fs) {
- free(fs->rootdir);
- free(fs->bindir);
- free(fs->includedir);
- free(fs->libdir);
- free(fs->datadir);
- free(fs->localstatedir);
- free(fs->sysconfdir);
- free(fs->mandir);
- free(fs->tmpdir);
- free(fs->dbdir);
- free(fs->dbrecdir);
- free(fs);
-}
-
-/**
- * Populate global configuration structure
- */
-void init_config_global(void) {
- SPM_GLOBAL.user_config_basedir = NULL;
- SPM_GLOBAL.user_config_file = NULL;
- SPM_GLOBAL.package_dir = NULL;
- SPM_GLOBAL.tmp_dir = NULL;
- SPM_GLOBAL.package_manifest = NULL;
- SPM_GLOBAL.config = NULL;
- SPM_GLOBAL.verbose = 0;
- SPM_GLOBAL.repo_target = NULL;
- SPM_GLOBAL.mirror_list = NULL;
- SPM_GLOBAL.prompt_user = 1;
-
- if (uname(&SPM_GLOBAL.sysinfo) != 0) {
- fprintf(SYSERROR);
- exit(errno);
- }
-
- // Initialize filesystem paths structure
- SPM_GLOBAL.fs.bindir = calloc(strlen(SPM_PROGRAM_BIN) + 1, sizeof(char));
- SPM_GLOBAL.fs.includedir = calloc(strlen(SPM_PROGRAM_INCLUDE) + 1, sizeof(char));
- SPM_GLOBAL.fs.libdir = calloc(strlen(SPM_PROGRAM_LIB) + 1, sizeof(char));
- SPM_GLOBAL.fs.datadir = calloc(strlen(SPM_PROGRAM_DATA) + 1, sizeof(char));
-
- if (!SPM_GLOBAL.fs.bindir || !SPM_GLOBAL.fs.includedir
- || !SPM_GLOBAL.fs.libdir) {
- perror("Unable to allocate memory for global filesystem paths");
- fprintf(SYSERROR);
- exit(errno);
- }
-
- strcpy(SPM_GLOBAL.fs.bindir, SPM_PROGRAM_BIN);
- strcpy(SPM_GLOBAL.fs.includedir, SPM_PROGRAM_INCLUDE);
- strcpy(SPM_GLOBAL.fs.libdir, SPM_PROGRAM_LIB);
- strcpy(SPM_GLOBAL.fs.datadir, SPM_PROGRAM_DATA);
- SPM_GLOBAL.fs.mandir = join((char *[]) {SPM_PROGRAM_DATA, "man", NULL}, DIRSEPS);
-
- SPM_GLOBAL.user_config_basedir = get_user_conf_dir();
- SPM_GLOBAL.user_config_file = get_user_config_file();
- if (SPM_GLOBAL.user_config_file) {
- SPM_GLOBAL.config = config_read(SPM_GLOBAL.user_config_file);
- }
-
- ConfigItem *item = NULL;
-
- // Initialize repository target (i.e. repository path suffix)
- SPM_GLOBAL.repo_target = join((char *[]) {SPM_GLOBAL.sysinfo.sysname, SPM_GLOBAL.sysinfo.machine, NULL}, DIRSEPS);
- item = config_get(SPM_GLOBAL.config, "repo_target");
- if (item) {
- free(SPM_GLOBAL.repo_target);
- SPM_GLOBAL.repo_target = normpath(item->value);
- }
-
- // Initialize mirror list filename
- SPM_GLOBAL.mirror_config = join((char *[]) {SPM_GLOBAL.user_config_basedir, SPM_MIRROR_FILENAME, NULL}, DIRSEPS);
- item = config_get(SPM_GLOBAL.config, "mirror_config");
- if (item) {
- free(SPM_GLOBAL.mirror_config);
- SPM_GLOBAL.mirror_config = normpath(item->value);
- }
-
- if (SPM_GLOBAL.mirror_config != NULL) {
- SPM_GLOBAL.mirror_list = mirror_list(SPM_GLOBAL.mirror_config);
- }
-
- // Initialize temp directory
- item = config_get(SPM_GLOBAL.config, "tmp_dir");
- if (item) {
- SPM_GLOBAL.tmp_dir = strdup(item->value);
- if (access(SPM_GLOBAL.tmp_dir, F_OK) != 0) {
- if (mkdirs(SPM_GLOBAL.tmp_dir, 0755) != 0) {
- fprintf(stderr, "Unable to create global temporary directory: %s\n", SPM_GLOBAL.tmp_dir);
- fprintf(SYSERROR);
- exit(1);
- }
- }
- }
- else {
- SPM_GLOBAL.tmp_dir = get_user_tmp_dir();
- }
-
- // Initialize package directory
- item = config_get(SPM_GLOBAL.config, "package_dir");
- if (item) {
- SPM_GLOBAL.package_dir = calloc(PATH_MAX, sizeof(char)); //strdup(item->value);
- strncpy(SPM_GLOBAL.package_dir, item->value, PATH_MAX - 1);
- strcat(SPM_GLOBAL.package_dir, DIRSEPS);
- strcat(SPM_GLOBAL.package_dir, SPM_GLOBAL.repo_target);
-
- if (access(SPM_GLOBAL.package_dir, F_OK) != 0) {
- if (mkdirs(SPM_GLOBAL.package_dir, 0755) != 0) {
- fprintf(stderr, "Unable to create global package directory: %s\n", SPM_GLOBAL.package_dir);
- fprintf(SYSERROR);
- exit(1);
- }
- }
- }
- else {
- SPM_GLOBAL.package_dir = get_user_package_dir();
- }
-
- // Initialize package manifest
- item = config_get(SPM_GLOBAL.config, "package_manifest");
- if (item) {
- SPM_GLOBAL.package_manifest = strdup(item->value);
- if (access(SPM_GLOBAL.package_manifest, F_OK) != 0) {
- fprintf(stderr, "Package manifest not found: %s\n", SPM_GLOBAL.package_manifest);
- Manifest *manifest = manifest_from(PKG_DIR);
- manifest_write(manifest, SPM_GLOBAL.package_manifest);
- manifest_free(manifest);
- }
- }
- else {
- SPM_GLOBAL.package_manifest = get_package_manifest();
- }
-}
-
-/**
- * Free memory allocated for global configuration
- */
-void free_global_config(void) {
- if (SPM_GLOBAL.package_dir) {
- free(SPM_GLOBAL.package_dir);
- }
- if (SPM_GLOBAL.tmp_dir) {
- free(SPM_GLOBAL.tmp_dir);
- }
- if (SPM_GLOBAL.package_manifest) {
- free(SPM_GLOBAL.package_manifest);
- }
- if (SPM_GLOBAL.user_config_basedir) {
- free(SPM_GLOBAL.user_config_basedir);
- }
- if (SPM_GLOBAL.user_config_file) {
- free(SPM_GLOBAL.user_config_file);
- }
- if (SPM_GLOBAL.repo_target) {
- free(SPM_GLOBAL.repo_target);
- }
- if (SPM_GLOBAL.mirror_config) {
- free(SPM_GLOBAL.mirror_config);
- }
- if (SPM_GLOBAL.mirror_list) {
- mirror_list_free(SPM_GLOBAL.mirror_list);
- }
-
- free(SPM_GLOBAL.fs.bindir);
- free(SPM_GLOBAL.fs.includedir);
- free(SPM_GLOBAL.fs.libdir);
- free(SPM_GLOBAL.fs.datadir);
- free(SPM_GLOBAL.fs.mandir);
- if (SPM_GLOBAL.config) {
- config_free(SPM_GLOBAL.config);
- }
-}
-
-/**
- * Display global configuration data
- */
-void show_global_config(void) {
- printf("#---------------------------\n");
- printf("#---- SPM CONFIGURATION ----\n");
- printf("#---------------------------\n");
- printf("# base dir: %s\n", SPM_GLOBAL.user_config_basedir ? SPM_GLOBAL.user_config_basedir : "none (check write permission on home directory)");
- printf("# config file: %s\n", SPM_GLOBAL.user_config_file ? SPM_GLOBAL.user_config_file : "none");
- if (SPM_GLOBAL.user_config_file) {
- printf("# config file contents:\n");
- for (int i = 0; SPM_GLOBAL.config[i] != NULL; i++) {
- printf("# -> %s: %s\n", SPM_GLOBAL.config[i]->key, SPM_GLOBAL.config[i]->value);
- }
- }
- printf("# package storage: %s\n", SPM_GLOBAL.package_dir);
- printf("# temp storage: %s\n", SPM_GLOBAL.tmp_dir);
- printf("# package manifest: %s\n", SPM_GLOBAL.package_manifest);
- printf("\n");
-}