Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

shared/install: modernize and eliminate the use of basename() #32603

Open
wants to merge 12 commits into
base: main
Choose a base branch
from
Open
2 changes: 1 addition & 1 deletion src/basic/unit-file.c
Original file line number Diff line number Diff line change
Expand Up @@ -699,7 +699,7 @@ static int add_names(

if (inst_fragment &&
fragment_basename &&
!streq(basename(inst_fragment), fragment_basename)) {
!path_equal_filename(inst_fragment, fragment_basename)) {
log_debug("Instance %s has fragment %s and is not an alias of %s.",
inst, inst_fragment, unit_name);
continue;
Expand Down
17 changes: 6 additions & 11 deletions src/core/dbus-manager.c
Original file line number Diff line number Diff line change
Expand Up @@ -2185,9 +2185,8 @@ static int method_enqueue_marked_jobs(sd_bus_message *message, void *userdata, s
}

static int list_unit_files_by_patterns(sd_bus_message *message, void *userdata, sd_bus_error *error, char **states, char **patterns) {
_cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
Manager *m = ASSERT_PTR(userdata);
UnitFileList *item;
_cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
_cleanup_hashmap_free_ Hashmap *h = NULL;
int r;

Expand All @@ -2203,20 +2202,16 @@ static int list_unit_files_by_patterns(sd_bus_message *message, void *userdata,
if (r < 0)
return r;

h = hashmap_new(&unit_file_list_hash_ops_free);
if (!h)
return -ENOMEM;

r = unit_file_get_list(m->runtime_scope, NULL, h, states, patterns);
r = unit_file_get_list(m->runtime_scope, /* root_dir = */ NULL, states, patterns, &h);
if (r < 0)
return r;

r = sd_bus_message_open_container(reply, 'a', "(ss)");
if (r < 0)
return r;

UnitFileList *item;
HASHMAP_FOREACH(item, h) {

r = sd_bus_message_append(reply, "(ss)", item->path, unit_file_state_to_string(item->state));
if (r < 0)
return r;
Expand Down Expand Up @@ -2423,7 +2418,7 @@ static int reply_install_changes_and_free(
static int method_enable_unit_files_generic(
sd_bus_message *message,
Manager *m,
int (*call)(RuntimeScope scope, UnitFileFlags flags, const char *root_dir, char *files[], InstallChange **changes, size_t *n_changes),
int (*call)(RuntimeScope scope, UnitFileFlags flags, const char *root_dir, char * const *files, InstallChange **changes, size_t *n_changes),
bool carries_install_info,
sd_bus_error *error) {

Expand Down Expand Up @@ -2488,7 +2483,7 @@ static int method_link_unit_files(sd_bus_message *message, void *userdata, sd_bu
return method_enable_unit_files_generic(message, userdata, unit_file_link, /* carries_install_info = */ false, error);
}

static int unit_file_preset_without_mode(RuntimeScope scope, UnitFileFlags flags, const char *root_dir, char **files, InstallChange **changes, size_t *n_changes) {
static int unit_file_preset_without_mode(RuntimeScope scope, UnitFileFlags flags, const char *root_dir, char * const *files, InstallChange **changes, size_t *n_changes) {
return unit_file_preset(scope, flags, root_dir, files, UNIT_FILE_PRESET_FULL, changes, n_changes);
}

Expand Down Expand Up @@ -2548,7 +2543,7 @@ static int method_preset_unit_files_with_mode(sd_bus_message *message, void *use
static int method_disable_unit_files_generic(
sd_bus_message *message,
Manager *m,
int (*call)(RuntimeScope scope, UnitFileFlags flags, const char *root_dir, char *files[], InstallChange **changes, size_t *n_changes),
int (*call)(RuntimeScope scope, UnitFileFlags flags, const char *root_dir, char * const *files, InstallChange **changes, size_t *n_changes),
bool carries_install_info,
sd_bus_error *error) {

Expand Down
2 changes: 1 addition & 1 deletion src/portable/portabled-image-bus.c
Original file line number Diff line number Diff line change
Expand Up @@ -596,7 +596,7 @@ static int normalize_portable_changes(
bool found = false;

for (size_t j = 0; j < n_changes_attached; ++j)
if (streq(basename(changes_detached[i].path), basename(changes_attached[j].path))) {
if (path_equal_filename(changes_detached[i].path, changes_attached[j].path)) {
found = true;
break;
}
Expand Down
62 changes: 38 additions & 24 deletions src/shared/dropin.c
Original file line number Diff line number Diff line change
Expand Up @@ -23,39 +23,48 @@
#include "strv.h"
#include "unit-name.h"

int drop_in_file(const char *dir, const char *unit, unsigned level,
const char *name, char **ret_p, char **ret_q) {
int drop_in_file(
const char *dir,
const char *unit,
unsigned level,
const char *name,
char **ret_unit_dir,
char **ret_path) {

char prefix[DECIMAL_STR_MAX(unsigned) + 1] = {};
_cleanup_free_ char *b = NULL, *p = NULL, *q = NULL;
_cleanup_free_ char *n = NULL, *unit_dir = NULL, *path = NULL;

assert(dir);
assert(unit);
assert(name);
assert(ret_p);
assert(ret_q);

if (level != UINT_MAX)
xsprintf(prefix, "%u-", level);
assert(ret_unit_dir);
assert(ret_path);

b = xescape(name, "/.");
if (!b)
n = xescape(name, "/.");
if (!n)
return -ENOMEM;

if (!filename_is_valid(b))
if (!filename_is_valid(n))
return -EINVAL;

p = strjoin(dir, "/", unit, ".d");
q = strjoin(p, "/", prefix, b, ".conf");
if (!p || !q)
if (level != UINT_MAX)
xsprintf(prefix, "%u-", level);

unit_dir = path_join(dir, strjoina(unit, ".d"));
path = strjoin(unit_dir, "/", prefix, n, ".conf");
if (!unit_dir || !path)
return -ENOMEM;

*ret_p = TAKE_PTR(p);
*ret_q = TAKE_PTR(q);
*ret_unit_dir = TAKE_PTR(unit_dir);
*ret_path = TAKE_PTR(path);
return 0;
}

int write_drop_in(const char *dir, const char *unit, unsigned level,
const char *name, const char *data) {
int write_drop_in(
const char *dir,
const char *unit,
unsigned level,
const char *name,
const char *data) {

_cleanup_free_ char *p = NULL, *q = NULL;
int r;
Expand All @@ -73,9 +82,14 @@ int write_drop_in(const char *dir, const char *unit, unsigned level,
return write_string_file_atomic_label(q, data);
}

int write_drop_in_format(const char *dir, const char *unit, unsigned level,
const char *name, const char *format, ...) {
_cleanup_free_ char *p = NULL;
int write_drop_in_format(
const char *dir,
const char *unit,
unsigned level,
const char *name,
const char *format, ...) {

_cleanup_free_ char *content = NULL;
va_list ap;
int r;

Expand All @@ -85,13 +99,13 @@ int write_drop_in_format(const char *dir, const char *unit, unsigned level,
assert(format);

va_start(ap, format);
r = vasprintf(&p, format, ap);
r = vasprintf(&content, format, ap);
va_end(ap);

if (r < 0)
return -ENOMEM;

return write_drop_in(dir, unit, level, name, p);
return write_drop_in(dir, unit, level, name, content);
}

static int unit_file_add_dir(
Expand Down
26 changes: 19 additions & 7 deletions src/shared/dropin.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,26 @@
#include "set.h"
#include "unit-name.h"

int drop_in_file(const char *dir, const char *unit, unsigned level,
const char *name, char **_p, char **_q);

int write_drop_in(const char *dir, const char *unit, unsigned level,
const char *name, const char *data);
int drop_in_file(
const char *dir,
const char *unit,
unsigned level,
const char *name,
char **ret_unit_dir,
char **ret_path);

int write_drop_in_format(const char *dir, const char *unit, unsigned level,
const char *name, const char *format, ...) _printf_(5, 6);
int write_drop_in(
const char *dir,
const char *unit,
unsigned level,
const char *name,
const char *data);
int write_drop_in_format(
const char *dir,
const char *unit,
unsigned level,
const char *name,
const char *format, ...) _printf_(5, 6);

int unit_file_find_dropin_paths(
const char *original_root,
Expand Down