#include "conf-files.h"
#include "specifier.h"
#include "install-printf.h"
+#include "special.h"
typedef struct {
Hashmap *will_install;
Hashmap *have_installed;
} InstallContext;
-#define _cleanup_lookup_paths_free_ \
- __attribute__((cleanup(lookup_paths_free)))
-#define _cleanup_install_context_done_ \
- __attribute__((cleanup(install_context_done)))
+#define _cleanup_install_context_done_ _cleanup_(install_context_done)
static int lookup_paths_init_from_scope(LookupPaths *paths, UnitFileScope scope) {
assert(paths);
for (;;) {
struct dirent *de;
- union dirent_storage buf;
- int k;
- k = readdir_r(d, &buf.de, &de);
- if (k != 0) {
+ errno = 0;
+ de = readdir(d);
+ if (!de && errno != 0) {
r = -errno;
break;
}
found =
set_get(remove_symlinks_to, dest) ||
- set_get(remove_symlinks_to, path_get_file_name(dest));
+ set_get(remove_symlinks_to, basename(dest));
if (unit_name_is_instance(p))
- found = found && strv_contains(files, path_get_file_name(p));
+ found = found && strv_contains(files, basename(p));
if (found) {
}
for (;;) {
- int k;
struct dirent *de;
- union dirent_storage buf;
- k = readdir_r(d, &buf.de, &de);
- if (k != 0)
+ errno = 0;
+ de = readdir(d);
+ if (!de && errno != 0)
return -errno;
if (!de)
if (path_is_absolute(name))
found_dest = path_equal(dest, name);
else
- found_dest = streq(path_get_file_name(dest), name);
+ found_dest = streq(basename(dest), name);
if (found_path && found_dest) {
_cleanup_free_ char *t = NULL;
return 1;
}
}
-
- return r;
}
static int find_symlinks(
UnitFileScope scope,
bool runtime,
const char *root_dir,
- char *files[],
+ char **files,
bool force,
UnitFileChange **changes,
unsigned *n_changes) {
STRV_FOREACH(i, files) {
_cleanup_free_ char *path = NULL;
- if (!unit_name_is_valid(*i, true)) {
+ if (!unit_name_is_valid(*i, TEMPLATE_VALID)) {
if (r == 0)
r = -EINVAL;
continue;
UnitFileScope scope,
bool runtime,
const char *root_dir,
- char *files[],
+ char **files,
UnitFileChange **changes,
unsigned *n_changes) {
STRV_FOREACH(i, files) {
char *path;
- if (!unit_name_is_valid(*i, true)) {
+ if (!unit_name_is_valid(*i, TEMPLATE_VALID)) {
if (r == 0)
r = -EINVAL;
continue;
UnitFileScope scope,
bool runtime,
const char *root_dir,
- char *files[],
+ char **files,
bool force,
UnitFileChange **changes,
unsigned *n_changes) {
char *fn;
struct stat st;
- fn = path_get_file_name(*i);
+ fn = basename(*i);
if (!path_is_absolute(*i) ||
- !unit_name_is_valid(fn, true)) {
+ !unit_name_is_valid(fn, TEMPLATE_VALID)) {
if (r == 0)
r = -EINVAL;
continue;
assert(name || path);
if (!name)
- name = path_get_file_name(path);
+ name = basename(path);
- if (!unit_name_is_valid(name, true))
+ if (!unit_name_is_valid(name, TEMPLATE_VALID))
return -EINVAL;
if (hashmap_get(c->have_installed, name) ||
const char *filename,
unsigned line,
const char *section,
+ unsigned section_line,
const char *lvalue,
int ltype,
const char *rvalue,
const char *filename,
unsigned line,
const char *section,
+ unsigned section_line,
const char *lvalue,
int ltype,
const char *rvalue,
InstallInfo *i = data;
char* printed;
+ int r;
assert(filename);
assert(lvalue);
assert(rvalue);
- printed = install_full_printf(i, rvalue);
- if (!printed)
- return -ENOMEM;
+ r = install_full_printf(i, rvalue, &printed);
+ if (r < 0)
+ return r;
free(i->user);
i->user = printed;
return r;
return
- strv_length(info->aliases) +
- strv_length(info->wanted_by) +
- strv_length(info->required_by);
+ (int) strv_length(info->aliases) +
+ (int) strv_length(info->wanted_by) +
+ (int) strv_length(info->required_by);
}
static int unit_file_search(
if (r >= 0)
r =
- strv_length(i->aliases) +
- strv_length(i->wanted_by) +
- strv_length(i->required_by);
+ (int) strv_length(i->aliases) +
+ (int) strv_length(i->wanted_by) +
+ (int) strv_length(i->required_by);
return r;
}
STRV_FOREACH(s, i->aliases) {
_cleanup_free_ char *alias_path = NULL, *dst = NULL;
- dst = install_full_printf(i, *s);
- if (!dst)
- return -ENOMEM;
+ q = install_full_printf(i, *s, &dst);
+ if (q < 0)
+ return q;
alias_path = path_make_absolute(dst, config_path);
if (!alias_path)
STRV_FOREACH(s, i->wanted_by) {
_cleanup_free_ char *path = NULL, *dst = NULL;
- dst = install_full_printf(i, *s);
- if (!dst)
- return -ENOMEM;
+ q = install_full_printf(i, *s, &dst);
+ if (q < 0)
+ return q;
- if (!unit_name_is_valid(dst, true)) {
+ if (!unit_name_is_valid(dst, TEMPLATE_VALID)) {
r = -EINVAL;
continue;
}
STRV_FOREACH(s, i->required_by) {
_cleanup_free_ char *path = NULL, *dst = NULL;
- dst = install_full_printf(i, *s);
- if (!dst)
- return -ENOMEM;
+ q = install_full_printf(i, *s, &dst);
+ if (q < 0)
+ return q;
- if (!unit_name_is_valid(dst, true)) {
+ if (!unit_name_is_valid(dst, TEMPLATE_VALID)) {
r = -EINVAL;
continue;
}
char *unit_file;
if (i->path) {
- unit_file = path_get_file_name(i->path);
+ unit_file = basename(i->path);
if (unit_name_is_instance(unit_file))
/* unit file named as instance exists, thus all symlinks
UnitFileScope scope,
bool runtime,
const char *root_dir,
- char *files[],
+ char **files,
bool force,
UnitFileChange **changes,
unsigned *n_changes) {
UnitFileScope scope,
bool runtime,
const char *root_dir,
- char *files[],
+ char **files,
UnitFileChange **changes,
unsigned *n_changes) {
UnitFileScope scope,
bool runtime,
const char *root_dir,
- char *files[],
+ char **files,
bool force,
UnitFileChange **changes,
unsigned *n_changes) {
int unit_file_set_default(
UnitFileScope scope,
const char *root_dir,
- char *file,
+ const char *file,
+ bool force,
UnitFileChange **changes,
unsigned *n_changes) {
assert(scope >= 0);
assert(scope < _UNIT_FILE_SCOPE_MAX);
+ assert(file);
if (unit_name_to_type(file) != UNIT_TARGET)
return -EINVAL;
if (r < 0)
return r;
- i = (InstallInfo*)hashmap_first(c.will_install);
+ assert_se(i = hashmap_first(c.will_install));
r = unit_file_search(&c, i, &paths, root_dir, false);
if (r < 0)
return r;
- path = strappenda(config_path, "/default.target");
- r = create_symlink(i->path, path, true, changes, n_changes);
+ path = strappenda(config_path, "/" SPECIAL_DEFAULT_TARGET);
+
+ r = create_symlink(i->path, path, force, changes, n_changes);
if (r < 0)
return r;
char **p;
int r;
+ assert(scope >= 0);
+ assert(scope < _UNIT_FILE_SCOPE_MAX);
+ assert(name);
+
r = lookup_paths_init_from_scope(&paths, scope);
if (r < 0)
return r;
STRV_FOREACH(p, paths.unit_path) {
_cleanup_free_ char *path = NULL, *tmp = NULL;
+ char *n;
if (isempty(root_dir))
- path = strappend(*p, "/default.target");
+ path = strappend(*p, "/" SPECIAL_DEFAULT_TARGET);
else
- path = strjoin(root_dir, "/", *p, "/default.target", NULL);
+ path = strjoin(root_dir, "/", *p, "/" SPECIAL_DEFAULT_TARGET, NULL);
if (!path)
return -ENOMEM;
r = readlink_malloc(path, &tmp);
if (r == -ENOENT)
continue;
+ else if (r == -EINVAL)
+ /* not a symlink */
+ n = strdup(SPECIAL_DEFAULT_TARGET);
else if (r < 0)
return r;
+ else
+ n = strdup(basename(tmp));
- *name = strdup(path_get_file_name(tmp));
- if (!*name)
+ if (!n)
return -ENOMEM;
+ *name = n;
return 0;
}
if (root_dir && scope != UNIT_FILE_SYSTEM)
return -EINVAL;
- if (!unit_name_is_valid(name, true))
+ if (!unit_name_is_valid(name, TEMPLATE_VALID))
return -EINVAL;
r = lookup_paths_init_from_scope(&paths, scope);
UnitFileScope scope,
bool runtime,
const char *root_dir,
- char *files[],
+ char **files,
bool force,
UnitFileChange **changes,
unsigned *n_changes) {
STRV_FOREACH(i, files) {
- if (!unit_name_is_valid(*i, true))
+ if (!unit_name_is_valid(*i, TEMPLATE_VALID))
return -EINVAL;
r = unit_file_query_preset(scope, *i);
free((*f)->path);
free(*f);
}
+#define _cleanup_unitfilelist_free_ _cleanup_(unitfilelist_free)
int unit_file_get_list(
UnitFileScope scope,
for (;;) {
struct dirent *de;
- union dirent_storage buffer;
- UnitFileList __attribute__((cleanup(unitfilelist_free)))
- *f = NULL;
+ _cleanup_unitfilelist_free_ UnitFileList *f = NULL;
- r = readdir_r(d, &buffer.de, &de);
- if (r != 0)
- return -r;
+ errno = 0;
+ de = readdir(d);
+ if (!de && errno != 0)
+ return -errno;
if (!de)
break;
if (ignore_file(de->d_name))
continue;
- if (!unit_name_is_valid(de->d_name, true))
+ if (!unit_name_is_valid(de->d_name, TEMPLATE_VALID))
continue;
if (hashmap_get(h, de->d_name))
f->state = UNIT_FILE_STATIC;
found:
- r = hashmap_put(h, path_get_file_name(f->path), f);
+ r = hashmap_put(h, basename(f->path), f);
if (r < 0)
return r;
f = NULL; /* prevent cleanup */