summaryrefslogtreecommitdiff
path: root/src/libsystemd
diff options
context:
space:
mode:
Diffstat (limited to 'src/libsystemd')
-rw-r--r--src/libsystemd/libsystemd.sym6
-rw-r--r--src/libsystemd/sd-bus/bus-convenience.c11
-rw-r--r--src/libsystemd/sd-bus/bus-message.c7
-rw-r--r--src/libsystemd/sd-bus/sd-bus.c82
-rw-r--r--src/libsystemd/sd-network/sd-network.c8
-rw-r--r--src/libsystemd/sd-path/sd-path.c207
6 files changed, 211 insertions, 110 deletions
diff --git a/src/libsystemd/libsystemd.sym b/src/libsystemd/libsystemd.sym
index 8b6ebbcf8b..2c1bcab576 100644
--- a/src/libsystemd/libsystemd.sym
+++ b/src/libsystemd/libsystemd.sym
@@ -697,3 +697,9 @@ global:
sd_event_source_send_child_signal;
sd_journal_open_namespace;
} LIBSYSTEMD_243;
+
+LIBSYSTEMD_246 {
+global:
+ sd_path_lookup;
+ sd_path_lookup_strv;
+} LIBSYSTEMD_245;
diff --git a/src/libsystemd/sd-bus/bus-convenience.c b/src/libsystemd/sd-bus/bus-convenience.c
index 4ec061644d..89547a252d 100644
--- a/src/libsystemd/sd-bus/bus-convenience.c
+++ b/src/libsystemd/sd-bus/bus-convenience.c
@@ -96,6 +96,7 @@ _public_ int sd_bus_call_method(
int r;
bus_assert_return(bus, -EINVAL, error);
+ bus_assert_return(bus = bus_resolve(bus), -ENOPKG, error);
bus_assert_return(!bus_pid_changed(bus), -ECHILD, error);
if (!BUS_IS_OPEN(bus->state)) {
@@ -283,6 +284,7 @@ _public_ int sd_bus_get_property(
int r;
bus_assert_return(bus, -EINVAL, error);
+ bus_assert_return(bus = bus_resolve(bus), -ENOPKG, error);
bus_assert_return(isempty(interface) || interface_name_is_valid(interface), -EINVAL, error);
bus_assert_return(member_name_is_valid(member), -EINVAL, error);
bus_assert_return(reply, -EINVAL, error);
@@ -294,7 +296,10 @@ _public_ int sd_bus_get_property(
goto fail;
}
- r = sd_bus_call_method(bus, destination, path, "org.freedesktop.DBus.Properties", "Get", error, &rep, "ss", strempty(interface), member);
+ r = sd_bus_call_method(bus, destination, path,
+ "org.freedesktop.DBus.Properties", "Get",
+ error, &rep,
+ "ss", strempty(interface), member);
if (r < 0)
return r;
@@ -324,6 +329,7 @@ _public_ int sd_bus_get_property_trivial(
int r;
bus_assert_return(bus, -EINVAL, error);
+ bus_assert_return(bus = bus_resolve(bus), -ENOPKG, error);
bus_assert_return(isempty(interface) || interface_name_is_valid(interface), -EINVAL, error);
bus_assert_return(member_name_is_valid(member), -EINVAL, error);
bus_assert_return(bus_type_is_trivial(type), -EINVAL, error);
@@ -368,6 +374,7 @@ _public_ int sd_bus_get_property_string(
int r;
bus_assert_return(bus, -EINVAL, error);
+ bus_assert_return(bus = bus_resolve(bus), -ENOPKG, error);
bus_assert_return(isempty(interface) || interface_name_is_valid(interface), -EINVAL, error);
bus_assert_return(member_name_is_valid(member), -EINVAL, error);
bus_assert_return(ret, -EINVAL, error);
@@ -416,6 +423,7 @@ _public_ int sd_bus_get_property_strv(
int r;
bus_assert_return(bus, -EINVAL, error);
+ bus_assert_return(bus = bus_resolve(bus), -ENOPKG, error);
bus_assert_return(isempty(interface) || interface_name_is_valid(interface), -EINVAL, error);
bus_assert_return(member_name_is_valid(member), -EINVAL, error);
bus_assert_return(ret, -EINVAL, error);
@@ -458,6 +466,7 @@ _public_ int sd_bus_set_property(
int r;
bus_assert_return(bus, -EINVAL, error);
+ bus_assert_return(bus = bus_resolve(bus), -ENOPKG, error);
bus_assert_return(isempty(interface) || interface_name_is_valid(interface), -EINVAL, error);
bus_assert_return(member_name_is_valid(member), -EINVAL, error);
bus_assert_return(signature_is_single(type, false), -EINVAL, error);
diff --git a/src/libsystemd/sd-bus/bus-message.c b/src/libsystemd/sd-bus/bus-message.c
index 73127dfe02..62c34d9312 100644
--- a/src/libsystemd/sd-bus/bus-message.c
+++ b/src/libsystemd/sd-bus/bus-message.c
@@ -585,14 +585,13 @@ _public_ int sd_bus_message_new(
sd_bus_message **m,
uint8_t type) {
- sd_bus_message *t;
-
assert_return(bus, -ENOTCONN);
+ assert_return(bus = bus_resolve(bus), -ENOPKG);
assert_return(bus->state != BUS_UNSET, -ENOTCONN);
assert_return(m, -EINVAL);
assert_return(type < _SD_BUS_MESSAGE_TYPE_MAX, -EINVAL);
- t = malloc0(ALIGN(sizeof(sd_bus_message)) + sizeof(struct bus_header));
+ sd_bus_message *t = malloc0(ALIGN(sizeof(sd_bus_message)) + sizeof(struct bus_header));
if (!t)
return -ENOMEM;
@@ -623,6 +622,7 @@ _public_ int sd_bus_message_new_signal(
int r;
assert_return(bus, -ENOTCONN);
+ assert_return(bus = bus_resolve(bus), -ENOPKG);
assert_return(bus->state != BUS_UNSET, -ENOTCONN);
assert_return(object_path_is_valid(path), -EINVAL);
assert_return(interface_name_is_valid(interface), -EINVAL);
@@ -663,6 +663,7 @@ _public_ int sd_bus_message_new_method_call(
int r;
assert_return(bus, -ENOTCONN);
+ assert_return(bus = bus_resolve(bus), -ENOPKG);
assert_return(bus->state != BUS_UNSET, -ENOTCONN);
assert_return(!destination || service_name_is_valid(destination), -EINVAL);
assert_return(object_path_is_valid(path), -EINVAL);
diff --git a/src/libsystemd/sd-bus/sd-bus.c b/src/libsystemd/sd-bus/sd-bus.c
index 7ad03680f4..5cbd01594c 100644
--- a/src/libsystemd/sd-bus/sd-bus.c
+++ b/src/libsystemd/sd-bus/sd-bus.c
@@ -504,7 +504,6 @@ static int synthesize_connected_signal(sd_bus *bus) {
}
void bus_set_state(sd_bus *bus, enum bus_state state) {
-
static const char * const table[_BUS_STATE_MAX] = {
[BUS_UNSET] = "UNSET",
[BUS_WATCH_BIND] = "WATCH_BIND",
@@ -980,9 +979,8 @@ static int parse_container_unix_address(sd_bus *b, const char **p, char **guid)
return -EINVAL;
free_and_replace(b->machine, machine);
- } else {
+ } else
b->machine = mfree(b->machine);
- }
if (pid) {
r = parse_pid(pid, &b->nspid);
@@ -1271,10 +1269,7 @@ int bus_set_address_system(sd_bus *b) {
assert(b);
e = secure_getenv("DBUS_SYSTEM_BUS_ADDRESS");
- if (e)
- return sd_bus_set_address(b, e);
-
- return sd_bus_set_address(b, DEFAULT_SYSTEM_BUS_ADDRESS);
+ return sd_bus_set_address(b, e ?: DEFAULT_SYSTEM_BUS_ADDRESS);
}
_public_ int sd_bus_open_system_with_description(sd_bus **ret, const char *description) {
@@ -1319,29 +1314,30 @@ _public_ int sd_bus_open_system(sd_bus **ret) {
}
int bus_set_address_user(sd_bus *b) {
- const char *e;
- _cleanup_free_ char *ee = NULL, *s = NULL;
+ const char *a;
+ _cleanup_free_ char *_a = NULL;
assert(b);
- e = secure_getenv("DBUS_SESSION_BUS_ADDRESS");
- if (e)
- return sd_bus_set_address(b, e);
+ a = secure_getenv("DBUS_SESSION_BUS_ADDRESS");
+ if (!a) {
+ const char *e;
+ _cleanup_free_ char *ee = NULL;
- e = secure_getenv("XDG_RUNTIME_DIR");
- if (!e)
- return -ENOENT;
-
- ee = bus_address_escape(e);
- if (!ee)
- return -ENOMEM;
+ e = secure_getenv("XDG_RUNTIME_DIR");
+ if (!e)
+ return -ENOENT;
- if (asprintf(&s, DEFAULT_USER_BUS_ADDRESS_FMT, ee) < 0)
- return -ENOMEM;
+ ee = bus_address_escape(e);
+ if (!ee)
+ return -ENOMEM;
- b->address = TAKE_PTR(s);
+ if (asprintf(&_a, DEFAULT_USER_BUS_ADDRESS_FMT, ee) < 0)
+ return -ENOMEM;
+ a = _a;
+ }
- return 0;
+ return sd_bus_set_address(b, a);
}
_public_ int sd_bus_open_user_with_description(sd_bus **ret, const char *description) {
@@ -1902,9 +1898,10 @@ _public_ int sd_bus_send(sd_bus *bus, sd_bus_message *_m, uint64_t *cookie) {
assert_return(m, -EINVAL);
- if (!bus)
- bus = m->bus;
-
+ if (bus)
+ assert_return(bus = bus_resolve(bus), -ENOPKG);
+ else
+ assert_return(bus = m->bus, -ENOTCONN);
assert_return(!bus_pid_changed(bus), -ECHILD);
if (!BUS_IS_OPEN(bus->state))
@@ -1986,9 +1983,10 @@ _public_ int sd_bus_send_to(sd_bus *bus, sd_bus_message *m, const char *destinat
assert_return(m, -EINVAL);
- if (!bus)
- bus = m->bus;
-
+ if (bus)
+ assert_return(bus = bus_resolve(bus), -ENOPKG);
+ else
+ assert_return(bus = m->bus, -ENOTCONN);
assert_return(!bus_pid_changed(bus), -ECHILD);
if (!BUS_IS_OPEN(bus->state))
@@ -2051,9 +2049,10 @@ _public_ int sd_bus_call_async(
assert_return(m->header->type == SD_BUS_MESSAGE_METHOD_CALL, -EINVAL);
assert_return(!m->sealed || (!!callback == !(m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED)), -EINVAL);
- if (!bus)
- bus = m->bus;
-
+ if (bus)
+ assert_return(bus = bus_resolve(bus), -ENOPKG);
+ else
+ assert_return(bus = m->bus, -ENOTCONN);
assert_return(!bus_pid_changed(bus), -ECHILD);
if (!BUS_IS_OPEN(bus->state))
@@ -2157,9 +2156,10 @@ _public_ int sd_bus_call(
bus_assert_return(!(m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED), -EINVAL, error);
bus_assert_return(!bus_error_is_dirty(error), -EINVAL, error);
- if (!bus)
- bus = m->bus;
-
+ if (bus)
+ assert_return(bus = bus_resolve(bus), -ENOPKG);
+ else
+ assert_return(bus = m->bus, -ENOTCONN);
bus_assert_return(!bus_pid_changed(bus), -ECHILD, error);
if (!BUS_IS_OPEN(bus->state)) {
@@ -2286,7 +2286,6 @@ fail:
}
_public_ int sd_bus_get_fd(sd_bus *bus) {
-
assert_return(bus, -EINVAL);
assert_return(bus = bus_resolve(bus), -ENOPKG);
assert_return(bus->input_fd == bus->output_fd, -EPERM);
@@ -3677,31 +3676,31 @@ _public_ int sd_bus_detach_event(sd_bus *bus) {
}
_public_ sd_event* sd_bus_get_event(sd_bus *bus) {
- assert_return(bus, NULL);
+ assert_return(bus = bus_resolve(bus), NULL);
return bus->event;
}
_public_ sd_bus_message* sd_bus_get_current_message(sd_bus *bus) {
- assert_return(bus, NULL);
+ assert_return(bus = bus_resolve(bus), NULL);
return bus->current_message;
}
_public_ sd_bus_slot* sd_bus_get_current_slot(sd_bus *bus) {
- assert_return(bus, NULL);
+ assert_return(bus = bus_resolve(bus), NULL);
return bus->current_slot;
}
_public_ sd_bus_message_handler_t sd_bus_get_current_handler(sd_bus *bus) {
- assert_return(bus, NULL);
+ assert_return(bus = bus_resolve(bus), NULL);
return bus->current_handler;
}
_public_ void* sd_bus_get_current_userdata(sd_bus *bus) {
- assert_return(bus, NULL);
+ assert_return(bus = bus_resolve(bus), NULL);
return bus->current_userdata;
}
@@ -4018,7 +4017,6 @@ _public_ int sd_bus_get_scope(sd_bus *bus, const char **scope) {
}
_public_ int sd_bus_get_address(sd_bus *bus, const char **address) {
-
assert_return(bus, -EINVAL);
assert_return(bus = bus_resolve(bus), -ENOPKG);
assert_return(address, -EINVAL);
diff --git a/src/libsystemd/sd-network/sd-network.c b/src/libsystemd/sd-network/sd-network.c
index b9b618e585..a5ab5b3c36 100644
--- a/src/libsystemd/sd-network/sd-network.c
+++ b/src/libsystemd/sd-network/sd-network.c
@@ -240,6 +240,10 @@ _public_ int sd_network_link_get_ntp(int ifindex, char ***ret) {
return network_link_get_strv(ifindex, "NTP", ret);
}
+_public_ int sd_network_link_get_sip(int ifindex, char ***ret) {
+ return network_link_get_strv(ifindex, "SIP", ret);
+}
+
_public_ int sd_network_link_get_search_domains(int ifindex, char ***ret) {
return network_link_get_strv(ifindex, "DOMAINS", ret);
}
@@ -252,6 +256,10 @@ _public_ int sd_network_link_get_sip_servers(int ifindex, char ***ret) {
return network_link_get_strv(ifindex, "SIP", ret);
}
+_public_ int sd_network_link_get_pop3_servers(int ifindex, char ***pop3) {
+ return network_link_get_strv(ifindex, "POP3_SERVERS", pop3);
+}
+
_public_ int sd_network_link_get_dns_default_route(int ifindex) {
char path[STRLEN("/run/systemd/netif/links/") + DECIMAL_STR_MAX(ifindex) + 1];
_cleanup_free_ char *s = NULL;
diff --git a/src/libsystemd/sd-path/sd-path.c b/src/libsystemd/sd-path/sd-path.c
index 95d6551e5c..2a9c04a84d 100644
--- a/src/libsystemd/sd-path/sd-path.c
+++ b/src/libsystemd/sd-path/sd-path.c
@@ -7,6 +7,7 @@
#include "fd-util.h"
#include "fileio.h"
#include "fs-util.h"
+#include "path-lookup.h"
#include "path-util.h"
#include "string-util.h"
#include "strv.h"
@@ -318,64 +319,130 @@ static int get_path(uint64_t type, char **buffer, const char **ret) {
case SD_PATH_USER_DESKTOP:
return from_user_dir("XDG_DESKTOP_DIR", buffer, ret);
+
+ case SD_PATH_SYSTEMD_UTIL_DIR:
+ *ret = ROOTPREFIX "lib/systemd";
+ return 0;
+
+ case SD_PATH_SYSTEMD_SYSTEM_UNIT_DIR:
+ *ret = SYSTEM_DATA_UNIT_PATH;
+ return 0;
+
+ case SD_PATH_SYSTEMD_SYSTEM_PRESET_DIR:
+ *ret = ROOTPREFIX "lib/systemd/system-preset";
+ return 0;
+
+ case SD_PATH_SYSTEMD_USER_UNIT_DIR:
+ *ret = USER_DATA_UNIT_DIR;
+ return 0;
+
+ case SD_PATH_SYSTEMD_USER_PRESET_DIR:
+ *ret = ROOTPREFIX "lib/systemd/user-preset";
+ return 0;
+
+ case SD_PATH_SYSTEMD_SYSTEM_CONF_DIR:
+ *ret = SYSTEM_CONFIG_UNIT_DIR;
+ return 0;
+
+ case SD_PATH_SYSTEMD_USER_CONF_DIR:
+ *ret = USER_CONFIG_UNIT_DIR;
+ return 0;
+
+ case SD_PATH_SYSTEMD_SYSTEM_GENERATOR_DIR:
+ *ret = SYSTEM_GENERATOR_DIR;
+ return 0;
+
+ case SD_PATH_SYSTEMD_USER_GENERATOR_DIR:
+ *ret = USER_GENERATOR_DIR;
+ return 0;
+
+ case SD_PATH_SYSTEMD_SLEEP_DIR:
+ *ret = ROOTPREFIX "lib/systemd/system-sleep";
+ return 0;
+
+ case SD_PATH_SYSTEMD_SHUTDOWN_DIR:
+ *ret = ROOTPREFIX "lib/systemd/system-shutdown";
+ return 0;
+
+ /* FIXME: systemd.pc uses ${prefix}, but CONF_PATHS_NULSTR doesn't.
+ * Should ${prefix} use in systemd.pc be removed? */
+ case SD_PATH_TMPFILES_DIR:
+ *ret = "/usr/lib/tmpfiles.d";
+ return 0;
+
+ case SD_PATH_SYSUSERS_DIR:
+ *ret = "/usr/lib/sysusers.d";
+ return 0;
+
+ case SD_PATH_SYSCTL_DIR:
+ *ret = "/usr/lib/sysctl.d";
+ return 0;
+
+ case SD_PATH_BINFMT_DIR:
+ *ret = "/usr/lib/binfmt.d";
+ return 0;
+
+ case SD_PATH_MODULES_LOAD_DIR:
+ *ret = "/usr/lib/modules-load.d";
+ return 0;
+
+ case SD_PATH_CATALOG_DIR:
+ *ret = "/usr/lib/systemd/catalog";
+ return 0;
}
return -EOPNOTSUPP;
}
-_public_ int sd_path_home(uint64_t type, const char *suffix, char **path) {
+static int get_path_alloc(uint64_t type, const char *suffix, char **path) {
_cleanup_free_ char *buffer = NULL;
+ char *buffer2 = NULL;
const char *ret;
- char *cc;
int r;
- assert_return(path, -EINVAL);
-
- if (IN_SET(type,
- SD_PATH_SEARCH_BINARIES,
- SD_PATH_SEARCH_BINARIES_DEFAULT,
- SD_PATH_SEARCH_LIBRARY_PRIVATE,
- SD_PATH_SEARCH_LIBRARY_ARCH,
- SD_PATH_SEARCH_SHARED,
- SD_PATH_SEARCH_CONFIGURATION_FACTORY,
- SD_PATH_SEARCH_STATE_FACTORY,
- SD_PATH_SEARCH_CONFIGURATION)) {
+ assert(path);
- _cleanup_strv_free_ char **l = NULL;
-
- r = sd_path_search(type, suffix, &l);
- if (r < 0)
- return r;
+ r = get_path(type, &buffer, &ret);
+ if (r < 0)
+ return r;
- buffer = strv_join(l, ":");
+ if (suffix) {
+ suffix += strspn(suffix, "/");
+ buffer2 = path_join(ret, suffix);
+ if (!buffer2)
+ return -ENOMEM;
+ } else if (!buffer) {
+ buffer = strdup(ret);
if (!buffer)
return -ENOMEM;
-
- *path = TAKE_PTR(buffer);
- return 0;
}
- r = get_path(type, &buffer, &ret);
- if (r < 0)
+ *path = buffer2 ?: TAKE_PTR(buffer);
+ return 0;
+}
+
+_public_ int sd_path_lookup(uint64_t type, const char *suffix, char **path) {
+ int r;
+
+ assert_return(path, -EINVAL);
+
+ r = get_path_alloc(type, suffix, path);
+ if (r != -EOPNOTSUPP)
return r;
- if (!suffix) {
- if (!buffer) {
- buffer = strdup(ret);
- if (!buffer)
- return -ENOMEM;
- }
+ /* Fall back to sd_path_lookup_strv */
+ _cleanup_strv_free_ char **l = NULL;
+ char *buffer;
- *path = TAKE_PTR(buffer);
- return 0;
- }
+ r = sd_path_lookup_strv(type, suffix, &l);
+ if (r < 0)
+ return r;
- suffix += strspn(suffix, "/");
- cc = path_join(ret, suffix);
- if (!cc)
+ buffer = strv_join(l, ":");
+ if (!buffer)
return -ENOMEM;
- *path = TAKE_PTR(cc);
+ *path = buffer;
return 0;
}
@@ -454,6 +521,7 @@ static int search_from_environment(
#endif
static int get_search(uint64_t type, char ***list) {
+ int r;
assert(list);
@@ -536,58 +604,69 @@ static int get_search(uint64_t type, char ***list) {
"/etc",
NULL);
- case SD_PATH_SEARCH_BINARIES_DEFAULT: {
+ case SD_PATH_SEARCH_BINARIES_DEFAULT:
+ return strv_from_nulstr(list, DEFAULT_PATH_NULSTR);
+
+ case SD_PATH_SYSTEMD_SYSTEM_UNIT_PATH:
+ case SD_PATH_SYSTEMD_USER_UNIT_PATH: {
+ _cleanup_(lookup_paths_free) LookupPaths lp = {};
+ const UnitFileScope scope = type == SD_PATH_SYSTEMD_SYSTEM_UNIT_PATH ?
+ UNIT_FILE_SYSTEM : UNIT_FILE_USER;
+
+ r = lookup_paths_init(&lp, scope, 0, NULL);
+ if (r < 0)
+ return r;
+
+ *list = TAKE_PTR(lp.search_path);
+ return 0;
+ }
+
+ case SD_PATH_SYSTEMD_SYSTEM_GENERATOR_PATH:
+ case SD_PATH_SYSTEMD_USER_GENERATOR_PATH: {
char **t;
+ const UnitFileScope scope = type == SD_PATH_SYSTEMD_SYSTEM_UNIT_PATH ?
+ UNIT_FILE_SYSTEM : UNIT_FILE_USER;
- t = strv_split_nulstr(DEFAULT_PATH_NULSTR);
+ t = generator_binary_paths(scope);
if (!t)
return -ENOMEM;
*list = t;
return 0;
- }}
+ }
+
+ case SD_PATH_SYSTEMD_NETWORK_PATH:
+ return strv_from_nulstr(list, NETWORK_DIRS_NULSTR);
+
+ }
return -EOPNOTSUPP;
}
-_public_ int sd_path_search(uint64_t type, const char *suffix, char ***paths) {
- char **i, **j;
+_public_ int sd_path_lookup_strv(uint64_t type, const char *suffix, char ***paths) {
_cleanup_strv_free_ char **l = NULL, **n = NULL;
int r;
assert_return(paths, -EINVAL);
- if (!IN_SET(type,
- SD_PATH_SEARCH_BINARIES,
- SD_PATH_SEARCH_BINARIES_DEFAULT,
- SD_PATH_SEARCH_LIBRARY_PRIVATE,
- SD_PATH_SEARCH_LIBRARY_ARCH,
- SD_PATH_SEARCH_SHARED,
- SD_PATH_SEARCH_CONFIGURATION_FACTORY,
- SD_PATH_SEARCH_STATE_FACTORY,
- SD_PATH_SEARCH_CONFIGURATION)) {
-
- char *p;
+ r = get_search(type, &l);
+ if (r == -EOPNOTSUPP) {
+ _cleanup_free_ char *t = NULL;
- r = sd_path_home(type, suffix, &p);
+ r = get_path_alloc(type, suffix, &t);
if (r < 0)
return r;
l = new(char*, 2);
- if (!l) {
- free(p);
+ if (!l)
return -ENOMEM;
- }
-
- l[0] = p;
+ l[0] = TAKE_PTR(t);
l[1] = NULL;
*paths = TAKE_PTR(l);
return 0;
- }
- r = get_search(type, &l);
- if (r < 0)
+ } else if (r < 0)
return r;
if (!suffix) {
@@ -599,7 +678,7 @@ _public_ int sd_path_search(uint64_t type, const char *suffix, char ***paths) {
if (!n)
return -ENOMEM;
- j = n;
+ char **i, **j = n;
STRV_FOREACH(i, l) {
*j = path_join(*i, suffix);
if (!*j)
@@ -607,8 +686,8 @@ _public_ int sd_path_search(uint64_t type, const char *suffix, char ***paths) {
j++;
}
-
*j = NULL;
+
*paths = TAKE_PTR(n);
return 0;
}