X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fshared%2Fpath-lookup.c;h=e0aaf4431fbd8f53789760085e5643c4f568d5db;hb=a1948c7bfeb87b54bc7715a44490c01593ee6e23;hp=6e5529e0c729861db3aa6974ba28a629e1062796;hpb=f274ece0f76b5709408821e317e87aef76123db6;p=elogind.git diff --git a/src/shared/path-lookup.c b/src/shared/path-lookup.c index 6e5529e0c..e0aaf4431 100644 --- a/src/shared/path-lookup.c +++ b/src/shared/path-lookup.c @@ -41,21 +41,26 @@ DEFINE_STRING_TABLE_LOOKUP(systemd_running_as, SystemdRunningAs); int user_config_home(char **config_home) { const char *e; + char *r; e = getenv("XDG_CONFIG_HOME"); if (e) { - if (asprintf(config_home, "%s/systemd/user", e) < 0) + r = strappend(e, "/systemd/user"); + if (!r) return -ENOMEM; + *config_home = r; return 1; } else { const char *home; home = getenv("HOME"); if (home) { - if (asprintf(config_home, "%s/.config/systemd/user", home) < 0) + r = strappend(home, "/.config/systemd/user"); + if (!r) return -ENOMEM; + *config_home = r; return 1; } } @@ -85,9 +90,9 @@ static char** user_dirs( }; const char *home, *e; - char *config_home = NULL, *data_home = NULL; - char **config_dirs = NULL, **data_dirs = NULL; - char **r = NULL, **t; + _cleanup_free_ char *config_home = NULL, *data_home = NULL; + _cleanup_strv_free_ char **config_dirs = NULL, **data_dirs = NULL; + char **r = NULL; /* Implement the mechanisms defined in * @@ -120,6 +125,8 @@ static char** user_dirs( goto fail; } else if (home) { + _cleanup_free_ char *data_home_parent = NULL; + if (asprintf(&data_home, "%s/.local/share/systemd/user", home) < 0) goto fail; @@ -130,8 +137,14 @@ static char** user_dirs( * then filter out this link, if it is actually is * one. */ - mkdir_parents_label(data_home, 0777); - (void) symlink("../../../.config/systemd/user", data_home); + if (path_get_parent(data_home, &data_home_parent) >= 0) { + _cleanup_free_ char *config_home_relative = NULL; + + if (path_make_relative(data_home_parent, config_home, &config_home_relative) >= 0) { + mkdir_parents_label(data_home, 0777); + (void) symlink(config_home_relative, data_home); + } + } } e = getenv("XDG_DATA_DIRS"); @@ -145,101 +158,60 @@ static char** user_dirs( goto fail; /* Now merge everything we found. */ - if (generator_early) { - t = strv_append(r, generator_early); - if (!t) + if (generator_early) + if (strv_extend(&r, generator_early) < 0) goto fail; - strv_free(r); - r = t; - } - if (config_home) { - t = strv_append(r, config_home); - if (!t) + if (config_home) + if (strv_extend(&r, config_home) < 0) goto fail; - strv_free(r); - r = t; - } - if (!strv_isempty(config_dirs)) { - t = strv_merge_concat(r, config_dirs, "/systemd/user"); - if (!t) - goto finish; - strv_free(r); - r = t; - } + if (!strv_isempty(config_dirs)) + if (strv_extend_strv_concat(&r, config_dirs, "/systemd/user") < 0) + goto fail; - t = strv_merge(r, (char**) config_unit_paths); - if (!t) + if (strv_extend_strv(&r, (char**) config_unit_paths) < 0) goto fail; - strv_free(r); - r = t; - if (generator) { - t = strv_append(r, generator); - if (!t) + if (generator) + if (strv_extend(&r, generator) < 0) goto fail; - strv_free(r); - r = t; - } - if (data_home) { - t = strv_append(r, data_home); - if (!t) + if (data_home) + if (strv_extend(&r, data_home) < 0) goto fail; - strv_free(r); - r = t; - } - if (!strv_isempty(data_dirs)) { - t = strv_merge_concat(r, data_dirs, "/systemd/user"); - if (!t) + if (!strv_isempty(data_dirs)) + if (strv_extend_strv_concat(&r, data_dirs, "/systemd/user") < 0) goto fail; - strv_free(r); - r = t; - } - t = strv_merge(r, (char**) data_unit_paths); - if (!t) + if (strv_extend_strv(&r, (char**) data_unit_paths) < 0) goto fail; - strv_free(r); - r = t; - if (generator_late) { - t = strv_append(r, generator_late); - if (!t) + if (generator_late) + if (strv_extend(&r, generator_late) < 0) goto fail; - strv_free(r); - r = t; - } if (!path_strv_make_absolute_cwd(r)) goto fail; -finish: - free(config_home); - strv_free(config_dirs); - free(data_home); - strv_free(data_dirs); - return r; fail: strv_free(r); - r = NULL; - goto finish; + return NULL; } int lookup_paths_init( LookupPaths *p, SystemdRunningAs running_as, bool personal, + const char *root_dir, const char *generator, const char *generator_early, const char *generator_late) { const char *e; - char *t; assert(p); @@ -312,19 +284,14 @@ int lookup_paths_init( } } - if (!path_strv_canonicalize(p->unit_path)) + if (!path_strv_resolve_uniq(p->unit_path, root_dir)) return -ENOMEM; - strv_uniq(p->unit_path); - path_strv_remove_empty(p->unit_path); - if (!strv_isempty(p->unit_path)) { - - t = strv_join(p->unit_path, "\n\t"); + _cleanup_free_ char *t = strv_join(p->unit_path, "\n\t"); if (!t) return -ENOMEM; - log_debug("Looking for unit files in:\n\t%s", t); - free(t); + log_debug("Looking for unit files in (higher priority first):\n\t%s", t); } else { log_debug("Ignoring unit files."); strv_free(p->unit_path); @@ -371,24 +338,17 @@ int lookup_paths_init( return -ENOMEM; } - if (!path_strv_canonicalize(p->sysvinit_path)) + if (!path_strv_resolve_uniq(p->sysvinit_path, root_dir)) return -ENOMEM; - if (!path_strv_canonicalize(p->sysvrcnd_path)) + if (!path_strv_resolve_uniq(p->sysvrcnd_path, root_dir)) return -ENOMEM; - strv_uniq(p->sysvinit_path); - strv_uniq(p->sysvrcnd_path); - path_strv_remove_empty(p->sysvinit_path); - path_strv_remove_empty(p->sysvrcnd_path); - if (!strv_isempty(p->sysvinit_path)) { - - t = strv_join(p->sysvinit_path, "\n\t"); + _cleanup_free_ char *t = strv_join(p->sysvinit_path, "\n\t"); if (!t) return -ENOMEM; log_debug("Looking for SysV init scripts in:\n\t%s", t); - free(t); } else { log_debug("Ignoring SysV init scripts."); strv_free(p->sysvinit_path); @@ -396,20 +356,19 @@ int lookup_paths_init( } if (!strv_isempty(p->sysvrcnd_path)) { - - t = strv_join(p->sysvrcnd_path, "\n\t"); + _cleanup_free_ char *t = + strv_join(p->sysvrcnd_path, "\n\t"); if (!t) return -ENOMEM; log_debug("Looking for SysV rcN.d links in:\n\t%s", t); - free(t); } else { log_debug("Ignoring SysV rcN.d links."); strv_free(p->sysvrcnd_path); p->sysvrcnd_path = NULL; } #else - log_debug("Disabled SysV init scripts and rcN.d links support"); + log_debug("SysV init scripts and rcN.d links support disabled"); #endif }