mirror of
https://github.com/systemd/systemd
synced 2025-11-10 12:24:45 +01:00
Compare commits
No commits in common. "a1447e77a77b80db84cadc7b03f80f653f74118d" and "819528326571f3d5e7fccaf5bc72be6ca00ae78a" have entirely different histories.
a1447e77a7
...
8195283265
@ -408,48 +408,36 @@
|
||||
<varlistentry>
|
||||
<term><varname>IPv6Token=</varname></term>
|
||||
<listitem>
|
||||
<para>Specifies an optional address generation mode for the Stateless Address
|
||||
Autoconfiguration (SLAAC). Supported modes are <literal>prefixstable</literal> and
|
||||
<literal>static</literal>.</para>
|
||||
<para>Specifies an optional address generation mode and a required IPv6 address. If
|
||||
the mode is present, the two parts must be separated with a colon
|
||||
<literal><replaceable>mode</replaceable>:<replaceable>address</replaceable></literal>. The
|
||||
address generation mode may be either <constant>prefixstable</constant> or
|
||||
<constant>static</constant>. If not specified, <constant>static</constant> is assumed.
|
||||
</para>
|
||||
<para>When the mode is set to <constant>static</constant>, or unspecified, the lower bits of
|
||||
the supplied address are combined with the upper bits of a prefix received in a Router Advertisement
|
||||
message to form a complete address. Note that if multiple prefixes are received in an RA message, or in
|
||||
multiple RA messages, addresses will be formed from each of them using the supplied address. This
|
||||
mode implements SLAAC but uses a static interface identifier instead of an identifier generated
|
||||
using the EUI-64 algorithm. Because the interface identifier is static, if Duplicate Address Detection
|
||||
detects that the computed address is a duplicate (in use by another node on the link), then this
|
||||
mode will fail to provide an address for that prefix.
|
||||
</para>
|
||||
<para>When the mode is set to <literal>prefixstable</literal> the RFC 7217 algorithm for generating
|
||||
interface identifiers will be used, but only when a prefix received in an RA message matches the supplied address.
|
||||
See <ulink url="https://tools.ietf.org/html/rfc7217">RFC 7217</ulink>. Prefix matching will be attempted
|
||||
against each <constant>prefixstable</constant> IPv6Token variable provided in the configuration; if a received
|
||||
prefix does not match any of the provided addresses, then the EUI-64 algorithm will be used to form
|
||||
an interface identifier for that prefix. This mode is also SLAAC, but with a potentially stable interface
|
||||
identifier which does not directly map to the interface's hardware address.
|
||||
|
||||
<para>When the mode is set to <literal>static</literal>, an IPv6 address must be
|
||||
specified after a colon (<literal>:</literal>), and the lower bits of the supplied
|
||||
address are combined with the upper bits of a prefix received in a Router Advertisement
|
||||
(RA) message to form a complete address. Note that if multiple prefixes are received in an
|
||||
RA message, or in multiple RA messages, addresses will be formed from each of them using
|
||||
the supplied address. This mode implements SLAAC but uses a static interface identifier
|
||||
instead of an identifier generated by using the EUI-64 algorithm. Because the interface
|
||||
identifier is static, if Duplicate Address Detection detects that the computed address is a
|
||||
duplicate (in use by another node on the link), then this mode will fail to provide an
|
||||
address for that prefix. If an IPv6 address without mode is specified, then
|
||||
<literal>static</literal> mode is assumed.</para>
|
||||
Note that the <constant>prefixstable</constant> algorithm includes both the interface's name and
|
||||
MAC address in the hash used to compute the interface identifier, so if either of those are changed the resulting
|
||||
interface identifier (and address) will change, even if the prefix received in the RA message has not changed.
|
||||
|
||||
<para>When the mode is set to <literal>prefixstable</literal> the
|
||||
<ulink url="https://tools.ietf.org/html/rfc7217">RFC 7217</ulink> algorithm for generating
|
||||
interface identifiers will be used. This mode can optionally take an IPv6 address separated
|
||||
with a colon (<literal>:</literal>). If an IPv6 address is specified, then an interface
|
||||
identifier is generated only when a prefix received in an RA message matches the supplied
|
||||
address.</para>
|
||||
|
||||
<para>If no address generation mode is specified (which is the default), or a received
|
||||
prefix does not match any of the addresses provided in <literal>prefixstable</literal>
|
||||
mode, then the EUI-64 algorithm will be used to form an interface identifier for that
|
||||
prefix. This mode is also SLAAC, but with a potentially stable interface identifier which
|
||||
does not directly map to the interface's hardware address.</para>
|
||||
|
||||
<para>Note that the <literal>prefixstable</literal> algorithm uses both the interface
|
||||
name and MAC address as input to the hash to compute the interface identifier, so if either
|
||||
of those are changed the resulting interface identifier (and address) will change, even if
|
||||
the prefix received in the RA message has not changed.</para>
|
||||
|
||||
<para>This setting can be specified multiple times. If an empty string is assigned, then
|
||||
the all previous assignments are cleared.</para>
|
||||
|
||||
<para>Examples:
|
||||
<programlisting>IPv6Token=::1a:2b:3c:4d
|
||||
IPv6Token=static:::1a:2b:3c:4d
|
||||
IPv6Token=prefixstable
|
||||
IPv6Token=prefixstable:2002:da8:1::</programlisting></para>
|
||||
Note that if multiple <constant>prefixstable</constant> IPv6Token variables are supplied with addresses that
|
||||
match a prefix received in an RA message, only the first one will be used to generate addresses.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
|
||||
@ -27,12 +27,12 @@
|
||||
<para><filename>/usr/lib/sysusers.d/*.conf</filename></para>
|
||||
|
||||
<programlisting>
|
||||
#Type Name ID GECOS Home directory Shell
|
||||
u user_name uid "User Description" /home/dir /path/to/shell
|
||||
u user_name uid:gid "User Description" /home/dir /path/to/shell
|
||||
u user_name /file/owned/by/user "User Description" /home/dir /path/to/shell
|
||||
g group_name gid
|
||||
g group_name /file/owned/by/group
|
||||
#Type Name ID GECOS Home directory Shell
|
||||
u user_name uid "User Description" /path/to/shell
|
||||
u user_name uid:gid - -
|
||||
u user_name /file/owned/by/user - -
|
||||
g group_name gid "Group Description"
|
||||
g group_name /file/owned/by/group -
|
||||
m user_name group_name
|
||||
r - lowest-highest</programlisting>
|
||||
</refsynopsisdiv>
|
||||
|
||||
@ -1500,6 +1500,7 @@ static int do_unit_files(int argc, char *argv[], void *userdata) {
|
||||
_cleanup_hashmap_free_ Hashmap *unit_ids = NULL;
|
||||
_cleanup_hashmap_free_ Hashmap *unit_names = NULL;
|
||||
char **patterns = strv_skip(argv, 1);
|
||||
Iterator i;
|
||||
const char *k, *dst;
|
||||
char **v;
|
||||
int r;
|
||||
@ -1512,7 +1513,7 @@ static int do_unit_files(int argc, char *argv[], void *userdata) {
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "unit_file_build_name_map() failed: %m");
|
||||
|
||||
HASHMAP_FOREACH_KEY(dst, k, unit_ids) {
|
||||
HASHMAP_FOREACH_KEY(dst, k, unit_ids, i) {
|
||||
if (!strv_fnmatch_or_empty(patterns, k, FNM_NOESCAPE) &&
|
||||
!strv_fnmatch_or_empty(patterns, dst, FNM_NOESCAPE))
|
||||
continue;
|
||||
@ -1520,7 +1521,7 @@ static int do_unit_files(int argc, char *argv[], void *userdata) {
|
||||
printf("ids: %s → %s\n", k, dst);
|
||||
}
|
||||
|
||||
HASHMAP_FOREACH_KEY(v, k, unit_names) {
|
||||
HASHMAP_FOREACH_KEY(v, k, unit_names, i) {
|
||||
if (!strv_fnmatch_or_empty(patterns, k, FNM_NOESCAPE) &&
|
||||
!strv_fnmatch_strv_or_empty(patterns, v, FNM_NOESCAPE))
|
||||
continue;
|
||||
|
||||
@ -315,15 +315,6 @@ int btrfs_get_block_device_fd(int fd, dev_t *dev) {
|
||||
return -errno;
|
||||
}
|
||||
|
||||
/* For the root fs — when no initrd is involved — btrfs returns /dev/root on any kernels from
|
||||
* the past few years. That sucks, as we have no API to determine the actual root then. let's
|
||||
* return an recognizable error for this case, so that the caller can maybe print a nice
|
||||
* message about this.
|
||||
*
|
||||
* https://bugzilla.kernel.org/show_bug.cgi?id=89721 */
|
||||
if (path_equal((char*) di.path, "/dev/root"))
|
||||
return -EUCLEAN;
|
||||
|
||||
if (stat((char*) di.path, &st) < 0)
|
||||
return -errno;
|
||||
|
||||
|
||||
@ -121,9 +121,3 @@ int btrfs_qgroup_find_parents(int fd, uint64_t qgroupid, uint64_t **ret);
|
||||
|
||||
int btrfs_qgroup_get_quota_fd(int fd, uint64_t qgroupid, BtrfsQuotaInfo *quota);
|
||||
int btrfs_qgroup_get_quota(const char *path, uint64_t qgroupid, BtrfsQuotaInfo *quota);
|
||||
|
||||
static inline int btrfs_log_dev_root(int level, int ret, const char *p) {
|
||||
return log_full_errno(level, ret,
|
||||
"File system behind %s is reported by btrfs to be backed by pseudo-device /dev/root, which is not a valid userspace accessible device node. "
|
||||
"Cannot determine correct backing block device.", p);
|
||||
}
|
||||
|
||||
@ -407,25 +407,17 @@ static inline char** ordered_hashmap_get_strv(OrderedHashmap *h) {
|
||||
* the entries were inserted.
|
||||
* It is safe to remove the current entry.
|
||||
*/
|
||||
#define _HASHMAP_FOREACH(e, h, i) \
|
||||
for (Iterator i = ITERATOR_FIRST; hashmap_iterate((h), &i, (void**)&(e), NULL); )
|
||||
#define HASHMAP_FOREACH(e, h) \
|
||||
_HASHMAP_FOREACH(e, h, UNIQ_T(i, UNIQ))
|
||||
#define HASHMAP_FOREACH(e, h, i) \
|
||||
for ((i) = ITERATOR_FIRST; hashmap_iterate((h), &(i), (void**)&(e), NULL); )
|
||||
|
||||
#define _ORDERED_HASHMAP_FOREACH(e, h, i) \
|
||||
for (Iterator i = ITERATOR_FIRST; ordered_hashmap_iterate((h), &i, (void**)&(e), NULL); )
|
||||
#define ORDERED_HASHMAP_FOREACH(e, h) \
|
||||
_ORDERED_HASHMAP_FOREACH(e, h, UNIQ_T(i, UNIQ))
|
||||
#define ORDERED_HASHMAP_FOREACH(e, h, i) \
|
||||
for ((i) = ITERATOR_FIRST; ordered_hashmap_iterate((h), &(i), (void**)&(e), NULL); )
|
||||
|
||||
#define _HASHMAP_FOREACH_KEY(e, k, h, i) \
|
||||
for (Iterator i = ITERATOR_FIRST; hashmap_iterate((h), &i, (void**)&(e), (const void**) &(k)); )
|
||||
#define HASHMAP_FOREACH_KEY(e, k, h) \
|
||||
_HASHMAP_FOREACH_KEY(e, k, h, UNIQ_T(i, UNIQ))
|
||||
#define HASHMAP_FOREACH_KEY(e, k, h, i) \
|
||||
for ((i) = ITERATOR_FIRST; hashmap_iterate((h), &(i), (void**)&(e), (const void**) &(k)); )
|
||||
|
||||
#define _ORDERED_HASHMAP_FOREACH_KEY(e, k, h, i) \
|
||||
for (Iterator i = ITERATOR_FIRST; ordered_hashmap_iterate((h), &i, (void**)&(e), (const void**) &(k)); )
|
||||
#define ORDERED_HASHMAP_FOREACH_KEY(e, k, h) \
|
||||
_ORDERED_HASHMAP_FOREACH_KEY(e, k, h, UNIQ_T(i, UNIQ))
|
||||
#define ORDERED_HASHMAP_FOREACH_KEY(e, k, h, i) \
|
||||
for ((i) = ITERATOR_FIRST; ordered_hashmap_iterate((h), &(i), (void**)&(e), (const void**) &(k)); )
|
||||
|
||||
DEFINE_TRIVIAL_CLEANUP_FUNC(Hashmap*, hashmap_free);
|
||||
DEFINE_TRIVIAL_CLEANUP_FUNC(Hashmap*, hashmap_free_free);
|
||||
|
||||
@ -234,12 +234,12 @@ void log_assert_failed_return_realm(
|
||||
#define log_full_errno(level, error, ...) \
|
||||
log_full_errno_realm(LOG_REALM, (level), (error), __VA_ARGS__)
|
||||
|
||||
#define log_full(level, ...) (void) log_full_errno((level), 0, __VA_ARGS__)
|
||||
#define log_full(level, ...) log_full_errno((level), 0, __VA_ARGS__)
|
||||
|
||||
int log_emergency_level(void);
|
||||
|
||||
/* Normal logging */
|
||||
#define log_debug(...) log_full_errno(LOG_DEBUG, 0, __VA_ARGS__)
|
||||
#define log_debug(...) log_full(LOG_DEBUG, __VA_ARGS__)
|
||||
#define log_info(...) log_full(LOG_INFO, __VA_ARGS__)
|
||||
#define log_notice(...) log_full(LOG_NOTICE, __VA_ARGS__)
|
||||
#define log_warning(...) log_full(LOG_WARNING, __VA_ARGS__)
|
||||
|
||||
@ -70,11 +70,12 @@ int ordered_set_put_strdupv(OrderedSet *s, char **l) {
|
||||
|
||||
int ordered_set_put_string_set(OrderedSet *s, OrderedSet *l) {
|
||||
int n = 0, r;
|
||||
Iterator i;
|
||||
char *p;
|
||||
|
||||
/* Like ordered_set_put_strv, but for an OrderedSet of strings */
|
||||
|
||||
ORDERED_SET_FOREACH(p, l) {
|
||||
ORDERED_SET_FOREACH(p, l, i) {
|
||||
r = ordered_set_put_strdup(s, p);
|
||||
if (r < 0)
|
||||
return r;
|
||||
@ -87,6 +88,7 @@ int ordered_set_put_string_set(OrderedSet *s, OrderedSet *l) {
|
||||
|
||||
void ordered_set_print(FILE *f, const char *field, OrderedSet *s) {
|
||||
bool space = false;
|
||||
Iterator i;
|
||||
char *p;
|
||||
|
||||
if (ordered_set_isempty(s))
|
||||
@ -94,7 +96,7 @@ void ordered_set_print(FILE *f, const char *field, OrderedSet *s) {
|
||||
|
||||
fputs(field, f);
|
||||
|
||||
ORDERED_SET_FOREACH(p, s)
|
||||
ORDERED_SET_FOREACH(p, s, i)
|
||||
fputs_with_space(f, p, NULL, &space);
|
||||
|
||||
fputc('\n', f);
|
||||
|
||||
@ -64,10 +64,8 @@ int ordered_set_put_strdupv(OrderedSet *s, char **l);
|
||||
int ordered_set_put_string_set(OrderedSet *s, OrderedSet *l);
|
||||
void ordered_set_print(FILE *f, const char *field, OrderedSet *s);
|
||||
|
||||
#define _ORDERED_SET_FOREACH(e, s, i) \
|
||||
for (Iterator i = ITERATOR_FIRST; ordered_set_iterate((s), &i, (void**)&(e)); )
|
||||
#define ORDERED_SET_FOREACH(e, s) \
|
||||
_ORDERED_SET_FOREACH(e, s, UNIQ_T(i, UNIQ))
|
||||
#define ORDERED_SET_FOREACH(e, s, i) \
|
||||
for ((i) = ITERATOR_FIRST; ordered_set_iterate((s), &(i), (void**)&(e)); )
|
||||
|
||||
DEFINE_TRIVIAL_CLEANUP_FUNC(OrderedSet*, ordered_set_free);
|
||||
DEFINE_TRIVIAL_CLEANUP_FUNC(OrderedSet*, ordered_set_free_free);
|
||||
|
||||
@ -34,7 +34,7 @@ int quotactl_path(int cmd, const char *path, int id, void *addr) {
|
||||
r = get_block_device(path, &devno);
|
||||
if (r < 0)
|
||||
return r;
|
||||
if (devno == 0) /* Doesn't have a block device */
|
||||
if (devno == 0)
|
||||
return -ENODEV;
|
||||
|
||||
return quotactl_devno(cmd, devno, id, addr);
|
||||
|
||||
@ -135,10 +135,8 @@ int _set_put_strdupv(Set **s, char **l HASHMAP_DEBUG_PARAMS);
|
||||
|
||||
int set_put_strsplit(Set *s, const char *v, const char *separators, ExtractFlags flags);
|
||||
|
||||
#define _SET_FOREACH(e, s, i) \
|
||||
for (Iterator i = ITERATOR_FIRST; set_iterate((s), &i, (void**)&(e)); )
|
||||
#define SET_FOREACH(e, s) \
|
||||
_SET_FOREACH(e, s, UNIQ_T(i, UNIQ))
|
||||
#define SET_FOREACH(e, s, i) \
|
||||
for ((i) = ITERATOR_FIRST; set_iterate((s), &(i), (void**)&(e)); )
|
||||
|
||||
#define SET_FOREACH_MOVE(e, d, s) \
|
||||
for (; ({ e = set_first(s); assert_se(!e || set_move_one(d, s, e) >= 0); e; }); )
|
||||
|
||||
@ -145,6 +145,7 @@ static int list_bus_names(int argc, char **argv, void *userdata) {
|
||||
_cleanup_(sd_bus_flush_close_unrefp) sd_bus *bus = NULL;
|
||||
_cleanup_hashmap_free_ Hashmap *names = NULL;
|
||||
_cleanup_(table_unrefp) Table *table = NULL;
|
||||
Iterator iterator;
|
||||
char **i, *k;
|
||||
void *v;
|
||||
int r;
|
||||
@ -246,7 +247,7 @@ static int list_bus_names(int argc, char **argv, void *userdata) {
|
||||
|
||||
table_set_header(table, arg_legend);
|
||||
|
||||
HASHMAP_FOREACH_KEY(v, k, names) {
|
||||
HASHMAP_FOREACH_KEY(v, k, names, iterator) {
|
||||
_cleanup_(sd_bus_creds_unrefp) sd_bus_creds *creds = NULL;
|
||||
|
||||
if (v == NAME_IS_ACTIVATABLE) {
|
||||
@ -985,6 +986,7 @@ static int introspect(int argc, char **argv, void *userdata) {
|
||||
_cleanup_(member_set_freep) Set *members = NULL;
|
||||
unsigned name_width, type_width, signature_width, result_width, j, k = 0;
|
||||
Member *m, **sorted = NULL;
|
||||
Iterator i;
|
||||
const char *xml;
|
||||
int r;
|
||||
|
||||
@ -1020,7 +1022,7 @@ static int introspect(int argc, char **argv, void *userdata) {
|
||||
return r;
|
||||
|
||||
/* Second, find the current values for them */
|
||||
SET_FOREACH(m, members) {
|
||||
SET_FOREACH(m, members, i) {
|
||||
_cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
|
||||
|
||||
if (!streq(m->type, "property"))
|
||||
@ -1103,7 +1105,7 @@ static int introspect(int argc, char **argv, void *userdata) {
|
||||
|
||||
sorted = newa(Member*, set_size(members));
|
||||
|
||||
SET_FOREACH(m, members) {
|
||||
SET_FOREACH(m, members, i) {
|
||||
if (argv[3] && !streq(argv[3], m->interface))
|
||||
continue;
|
||||
|
||||
|
||||
@ -582,6 +582,7 @@ static int group_compare(Group * const *a, Group * const *b) {
|
||||
}
|
||||
|
||||
static void display(Hashmap *a) {
|
||||
Iterator i;
|
||||
Group *g;
|
||||
Group **array;
|
||||
signed path_columns;
|
||||
@ -595,7 +596,7 @@ static void display(Hashmap *a) {
|
||||
|
||||
array = newa(Group*, hashmap_size(a));
|
||||
|
||||
HASHMAP_FOREACH(g, a)
|
||||
HASHMAP_FOREACH(g, a, i)
|
||||
if (g->n_tasks_valid || g->cpu_valid || g->memory_valid || g->io_valid)
|
||||
array[n++] = g;
|
||||
|
||||
|
||||
@ -850,6 +850,7 @@ static int automount_stop(Unit *u) {
|
||||
|
||||
static int automount_serialize(Unit *u, FILE *f, FDSet *fds) {
|
||||
Automount *a = AUTOMOUNT(u);
|
||||
Iterator i;
|
||||
void *p;
|
||||
int r;
|
||||
|
||||
@ -861,9 +862,9 @@ static int automount_serialize(Unit *u, FILE *f, FDSet *fds) {
|
||||
(void) serialize_item(f, "result", automount_result_to_string(a->result));
|
||||
(void) serialize_item_format(f, "dev-id", "%lu", (unsigned long) a->dev_id);
|
||||
|
||||
SET_FOREACH(p, a->tokens)
|
||||
SET_FOREACH(p, a->tokens, i)
|
||||
(void) serialize_item_format(f, "token", "%u", PTR_TO_UINT(p));
|
||||
SET_FOREACH(p, a->expire_tokens)
|
||||
SET_FOREACH(p, a->expire_tokens, i)
|
||||
(void) serialize_item_format(f, "expire-token", "%u", PTR_TO_UINT(p));
|
||||
|
||||
r = serialize_fd(f, fds, "pipe-fd", a->pipe_fd);
|
||||
|
||||
@ -646,13 +646,14 @@ int bpf_firewall_load_custom(Unit *u) {
|
||||
|
||||
static int attach_custom_bpf_progs(Unit *u, const char *path, int attach_type, Set **set, Set **set_installed) {
|
||||
BPFProgram *prog;
|
||||
Iterator i;
|
||||
int r;
|
||||
|
||||
assert(u);
|
||||
|
||||
set_clear(*set_installed);
|
||||
|
||||
SET_FOREACH(prog, *set) {
|
||||
SET_FOREACH(prog, *set, i) {
|
||||
r = bpf_program_cgroup_attach(prog, attach_type, path, BPF_F_ALLOW_MULTI);
|
||||
if (r < 0)
|
||||
return log_unit_error_errno(u, r, "Attaching custom egress BPF program to cgroup %s failed: %m", path);
|
||||
|
||||
@ -1516,8 +1516,9 @@ CGroupMask unit_get_members_mask(Unit *u) {
|
||||
if (u->type == UNIT_SLICE) {
|
||||
void *v;
|
||||
Unit *member;
|
||||
Iterator i;
|
||||
|
||||
HASHMAP_FOREACH_KEY(v, member, u->dependencies[UNIT_BEFORE])
|
||||
HASHMAP_FOREACH_KEY(v, member, u->dependencies[UNIT_BEFORE], i)
|
||||
if (UNIT_DEREF(member->slice) == u)
|
||||
u->cgroup_members_mask |= unit_get_subtree_mask(member); /* note that this calls ourselves again, for the children */
|
||||
}
|
||||
@ -1939,6 +1940,7 @@ static int unit_attach_pid_to_cgroup_via_bus(Unit *u, pid_t pid, const char *suf
|
||||
int unit_attach_pids_to_cgroup(Unit *u, Set *pids, const char *suffix_path) {
|
||||
CGroupMask delegated_mask;
|
||||
const char *p;
|
||||
Iterator i;
|
||||
void *pidp;
|
||||
int r, q;
|
||||
|
||||
@ -1968,7 +1970,7 @@ int unit_attach_pids_to_cgroup(Unit *u, Set *pids, const char *suffix_path) {
|
||||
delegated_mask = unit_get_delegate_mask(u);
|
||||
|
||||
r = 0;
|
||||
SET_FOREACH(pidp, pids) {
|
||||
SET_FOREACH(pidp, pids, i) {
|
||||
pid_t pid = PTR_TO_PID(pidp);
|
||||
CGroupController c;
|
||||
|
||||
@ -2156,6 +2158,7 @@ static int unit_realize_cgroup_now_enable(Unit *u, ManagerState state) {
|
||||
/* Controllers can only be disabled depth-first, from the leaves of the
|
||||
* hierarchy upwards to the unit in question. */
|
||||
static int unit_realize_cgroup_now_disable(Unit *u, ManagerState state) {
|
||||
Iterator i;
|
||||
Unit *m;
|
||||
void *v;
|
||||
|
||||
@ -2164,7 +2167,7 @@ static int unit_realize_cgroup_now_disable(Unit *u, ManagerState state) {
|
||||
if (u->type != UNIT_SLICE)
|
||||
return 0;
|
||||
|
||||
HASHMAP_FOREACH_KEY(v, m, u->dependencies[UNIT_BEFORE]) {
|
||||
HASHMAP_FOREACH_KEY(v, m, u->dependencies[UNIT_BEFORE], i) {
|
||||
CGroupMask target_mask, enable_mask, new_target_mask, new_enable_mask;
|
||||
int r;
|
||||
|
||||
@ -2328,13 +2331,14 @@ void unit_add_family_to_cgroup_realize_queue(Unit *u) {
|
||||
* masks. */
|
||||
|
||||
do {
|
||||
Iterator i;
|
||||
Unit *m;
|
||||
void *v;
|
||||
|
||||
/* Children of u likely changed when we're called */
|
||||
u->cgroup_members_mask_valid = false;
|
||||
|
||||
HASHMAP_FOREACH_KEY(v, m, u->dependencies[UNIT_BEFORE]) {
|
||||
HASHMAP_FOREACH_KEY(v, m, u->dependencies[UNIT_BEFORE], i) {
|
||||
/* Skip units that have a dependency on the slice but aren't actually in it. */
|
||||
if (UNIT_DEREF(m->slice) != u)
|
||||
continue;
|
||||
@ -3523,9 +3527,10 @@ void unit_invalidate_cgroup_bpf(Unit *u) {
|
||||
* list of our children includes our own. */
|
||||
if (u->type == UNIT_SLICE) {
|
||||
Unit *member;
|
||||
Iterator i;
|
||||
void *v;
|
||||
|
||||
HASHMAP_FOREACH_KEY(v, member, u->dependencies[UNIT_BEFORE])
|
||||
HASHMAP_FOREACH_KEY(v, member, u->dependencies[UNIT_BEFORE], i)
|
||||
if (UNIT_DEREF(member->slice) == u)
|
||||
unit_invalidate_cgroup_bpf(member);
|
||||
}
|
||||
@ -3547,11 +3552,12 @@ bool unit_cgroup_delegate(Unit *u) {
|
||||
}
|
||||
|
||||
void manager_invalidate_startup_units(Manager *m) {
|
||||
Iterator i;
|
||||
Unit *u;
|
||||
|
||||
assert(m);
|
||||
|
||||
SET_FOREACH(u, m->startup_units)
|
||||
SET_FOREACH(u, m->startup_units, i)
|
||||
unit_invalidate_cgroup(u, CGROUP_MASK_CPU|CGROUP_MASK_IO|CGROUP_MASK_BLKIO);
|
||||
}
|
||||
|
||||
@ -3602,9 +3608,6 @@ int unit_cgroup_freezer_action(Unit *u, FreezerAction action) {
|
||||
assert(u);
|
||||
assert(IN_SET(action, FREEZER_FREEZE, FREEZER_THAW));
|
||||
|
||||
if (!cg_freezer_supported())
|
||||
return 0;
|
||||
|
||||
if (!u->cgroup_realized)
|
||||
return -EBUSY;
|
||||
|
||||
|
||||
@ -79,9 +79,10 @@ static int vl_method_get_user_record(Varlink *link, JsonVariant *parameters, Var
|
||||
else if (p.user_name)
|
||||
r = dynamic_user_lookup_name(m, p.user_name, &found_uid);
|
||||
else {
|
||||
Iterator i;
|
||||
DynamicUser *d;
|
||||
|
||||
HASHMAP_FOREACH(d, m->dynamic_users) {
|
||||
HASHMAP_FOREACH(d, m->dynamic_users, i) {
|
||||
r = dynamic_user_current(d, &uid);
|
||||
if (r == -EAGAIN) /* not realized yet? */
|
||||
continue;
|
||||
@ -188,8 +189,9 @@ static int vl_method_get_group_record(Varlink *link, JsonVariant *parameters, Va
|
||||
r = dynamic_user_lookup_name(m, p.group_name, (uid_t*) &found_gid);
|
||||
else {
|
||||
DynamicUser *d;
|
||||
Iterator i;
|
||||
|
||||
HASHMAP_FOREACH(d, m->dynamic_users) {
|
||||
HASHMAP_FOREACH(d, m->dynamic_users, i) {
|
||||
uid_t uid;
|
||||
|
||||
r = dynamic_user_current(d, &uid);
|
||||
|
||||
@ -360,6 +360,7 @@ static int property_get_syscall_filter(
|
||||
int r;
|
||||
|
||||
#if HAVE_SECCOMP
|
||||
Iterator i;
|
||||
void *id, *val;
|
||||
#endif
|
||||
|
||||
@ -376,7 +377,7 @@ static int property_get_syscall_filter(
|
||||
return r;
|
||||
|
||||
#if HAVE_SECCOMP
|
||||
HASHMAP_FOREACH_KEY(val, id, c->syscall_filter) {
|
||||
HASHMAP_FOREACH_KEY(val, id, c->syscall_filter, i) {
|
||||
_cleanup_free_ char *name = NULL;
|
||||
const char *e = NULL;
|
||||
char *s;
|
||||
@ -429,6 +430,7 @@ static int property_get_syscall_archs(
|
||||
int r;
|
||||
|
||||
#if HAVE_SECCOMP
|
||||
Iterator i;
|
||||
void *id;
|
||||
#endif
|
||||
|
||||
@ -437,7 +439,7 @@ static int property_get_syscall_archs(
|
||||
assert(c);
|
||||
|
||||
#if HAVE_SECCOMP
|
||||
SET_FOREACH(id, c->syscall_archs) {
|
||||
SET_FOREACH(id, c->syscall_archs, i) {
|
||||
const char *name;
|
||||
|
||||
name = seccomp_arch_to_string(PTR_TO_UINT32(id) - 1);
|
||||
@ -524,6 +526,7 @@ static int property_get_address_families(
|
||||
|
||||
ExecContext *c = userdata;
|
||||
_cleanup_strv_free_ char **l = NULL;
|
||||
Iterator i;
|
||||
void *af;
|
||||
int r;
|
||||
|
||||
@ -539,7 +542,7 @@ static int property_get_address_families(
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
SET_FOREACH(af, c->address_families) {
|
||||
SET_FOREACH(af, c->address_families, i) {
|
||||
const char *name;
|
||||
|
||||
name = af_to_name(PTR_TO_INT(af));
|
||||
@ -756,6 +759,7 @@ static int property_get_set_credential(
|
||||
|
||||
ExecContext *c = userdata;
|
||||
ExecSetCredential *sc;
|
||||
Iterator iterator;
|
||||
int r;
|
||||
|
||||
assert(bus);
|
||||
@ -767,7 +771,7 @@ static int property_get_set_credential(
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
HASHMAP_FOREACH(sc, c->set_credentials) {
|
||||
HASHMAP_FOREACH(sc, c->set_credentials, iterator) {
|
||||
|
||||
r = sd_bus_message_open_container(reply, 'r', "say");
|
||||
if (r < 0)
|
||||
|
||||
@ -164,13 +164,14 @@ static int bus_job_enumerate(sd_bus *bus, const char *path, void *userdata, char
|
||||
_cleanup_strv_free_ char **l = NULL;
|
||||
Manager *m = userdata;
|
||||
unsigned k = 0;
|
||||
Iterator i;
|
||||
Job *j;
|
||||
|
||||
l = new0(char*, hashmap_size(m->jobs)+1);
|
||||
if (!l)
|
||||
return -ENOMEM;
|
||||
|
||||
HASHMAP_FOREACH(j, m->jobs) {
|
||||
HASHMAP_FOREACH(j, m->jobs, i) {
|
||||
l[k] = job_dbus_path(j);
|
||||
if (!l[k])
|
||||
return -ENOMEM;
|
||||
|
||||
@ -1058,6 +1058,7 @@ static int list_units_filtered(sd_bus_message *message, void *userdata, sd_bus_e
|
||||
_cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
|
||||
Manager *m = userdata;
|
||||
const char *k;
|
||||
Iterator i;
|
||||
Unit *u;
|
||||
int r;
|
||||
|
||||
@ -1078,7 +1079,7 @@ static int list_units_filtered(sd_bus_message *message, void *userdata, sd_bus_e
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
HASHMAP_FOREACH_KEY(u, k, m->units) {
|
||||
HASHMAP_FOREACH_KEY(u, k, m->units, i) {
|
||||
if (k != u->id)
|
||||
continue;
|
||||
|
||||
@ -1138,6 +1139,7 @@ static int method_list_units_by_patterns(sd_bus_message *message, void *userdata
|
||||
static int method_list_jobs(sd_bus_message *message, void *userdata, sd_bus_error *error) {
|
||||
_cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
|
||||
Manager *m = userdata;
|
||||
Iterator i;
|
||||
Job *j;
|
||||
int r;
|
||||
|
||||
@ -1158,7 +1160,7 @@ static int method_list_jobs(sd_bus_message *message, void *userdata, sd_bus_erro
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
HASHMAP_FOREACH(j, m->jobs) {
|
||||
HASHMAP_FOREACH(j, m->jobs, i) {
|
||||
_cleanup_free_ char *unit_path = NULL, *job_path = NULL;
|
||||
|
||||
job_path = job_dbus_path(j);
|
||||
@ -1757,6 +1759,7 @@ static int method_get_dynamic_users(sd_bus_message *message, void *userdata, sd_
|
||||
_cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
|
||||
Manager *m = userdata;
|
||||
DynamicUser *d;
|
||||
Iterator i;
|
||||
int r;
|
||||
|
||||
assert(message);
|
||||
@ -1775,7 +1778,7 @@ static int method_get_dynamic_users(sd_bus_message *message, void *userdata, sd_
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
HASHMAP_FOREACH(d, m->dynamic_users) {
|
||||
HASHMAP_FOREACH(d, m->dynamic_users, i) {
|
||||
uid_t uid;
|
||||
|
||||
r = dynamic_user_current(d, &uid);
|
||||
@ -1801,6 +1804,7 @@ static int list_unit_files_by_patterns(sd_bus_message *message, void *userdata,
|
||||
Manager *m = userdata;
|
||||
UnitFileList *item;
|
||||
Hashmap *h;
|
||||
Iterator i;
|
||||
int r;
|
||||
|
||||
assert(message);
|
||||
@ -1828,7 +1832,7 @@ static int list_unit_files_by_patterns(sd_bus_message *message, void *userdata,
|
||||
if (r < 0)
|
||||
goto fail;
|
||||
|
||||
HASHMAP_FOREACH(item, h) {
|
||||
HASHMAP_FOREACH(item, h, i) {
|
||||
|
||||
r = sd_bus_message_append(reply, "(ss)", item->path, unit_file_state_to_string(item->state));
|
||||
if (r < 0)
|
||||
|
||||
@ -42,6 +42,7 @@ static int property_get_exit_status_set(
|
||||
|
||||
const ExitStatusSet *status_set = userdata;
|
||||
unsigned n;
|
||||
Iterator i;
|
||||
int r;
|
||||
|
||||
assert(bus);
|
||||
@ -56,7 +57,7 @@ static int property_get_exit_status_set(
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
BITMAP_FOREACH(n, &status_set->status) {
|
||||
BITMAP_FOREACH(n, &status_set->status, i) {
|
||||
assert(n < 256);
|
||||
|
||||
r = sd_bus_message_append_basic(reply, 'i', &n);
|
||||
@ -72,7 +73,7 @@ static int property_get_exit_status_set(
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
BITMAP_FOREACH(n, &status_set->signal) {
|
||||
BITMAP_FOREACH(n, &status_set->signal, i) {
|
||||
const char *str;
|
||||
|
||||
str = signal_to_string(n);
|
||||
|
||||
@ -103,6 +103,7 @@ static int property_get_names(
|
||||
sd_bus_error *error) {
|
||||
|
||||
Unit *u = userdata;
|
||||
Iterator i;
|
||||
const char *t;
|
||||
int r;
|
||||
|
||||
@ -118,7 +119,7 @@ static int property_get_names(
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
SET_FOREACH(t, u->aliases) {
|
||||
SET_FOREACH(t, u->aliases, i) {
|
||||
r = sd_bus_message_append(reply, "s", t);
|
||||
if (r < 0)
|
||||
return r;
|
||||
@ -156,6 +157,7 @@ static int property_get_dependencies(
|
||||
sd_bus_error *error) {
|
||||
|
||||
Hashmap **h = userdata;
|
||||
Iterator j;
|
||||
Unit *u;
|
||||
void *v;
|
||||
int r;
|
||||
@ -168,7 +170,7 @@ static int property_get_dependencies(
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
HASHMAP_FOREACH_KEY(v, u, *h) {
|
||||
HASHMAP_FOREACH_KEY(v, u, *h, j) {
|
||||
r = sd_bus_message_append(reply, "s", u->id);
|
||||
if (r < 0)
|
||||
return r;
|
||||
@ -188,6 +190,7 @@ static int property_get_requires_mounts_for(
|
||||
|
||||
Hashmap **h = userdata;
|
||||
const char *p;
|
||||
Iterator j;
|
||||
void *v;
|
||||
int r;
|
||||
|
||||
@ -199,7 +202,7 @@ static int property_get_requires_mounts_for(
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
HASHMAP_FOREACH_KEY(v, p, *h) {
|
||||
HASHMAP_FOREACH_KEY(v, p, *h, j) {
|
||||
r = sd_bus_message_append(reply, "s", p);
|
||||
if (r < 0)
|
||||
return r;
|
||||
@ -1726,6 +1729,7 @@ int bus_unit_queue_job(
|
||||
_cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
|
||||
_cleanup_free_ char *job_path = NULL, *unit_path = NULL;
|
||||
_cleanup_set_free_ Set *affected = NULL;
|
||||
Iterator i;
|
||||
Job *j, *a;
|
||||
int r;
|
||||
|
||||
@ -1804,7 +1808,7 @@ int bus_unit_queue_job(
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
SET_FOREACH(a, affected) {
|
||||
SET_FOREACH(a, affected, i) {
|
||||
|
||||
if (a->id == j->id)
|
||||
continue;
|
||||
|
||||
@ -457,13 +457,14 @@ static int bus_unit_enumerate(sd_bus *bus, const char *path, void *userdata, cha
|
||||
_cleanup_strv_free_ char **l = NULL;
|
||||
Manager *m = userdata;
|
||||
unsigned k = 0;
|
||||
Iterator i;
|
||||
Unit *u;
|
||||
|
||||
l = new0(char*, hashmap_size(m->units)+1);
|
||||
if (!l)
|
||||
return -ENOMEM;
|
||||
|
||||
HASHMAP_FOREACH(u, m->units) {
|
||||
HASHMAP_FOREACH(u, m->units, i) {
|
||||
l[k] = unit_dbus_path(u);
|
||||
if (!l[k])
|
||||
return -ENOMEM;
|
||||
@ -766,6 +767,7 @@ static int bus_on_connection(sd_event_source *s, int fd, uint32_t revents, void
|
||||
}
|
||||
|
||||
static int bus_setup_api(Manager *m, sd_bus *bus) {
|
||||
Iterator i;
|
||||
char *name;
|
||||
Unit *u;
|
||||
int r;
|
||||
@ -785,7 +787,7 @@ static int bus_setup_api(Manager *m, sd_bus *bus) {
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
HASHMAP_FOREACH_KEY(u, name, m->watch_bus) {
|
||||
HASHMAP_FOREACH_KEY(u, name, m->watch_bus, i) {
|
||||
r = unit_install_bus_match(u, bus, name);
|
||||
if (r < 0)
|
||||
log_error_errno(r, "Failed to subscribe to NameOwnerChanged signal for '%s': %m", name);
|
||||
@ -974,6 +976,7 @@ int bus_init_private(Manager *m) {
|
||||
}
|
||||
|
||||
static void destroy_bus(Manager *m, sd_bus **bus) {
|
||||
Iterator i;
|
||||
Unit *u;
|
||||
Job *j;
|
||||
|
||||
@ -984,7 +987,7 @@ static void destroy_bus(Manager *m, sd_bus **bus) {
|
||||
return;
|
||||
|
||||
/* Make sure all bus slots watching names are released. */
|
||||
HASHMAP_FOREACH(u, m->watch_bus) {
|
||||
HASHMAP_FOREACH(u, m->watch_bus, i) {
|
||||
if (u->match_bus_slot && sd_bus_slot_get_bus(u->match_bus_slot) == *bus)
|
||||
u->match_bus_slot = sd_bus_slot_unref(u->match_bus_slot);
|
||||
if (u->get_name_owner_slot && sd_bus_slot_get_bus(u->get_name_owner_slot) == *bus)
|
||||
@ -995,11 +998,11 @@ static void destroy_bus(Manager *m, sd_bus **bus) {
|
||||
if (m->subscribed && sd_bus_track_get_bus(m->subscribed) == *bus)
|
||||
m->subscribed = sd_bus_track_unref(m->subscribed);
|
||||
|
||||
HASHMAP_FOREACH(j, m->jobs)
|
||||
HASHMAP_FOREACH(j, m->jobs, i)
|
||||
if (j->bus_track && sd_bus_track_get_bus(j->bus_track) == *bus)
|
||||
j->bus_track = sd_bus_track_unref(j->bus_track);
|
||||
|
||||
HASHMAP_FOREACH(u, m->units) {
|
||||
HASHMAP_FOREACH(u, m->units, i) {
|
||||
if (u->bus_track && sd_bus_track_get_bus(u->bus_track) == *bus)
|
||||
u->bus_track = sd_bus_track_unref(u->bus_track);
|
||||
|
||||
@ -1057,6 +1060,7 @@ void bus_done(Manager *m) {
|
||||
}
|
||||
|
||||
int bus_fdset_add_all(Manager *m, FDSet *fds) {
|
||||
Iterator i;
|
||||
sd_bus *b;
|
||||
int fd;
|
||||
|
||||
@ -1079,7 +1083,7 @@ int bus_fdset_add_all(Manager *m, FDSet *fds) {
|
||||
}
|
||||
}
|
||||
|
||||
SET_FOREACH(b, m->private_buses) {
|
||||
SET_FOREACH(b, m->private_buses, i) {
|
||||
fd = sd_bus_get_fd(b);
|
||||
if (fd >= 0) {
|
||||
fd = fdset_put_dup(fds, fd);
|
||||
@ -1101,11 +1105,12 @@ int bus_foreach_bus(
|
||||
int (*send_message)(sd_bus *bus, void *userdata),
|
||||
void *userdata) {
|
||||
|
||||
Iterator i;
|
||||
sd_bus *b;
|
||||
int r, ret = 0;
|
||||
|
||||
/* Send to all direct buses, unconditionally */
|
||||
SET_FOREACH(b, m->private_buses) {
|
||||
SET_FOREACH(b, m->private_buses, i) {
|
||||
|
||||
/* Don't bother with enqueuing these messages to clients that haven't started yet */
|
||||
if (sd_bus_is_ready(b) <= 0)
|
||||
@ -1186,12 +1191,13 @@ int bus_verify_set_environment_async(Manager *m, sd_bus_message *call, sd_bus_er
|
||||
|
||||
uint64_t manager_bus_n_queued_write(Manager *m) {
|
||||
uint64_t c = 0;
|
||||
Iterator i;
|
||||
sd_bus *b;
|
||||
int r;
|
||||
|
||||
/* Returns the total number of messages queued for writing on all our direct and API buses. */
|
||||
|
||||
SET_FOREACH(b, m->private_buses) {
|
||||
SET_FOREACH(b, m->private_buses, i) {
|
||||
uint64_t k;
|
||||
|
||||
r = sd_bus_get_n_queued_write(b, &k);
|
||||
|
||||
@ -468,12 +468,13 @@ static bool device_is_bound_by_mounts(Device *d, sd_device *dev) {
|
||||
|
||||
static void device_upgrade_mount_deps(Unit *u) {
|
||||
Unit *other;
|
||||
Iterator i;
|
||||
void *v;
|
||||
int r;
|
||||
|
||||
/* Let's upgrade Requires= to BindsTo= on us. (Used when SYSTEMD_MOUNT_DEVICE_BOUND is set) */
|
||||
|
||||
HASHMAP_FOREACH_KEY(v, other, u->dependencies[UNIT_REQUIRED_BY]) {
|
||||
HASHMAP_FOREACH_KEY(v, other, u->dependencies[UNIT_REQUIRED_BY], i) {
|
||||
if (other->type != UNIT_MOUNT)
|
||||
continue;
|
||||
|
||||
|
||||
@ -611,6 +611,7 @@ static DynamicUser* dynamic_user_destroy(DynamicUser *d) {
|
||||
|
||||
int dynamic_user_serialize(Manager *m, FILE *f, FDSet *fds) {
|
||||
DynamicUser *d;
|
||||
Iterator i;
|
||||
|
||||
assert(m);
|
||||
assert(f);
|
||||
@ -618,7 +619,7 @@ int dynamic_user_serialize(Manager *m, FILE *f, FDSet *fds) {
|
||||
|
||||
/* Dump the dynamic user database into the manager serialization, to deal with daemon reloads. */
|
||||
|
||||
HASHMAP_FOREACH(d, m->dynamic_users) {
|
||||
HASHMAP_FOREACH(d, m->dynamic_users, i) {
|
||||
int copy0, copy1;
|
||||
|
||||
copy0 = fdset_put_dup(fds, d->storage_socket[0]);
|
||||
@ -673,6 +674,7 @@ void dynamic_user_deserialize_one(Manager *m, const char *value, FDSet *fds) {
|
||||
|
||||
void dynamic_user_vacuum(Manager *m, bool close_user) {
|
||||
DynamicUser *d;
|
||||
Iterator i;
|
||||
|
||||
assert(m);
|
||||
|
||||
@ -680,7 +682,7 @@ void dynamic_user_vacuum(Manager *m, bool close_user) {
|
||||
* to which no reference exist. This is called after a daemon reload finished, in order to destroy users which
|
||||
* might not be referenced anymore. */
|
||||
|
||||
HASHMAP_FOREACH(d, m->dynamic_users) {
|
||||
HASHMAP_FOREACH(d, m->dynamic_users, i) {
|
||||
if (d->n_ref > 0)
|
||||
continue;
|
||||
|
||||
|
||||
@ -101,6 +101,8 @@
|
||||
#define SNDBUF_SIZE (8*1024*1024)
|
||||
|
||||
static int shift_fds(int fds[], size_t n_fds) {
|
||||
int start, restart_from;
|
||||
|
||||
if (n_fds <= 0)
|
||||
return 0;
|
||||
|
||||
@ -108,10 +110,13 @@ static int shift_fds(int fds[], size_t n_fds) {
|
||||
|
||||
assert(fds);
|
||||
|
||||
for (int start = 0;;) {
|
||||
int restart_from = -1;
|
||||
start = 0;
|
||||
for (;;) {
|
||||
int i;
|
||||
|
||||
for (int i = start; i < (int) n_fds; i++) {
|
||||
restart_from = -1;
|
||||
|
||||
for (i = start; i < (int) n_fds; i++) {
|
||||
int nfd;
|
||||
|
||||
/* Already at right index? */
|
||||
@ -141,7 +146,7 @@ static int shift_fds(int fds[], size_t n_fds) {
|
||||
}
|
||||
|
||||
static int flags_fds(const int fds[], size_t n_socket_fds, size_t n_storage_fds, bool nonblock) {
|
||||
size_t n_fds;
|
||||
size_t i, n_fds;
|
||||
int r;
|
||||
|
||||
n_fds = n_socket_fds + n_storage_fds;
|
||||
@ -153,7 +158,7 @@ static int flags_fds(const int fds[], size_t n_socket_fds, size_t n_storage_fds,
|
||||
/* Drops/Sets O_NONBLOCK and FD_CLOEXEC from the file flags.
|
||||
* O_NONBLOCK only applies to socket activation though. */
|
||||
|
||||
for (size_t i = 0; i < n_fds; i++) {
|
||||
for (i = 0; i < n_fds; i++) {
|
||||
|
||||
if (i < n_socket_fds) {
|
||||
r = fd_nonblock(fds[i], nonblock);
|
||||
@ -1740,6 +1745,7 @@ static int build_environment(
|
||||
char ***ret) {
|
||||
|
||||
_cleanup_strv_free_ char **our_env = NULL;
|
||||
ExecDirectoryType t;
|
||||
size_t n_env = 0;
|
||||
char *x;
|
||||
|
||||
@ -1867,7 +1873,7 @@ static int build_environment(
|
||||
our_env[n_env++] = x;
|
||||
}
|
||||
|
||||
for (ExecDirectoryType t = 0; t < _EXEC_DIRECTORY_TYPE_MAX; t++) {
|
||||
for (t = 0; t < _EXEC_DIRECTORY_TYPE_MAX; t++) {
|
||||
_cleanup_free_ char *pre = NULL, *joined = NULL;
|
||||
const char *n;
|
||||
|
||||
@ -1985,10 +1991,12 @@ static bool exec_needs_mount_namespace(
|
||||
return true;
|
||||
|
||||
if (context->root_directory) {
|
||||
ExecDirectoryType t;
|
||||
|
||||
if (context->mount_apivfs)
|
||||
return true;
|
||||
|
||||
for (ExecDirectoryType t = 0; t < _EXEC_DIRECTORY_TYPE_MAX; t++) {
|
||||
for (t = 0; t < _EXEC_DIRECTORY_TYPE_MAX; t++) {
|
||||
if (!params->prefix[t])
|
||||
continue;
|
||||
|
||||
@ -2475,6 +2483,7 @@ static int acquire_credentials(
|
||||
_cleanup_close_ int dfd = -1;
|
||||
ExecSetCredential *sc;
|
||||
char **id, **fn;
|
||||
Iterator iterator;
|
||||
int r;
|
||||
|
||||
assert(context);
|
||||
@ -2486,7 +2495,7 @@ static int acquire_credentials(
|
||||
|
||||
/* First we use the literally specified credentials. Note that they might be overriden again below,
|
||||
* and thus act as a "default" if the same credential is specified multiple times */
|
||||
HASHMAP_FOREACH(sc, context->set_credentials) {
|
||||
HASHMAP_FOREACH(sc, context->set_credentials, iterator) {
|
||||
size_t add;
|
||||
|
||||
add = strlen(sc->id) + sc->size;
|
||||
@ -2871,7 +2880,8 @@ static int compile_bind_mounts(
|
||||
|
||||
_cleanup_strv_free_ char **empty_directories = NULL;
|
||||
BindMount *bind_mounts;
|
||||
size_t n, h = 0;
|
||||
size_t n, h = 0, i;
|
||||
ExecDirectoryType t;
|
||||
int r;
|
||||
|
||||
assert(context);
|
||||
@ -2881,7 +2891,7 @@ static int compile_bind_mounts(
|
||||
assert(ret_empty_directories);
|
||||
|
||||
n = context->n_bind_mounts;
|
||||
for (ExecDirectoryType t = 0; t < _EXEC_DIRECTORY_TYPE_MAX; t++) {
|
||||
for (t = 0; t < _EXEC_DIRECTORY_TYPE_MAX; t++) {
|
||||
if (!params->prefix[t])
|
||||
continue;
|
||||
|
||||
@ -2899,7 +2909,7 @@ static int compile_bind_mounts(
|
||||
if (!bind_mounts)
|
||||
return -ENOMEM;
|
||||
|
||||
for (size_t i = 0; i < context->n_bind_mounts; i++) {
|
||||
for (i = 0; i < context->n_bind_mounts; i++) {
|
||||
BindMount *item = context->bind_mounts + i;
|
||||
char *s, *d;
|
||||
|
||||
@ -2925,7 +2935,7 @@ static int compile_bind_mounts(
|
||||
};
|
||||
}
|
||||
|
||||
for (ExecDirectoryType t = 0; t < _EXEC_DIRECTORY_TYPE_MAX; t++) {
|
||||
for (t = 0; t < _EXEC_DIRECTORY_TYPE_MAX; t++) {
|
||||
char **suffix;
|
||||
|
||||
if (!params->prefix[t])
|
||||
@ -3010,6 +3020,8 @@ static bool insist_on_sandboxing(
|
||||
const BindMount *bind_mounts,
|
||||
size_t n_bind_mounts) {
|
||||
|
||||
size_t i;
|
||||
|
||||
assert(context);
|
||||
assert(n_bind_mounts == 0 || bind_mounts);
|
||||
|
||||
@ -3031,7 +3043,7 @@ static bool insist_on_sandboxing(
|
||||
|
||||
/* If there are any bind mounts set that don't map back onto themselves, fs namespacing becomes
|
||||
* essential. */
|
||||
for (size_t i = 0; i < n_bind_mounts; i++)
|
||||
for (i = 0; i < n_bind_mounts; i++)
|
||||
if (!path_equal(bind_mounts[i].source, bind_mounts[i].destination))
|
||||
return true;
|
||||
|
||||
@ -3224,12 +3236,13 @@ static int apply_root_directory(
|
||||
assert(context);
|
||||
assert(exit_status);
|
||||
|
||||
if (params->flags & EXEC_APPLY_CHROOT)
|
||||
if (params->flags & EXEC_APPLY_CHROOT) {
|
||||
if (!needs_mount_ns && context->root_directory)
|
||||
if (chroot(context->root_directory) < 0) {
|
||||
*exit_status = EXIT_CHROOT;
|
||||
return -errno;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -3454,6 +3467,7 @@ static int acquire_home(const ExecContext *c, uid_t uid, const char** home, char
|
||||
|
||||
static int compile_suggested_paths(const ExecContext *c, const ExecParameters *p, char ***ret) {
|
||||
_cleanup_strv_free_ char ** list = NULL;
|
||||
ExecDirectoryType t;
|
||||
int r;
|
||||
|
||||
assert(c);
|
||||
@ -3466,7 +3480,7 @@ static int compile_suggested_paths(const ExecContext *c, const ExecParameters *p
|
||||
* dynamic UID allocation, in order to save us from doing costly recursive chown()s of the special
|
||||
* directories. */
|
||||
|
||||
for (ExecDirectoryType t = 0; t < _EXEC_DIRECTORY_TYPE_MAX; t++) {
|
||||
for (t = 0; t < _EXEC_DIRECTORY_TYPE_MAX; t++) {
|
||||
char **i;
|
||||
|
||||
if (t == EXEC_DIRECTORY_CONFIGURATION)
|
||||
@ -3601,6 +3615,7 @@ static int exec_child(
|
||||
uid_t uid = UID_INVALID;
|
||||
gid_t gid = GID_INVALID;
|
||||
size_t n_fds;
|
||||
ExecDirectoryType dt;
|
||||
int secure_bits;
|
||||
_cleanup_free_ gid_t *gids_after_pam = NULL;
|
||||
int ngids_after_pam = 0;
|
||||
@ -3939,7 +3954,7 @@ static int exec_child(
|
||||
}
|
||||
}
|
||||
|
||||
for (ExecDirectoryType dt = 0; dt < _EXEC_DIRECTORY_TYPE_MAX; dt++) {
|
||||
for (dt = 0; dt < _EXEC_DIRECTORY_TYPE_MAX; dt++) {
|
||||
r = setup_exec_directory(context, params, uid, gid, dt, exit_status);
|
||||
if (r < 0)
|
||||
return log_unit_error_errno(unit, r, "Failed to set up special execution directory in %s: %m", params->prefix[dt]);
|
||||
@ -4659,6 +4674,8 @@ int exec_spawn(Unit *unit,
|
||||
}
|
||||
|
||||
void exec_context_init(ExecContext *c) {
|
||||
ExecDirectoryType i;
|
||||
|
||||
assert(c);
|
||||
|
||||
c->umask = 0022;
|
||||
@ -4669,8 +4686,8 @@ void exec_context_init(ExecContext *c) {
|
||||
c->ignore_sigpipe = true;
|
||||
c->timer_slack_nsec = NSEC_INFINITY;
|
||||
c->personality = PERSONALITY_INVALID;
|
||||
for (ExecDirectoryType t = 0; t < _EXEC_DIRECTORY_TYPE_MAX; t++)
|
||||
c->directories[t].mode = 0755;
|
||||
for (i = 0; i < _EXEC_DIRECTORY_TYPE_MAX; i++)
|
||||
c->directories[i].mode = 0755;
|
||||
c->timeout_clean_usec = USEC_INFINITY;
|
||||
c->capability_bounding_set = CAP_ALL;
|
||||
assert_cc(NAMESPACE_FLAGS_INITIAL != NAMESPACE_FLAGS_ALL);
|
||||
@ -4680,6 +4697,9 @@ void exec_context_init(ExecContext *c) {
|
||||
}
|
||||
|
||||
void exec_context_done(ExecContext *c) {
|
||||
ExecDirectoryType i;
|
||||
size_t l;
|
||||
|
||||
assert(c);
|
||||
|
||||
c->environment = strv_free(c->environment);
|
||||
@ -4689,7 +4709,7 @@ void exec_context_done(ExecContext *c) {
|
||||
|
||||
rlimit_free_all(c->rlimit);
|
||||
|
||||
for (size_t l = 0; l < 3; l++) {
|
||||
for (l = 0; l < 3; l++) {
|
||||
c->stdio_fdname[l] = mfree(c->stdio_fdname[l]);
|
||||
c->stdio_file[l] = mfree(c->stdio_file[l]);
|
||||
}
|
||||
@ -4738,8 +4758,8 @@ void exec_context_done(ExecContext *c) {
|
||||
c->syscall_archs = set_free(c->syscall_archs);
|
||||
c->address_families = set_free(c->address_families);
|
||||
|
||||
for (ExecDirectoryType t = 0; t < _EXEC_DIRECTORY_TYPE_MAX; t++)
|
||||
c->directories[t].paths = strv_free(c->directories[t].paths);
|
||||
for (i = 0; i < _EXEC_DIRECTORY_TYPE_MAX; i++)
|
||||
c->directories[i].paths = strv_free(c->directories[i].paths);
|
||||
|
||||
c->log_level_max = -1;
|
||||
|
||||
@ -4832,17 +4852,23 @@ ExecCommand* exec_command_free_list(ExecCommand *c) {
|
||||
}
|
||||
|
||||
void exec_command_free_array(ExecCommand **c, size_t n) {
|
||||
for (size_t i = 0; i < n; i++)
|
||||
size_t i;
|
||||
|
||||
for (i = 0; i < n; i++)
|
||||
c[i] = exec_command_free_list(c[i]);
|
||||
}
|
||||
|
||||
void exec_command_reset_status_array(ExecCommand *c, size_t n) {
|
||||
for (size_t i = 0; i < n; i++)
|
||||
size_t i;
|
||||
|
||||
for (i = 0; i < n; i++)
|
||||
exec_status_reset(&c[i].exec_status);
|
||||
}
|
||||
|
||||
void exec_command_reset_status_list_array(ExecCommand **c, size_t n) {
|
||||
for (size_t i = 0; i < n; i++) {
|
||||
size_t i;
|
||||
|
||||
for (i = 0; i < n; i++) {
|
||||
ExecCommand *z;
|
||||
|
||||
LIST_FOREACH(command, z, c[i])
|
||||
@ -4894,7 +4920,7 @@ static int exec_context_named_iofds(
|
||||
const ExecParameters *p,
|
||||
int named_iofds[static 3]) {
|
||||
|
||||
size_t targets;
|
||||
size_t i, targets;
|
||||
const char* stdio_fdname[3];
|
||||
size_t n_fds;
|
||||
|
||||
@ -4906,12 +4932,12 @@ static int exec_context_named_iofds(
|
||||
(c->std_output == EXEC_OUTPUT_NAMED_FD) +
|
||||
(c->std_error == EXEC_OUTPUT_NAMED_FD);
|
||||
|
||||
for (size_t i = 0; i < 3; i++)
|
||||
for (i = 0; i < 3; i++)
|
||||
stdio_fdname[i] = exec_context_fdname(c, i);
|
||||
|
||||
n_fds = p->n_storage_fds + p->n_socket_fds;
|
||||
|
||||
for (size_t i = 0; i < n_fds && targets > 0; i++)
|
||||
for (i = 0; i < n_fds && targets > 0; i++)
|
||||
if (named_iofds[STDIN_FILENO] < 0 &&
|
||||
c->std_input == EXEC_INPUT_NAMED_FD &&
|
||||
stdio_fdname[STDIN_FILENO] &&
|
||||
@ -4949,6 +4975,7 @@ static int exec_context_load_environment(const Unit *unit, const ExecContext *c,
|
||||
STRV_FOREACH(i, c->environment_files) {
|
||||
char *fn;
|
||||
int k;
|
||||
unsigned n;
|
||||
bool ignore = false;
|
||||
char **p;
|
||||
_cleanup_globfree_ glob_t pglob = {};
|
||||
@ -4981,7 +5008,7 @@ static int exec_context_load_environment(const Unit *unit, const ExecContext *c,
|
||||
/* When we don't match anything, -ENOENT should be returned */
|
||||
assert(pglob.gl_pathc > 0);
|
||||
|
||||
for (unsigned n = 0; n < pglob.gl_pathc; n++) {
|
||||
for (n = 0; n < pglob.gl_pathc; n++) {
|
||||
k = load_env_file(NULL, pglob.gl_pathv[n], &p);
|
||||
if (k < 0) {
|
||||
if (ignore)
|
||||
@ -5068,6 +5095,8 @@ static void strv_fprintf(FILE *f, char **l) {
|
||||
|
||||
void exec_context_dump(const ExecContext *c, FILE* f, const char *prefix) {
|
||||
char **e, **d, buf_clean[FORMAT_TIMESPAN_MAX];
|
||||
ExecDirectoryType dt;
|
||||
unsigned i;
|
||||
int r;
|
||||
|
||||
assert(c);
|
||||
@ -5178,7 +5207,7 @@ void exec_context_dump(const ExecContext *c, FILE* f, const char *prefix) {
|
||||
|
||||
fprintf(f, "%sRuntimeDirectoryPreserve: %s\n", prefix, exec_preserve_mode_to_string(c->runtime_directory_preserve_mode));
|
||||
|
||||
for (ExecDirectoryType dt = 0; dt < _EXEC_DIRECTORY_TYPE_MAX; dt++) {
|
||||
for (dt = 0; dt < _EXEC_DIRECTORY_TYPE_MAX; dt++) {
|
||||
fprintf(f, "%s%sMode: %04o\n", prefix, exec_directory_type_to_string(dt), c->directories[dt].mode);
|
||||
|
||||
STRV_FOREACH(d, c->directories[dt].paths)
|
||||
@ -5204,7 +5233,7 @@ void exec_context_dump(const ExecContext *c, FILE* f, const char *prefix) {
|
||||
"%sCoredumpFilter: 0x%"PRIx64"\n",
|
||||
prefix, c->coredump_filter);
|
||||
|
||||
for (unsigned i = 0; i < RLIM_NLIMITS; i++)
|
||||
for (i = 0; i < RLIM_NLIMITS; i++)
|
||||
if (c->rlimit[i]) {
|
||||
fprintf(f, "%sLimit%s: " RLIM_FMT "\n",
|
||||
prefix, rlimit_to_string(i), c->rlimit[i]->rlim_max);
|
||||
@ -5332,12 +5361,16 @@ void exec_context_dump(const ExecContext *c, FILE* f, const char *prefix) {
|
||||
if (c->log_ratelimit_burst > 0)
|
||||
fprintf(f, "%sLogRateLimitBurst: %u\n", prefix, c->log_ratelimit_burst);
|
||||
|
||||
for (size_t j = 0; j < c->n_log_extra_fields; j++) {
|
||||
fprintf(f, "%sLogExtraFields: ", prefix);
|
||||
fwrite(c->log_extra_fields[j].iov_base,
|
||||
1, c->log_extra_fields[j].iov_len,
|
||||
f);
|
||||
fputc('\n', f);
|
||||
if (c->n_log_extra_fields > 0) {
|
||||
size_t j;
|
||||
|
||||
for (j = 0; j < c->n_log_extra_fields; j++) {
|
||||
fprintf(f, "%sLogExtraFields: ", prefix);
|
||||
fwrite(c->log_extra_fields[j].iov_base,
|
||||
1, c->log_extra_fields[j].iov_len,
|
||||
f);
|
||||
fputc('\n', f);
|
||||
}
|
||||
}
|
||||
|
||||
if (c->log_namespace)
|
||||
@ -5401,22 +5434,24 @@ void exec_context_dump(const ExecContext *c, FILE* f, const char *prefix) {
|
||||
fputs("\n", f);
|
||||
}
|
||||
|
||||
for (size_t i = 0; i < c->n_bind_mounts; i++)
|
||||
fprintf(f, "%s%s: %s%s:%s:%s\n", prefix,
|
||||
c->bind_mounts[i].read_only ? "BindReadOnlyPaths" : "BindPaths",
|
||||
c->bind_mounts[i].ignore_enoent ? "-": "",
|
||||
c->bind_mounts[i].source,
|
||||
c->bind_mounts[i].destination,
|
||||
c->bind_mounts[i].recursive ? "rbind" : "norbind");
|
||||
if (c->n_bind_mounts > 0)
|
||||
for (i = 0; i < c->n_bind_mounts; i++)
|
||||
fprintf(f, "%s%s: %s%s:%s:%s\n", prefix,
|
||||
c->bind_mounts[i].read_only ? "BindReadOnlyPaths" : "BindPaths",
|
||||
c->bind_mounts[i].ignore_enoent ? "-": "",
|
||||
c->bind_mounts[i].source,
|
||||
c->bind_mounts[i].destination,
|
||||
c->bind_mounts[i].recursive ? "rbind" : "norbind");
|
||||
|
||||
for (size_t i = 0; i < c->n_temporary_filesystems; i++) {
|
||||
const TemporaryFileSystem *t = c->temporary_filesystems + i;
|
||||
if (c->n_temporary_filesystems > 0)
|
||||
for (i = 0; i < c->n_temporary_filesystems; i++) {
|
||||
TemporaryFileSystem *t = c->temporary_filesystems + i;
|
||||
|
||||
fprintf(f, "%sTemporaryFileSystem: %s%s%s\n", prefix,
|
||||
t->path,
|
||||
isempty(t->options) ? "" : ":",
|
||||
strempty(t->options));
|
||||
}
|
||||
fprintf(f, "%sTemporaryFileSystem: %s%s%s\n", prefix,
|
||||
t->path,
|
||||
isempty(t->options) ? "" : ":",
|
||||
strempty(t->options));
|
||||
}
|
||||
|
||||
if (c->utmp_id)
|
||||
fprintf(f,
|
||||
@ -5449,6 +5484,7 @@ void exec_context_dump(const ExecContext *c, FILE* f, const char *prefix) {
|
||||
|
||||
if (c->syscall_filter) {
|
||||
#if HAVE_SECCOMP
|
||||
Iterator j;
|
||||
void *id, *val;
|
||||
bool first = true;
|
||||
#endif
|
||||
@ -5461,7 +5497,7 @@ void exec_context_dump(const ExecContext *c, FILE* f, const char *prefix) {
|
||||
fputc('~', f);
|
||||
|
||||
#if HAVE_SECCOMP
|
||||
HASHMAP_FOREACH_KEY(val, id, c->syscall_filter) {
|
||||
HASHMAP_FOREACH_KEY(val, id, c->syscall_filter, j) {
|
||||
_cleanup_free_ char *name = NULL;
|
||||
const char *errno_name = NULL;
|
||||
int num = PTR_TO_INT(val);
|
||||
@ -5489,6 +5525,7 @@ void exec_context_dump(const ExecContext *c, FILE* f, const char *prefix) {
|
||||
|
||||
if (c->syscall_archs) {
|
||||
#if HAVE_SECCOMP
|
||||
Iterator j;
|
||||
void *id;
|
||||
#endif
|
||||
|
||||
@ -5497,7 +5534,7 @@ void exec_context_dump(const ExecContext *c, FILE* f, const char *prefix) {
|
||||
prefix);
|
||||
|
||||
#if HAVE_SECCOMP
|
||||
SET_FOREACH(id, c->syscall_archs)
|
||||
SET_FOREACH(id, c->syscall_archs, j)
|
||||
fprintf(f, " %s", strna(seccomp_arch_to_string(PTR_TO_UINT32(id) - 1)));
|
||||
#endif
|
||||
fputc('\n', f);
|
||||
@ -5529,7 +5566,7 @@ void exec_context_dump(const ExecContext *c, FILE* f, const char *prefix) {
|
||||
fprintf(f, "%d\n", c->syscall_errno);
|
||||
}
|
||||
|
||||
for (size_t i = 0; i < c->n_mount_images; i++) {
|
||||
for (i = 0; i < c->n_mount_images; i++) {
|
||||
MountOptions *o;
|
||||
|
||||
fprintf(f, "%sMountImages: %s%s:%s%s", prefix,
|
||||
@ -5576,9 +5613,11 @@ int exec_context_get_effective_ioprio(const ExecContext *c) {
|
||||
}
|
||||
|
||||
void exec_context_free_log_extra_fields(ExecContext *c) {
|
||||
size_t l;
|
||||
|
||||
assert(c);
|
||||
|
||||
for (size_t l = 0; l < c->n_log_extra_fields; l++)
|
||||
for (l = 0; l < c->n_log_extra_fields; l++)
|
||||
free(c->log_extra_fields[l].iov_base);
|
||||
c->log_extra_fields = mfree(c->log_extra_fields);
|
||||
c->n_log_extra_fields = 0;
|
||||
@ -5615,13 +5654,14 @@ int exec_context_get_clean_directories(
|
||||
char ***ret) {
|
||||
|
||||
_cleanup_strv_free_ char **l = NULL;
|
||||
ExecDirectoryType t;
|
||||
int r;
|
||||
|
||||
assert(c);
|
||||
assert(prefix);
|
||||
assert(ret);
|
||||
|
||||
for (ExecDirectoryType t = 0; t < _EXEC_DIRECTORY_TYPE_MAX; t++) {
|
||||
for (t = 0; t < _EXEC_DIRECTORY_TYPE_MAX; t++) {
|
||||
char **i;
|
||||
|
||||
if (!FLAGS_SET(mask, 1U << t))
|
||||
@ -6060,12 +6100,13 @@ ExecRuntime *exec_runtime_unref(ExecRuntime *rt, bool destroy) {
|
||||
|
||||
int exec_runtime_serialize(const Manager *m, FILE *f, FDSet *fds) {
|
||||
ExecRuntime *rt;
|
||||
Iterator i;
|
||||
|
||||
assert(m);
|
||||
assert(f);
|
||||
assert(fds);
|
||||
|
||||
HASHMAP_FOREACH(rt, m->exec_runtime_by_id) {
|
||||
HASHMAP_FOREACH(rt, m->exec_runtime_by_id, i) {
|
||||
fprintf(f, "exec-runtime=%s", rt->id);
|
||||
|
||||
if (rt->tmp_dir)
|
||||
@ -6240,13 +6281,8 @@ int exec_runtime_deserialize_one(Manager *m, const char *value, FDSet *fds) {
|
||||
|
||||
n = strcspn(v, " ");
|
||||
buf = strndupa(v, n);
|
||||
|
||||
r = safe_atoi(buf, &fdpair[0]);
|
||||
if (r < 0)
|
||||
return log_debug_errno(r, "Unable to parse exec-runtime specification netns-socket-0=%s: %m", buf);
|
||||
if (!fdset_contains(fds, fdpair[0]))
|
||||
return log_debug_errno(SYNTHETIC_ERRNO(EBADF),
|
||||
"exec-runtime specification netns-socket-0= refers to unknown fd %d: %m", fdpair[0]);
|
||||
if (safe_atoi(buf, &fdpair[0]) < 0 || !fdset_contains(fds, fdpair[0]))
|
||||
return log_debug("Unable to process exec-runtime netns fd specification.");
|
||||
fdpair[0] = fdset_remove(fds, fdpair[0]);
|
||||
if (v[n] != ' ')
|
||||
goto finalize;
|
||||
@ -6259,12 +6295,8 @@ int exec_runtime_deserialize_one(Manager *m, const char *value, FDSet *fds) {
|
||||
|
||||
n = strcspn(v, " ");
|
||||
buf = strndupa(v, n);
|
||||
r = safe_atoi(buf, &fdpair[1]);
|
||||
if (r < 0)
|
||||
return log_debug_errno(r, "Unable to parse exec-runtime specification netns-socket-1=%s: %m", buf);
|
||||
if (!fdset_contains(fds, fdpair[0]))
|
||||
return log_debug_errno(SYNTHETIC_ERRNO(EBADF),
|
||||
"exec-runtime specification netns-socket-1= refers to unknown fd %d: %m", fdpair[1]);
|
||||
if (safe_atoi(buf, &fdpair[1]) < 0 || !fdset_contains(fds, fdpair[1]))
|
||||
return log_debug("Unable to process exec-runtime netns fd specification.");
|
||||
fdpair[1] = fdset_remove(fds, fdpair[1]);
|
||||
}
|
||||
|
||||
@ -6277,12 +6309,13 @@ finalize:
|
||||
|
||||
void exec_runtime_vacuum(Manager *m) {
|
||||
ExecRuntime *rt;
|
||||
Iterator i;
|
||||
|
||||
assert(m);
|
||||
|
||||
/* Free unreferenced ExecRuntime objects. This is used after manager deserialization process. */
|
||||
|
||||
HASHMAP_FOREACH(rt, m->exec_runtime_by_id) {
|
||||
HASHMAP_FOREACH(rt, m->exec_runtime_by_id, i) {
|
||||
if (rt->n_ref > 0)
|
||||
continue;
|
||||
|
||||
|
||||
@ -458,6 +458,7 @@ int job_type_merge_and_collapse(JobType *a, JobType b, Unit *u) {
|
||||
}
|
||||
|
||||
static bool job_is_runnable(Job *j) {
|
||||
Iterator i;
|
||||
Unit *other;
|
||||
void *v;
|
||||
|
||||
@ -481,7 +482,7 @@ static bool job_is_runnable(Job *j) {
|
||||
if (j->type == JOB_NOP)
|
||||
return true;
|
||||
|
||||
HASHMAP_FOREACH_KEY(v, other, j->unit->dependencies[UNIT_AFTER])
|
||||
HASHMAP_FOREACH_KEY(v, other, j->unit->dependencies[UNIT_AFTER], i)
|
||||
if (other->job && job_compare(j, other->job, UNIT_AFTER) > 0) {
|
||||
log_unit_debug(j->unit,
|
||||
"starting held back, waiting for: %s",
|
||||
@ -489,7 +490,7 @@ static bool job_is_runnable(Job *j) {
|
||||
return false;
|
||||
}
|
||||
|
||||
HASHMAP_FOREACH_KEY(v, other, j->unit->dependencies[UNIT_BEFORE])
|
||||
HASHMAP_FOREACH_KEY(v, other, j->unit->dependencies[UNIT_BEFORE], i)
|
||||
if (other->job && job_compare(j, other->job, UNIT_BEFORE) > 0) {
|
||||
log_unit_debug(j->unit,
|
||||
"stopping held back, waiting for: %s",
|
||||
@ -956,11 +957,12 @@ static void job_emit_done_status_message(Unit *u, uint32_t job_id, JobType t, Jo
|
||||
|
||||
static void job_fail_dependencies(Unit *u, UnitDependency d) {
|
||||
Unit *other;
|
||||
Iterator i;
|
||||
void *v;
|
||||
|
||||
assert(u);
|
||||
|
||||
HASHMAP_FOREACH_KEY(v, other, u->dependencies[d]) {
|
||||
HASHMAP_FOREACH_KEY(v, other, u->dependencies[d], i) {
|
||||
Job *j = other->job;
|
||||
|
||||
if (!j)
|
||||
@ -976,6 +978,7 @@ int job_finish_and_invalidate(Job *j, JobResult result, bool recursive, bool alr
|
||||
Unit *u;
|
||||
Unit *other;
|
||||
JobType t;
|
||||
Iterator i;
|
||||
void *v;
|
||||
|
||||
assert(j);
|
||||
@ -1069,12 +1072,12 @@ int job_finish_and_invalidate(Job *j, JobResult result, bool recursive, bool alr
|
||||
|
||||
finish:
|
||||
/* Try to start the next jobs that can be started */
|
||||
HASHMAP_FOREACH_KEY(v, other, u->dependencies[UNIT_AFTER])
|
||||
HASHMAP_FOREACH_KEY(v, other, u->dependencies[UNIT_AFTER], i)
|
||||
if (other->job) {
|
||||
job_add_to_run_queue(other->job);
|
||||
job_add_to_gc_queue(other->job);
|
||||
}
|
||||
HASHMAP_FOREACH_KEY(v, other, u->dependencies[UNIT_BEFORE])
|
||||
HASHMAP_FOREACH_KEY(v, other, u->dependencies[UNIT_BEFORE], i)
|
||||
if (other->job) {
|
||||
job_add_to_run_queue(other->job);
|
||||
job_add_to_gc_queue(other->job);
|
||||
@ -1424,6 +1427,7 @@ int job_get_timeout(Job *j, usec_t *timeout) {
|
||||
|
||||
bool job_may_gc(Job *j) {
|
||||
Unit *other;
|
||||
Iterator i;
|
||||
void *v;
|
||||
|
||||
assert(j);
|
||||
@ -1453,11 +1457,11 @@ bool job_may_gc(Job *j) {
|
||||
return false;
|
||||
|
||||
/* The logic is inverse to job_is_runnable, we cannot GC as long as we block any job. */
|
||||
HASHMAP_FOREACH_KEY(v, other, j->unit->dependencies[UNIT_BEFORE])
|
||||
HASHMAP_FOREACH_KEY(v, other, j->unit->dependencies[UNIT_BEFORE], i)
|
||||
if (other->job && job_compare(j, other->job, UNIT_BEFORE) < 0)
|
||||
return false;
|
||||
|
||||
HASHMAP_FOREACH_KEY(v, other, j->unit->dependencies[UNIT_AFTER])
|
||||
HASHMAP_FOREACH_KEY(v, other, j->unit->dependencies[UNIT_AFTER], i)
|
||||
if (other->job && job_compare(j, other->job, UNIT_AFTER) < 0)
|
||||
return false;
|
||||
|
||||
@ -1504,6 +1508,7 @@ int job_get_before(Job *j, Job*** ret) {
|
||||
_cleanup_free_ Job** list = NULL;
|
||||
size_t n = 0, n_allocated = 0;
|
||||
Unit *other = NULL;
|
||||
Iterator i;
|
||||
void *v;
|
||||
|
||||
/* Returns a list of all pending jobs that need to finish before this job may be started. */
|
||||
@ -1516,7 +1521,7 @@ int job_get_before(Job *j, Job*** ret) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
HASHMAP_FOREACH_KEY(v, other, j->unit->dependencies[UNIT_AFTER]) {
|
||||
HASHMAP_FOREACH_KEY(v, other, j->unit->dependencies[UNIT_AFTER], i) {
|
||||
if (!other->job)
|
||||
continue;
|
||||
if (job_compare(j, other->job, UNIT_AFTER) <= 0)
|
||||
@ -1527,7 +1532,7 @@ int job_get_before(Job *j, Job*** ret) {
|
||||
list[n++] = other->job;
|
||||
}
|
||||
|
||||
HASHMAP_FOREACH_KEY(v, other, j->unit->dependencies[UNIT_BEFORE]) {
|
||||
HASHMAP_FOREACH_KEY(v, other, j->unit->dependencies[UNIT_BEFORE], i) {
|
||||
if (!other->job)
|
||||
continue;
|
||||
if (job_compare(j, other->job, UNIT_BEFORE) <= 0)
|
||||
@ -1550,13 +1555,14 @@ int job_get_after(Job *j, Job*** ret) {
|
||||
size_t n = 0, n_allocated = 0;
|
||||
Unit *other = NULL;
|
||||
void *v;
|
||||
Iterator i;
|
||||
|
||||
assert(j);
|
||||
assert(ret);
|
||||
|
||||
/* Returns a list of all pending jobs that are waiting for this job to finish. */
|
||||
|
||||
HASHMAP_FOREACH_KEY(v, other, j->unit->dependencies[UNIT_BEFORE]) {
|
||||
HASHMAP_FOREACH_KEY(v, other, j->unit->dependencies[UNIT_BEFORE], i) {
|
||||
if (!other->job)
|
||||
continue;
|
||||
|
||||
@ -1571,7 +1577,7 @@ int job_get_after(Job *j, Job*** ret) {
|
||||
list[n++] = other->job;
|
||||
}
|
||||
|
||||
HASHMAP_FOREACH_KEY(v, other, j->unit->dependencies[UNIT_AFTER]) {
|
||||
HASHMAP_FOREACH_KEY(v, other, j->unit->dependencies[UNIT_AFTER], i) {
|
||||
if (!other->job)
|
||||
continue;
|
||||
|
||||
|
||||
@ -79,9 +79,10 @@ static bool ignore_proc(pid_t pid, bool warn_rootfs) {
|
||||
|
||||
static void log_children_no_yet_killed(Set *pids) {
|
||||
_cleanup_free_ char *lst_child = NULL;
|
||||
Iterator i;
|
||||
void *p;
|
||||
|
||||
SET_FOREACH(p, pids) {
|
||||
SET_FOREACH(p, pids, i) {
|
||||
_cleanup_free_ char *s = NULL;
|
||||
|
||||
if (get_process_comm(PTR_TO_PID(p), &s) < 0)
|
||||
@ -120,6 +121,7 @@ static int wait_for_children(Set *pids, sigset_t *mask, usec_t timeout) {
|
||||
struct timespec ts;
|
||||
int k;
|
||||
void *p;
|
||||
Iterator i;
|
||||
|
||||
/* First, let the kernel inform us about killed
|
||||
* children. Most processes will probably be our
|
||||
@ -143,7 +145,7 @@ static int wait_for_children(Set *pids, sigset_t *mask, usec_t timeout) {
|
||||
|
||||
/* Now explicitly check who might be remaining, who
|
||||
* might not be our child. */
|
||||
SET_FOREACH(p, pids) {
|
||||
SET_FOREACH(p, pids, i) {
|
||||
|
||||
/* kill(pid, 0) sends no signal, but it tells
|
||||
* us whether the process still exists. */
|
||||
|
||||
@ -198,6 +198,7 @@ static void manager_flip_auto_status(Manager *m, bool enable, const char *reason
|
||||
|
||||
static void manager_print_jobs_in_progress(Manager *m) {
|
||||
_cleanup_free_ char *job_of_n = NULL;
|
||||
Iterator i;
|
||||
Job *j;
|
||||
unsigned counter = 0, print_nr;
|
||||
char cylon[6 + CYLON_BUFFER_EXTRA + 1];
|
||||
@ -212,7 +213,7 @@ static void manager_print_jobs_in_progress(Manager *m) {
|
||||
|
||||
print_nr = (m->jobs_in_progress_iteration / JOBS_IN_PROGRESS_PERIOD_DIVISOR) % m->n_running_jobs;
|
||||
|
||||
HASHMAP_FOREACH(j, m->jobs)
|
||||
HASHMAP_FOREACH(j, m->jobs, i)
|
||||
if (j->state == JOB_RUNNING && counter++ == print_nr)
|
||||
break;
|
||||
|
||||
@ -671,19 +672,19 @@ static int manager_setup_prefix(Manager *m) {
|
||||
};
|
||||
|
||||
static const struct table_entry paths_system[_EXEC_DIRECTORY_TYPE_MAX] = {
|
||||
[EXEC_DIRECTORY_RUNTIME] = { SD_PATH_SYSTEM_RUNTIME, NULL },
|
||||
[EXEC_DIRECTORY_STATE] = { SD_PATH_SYSTEM_STATE_PRIVATE, NULL },
|
||||
[EXEC_DIRECTORY_CACHE] = { SD_PATH_SYSTEM_STATE_CACHE, NULL },
|
||||
[EXEC_DIRECTORY_LOGS] = { SD_PATH_SYSTEM_STATE_LOGS, NULL },
|
||||
[EXEC_DIRECTORY_RUNTIME] = { SD_PATH_SYSTEM_RUNTIME, NULL },
|
||||
[EXEC_DIRECTORY_STATE] = { SD_PATH_SYSTEM_STATE_PRIVATE, NULL },
|
||||
[EXEC_DIRECTORY_CACHE] = { SD_PATH_SYSTEM_STATE_CACHE, NULL },
|
||||
[EXEC_DIRECTORY_LOGS] = { SD_PATH_SYSTEM_STATE_LOGS, NULL },
|
||||
[EXEC_DIRECTORY_CONFIGURATION] = { SD_PATH_SYSTEM_CONFIGURATION, NULL },
|
||||
};
|
||||
|
||||
static const struct table_entry paths_user[_EXEC_DIRECTORY_TYPE_MAX] = {
|
||||
[EXEC_DIRECTORY_RUNTIME] = { SD_PATH_USER_RUNTIME, NULL },
|
||||
[EXEC_DIRECTORY_STATE] = { SD_PATH_USER_CONFIGURATION, NULL },
|
||||
[EXEC_DIRECTORY_CACHE] = { SD_PATH_USER_STATE_CACHE, NULL },
|
||||
[EXEC_DIRECTORY_LOGS] = { SD_PATH_USER_CONFIGURATION, "log" },
|
||||
[EXEC_DIRECTORY_CONFIGURATION] = { SD_PATH_USER_CONFIGURATION, NULL },
|
||||
[EXEC_DIRECTORY_RUNTIME] = { SD_PATH_USER_RUNTIME, NULL },
|
||||
[EXEC_DIRECTORY_STATE] = { SD_PATH_USER_CONFIGURATION, NULL },
|
||||
[EXEC_DIRECTORY_CACHE] = { SD_PATH_USER_STATE_CACHE, NULL },
|
||||
[EXEC_DIRECTORY_LOGS] = { SD_PATH_USER_CONFIGURATION, "log" },
|
||||
[EXEC_DIRECTORY_CONFIGURATION] = { SD_PATH_USER_CONFIGURATION, NULL },
|
||||
};
|
||||
|
||||
assert(m);
|
||||
@ -1146,12 +1147,13 @@ enum {
|
||||
|
||||
static void unit_gc_mark_good(Unit *u, unsigned gc_marker) {
|
||||
Unit *other;
|
||||
Iterator i;
|
||||
void *v;
|
||||
|
||||
u->gc_marker = gc_marker + GC_OFFSET_GOOD;
|
||||
|
||||
/* Recursively mark referenced units as GOOD as well */
|
||||
HASHMAP_FOREACH_KEY(v, other, u->dependencies[UNIT_REFERENCES])
|
||||
HASHMAP_FOREACH_KEY(v, other, u->dependencies[UNIT_REFERENCES], i)
|
||||
if (other->gc_marker == gc_marker + GC_OFFSET_UNSURE)
|
||||
unit_gc_mark_good(other, gc_marker);
|
||||
}
|
||||
@ -1159,6 +1161,7 @@ static void unit_gc_mark_good(Unit *u, unsigned gc_marker) {
|
||||
static void unit_gc_sweep(Unit *u, unsigned gc_marker) {
|
||||
Unit *other;
|
||||
bool is_bad;
|
||||
Iterator i;
|
||||
void *v;
|
||||
|
||||
assert(u);
|
||||
@ -1177,7 +1180,7 @@ static void unit_gc_sweep(Unit *u, unsigned gc_marker) {
|
||||
|
||||
is_bad = true;
|
||||
|
||||
HASHMAP_FOREACH_KEY(v, other, u->dependencies[UNIT_REFERENCED_BY]) {
|
||||
HASHMAP_FOREACH_KEY(v, other, u->dependencies[UNIT_REFERENCED_BY], i) {
|
||||
unit_gc_sweep(other, gc_marker);
|
||||
|
||||
if (other->gc_marker == gc_marker + GC_OFFSET_GOOD)
|
||||
@ -1471,6 +1474,7 @@ static void manager_enumerate(Manager *m) {
|
||||
}
|
||||
|
||||
static void manager_coldplug(Manager *m) {
|
||||
Iterator i;
|
||||
Unit *u;
|
||||
char *k;
|
||||
int r;
|
||||
@ -1480,7 +1484,7 @@ static void manager_coldplug(Manager *m) {
|
||||
log_debug("Invoking unit coldplug() handlers…");
|
||||
|
||||
/* Let's place the units back into their deserialized state */
|
||||
HASHMAP_FOREACH_KEY(u, k, m->units) {
|
||||
HASHMAP_FOREACH_KEY(u, k, m->units, i) {
|
||||
|
||||
/* ignore aliases */
|
||||
if (u->id != k)
|
||||
@ -1493,6 +1497,7 @@ static void manager_coldplug(Manager *m) {
|
||||
}
|
||||
|
||||
static void manager_catchup(Manager *m) {
|
||||
Iterator i;
|
||||
Unit *u;
|
||||
char *k;
|
||||
|
||||
@ -1501,7 +1506,7 @@ static void manager_catchup(Manager *m) {
|
||||
log_debug("Invoking unit catchup() handlers…");
|
||||
|
||||
/* Let's catch up on any state changes that happened while we were reloading/reexecing */
|
||||
HASHMAP_FOREACH_KEY(u, k, m->units) {
|
||||
HASHMAP_FOREACH_KEY(u, k, m->units, i) {
|
||||
|
||||
/* ignore aliases */
|
||||
if (u->id != k)
|
||||
@ -1512,11 +1517,12 @@ static void manager_catchup(Manager *m) {
|
||||
}
|
||||
|
||||
static void manager_distribute_fds(Manager *m, FDSet *fds) {
|
||||
Iterator i;
|
||||
Unit *u;
|
||||
|
||||
assert(m);
|
||||
|
||||
HASHMAP_FOREACH(u, m->units) {
|
||||
HASHMAP_FOREACH(u, m->units, i) {
|
||||
|
||||
if (fdset_size(fds) <= 0)
|
||||
break;
|
||||
@ -1877,6 +1883,7 @@ Unit *manager_get_unit(Manager *m, const char *name) {
|
||||
|
||||
static int manager_dispatch_target_deps_queue(Manager *m) {
|
||||
Unit *u;
|
||||
unsigned k;
|
||||
int r = 0;
|
||||
|
||||
static const UnitDependency deps[] = {
|
||||
@ -1894,11 +1901,12 @@ static int manager_dispatch_target_deps_queue(Manager *m) {
|
||||
LIST_REMOVE(target_deps_queue, u->manager->target_deps_queue, u);
|
||||
u->in_target_deps_queue = false;
|
||||
|
||||
for (size_t k = 0; k < ELEMENTSOF(deps); k++) {
|
||||
for (k = 0; k < ELEMENTSOF(deps); k++) {
|
||||
Unit *target;
|
||||
Iterator i;
|
||||
void *v;
|
||||
|
||||
HASHMAP_FOREACH_KEY(v, target, u->dependencies[deps[k]]) {
|
||||
HASHMAP_FOREACH_KEY(v, target, u->dependencies[deps[k]], i) {
|
||||
r = unit_add_default_target_dependency(u, target);
|
||||
if (r < 0)
|
||||
return r;
|
||||
@ -2091,32 +2099,36 @@ int manager_load_startable_unit_or_warn(
|
||||
}
|
||||
|
||||
void manager_dump_jobs(Manager *s, FILE *f, const char *prefix) {
|
||||
Iterator i;
|
||||
Job *j;
|
||||
|
||||
assert(s);
|
||||
assert(f);
|
||||
|
||||
HASHMAP_FOREACH(j, s->jobs)
|
||||
HASHMAP_FOREACH(j, s->jobs, i)
|
||||
job_dump(j, f, prefix);
|
||||
}
|
||||
|
||||
void manager_dump_units(Manager *s, FILE *f, const char *prefix) {
|
||||
Iterator i;
|
||||
Unit *u;
|
||||
const char *t;
|
||||
|
||||
assert(s);
|
||||
assert(f);
|
||||
|
||||
HASHMAP_FOREACH_KEY(u, t, s->units)
|
||||
HASHMAP_FOREACH_KEY(u, t, s->units, i)
|
||||
if (u->id == t)
|
||||
unit_dump(u, f, prefix);
|
||||
}
|
||||
|
||||
void manager_dump(Manager *m, FILE *f, const char *prefix) {
|
||||
ManagerTimestamp q;
|
||||
|
||||
assert(m);
|
||||
assert(f);
|
||||
|
||||
for (ManagerTimestamp q = 0; q < _MANAGER_TIMESTAMP_MAX; q++) {
|
||||
for (q = 0; q < _MANAGER_TIMESTAMP_MAX; q++) {
|
||||
const dual_timestamp *t = m->timestamps + q;
|
||||
char buf[CONST_MAX(FORMAT_TIMESPAN_MAX, FORMAT_TIMESTAMP_MAX)];
|
||||
|
||||
@ -2828,6 +2840,7 @@ static int manager_dispatch_signal_fd(sd_event_source *source, int fd, uint32_t
|
||||
|
||||
static int manager_dispatch_time_change_fd(sd_event_source *source, int fd, uint32_t revents, void *userdata) {
|
||||
Manager *m = userdata;
|
||||
Iterator i;
|
||||
Unit *u;
|
||||
|
||||
assert(m);
|
||||
@ -2840,7 +2853,7 @@ static int manager_dispatch_time_change_fd(sd_event_source *source, int fd, uint
|
||||
/* Restart the watch */
|
||||
(void) manager_setup_time_change(m);
|
||||
|
||||
HASHMAP_FOREACH(u, m->units)
|
||||
HASHMAP_FOREACH(u, m->units, i)
|
||||
if (UNIT_VTABLE(u)->time_change)
|
||||
UNIT_VTABLE(u)->time_change(u);
|
||||
|
||||
@ -2854,6 +2867,7 @@ static int manager_dispatch_timezone_change(
|
||||
|
||||
Manager *m = userdata;
|
||||
int changed;
|
||||
Iterator i;
|
||||
Unit *u;
|
||||
|
||||
assert(m);
|
||||
@ -2872,7 +2886,7 @@ static int manager_dispatch_timezone_change(
|
||||
|
||||
log_debug("Timezone has been changed (now: %s).", tzname[daylight]);
|
||||
|
||||
HASHMAP_FOREACH(u, m->units)
|
||||
HASHMAP_FOREACH(u, m->units, i)
|
||||
if (UNIT_VTABLE(u)->timezone_change)
|
||||
UNIT_VTABLE(u)->timezone_change(u);
|
||||
|
||||
@ -3175,6 +3189,7 @@ static void manager_serialize_uid_refs_internal(
|
||||
Hashmap **uid_refs,
|
||||
const char *field_name) {
|
||||
|
||||
Iterator i;
|
||||
void *p, *k;
|
||||
|
||||
assert(m);
|
||||
@ -3185,7 +3200,7 @@ static void manager_serialize_uid_refs_internal(
|
||||
/* Serialize the UID reference table. Or actually, just the IPC destruction flag of it, as
|
||||
* the actual counter of it is better rebuild after a reload/reexec. */
|
||||
|
||||
HASHMAP_FOREACH_KEY(p, k, *uid_refs) {
|
||||
HASHMAP_FOREACH_KEY(p, k, *uid_refs, i) {
|
||||
uint32_t c;
|
||||
uid_t uid;
|
||||
|
||||
@ -3213,7 +3228,9 @@ int manager_serialize(
|
||||
FDSet *fds,
|
||||
bool switching_root) {
|
||||
|
||||
ManagerTimestamp q;
|
||||
const char *t;
|
||||
Iterator i;
|
||||
Unit *u;
|
||||
int r;
|
||||
|
||||
@ -3247,7 +3264,7 @@ int manager_serialize(
|
||||
(void) serialize_usec(f, "reboot-watchdog-overridden", m->watchdog_overridden[WATCHDOG_REBOOT]);
|
||||
(void) serialize_usec(f, "kexec-watchdog-overridden", m->watchdog_overridden[WATCHDOG_KEXEC]);
|
||||
|
||||
for (ManagerTimestamp q = 0; q < _MANAGER_TIMESTAMP_MAX; q++) {
|
||||
for (q = 0; q < _MANAGER_TIMESTAMP_MAX; q++) {
|
||||
_cleanup_free_ char *joined = NULL;
|
||||
|
||||
if (!manager_timestamp_shall_serialize(q))
|
||||
@ -3306,7 +3323,7 @@ int manager_serialize(
|
||||
|
||||
(void) fputc('\n', f);
|
||||
|
||||
HASHMAP_FOREACH_KEY(u, t, m->units) {
|
||||
HASHMAP_FOREACH_KEY(u, t, m->units, i) {
|
||||
if (u->id != t)
|
||||
continue;
|
||||
|
||||
@ -3809,10 +3826,11 @@ int manager_reload(Manager *m) {
|
||||
|
||||
void manager_reset_failed(Manager *m) {
|
||||
Unit *u;
|
||||
Iterator i;
|
||||
|
||||
assert(m);
|
||||
|
||||
HASHMAP_FOREACH(u, m->units)
|
||||
HASHMAP_FOREACH(u, m->units, i)
|
||||
unit_reset_failed(u);
|
||||
}
|
||||
|
||||
@ -4175,9 +4193,11 @@ int manager_get_effective_environment(Manager *m, char ***ret) {
|
||||
}
|
||||
|
||||
int manager_set_default_rlimits(Manager *m, struct rlimit **default_rlimit) {
|
||||
int i;
|
||||
|
||||
assert(m);
|
||||
|
||||
for (unsigned i = 0; i < _RLIMIT_MAX; i++) {
|
||||
for (i = 0; i < _RLIMIT_MAX; i++) {
|
||||
m->rlimit[i] = mfree(m->rlimit[i]);
|
||||
|
||||
if (!default_rlimit[i])
|
||||
@ -4643,13 +4663,14 @@ static void manager_vacuum_uid_refs_internal(
|
||||
Hashmap **uid_refs,
|
||||
int (*_clean_ipc)(uid_t uid)) {
|
||||
|
||||
Iterator i;
|
||||
void *p, *k;
|
||||
|
||||
assert(m);
|
||||
assert(uid_refs);
|
||||
assert(_clean_ipc);
|
||||
|
||||
HASHMAP_FOREACH_KEY(p, k, *uid_refs) {
|
||||
HASHMAP_FOREACH_KEY(p, k, *uid_refs, i) {
|
||||
uint32_t c, n;
|
||||
uid_t uid;
|
||||
|
||||
|
||||
@ -281,6 +281,7 @@ static int update_parameters_proc_self_mountinfo(
|
||||
static int mount_add_mount_dependencies(Mount *m) {
|
||||
MountParameters *pm;
|
||||
Unit *other;
|
||||
Iterator i;
|
||||
Set *s;
|
||||
int r;
|
||||
|
||||
@ -314,7 +315,7 @@ static int mount_add_mount_dependencies(Mount *m) {
|
||||
|
||||
/* Adds in dependencies to other units that use this path or paths further down in the hierarchy */
|
||||
s = manager_get_units_requiring_mounts_for(UNIT(m)->manager, m->where);
|
||||
SET_FOREACH(other, s) {
|
||||
SET_FOREACH(other, s, i) {
|
||||
|
||||
if (other->load_state != UNIT_LOADED)
|
||||
continue;
|
||||
@ -1902,6 +1903,7 @@ static int drain_libmount(Manager *m) {
|
||||
static int mount_process_proc_self_mountinfo(Manager *m) {
|
||||
_cleanup_set_free_free_ Set *around = NULL, *gone = NULL;
|
||||
const char *what;
|
||||
Iterator i;
|
||||
Unit *u;
|
||||
int r;
|
||||
|
||||
@ -1999,7 +2001,7 @@ static int mount_process_proc_self_mountinfo(Manager *m) {
|
||||
mount->proc_flags = 0;
|
||||
}
|
||||
|
||||
SET_FOREACH(what, gone) {
|
||||
SET_FOREACH(what, gone, i) {
|
||||
if (set_contains(around, what))
|
||||
continue;
|
||||
|
||||
|
||||
@ -1273,12 +1273,13 @@ static int service_collect_fds(
|
||||
|
||||
rn_socket_fds = 1;
|
||||
} else {
|
||||
Iterator i;
|
||||
void *v;
|
||||
Unit *u;
|
||||
|
||||
/* Pass all our configured sockets for singleton services */
|
||||
|
||||
HASHMAP_FOREACH_KEY(v, u, UNIT(s)->dependencies[UNIT_TRIGGERED_BY]) {
|
||||
HASHMAP_FOREACH_KEY(v, u, UNIT(s)->dependencies[UNIT_TRIGGERED_BY], i) {
|
||||
_cleanup_free_ int *cfds = NULL;
|
||||
Socket *sock;
|
||||
int cn_fds;
|
||||
|
||||
@ -351,10 +351,11 @@ static void slice_enumerate_perpetual(Manager *m) {
|
||||
static bool slice_freezer_action_supported_by_children(Unit *s) {
|
||||
Unit *member;
|
||||
void *v;
|
||||
Iterator i;
|
||||
|
||||
assert(s);
|
||||
|
||||
HASHMAP_FOREACH_KEY(v, member, s->dependencies[UNIT_BEFORE]) {
|
||||
HASHMAP_FOREACH_KEY(v, member, s->dependencies[UNIT_BEFORE], i) {
|
||||
int r;
|
||||
|
||||
if (UNIT_DEREF(member->slice) != s)
|
||||
@ -376,6 +377,7 @@ static bool slice_freezer_action_supported_by_children(Unit *s) {
|
||||
static int slice_freezer_action(Unit *s, FreezerAction action) {
|
||||
Unit *member;
|
||||
void *v;
|
||||
Iterator i;
|
||||
int r;
|
||||
|
||||
assert(s);
|
||||
@ -384,7 +386,7 @@ static int slice_freezer_action(Unit *s, FreezerAction action) {
|
||||
if (!slice_freezer_action_supported_by_children(s))
|
||||
return log_unit_warning(s, "Requested freezer operation is not supported by all children of the slice");
|
||||
|
||||
HASHMAP_FOREACH_KEY(v, member, s->dependencies[UNIT_BEFORE]) {
|
||||
HASHMAP_FOREACH_KEY(v, member, s->dependencies[UNIT_BEFORE], i) {
|
||||
if (UNIT_DEREF(member->slice) != s)
|
||||
continue;
|
||||
|
||||
|
||||
@ -2338,11 +2338,12 @@ static void socket_enter_running(Socket *s, int cfd_in) {
|
||||
if (cfd < 0) {
|
||||
bool pending = false;
|
||||
Unit *other;
|
||||
Iterator i;
|
||||
void *v;
|
||||
|
||||
/* If there's already a start pending don't bother to
|
||||
* do anything */
|
||||
HASHMAP_FOREACH_KEY(v, other, UNIT(s)->dependencies[UNIT_TRIGGERS])
|
||||
HASHMAP_FOREACH_KEY(v, other, UNIT(s)->dependencies[UNIT_TRIGGERS], i)
|
||||
if (unit_active_or_pending(other)) {
|
||||
pending = true;
|
||||
break;
|
||||
@ -2787,6 +2788,7 @@ static void socket_distribute_fds(Unit *u, FDSet *fds) {
|
||||
assert(u);
|
||||
|
||||
LIST_FOREACH(port, p, s->ports) {
|
||||
Iterator i;
|
||||
int fd;
|
||||
|
||||
if (p->type != SOCKET_SOCKET)
|
||||
@ -2795,7 +2797,7 @@ static void socket_distribute_fds(Unit *u, FDSet *fds) {
|
||||
if (p->fd >= 0)
|
||||
continue;
|
||||
|
||||
FDSET_FOREACH(fd, fds) {
|
||||
FDSET_FOREACH(fd, fds, i) {
|
||||
if (socket_address_matches_fd(&p->address, fd)) {
|
||||
p->fd = fdset_remove(fds, fd);
|
||||
s->deserialized_state = SOCKET_LISTENING;
|
||||
|
||||
@ -57,9 +57,10 @@ static int target_add_default_dependencies(Target *t) {
|
||||
|
||||
for (k = 0; k < ELEMENTSOF(deps); k++) {
|
||||
Unit *other;
|
||||
Iterator i;
|
||||
void *v;
|
||||
|
||||
HASHMAP_FOREACH_KEY(v, other, UNIT(t)->dependencies[deps[k]]) {
|
||||
HASHMAP_FOREACH_KEY(v, other, UNIT(t)->dependencies[deps[k]], i) {
|
||||
r = unit_add_default_target_dependency(other, UNIT(t));
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
@ -218,13 +218,14 @@ static int delete_one_unmergeable_job(Transaction *tr, Job *j) {
|
||||
|
||||
static int transaction_merge_jobs(Transaction *tr, sd_bus_error *e) {
|
||||
Job *j;
|
||||
Iterator i;
|
||||
int r;
|
||||
|
||||
assert(tr);
|
||||
|
||||
/* First step, check whether any of the jobs for one specific
|
||||
* task conflict. If so, try to drop one of them. */
|
||||
HASHMAP_FOREACH(j, tr->jobs) {
|
||||
HASHMAP_FOREACH(j, tr->jobs, i) {
|
||||
JobType t;
|
||||
Job *k;
|
||||
|
||||
@ -255,7 +256,7 @@ static int transaction_merge_jobs(Transaction *tr, sd_bus_error *e) {
|
||||
}
|
||||
|
||||
/* Second step, merge the jobs. */
|
||||
HASHMAP_FOREACH(j, tr->jobs) {
|
||||
HASHMAP_FOREACH(j, tr->jobs, i) {
|
||||
JobType t = j->type;
|
||||
Job *k;
|
||||
|
||||
@ -287,11 +288,12 @@ static void transaction_drop_redundant(Transaction *tr) {
|
||||
assert(tr);
|
||||
|
||||
do {
|
||||
Iterator i;
|
||||
Job *j;
|
||||
|
||||
again = false;
|
||||
|
||||
HASHMAP_FOREACH(j, tr->jobs) {
|
||||
HASHMAP_FOREACH(j, tr->jobs, i) {
|
||||
bool keep = false;
|
||||
Job *k;
|
||||
|
||||
@ -347,6 +349,7 @@ static char* merge_unit_ids(const char* unit_log_field, char **pairs) {
|
||||
}
|
||||
|
||||
static int transaction_verify_order_one(Transaction *tr, Job *j, Job *from, unsigned generation, sd_bus_error *e) {
|
||||
Iterator i;
|
||||
Unit *u;
|
||||
void *v;
|
||||
int r;
|
||||
@ -450,7 +453,7 @@ static int transaction_verify_order_one(Transaction *tr, Job *j, Job *from, unsi
|
||||
* ordering dependencies and we test with job_compare() whether it is the 'before' edge in the job
|
||||
* execution ordering. */
|
||||
for (d = 0; d < ELEMENTSOF(directions); d++) {
|
||||
HASHMAP_FOREACH_KEY(v, u, j->unit->dependencies[directions[d]]) {
|
||||
HASHMAP_FOREACH_KEY(v, u, j->unit->dependencies[directions[d]], i) {
|
||||
Job *o;
|
||||
|
||||
/* Is there a job for this unit? */
|
||||
@ -484,6 +487,7 @@ static int transaction_verify_order_one(Transaction *tr, Job *j, Job *from, unsi
|
||||
static int transaction_verify_order(Transaction *tr, unsigned *generation, sd_bus_error *e) {
|
||||
Job *j;
|
||||
int r;
|
||||
Iterator i;
|
||||
unsigned g;
|
||||
|
||||
assert(tr);
|
||||
@ -494,7 +498,7 @@ static int transaction_verify_order(Transaction *tr, unsigned *generation, sd_bu
|
||||
|
||||
g = (*generation)++;
|
||||
|
||||
HASHMAP_FOREACH(j, tr->jobs) {
|
||||
HASHMAP_FOREACH(j, tr->jobs, i) {
|
||||
r = transaction_verify_order_one(tr, j, NULL, g, e);
|
||||
if (r < 0)
|
||||
return r;
|
||||
@ -511,11 +515,12 @@ static void transaction_collect_garbage(Transaction *tr) {
|
||||
/* Drop jobs that are not required by any other job */
|
||||
|
||||
do {
|
||||
Iterator i;
|
||||
Job *j;
|
||||
|
||||
again = false;
|
||||
|
||||
HASHMAP_FOREACH(j, tr->jobs) {
|
||||
HASHMAP_FOREACH(j, tr->jobs, i) {
|
||||
if (tr->anchor_job == j)
|
||||
continue;
|
||||
|
||||
@ -536,6 +541,7 @@ static void transaction_collect_garbage(Transaction *tr) {
|
||||
}
|
||||
|
||||
static int transaction_is_destructive(Transaction *tr, JobMode mode, sd_bus_error *e) {
|
||||
Iterator i;
|
||||
Job *j;
|
||||
|
||||
assert(tr);
|
||||
@ -543,7 +549,7 @@ static int transaction_is_destructive(Transaction *tr, JobMode mode, sd_bus_erro
|
||||
/* Checks whether applying this transaction means that
|
||||
* existing jobs would be replaced */
|
||||
|
||||
HASHMAP_FOREACH(j, tr->jobs) {
|
||||
HASHMAP_FOREACH(j, tr->jobs, i) {
|
||||
|
||||
/* Assume merged */
|
||||
assert(!j->transaction_prev);
|
||||
@ -562,6 +568,7 @@ static int transaction_is_destructive(Transaction *tr, JobMode mode, sd_bus_erro
|
||||
|
||||
static void transaction_minimize_impact(Transaction *tr) {
|
||||
Job *j;
|
||||
Iterator i;
|
||||
|
||||
assert(tr);
|
||||
|
||||
@ -569,7 +576,7 @@ static void transaction_minimize_impact(Transaction *tr) {
|
||||
* or that stop a running service. */
|
||||
|
||||
rescan:
|
||||
HASHMAP_FOREACH(j, tr->jobs) {
|
||||
HASHMAP_FOREACH(j, tr->jobs, i) {
|
||||
LIST_FOREACH(transaction, j, j) {
|
||||
bool stops_running_service, changes_existing_job;
|
||||
|
||||
@ -618,6 +625,7 @@ static int transaction_apply(
|
||||
JobMode mode,
|
||||
Set *affected_jobs) {
|
||||
|
||||
Iterator i;
|
||||
Job *j;
|
||||
int r;
|
||||
|
||||
@ -627,7 +635,7 @@ static int transaction_apply(
|
||||
|
||||
/* When isolating first kill all installed jobs which
|
||||
* aren't part of the new transaction */
|
||||
HASHMAP_FOREACH(j, m->jobs) {
|
||||
HASHMAP_FOREACH(j, m->jobs, i) {
|
||||
assert(j->installed);
|
||||
|
||||
if (j->unit->ignore_on_isolate)
|
||||
@ -643,7 +651,7 @@ static int transaction_apply(
|
||||
}
|
||||
}
|
||||
|
||||
HASHMAP_FOREACH(j, tr->jobs) {
|
||||
HASHMAP_FOREACH(j, tr->jobs, i) {
|
||||
/* Assume merged */
|
||||
assert(!j->transaction_prev);
|
||||
assert(!j->transaction_next);
|
||||
@ -688,7 +696,7 @@ static int transaction_apply(
|
||||
|
||||
rollback:
|
||||
|
||||
HASHMAP_FOREACH(j, tr->jobs)
|
||||
HASHMAP_FOREACH(j, tr->jobs, i)
|
||||
hashmap_remove(m->jobs, UINT32_TO_PTR(j->id));
|
||||
|
||||
return r;
|
||||
@ -701,6 +709,7 @@ int transaction_activate(
|
||||
Set *affected_jobs,
|
||||
sd_bus_error *e) {
|
||||
|
||||
Iterator i;
|
||||
Job *j;
|
||||
int r;
|
||||
unsigned generation = 1;
|
||||
@ -713,7 +722,7 @@ int transaction_activate(
|
||||
/* Reset the generation counter of all installed jobs. The detection of cycles
|
||||
* looks at installed jobs. If they had a non-zero generation from some previous
|
||||
* walk of the graph, the algorithm would break. */
|
||||
HASHMAP_FOREACH(j, m->jobs)
|
||||
HASHMAP_FOREACH(j, m->jobs, i)
|
||||
j->generation = 0;
|
||||
|
||||
/* First step: figure out which jobs matter */
|
||||
@ -881,6 +890,7 @@ static void transaction_unlink_job(Transaction *tr, Job *j, bool delete_dependen
|
||||
}
|
||||
|
||||
void transaction_add_propagate_reload_jobs(Transaction *tr, Unit *unit, Job *by, bool ignore_order, sd_bus_error *e) {
|
||||
Iterator i;
|
||||
JobType nt;
|
||||
Unit *dep;
|
||||
void *v;
|
||||
@ -889,7 +899,7 @@ void transaction_add_propagate_reload_jobs(Transaction *tr, Unit *unit, Job *by,
|
||||
assert(tr);
|
||||
assert(unit);
|
||||
|
||||
HASHMAP_FOREACH_KEY(v, dep, unit->dependencies[UNIT_PROPAGATES_RELOAD_TO]) {
|
||||
HASHMAP_FOREACH_KEY(v, dep, unit->dependencies[UNIT_PROPAGATES_RELOAD_TO], i) {
|
||||
nt = job_type_collapse(JOB_TRY_RELOAD, dep);
|
||||
if (nt == JOB_NOP)
|
||||
continue;
|
||||
@ -916,6 +926,7 @@ int transaction_add_job_and_dependencies(
|
||||
sd_bus_error *e) {
|
||||
|
||||
bool is_new;
|
||||
Iterator i;
|
||||
Unit *dep;
|
||||
Job *ret;
|
||||
void *v;
|
||||
@ -995,7 +1006,7 @@ int transaction_add_job_and_dependencies(
|
||||
/* If we are following some other unit, make sure we
|
||||
* add all dependencies of everybody following. */
|
||||
if (unit_following_set(ret->unit, &following) > 0) {
|
||||
SET_FOREACH(dep, following) {
|
||||
SET_FOREACH(dep, following, i) {
|
||||
r = transaction_add_job_and_dependencies(tr, type, dep, ret, false, false, false, ignore_order, e);
|
||||
if (r < 0) {
|
||||
log_unit_full(dep,
|
||||
@ -1011,7 +1022,7 @@ int transaction_add_job_and_dependencies(
|
||||
|
||||
/* Finally, recursively add in all dependencies. */
|
||||
if (IN_SET(type, JOB_START, JOB_RESTART)) {
|
||||
HASHMAP_FOREACH_KEY(v, dep, ret->unit->dependencies[UNIT_REQUIRES]) {
|
||||
HASHMAP_FOREACH_KEY(v, dep, ret->unit->dependencies[UNIT_REQUIRES], i) {
|
||||
r = transaction_add_job_and_dependencies(tr, JOB_START, dep, ret, true, false, false, ignore_order, e);
|
||||
if (r < 0) {
|
||||
if (r != -EBADR) /* job type not applicable */
|
||||
@ -1021,7 +1032,7 @@ int transaction_add_job_and_dependencies(
|
||||
}
|
||||
}
|
||||
|
||||
HASHMAP_FOREACH_KEY(v, dep, ret->unit->dependencies[UNIT_BINDS_TO]) {
|
||||
HASHMAP_FOREACH_KEY(v, dep, ret->unit->dependencies[UNIT_BINDS_TO], i) {
|
||||
r = transaction_add_job_and_dependencies(tr, JOB_START, dep, ret, true, false, false, ignore_order, e);
|
||||
if (r < 0) {
|
||||
if (r != -EBADR) /* job type not applicable */
|
||||
@ -1031,7 +1042,7 @@ int transaction_add_job_and_dependencies(
|
||||
}
|
||||
}
|
||||
|
||||
HASHMAP_FOREACH_KEY(v, dep, ret->unit->dependencies[UNIT_WANTS]) {
|
||||
HASHMAP_FOREACH_KEY(v, dep, ret->unit->dependencies[UNIT_WANTS], i) {
|
||||
r = transaction_add_job_and_dependencies(tr, JOB_START, dep, ret, false, false, false, ignore_order, e);
|
||||
if (r < 0) {
|
||||
/* unit masked, job type not applicable and unit not found are not considered as errors. */
|
||||
@ -1043,7 +1054,7 @@ int transaction_add_job_and_dependencies(
|
||||
}
|
||||
}
|
||||
|
||||
HASHMAP_FOREACH_KEY(v, dep, ret->unit->dependencies[UNIT_REQUISITE]) {
|
||||
HASHMAP_FOREACH_KEY(v, dep, ret->unit->dependencies[UNIT_REQUISITE], i) {
|
||||
r = transaction_add_job_and_dependencies(tr, JOB_VERIFY_ACTIVE, dep, ret, true, false, false, ignore_order, e);
|
||||
if (r < 0) {
|
||||
if (r != -EBADR) /* job type not applicable */
|
||||
@ -1053,7 +1064,7 @@ int transaction_add_job_and_dependencies(
|
||||
}
|
||||
}
|
||||
|
||||
HASHMAP_FOREACH_KEY(v, dep, ret->unit->dependencies[UNIT_CONFLICTS]) {
|
||||
HASHMAP_FOREACH_KEY(v, dep, ret->unit->dependencies[UNIT_CONFLICTS], i) {
|
||||
r = transaction_add_job_and_dependencies(tr, JOB_STOP, dep, ret, true, true, false, ignore_order, e);
|
||||
if (r < 0) {
|
||||
if (r != -EBADR) /* job type not applicable */
|
||||
@ -1063,7 +1074,7 @@ int transaction_add_job_and_dependencies(
|
||||
}
|
||||
}
|
||||
|
||||
HASHMAP_FOREACH_KEY(v, dep, ret->unit->dependencies[UNIT_CONFLICTED_BY]) {
|
||||
HASHMAP_FOREACH_KEY(v, dep, ret->unit->dependencies[UNIT_CONFLICTED_BY], i) {
|
||||
r = transaction_add_job_and_dependencies(tr, JOB_STOP, dep, ret, false, false, false, ignore_order, e);
|
||||
if (r < 0) {
|
||||
log_unit_warning(dep,
|
||||
@ -1092,7 +1103,7 @@ int transaction_add_job_and_dependencies(
|
||||
ptype = type == JOB_RESTART ? JOB_TRY_RESTART : type;
|
||||
|
||||
for (j = 0; j < ELEMENTSOF(propagate_deps); j++)
|
||||
HASHMAP_FOREACH_KEY(v, dep, ret->unit->dependencies[propagate_deps[j]]) {
|
||||
HASHMAP_FOREACH_KEY(v, dep, ret->unit->dependencies[propagate_deps[j]], i) {
|
||||
JobType nt;
|
||||
|
||||
nt = job_type_collapse(ptype, dep);
|
||||
@ -1122,6 +1133,7 @@ fail:
|
||||
}
|
||||
|
||||
int transaction_add_isolate_jobs(Transaction *tr, Manager *m) {
|
||||
Iterator i;
|
||||
Unit *u;
|
||||
char *k;
|
||||
int r;
|
||||
@ -1129,7 +1141,7 @@ int transaction_add_isolate_jobs(Transaction *tr, Manager *m) {
|
||||
assert(tr);
|
||||
assert(m);
|
||||
|
||||
HASHMAP_FOREACH_KEY(u, k, m->units) {
|
||||
HASHMAP_FOREACH_KEY(u, k, m->units, i) {
|
||||
|
||||
/* ignore aliases */
|
||||
if (u->id != k)
|
||||
@ -1155,6 +1167,7 @@ int transaction_add_isolate_jobs(Transaction *tr, Manager *m) {
|
||||
}
|
||||
|
||||
int transaction_add_triggering_jobs(Transaction *tr, Unit *u) {
|
||||
Iterator i;
|
||||
void *v;
|
||||
Unit *trigger;
|
||||
int r;
|
||||
@ -1162,7 +1175,7 @@ int transaction_add_triggering_jobs(Transaction *tr, Unit *u) {
|
||||
assert(tr);
|
||||
assert(u);
|
||||
|
||||
HASHMAP_FOREACH_KEY(v, trigger, u->dependencies[UNIT_TRIGGERED_BY]) {
|
||||
HASHMAP_FOREACH_KEY(v, trigger, u->dependencies[UNIT_TRIGGERED_BY], i) {
|
||||
/* No need to stop inactive jobs */
|
||||
if (UNIT_IS_INACTIVE_OR_FAILED(unit_active_state(trigger)) && !trigger->job)
|
||||
continue;
|
||||
|
||||
105
src/core/unit.c
105
src/core/unit.c
@ -510,13 +510,14 @@ void unit_submit_to_stop_when_unneeded_queue(Unit *u) {
|
||||
|
||||
static void bidi_set_free(Unit *u, Hashmap *h) {
|
||||
Unit *other;
|
||||
Iterator i;
|
||||
void *v;
|
||||
|
||||
assert(u);
|
||||
|
||||
/* Frees the hashmap and makes sure we are dropped from the inverse pointers */
|
||||
|
||||
HASHMAP_FOREACH_KEY(v, other, h) {
|
||||
HASHMAP_FOREACH_KEY(v, other, h, i) {
|
||||
for (UnitDependency d = 0; d < _UNIT_DEPENDENCY_MAX; d++)
|
||||
hashmap_remove(other->dependencies[d], u);
|
||||
|
||||
@ -613,6 +614,7 @@ static void unit_done(Unit *u) {
|
||||
}
|
||||
|
||||
void unit_free(Unit *u) {
|
||||
Iterator i;
|
||||
char *t;
|
||||
|
||||
if (!u)
|
||||
@ -636,7 +638,7 @@ void unit_free(Unit *u) {
|
||||
|
||||
unit_free_requires_mounts_for(u);
|
||||
|
||||
SET_FOREACH(t, u->aliases)
|
||||
SET_FOREACH(t, u->aliases, i)
|
||||
hashmap_remove_value(u->manager->units, t, u);
|
||||
if (u->id)
|
||||
hashmap_remove_value(u->manager->units, u->id, u);
|
||||
@ -817,6 +819,7 @@ static int hashmap_complete_move(Hashmap **s, Hashmap **other) {
|
||||
|
||||
static int merge_names(Unit *u, Unit *other) {
|
||||
char *name;
|
||||
Iterator i;
|
||||
int r;
|
||||
|
||||
assert(u);
|
||||
@ -835,7 +838,7 @@ static int merge_names(Unit *u, Unit *other) {
|
||||
TAKE_PTR(other->id);
|
||||
other->aliases = set_free_free(other->aliases);
|
||||
|
||||
SET_FOREACH(name, u->aliases)
|
||||
SET_FOREACH(name, u->aliases, i)
|
||||
assert_se(hashmap_replace(u->manager->units, name, u) == 0);
|
||||
|
||||
return 0;
|
||||
@ -863,6 +866,7 @@ static int reserve_dependencies(Unit *u, Unit *other, UnitDependency d) {
|
||||
}
|
||||
|
||||
static void merge_dependencies(Unit *u, Unit *other, const char *other_id, UnitDependency d) {
|
||||
Iterator i;
|
||||
Unit *back;
|
||||
void *v;
|
||||
int r;
|
||||
@ -874,7 +878,7 @@ static void merge_dependencies(Unit *u, Unit *other, const char *other_id, UnitD
|
||||
assert(d < _UNIT_DEPENDENCY_MAX);
|
||||
|
||||
/* Fix backwards pointers. Let's iterate through all dependent units of the other unit. */
|
||||
HASHMAP_FOREACH_KEY(v, back, other->dependencies[d])
|
||||
HASHMAP_FOREACH_KEY(v, back, other->dependencies[d], i)
|
||||
|
||||
/* Let's now iterate through the dependencies of that dependencies of the other units,
|
||||
* looking for pointers back, and let's fix them up, to instead point to 'u'. */
|
||||
@ -1036,6 +1040,8 @@ Unit* unit_follow_merge(Unit *u) {
|
||||
}
|
||||
|
||||
int unit_add_exec_dependencies(Unit *u, ExecContext *c) {
|
||||
ExecDirectoryType dt;
|
||||
char **dp;
|
||||
int r;
|
||||
|
||||
assert(u);
|
||||
@ -1059,11 +1065,10 @@ int unit_add_exec_dependencies(Unit *u, ExecContext *c) {
|
||||
return r;
|
||||
}
|
||||
|
||||
for (ExecDirectoryType dt = 0; dt < _EXEC_DIRECTORY_TYPE_MAX; dt++) {
|
||||
for (dt = 0; dt < _EXEC_DIRECTORY_TYPE_MAX; dt++) {
|
||||
if (!u->manager->prefix[dt])
|
||||
continue;
|
||||
|
||||
char **dp;
|
||||
STRV_FOREACH(dp, c->directories[dt].paths) {
|
||||
_cleanup_free_ char *p;
|
||||
|
||||
@ -1183,12 +1188,13 @@ static void print_unit_dependency_mask(FILE *f, const char *kind, UnitDependency
|
||||
{ UNIT_DEPENDENCY_MOUNTINFO_DEFAULT, "mountinfo-default" },
|
||||
{ UNIT_DEPENDENCY_PROC_SWAP, "proc-swap" },
|
||||
};
|
||||
size_t i;
|
||||
|
||||
assert(f);
|
||||
assert(kind);
|
||||
assert(space);
|
||||
|
||||
for (size_t i = 0; i < ELEMENTSOF(table); i++) {
|
||||
for (i = 0; i < ELEMENTSOF(table); i++) {
|
||||
|
||||
if (mask == 0)
|
||||
break;
|
||||
@ -1212,10 +1218,12 @@ static void print_unit_dependency_mask(FILE *f, const char *kind, UnitDependency
|
||||
|
||||
void unit_dump(Unit *u, FILE *f, const char *prefix) {
|
||||
char *t, **j;
|
||||
Iterator i;
|
||||
const char *prefix2;
|
||||
char timestamp[5][FORMAT_TIMESTAMP_MAX], timespan[FORMAT_TIMESPAN_MAX];
|
||||
Unit *following;
|
||||
_cleanup_set_free_ Set *following_set = NULL;
|
||||
const char *n;
|
||||
CGroupMask m;
|
||||
int r;
|
||||
|
||||
@ -1229,7 +1237,7 @@ void unit_dump(Unit *u, FILE *f, const char *prefix) {
|
||||
"%s-> Unit %s:\n",
|
||||
prefix, u->id);
|
||||
|
||||
SET_FOREACH(t, u->aliases)
|
||||
SET_FOREACH(t, u->aliases, i)
|
||||
fprintf(f, "%s\tAlias: %s\n", prefix, t);
|
||||
|
||||
fprintf(f,
|
||||
@ -1316,7 +1324,7 @@ void unit_dump(Unit *u, FILE *f, const char *prefix) {
|
||||
if (r >= 0) {
|
||||
Unit *other;
|
||||
|
||||
SET_FOREACH(other, following_set)
|
||||
SET_FOREACH(other, following_set, i)
|
||||
fprintf(f, "%s\tFollowing Set Member: %s\n", prefix, other->id);
|
||||
}
|
||||
|
||||
@ -1368,7 +1376,7 @@ void unit_dump(Unit *u, FILE *f, const char *prefix) {
|
||||
UnitDependencyInfo di;
|
||||
Unit *other;
|
||||
|
||||
HASHMAP_FOREACH_KEY(di.data, other, u->dependencies[d]) {
|
||||
HASHMAP_FOREACH_KEY(di.data, other, u->dependencies[d], i) {
|
||||
bool space = false;
|
||||
|
||||
fprintf(f, "%s\t%s: %s (", prefix, unit_dependency_to_string(d), other->id);
|
||||
@ -1384,7 +1392,7 @@ void unit_dump(Unit *u, FILE *f, const char *prefix) {
|
||||
UnitDependencyInfo di;
|
||||
const char *path;
|
||||
|
||||
HASHMAP_FOREACH_KEY(di.data, path, u->requires_mounts_for) {
|
||||
HASHMAP_FOREACH_KEY(di.data, path, u->requires_mounts_for, i) {
|
||||
bool space = false;
|
||||
|
||||
fprintf(f, "%s\tRequiresMountsFor: %s (", prefix, path);
|
||||
@ -1422,7 +1430,7 @@ void unit_dump(Unit *u, FILE *f, const char *prefix) {
|
||||
else if (u->load_state == UNIT_ERROR)
|
||||
fprintf(f, "%s\tLoad Error Code: %s\n", prefix, strerror_safe(u->load_error));
|
||||
|
||||
for (const char *n = sd_bus_track_first(u->bus_track); n; n = sd_bus_track_next(u->bus_track))
|
||||
for (n = sd_bus_track_first(u->bus_track); n; n = sd_bus_track_next(u->bus_track))
|
||||
fprintf(f, "%s\tBus Ref: %s\n", prefix, n);
|
||||
|
||||
if (u->job)
|
||||
@ -1531,11 +1539,12 @@ static int unit_add_slice_dependencies(Unit *u) {
|
||||
static int unit_add_mount_dependencies(Unit *u) {
|
||||
UnitDependencyInfo di;
|
||||
const char *path;
|
||||
Iterator i;
|
||||
int r;
|
||||
|
||||
assert(u);
|
||||
|
||||
HASHMAP_FOREACH_KEY(di.data, path, u->requires_mounts_for) {
|
||||
HASHMAP_FOREACH_KEY(di.data, path, u->requires_mounts_for, i) {
|
||||
char prefix[strlen(path) + 1];
|
||||
|
||||
PATH_FOREACH_PREFIX_MORE(prefix, path) {
|
||||
@ -1798,6 +1807,7 @@ bool unit_shall_confirm_spawn(Unit *u) {
|
||||
|
||||
static bool unit_verify_deps(Unit *u) {
|
||||
Unit *other;
|
||||
Iterator j;
|
||||
void *v;
|
||||
|
||||
assert(u);
|
||||
@ -1807,7 +1817,7 @@ static bool unit_verify_deps(Unit *u) {
|
||||
* processing, but do not have any effect afterwards. We don't check BindsTo= dependencies that are not used in
|
||||
* conjunction with After= as for them any such check would make things entirely racy. */
|
||||
|
||||
HASHMAP_FOREACH_KEY(v, other, u->dependencies[UNIT_BINDS_TO]) {
|
||||
HASHMAP_FOREACH_KEY(v, other, u->dependencies[UNIT_BINDS_TO], j) {
|
||||
|
||||
if (!hashmap_contains(u->dependencies[UNIT_AFTER], other))
|
||||
continue;
|
||||
@ -2034,6 +2044,7 @@ bool unit_is_unneeded(Unit *u) {
|
||||
UNIT_WANTED_BY,
|
||||
UNIT_BOUND_BY,
|
||||
};
|
||||
size_t j;
|
||||
|
||||
assert(u);
|
||||
|
||||
@ -2046,14 +2057,15 @@ bool unit_is_unneeded(Unit *u) {
|
||||
if (u->job)
|
||||
return false;
|
||||
|
||||
for (size_t j = 0; j < ELEMENTSOF(deps); j++) {
|
||||
for (j = 0; j < ELEMENTSOF(deps); j++) {
|
||||
Unit *other;
|
||||
Iterator i;
|
||||
void *v;
|
||||
|
||||
/* If a dependent unit has a job queued, is active or transitioning, or is marked for
|
||||
* restart, then don't clean this one up. */
|
||||
|
||||
HASHMAP_FOREACH_KEY(v, other, u->dependencies[deps[j]]) {
|
||||
HASHMAP_FOREACH_KEY(v, other, u->dependencies[deps[j]], i) {
|
||||
if (other->job)
|
||||
return false;
|
||||
|
||||
@ -2076,16 +2088,18 @@ static void check_unneeded_dependencies(Unit *u) {
|
||||
UNIT_WANTS,
|
||||
UNIT_BINDS_TO,
|
||||
};
|
||||
size_t j;
|
||||
|
||||
assert(u);
|
||||
|
||||
/* Add all units this unit depends on to the queue that processes StopWhenUnneeded= behaviour. */
|
||||
|
||||
for (size_t j = 0; j < ELEMENTSOF(deps); j++) {
|
||||
for (j = 0; j < ELEMENTSOF(deps); j++) {
|
||||
Unit *other;
|
||||
Iterator i;
|
||||
void *v;
|
||||
|
||||
HASHMAP_FOREACH_KEY(v, other, u->dependencies[deps[j]])
|
||||
HASHMAP_FOREACH_KEY(v, other, u->dependencies[deps[j]], i)
|
||||
unit_submit_to_stop_when_unneeded_queue(other);
|
||||
}
|
||||
}
|
||||
@ -2094,6 +2108,7 @@ static void unit_check_binds_to(Unit *u) {
|
||||
_cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
|
||||
bool stop = false;
|
||||
Unit *other;
|
||||
Iterator i;
|
||||
void *v;
|
||||
int r;
|
||||
|
||||
@ -2105,7 +2120,7 @@ static void unit_check_binds_to(Unit *u) {
|
||||
if (unit_active_state(u) != UNIT_ACTIVE)
|
||||
return;
|
||||
|
||||
HASHMAP_FOREACH_KEY(v, other, u->dependencies[UNIT_BINDS_TO]) {
|
||||
HASHMAP_FOREACH_KEY(v, other, u->dependencies[UNIT_BINDS_TO], i) {
|
||||
if (other->job)
|
||||
continue;
|
||||
|
||||
@ -2141,51 +2156,54 @@ static void unit_check_binds_to(Unit *u) {
|
||||
}
|
||||
|
||||
static void retroactively_start_dependencies(Unit *u) {
|
||||
Iterator i;
|
||||
Unit *other;
|
||||
void *v;
|
||||
|
||||
assert(u);
|
||||
assert(UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u)));
|
||||
|
||||
HASHMAP_FOREACH_KEY(v, other, u->dependencies[UNIT_REQUIRES])
|
||||
HASHMAP_FOREACH_KEY(v, other, u->dependencies[UNIT_REQUIRES], i)
|
||||
if (!hashmap_get(u->dependencies[UNIT_AFTER], other) &&
|
||||
!UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other)))
|
||||
manager_add_job(u->manager, JOB_START, other, JOB_REPLACE, NULL, NULL, NULL);
|
||||
|
||||
HASHMAP_FOREACH_KEY(v, other, u->dependencies[UNIT_BINDS_TO])
|
||||
HASHMAP_FOREACH_KEY(v, other, u->dependencies[UNIT_BINDS_TO], i)
|
||||
if (!hashmap_get(u->dependencies[UNIT_AFTER], other) &&
|
||||
!UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other)))
|
||||
manager_add_job(u->manager, JOB_START, other, JOB_REPLACE, NULL, NULL, NULL);
|
||||
|
||||
HASHMAP_FOREACH_KEY(v, other, u->dependencies[UNIT_WANTS])
|
||||
HASHMAP_FOREACH_KEY(v, other, u->dependencies[UNIT_WANTS], i)
|
||||
if (!hashmap_get(u->dependencies[UNIT_AFTER], other) &&
|
||||
!UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other)))
|
||||
manager_add_job(u->manager, JOB_START, other, JOB_FAIL, NULL, NULL, NULL);
|
||||
|
||||
HASHMAP_FOREACH_KEY(v, other, u->dependencies[UNIT_CONFLICTS])
|
||||
HASHMAP_FOREACH_KEY(v, other, u->dependencies[UNIT_CONFLICTS], i)
|
||||
if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
|
||||
manager_add_job(u->manager, JOB_STOP, other, JOB_REPLACE, NULL, NULL, NULL);
|
||||
|
||||
HASHMAP_FOREACH_KEY(v, other, u->dependencies[UNIT_CONFLICTED_BY])
|
||||
HASHMAP_FOREACH_KEY(v, other, u->dependencies[UNIT_CONFLICTED_BY], i)
|
||||
if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
|
||||
manager_add_job(u->manager, JOB_STOP, other, JOB_REPLACE, NULL, NULL, NULL);
|
||||
}
|
||||
|
||||
static void retroactively_stop_dependencies(Unit *u) {
|
||||
Unit *other;
|
||||
Iterator i;
|
||||
void *v;
|
||||
|
||||
assert(u);
|
||||
assert(UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(u)));
|
||||
|
||||
/* Pull down units which are bound to us recursively if enabled */
|
||||
HASHMAP_FOREACH_KEY(v, other, u->dependencies[UNIT_BOUND_BY])
|
||||
HASHMAP_FOREACH_KEY(v, other, u->dependencies[UNIT_BOUND_BY], i)
|
||||
if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
|
||||
manager_add_job(u->manager, JOB_STOP, other, JOB_REPLACE, NULL, NULL, NULL);
|
||||
}
|
||||
|
||||
void unit_start_on_failure(Unit *u) {
|
||||
Unit *other;
|
||||
Iterator i;
|
||||
void *v;
|
||||
int r;
|
||||
|
||||
@ -2196,7 +2214,7 @@ void unit_start_on_failure(Unit *u) {
|
||||
|
||||
log_unit_info(u, "Triggering OnFailure= dependencies.");
|
||||
|
||||
HASHMAP_FOREACH_KEY(v, other, u->dependencies[UNIT_ON_FAILURE]) {
|
||||
HASHMAP_FOREACH_KEY(v, other, u->dependencies[UNIT_ON_FAILURE], i) {
|
||||
_cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
|
||||
|
||||
r = manager_add_job(u->manager, JOB_START, other, u->on_failure_job_mode, NULL, &error, NULL);
|
||||
@ -2207,11 +2225,12 @@ void unit_start_on_failure(Unit *u) {
|
||||
|
||||
void unit_trigger_notify(Unit *u) {
|
||||
Unit *other;
|
||||
Iterator i;
|
||||
void *v;
|
||||
|
||||
assert(u);
|
||||
|
||||
HASHMAP_FOREACH_KEY(v, other, u->dependencies[UNIT_TRIGGERED_BY])
|
||||
HASHMAP_FOREACH_KEY(v, other, u->dependencies[UNIT_TRIGGERED_BY], i)
|
||||
if (UNIT_VTABLE(other)->trigger_notify)
|
||||
UNIT_VTABLE(other)->trigger_notify(other, u);
|
||||
}
|
||||
@ -2232,6 +2251,8 @@ static int unit_log_resources(Unit *u) {
|
||||
size_t n_message_parts = 0, n_iovec = 0;
|
||||
char* message_parts[1 + 2 + 2 + 1], *t;
|
||||
nsec_t nsec = NSEC_INFINITY;
|
||||
CGroupIPAccountingMetric m;
|
||||
size_t i;
|
||||
int r;
|
||||
const char* const ip_fields[_CGROUP_IP_ACCOUNTING_METRIC_MAX] = {
|
||||
[CGROUP_IP_INGRESS_BYTES] = "IP_METRIC_INGRESS_BYTES",
|
||||
@ -2343,7 +2364,7 @@ static int unit_log_resources(Unit *u) {
|
||||
}
|
||||
}
|
||||
|
||||
for (CGroupIPAccountingMetric m = 0; m < _CGROUP_IP_ACCOUNTING_METRIC_MAX; m++) {
|
||||
for (m = 0; m < _CGROUP_IP_ACCOUNTING_METRIC_MAX; m++) {
|
||||
char buf[FORMAT_BYTES_MAX] = "";
|
||||
uint64_t value = UINT64_MAX;
|
||||
|
||||
@ -2446,10 +2467,10 @@ static int unit_log_resources(Unit *u) {
|
||||
r = 0;
|
||||
|
||||
finish:
|
||||
for (size_t i = 0; i < n_message_parts; i++)
|
||||
for (i = 0; i < n_message_parts; i++)
|
||||
free(message_parts[i]);
|
||||
|
||||
for (size_t i = 0; i < n_iovec; i++)
|
||||
for (i = 0; i < n_iovec; i++)
|
||||
free(iovec[i].iov_base);
|
||||
|
||||
return r;
|
||||
@ -2777,10 +2798,10 @@ void unit_unwatch_pid(Unit *u, pid_t pid) {
|
||||
/* Then, let's also drop the unit, in case it's in the array keyed by -pid */
|
||||
array = hashmap_get(u->manager->watch_pids, PID_TO_PTR(-pid));
|
||||
if (array) {
|
||||
/* Let's iterate through the array, dropping our own entry */
|
||||
size_t n, m = 0;
|
||||
|
||||
size_t m = 0;
|
||||
for (size_t n = 0; array[n]; n++)
|
||||
/* Let's iterate through the array, dropping our own entry */
|
||||
for (n = 0; array[n]; n++)
|
||||
if (array[n] != u)
|
||||
array[m++] = array[n];
|
||||
array[m] = NULL;
|
||||
@ -2806,6 +2827,7 @@ void unit_unwatch_all_pids(Unit *u) {
|
||||
|
||||
static void unit_tidy_watch_pids(Unit *u) {
|
||||
pid_t except1, except2;
|
||||
Iterator i;
|
||||
void *e;
|
||||
|
||||
assert(u);
|
||||
@ -2815,7 +2837,7 @@ static void unit_tidy_watch_pids(Unit *u) {
|
||||
except1 = unit_main_pid(u);
|
||||
except2 = unit_control_pid(u);
|
||||
|
||||
SET_FOREACH(e, u->pids) {
|
||||
SET_FOREACH(e, u->pids, i) {
|
||||
pid_t pid = PTR_TO_PID(e);
|
||||
|
||||
if (pid == except1 || pid == except2)
|
||||
@ -3509,6 +3531,7 @@ static const char *const io_accounting_metric_field_last[_CGROUP_IO_ACCOUNTING_M
|
||||
};
|
||||
|
||||
int unit_serialize(Unit *u, FILE *f, FDSet *fds, bool serialize_jobs) {
|
||||
CGroupIPAccountingMetric m;
|
||||
int r;
|
||||
|
||||
assert(u);
|
||||
@ -3580,7 +3603,7 @@ int unit_serialize(Unit *u, FILE *f, FDSet *fds, bool serialize_jobs) {
|
||||
|
||||
bus_track_serialize(u->bus_track, f, "ref");
|
||||
|
||||
for (CGroupIPAccountingMetric m = 0; m < _CGROUP_IP_ACCOUNTING_METRIC_MAX; m++) {
|
||||
for (m = 0; m < _CGROUP_IP_ACCOUNTING_METRIC_MAX; m++) {
|
||||
uint64_t v;
|
||||
|
||||
r = unit_get_ip_accounting(u, m, &v);
|
||||
@ -4421,6 +4444,7 @@ static int user_from_unit_name(Unit *u, char **ret) {
|
||||
int unit_patch_contexts(Unit *u) {
|
||||
CGroupContext *cc;
|
||||
ExecContext *ec;
|
||||
unsigned i;
|
||||
int r;
|
||||
|
||||
assert(u);
|
||||
@ -4432,7 +4456,7 @@ int unit_patch_contexts(Unit *u) {
|
||||
ec = unit_get_exec_context(u);
|
||||
if (ec) {
|
||||
/* This only copies in the ones that need memory */
|
||||
for (unsigned i = 0; i < _RLIMIT_MAX; i++)
|
||||
for (i = 0; i < _RLIMIT_MAX; i++)
|
||||
if (u->manager->rlimit[i] && !ec->rlimit[i]) {
|
||||
ec->rlimit[i] = newdup(struct rlimit, u->manager->rlimit[i], 1);
|
||||
if (!ec->rlimit[i])
|
||||
@ -5087,6 +5111,7 @@ int unit_setup_exec_runtime(Unit *u) {
|
||||
ExecRuntime **rt;
|
||||
size_t offset;
|
||||
Unit *other;
|
||||
Iterator i;
|
||||
void *v;
|
||||
int r;
|
||||
|
||||
@ -5099,7 +5124,7 @@ int unit_setup_exec_runtime(Unit *u) {
|
||||
return 0;
|
||||
|
||||
/* Try to get it from somebody else */
|
||||
HASHMAP_FOREACH_KEY(v, other, u->dependencies[UNIT_JOINS_NAMESPACE_OF]) {
|
||||
HASHMAP_FOREACH_KEY(v, other, u->dependencies[UNIT_JOINS_NAMESPACE_OF], i) {
|
||||
r = exec_runtime_acquire(u->manager, NULL, other->id, false, rt);
|
||||
if (r == 1)
|
||||
return 1;
|
||||
@ -5502,10 +5527,11 @@ void unit_remove_dependencies(Unit *u, UnitDependencyMask mask) {
|
||||
do {
|
||||
UnitDependencyInfo di;
|
||||
Unit *other;
|
||||
Iterator i;
|
||||
|
||||
done = true;
|
||||
|
||||
HASHMAP_FOREACH_KEY(di.data, other, u->dependencies[d]) {
|
||||
HASHMAP_FOREACH_KEY(di.data, other, u->dependencies[d], i) {
|
||||
if ((di.origin_mask & ~mask) == di.origin_mask)
|
||||
continue;
|
||||
di.origin_mask &= ~mask;
|
||||
@ -5620,6 +5646,7 @@ static int unit_export_log_extra_fields(Unit *u, const ExecContext *c) {
|
||||
char *pattern;
|
||||
le64_t *sizes;
|
||||
ssize_t n;
|
||||
size_t i;
|
||||
int r;
|
||||
|
||||
if (u->exported_log_extra_fields)
|
||||
@ -5631,7 +5658,7 @@ static int unit_export_log_extra_fields(Unit *u, const ExecContext *c) {
|
||||
sizes = newa(le64_t, c->n_log_extra_fields);
|
||||
iovec = newa(struct iovec, c->n_log_extra_fields * 2);
|
||||
|
||||
for (size_t i = 0; i < c->n_log_extra_fields; i++) {
|
||||
for (i = 0; i < c->n_log_extra_fields; i++) {
|
||||
sizes[i] = htole64(c->log_extra_fields[i].iov_len);
|
||||
|
||||
iovec[i*2] = IOVEC_MAKE(sizes + i, sizeof(le64_t));
|
||||
|
||||
@ -644,9 +644,10 @@ static int add_crypttab_devices(void) {
|
||||
|
||||
static int add_proc_cmdline_devices(void) {
|
||||
int r;
|
||||
Iterator i;
|
||||
crypto_device *d;
|
||||
|
||||
HASHMAP_FOREACH(d, arg_disks) {
|
||||
HASHMAP_FOREACH(d, arg_disks, i) {
|
||||
_cleanup_free_ char *device = NULL;
|
||||
|
||||
if (!d->create)
|
||||
|
||||
@ -401,9 +401,13 @@ static int should_skip_path(const char *prefix, const char *suffix) {
|
||||
|
||||
static int process_suffix(const char *suffix, const char *onlyprefix) {
|
||||
const char *p;
|
||||
char *f, *key;
|
||||
OrderedHashmap *top, *bottom, *drops, *h;
|
||||
int r = 0, k, n_found = 0;
|
||||
char *f;
|
||||
OrderedHashmap *top, *bottom, *drops;
|
||||
OrderedHashmap *h;
|
||||
char *key;
|
||||
int r = 0, k;
|
||||
Iterator i, j;
|
||||
int n_found = 0;
|
||||
bool dropins;
|
||||
|
||||
assert(suffix);
|
||||
@ -437,7 +441,7 @@ static int process_suffix(const char *suffix, const char *onlyprefix) {
|
||||
r = k;
|
||||
}
|
||||
|
||||
ORDERED_HASHMAP_FOREACH_KEY(f, key, top) {
|
||||
ORDERED_HASHMAP_FOREACH_KEY(f, key, top, i) {
|
||||
char *o;
|
||||
|
||||
o = ordered_hashmap_get(bottom, key);
|
||||
@ -457,7 +461,7 @@ static int process_suffix(const char *suffix, const char *onlyprefix) {
|
||||
|
||||
h = ordered_hashmap_get(drops, key);
|
||||
if (h)
|
||||
ORDERED_HASHMAP_FOREACH(o, h)
|
||||
ORDERED_HASHMAP_FOREACH(o, h, j)
|
||||
if (!onlyprefix || startswith(o, onlyprefix))
|
||||
n_found += notify_override_extended(f, o);
|
||||
}
|
||||
@ -466,7 +470,7 @@ finish:
|
||||
ordered_hashmap_free_free(top);
|
||||
ordered_hashmap_free_free(bottom);
|
||||
|
||||
ORDERED_HASHMAP_FOREACH_KEY(h, key, drops) {
|
||||
ORDERED_HASHMAP_FOREACH_KEY(h, key, drops, i) {
|
||||
ordered_hashmap_free_free(ordered_hashmap_remove(drops, key));
|
||||
ordered_hashmap_remove(drops, key);
|
||||
free(key);
|
||||
|
||||
@ -211,16 +211,14 @@ static int run(int argc, char *argv[]) {
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to extract instance: %m");
|
||||
if (isempty(name))
|
||||
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
|
||||
"Unit %s is missing the instance name.", *i);
|
||||
return log_error("Unit %s is missing the instance name.", *i);
|
||||
|
||||
r = unit_name_template(*i, &template);
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to extract template: %m");
|
||||
if (arg_template && !streq(arg_template, template))
|
||||
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
|
||||
"Unit %s template %s does not match specified template %s.",
|
||||
*i, template, arg_template);
|
||||
return log_error("Unit %s template %s does not match specified template %s.",
|
||||
*i, template, arg_template);
|
||||
} else {
|
||||
name = strdup(*i);
|
||||
if (!name)
|
||||
|
||||
@ -729,14 +729,10 @@ static int add_mounts(void) {
|
||||
int r;
|
||||
|
||||
r = get_block_device_harder("/", &devno);
|
||||
if (r == -EUCLEAN)
|
||||
return btrfs_log_dev_root(LOG_ERR, r, "root file system");
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to determine block device of root file system: %m");
|
||||
if (r == 0) { /* Not backed by block device */
|
||||
if (r == 0) {
|
||||
r = get_block_device_harder("/usr", &devno);
|
||||
if (r == -EUCLEAN)
|
||||
return btrfs_log_dev_root(LOG_ERR, r, "/usr");
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to determine block device of /usr file system: %m");
|
||||
if (r == 0) {
|
||||
|
||||
@ -758,6 +758,7 @@ static int bus_home_node_enumerator(
|
||||
_cleanup_strv_free_ char **l = NULL;
|
||||
Manager *m = userdata;
|
||||
size_t k = 0;
|
||||
Iterator i;
|
||||
Home *h;
|
||||
int r;
|
||||
|
||||
@ -767,7 +768,7 @@ static int bus_home_node_enumerator(
|
||||
if (!l)
|
||||
return -ENOMEM;
|
||||
|
||||
HASHMAP_FOREACH(h, m->homes_by_uid) {
|
||||
HASHMAP_FOREACH(h, m->homes_by_uid, i) {
|
||||
r = bus_home_path(h, l + k);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
@ -25,6 +25,7 @@ static int property_get_auto_login(
|
||||
sd_bus_error *error) {
|
||||
|
||||
Manager *m = userdata;
|
||||
Iterator i;
|
||||
Home *h;
|
||||
int r;
|
||||
|
||||
@ -36,7 +37,7 @@ static int property_get_auto_login(
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
HASHMAP_FOREACH(h, m->homes_by_name) {
|
||||
HASHMAP_FOREACH(h, m->homes_by_name, i) {
|
||||
_cleanup_(strv_freep) char **seats = NULL;
|
||||
_cleanup_free_ char *home_path = NULL;
|
||||
char **s;
|
||||
@ -150,6 +151,7 @@ static int method_list_homes(
|
||||
|
||||
_cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
|
||||
Manager *m = userdata;
|
||||
Iterator i;
|
||||
Home *h;
|
||||
int r;
|
||||
|
||||
@ -164,7 +166,7 @@ static int method_list_homes(
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
HASHMAP_FOREACH(h, m->homes_by_uid) {
|
||||
HASHMAP_FOREACH(h, m->homes_by_uid, i) {
|
||||
_cleanup_free_ char *path = NULL;
|
||||
|
||||
r = bus_home_path(h, &path);
|
||||
@ -558,6 +560,7 @@ static int method_lock_all_homes(sd_bus_message *message, void *userdata, sd_bus
|
||||
_cleanup_(operation_unrefp) Operation *o = NULL;
|
||||
bool waiting = false;
|
||||
Manager *m = userdata;
|
||||
Iterator i;
|
||||
Home *h;
|
||||
int r;
|
||||
|
||||
@ -567,7 +570,7 @@ static int method_lock_all_homes(sd_bus_message *message, void *userdata, sd_bus
|
||||
* for every suitable home we have and only when all of them completed we send a reply indicating
|
||||
* completion. */
|
||||
|
||||
HASHMAP_FOREACH(h, m->homes_by_name) {
|
||||
HASHMAP_FOREACH(h, m->homes_by_name, i) {
|
||||
|
||||
/* Automatically suspend all homes that have at least one client referencing it that asked
|
||||
* for "please suspend", and no client that asked for "please do not suspend". */
|
||||
|
||||
@ -267,6 +267,7 @@ Manager* manager_free(Manager *m) {
|
||||
|
||||
int manager_verify_user_record(Manager *m, UserRecord *hr) {
|
||||
EVP_PKEY *pkey;
|
||||
Iterator i;
|
||||
int r;
|
||||
|
||||
assert(m);
|
||||
@ -297,7 +298,7 @@ int manager_verify_user_record(Manager *m, UserRecord *hr) {
|
||||
}
|
||||
}
|
||||
|
||||
HASHMAP_FOREACH(pkey, m->public_keys) {
|
||||
HASHMAP_FOREACH(pkey, m->public_keys, i) {
|
||||
r = user_record_verify(hr, pkey);
|
||||
switch (r) {
|
||||
|
||||
@ -1605,8 +1606,9 @@ int manager_gc_images(Manager *m) {
|
||||
manager_revalidate_image(m, h);
|
||||
} else {
|
||||
/* Gc all */
|
||||
Iterator i;
|
||||
|
||||
HASHMAP_FOREACH(h, m->homes_by_name)
|
||||
HASHMAP_FOREACH(h, m->homes_by_name, i)
|
||||
manager_revalidate_image(m, h);
|
||||
}
|
||||
|
||||
|
||||
@ -103,12 +103,13 @@ int vl_method_get_user_record(Varlink *link, JsonVariant *parameters, VarlinkMet
|
||||
else if (p.user_name)
|
||||
h = hashmap_get(m->homes_by_name, p.user_name);
|
||||
else {
|
||||
Iterator i;
|
||||
|
||||
/* If neither UID nor name was specified, then dump all homes. Do so with varlink_notify()
|
||||
* for all entries but the last, so that clients can stream the results, and easily process
|
||||
* them piecemeal. */
|
||||
|
||||
HASHMAP_FOREACH(h, m->homes_by_name) {
|
||||
HASHMAP_FOREACH(h, m->homes_by_name, i) {
|
||||
|
||||
if (!home_user_match_lookup_parameters(&p, h))
|
||||
continue;
|
||||
@ -218,8 +219,9 @@ int vl_method_get_group_record(Varlink *link, JsonVariant *parameters, VarlinkMe
|
||||
else if (p.group_name)
|
||||
h = hashmap_get(m->homes_by_name, p.group_name);
|
||||
else {
|
||||
Iterator i;
|
||||
|
||||
HASHMAP_FOREACH(h, m->homes_by_name) {
|
||||
HASHMAP_FOREACH(h, m->homes_by_name, i) {
|
||||
|
||||
if (!home_group_match_lookup_parameters(&p, h))
|
||||
continue;
|
||||
@ -313,8 +315,9 @@ int vl_method_get_memberships(Varlink *link, JsonVariant *parameters, VarlinkMet
|
||||
|
||||
} else if (p.group_name) {
|
||||
const char *last = NULL;
|
||||
Iterator i;
|
||||
|
||||
HASHMAP_FOREACH(h, m->homes_by_name) {
|
||||
HASHMAP_FOREACH(h, m->homes_by_name, i) {
|
||||
|
||||
if (!strv_contains(h->record->member_of, p.group_name))
|
||||
continue;
|
||||
@ -334,8 +337,9 @@ int vl_method_get_memberships(Varlink *link, JsonVariant *parameters, VarlinkMet
|
||||
JSON_BUILD_PAIR("groupName", JSON_BUILD_STRING(p.group_name))));
|
||||
} else {
|
||||
const char *last_user_name = NULL, *last_group_name = NULL;
|
||||
Iterator i;
|
||||
|
||||
HASHMAP_FOREACH(h, m->homes_by_name) {
|
||||
HASHMAP_FOREACH(h, m->homes_by_name, i) {
|
||||
char **j;
|
||||
|
||||
STRV_FOREACH(j, h->record->member_of) {
|
||||
|
||||
@ -562,6 +562,7 @@ static int manager_on_notify(sd_event_source *s, int fd, uint32_t revents, void
|
||||
Manager *m = userdata;
|
||||
char *p, *e;
|
||||
Transfer *t;
|
||||
Iterator i;
|
||||
ssize_t n;
|
||||
int r;
|
||||
|
||||
@ -584,7 +585,7 @@ static int manager_on_notify(sd_event_source *s, int fd, uint32_t revents, void
|
||||
return 0;
|
||||
}
|
||||
|
||||
HASHMAP_FOREACH(t, m->transfers)
|
||||
HASHMAP_FOREACH(t, m->transfers, i)
|
||||
if (ucred->pid == t->pid)
|
||||
break;
|
||||
|
||||
@ -669,12 +670,13 @@ static int manager_new(Manager **ret) {
|
||||
|
||||
static Transfer *manager_find(Manager *m, TransferType type, const char *remote) {
|
||||
Transfer *t;
|
||||
Iterator i;
|
||||
|
||||
assert(m);
|
||||
assert(type >= 0);
|
||||
assert(type < _TRANSFER_TYPE_MAX);
|
||||
|
||||
HASHMAP_FOREACH(t, m->transfers)
|
||||
HASHMAP_FOREACH(t, m->transfers, i)
|
||||
if (t->type == type && streq_ptr(t->remote, remote))
|
||||
return t;
|
||||
|
||||
@ -988,6 +990,7 @@ static int method_list_transfers(sd_bus_message *msg, void *userdata, sd_bus_err
|
||||
_cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
|
||||
Manager *m = userdata;
|
||||
Transfer *t;
|
||||
Iterator i;
|
||||
int r;
|
||||
|
||||
assert(msg);
|
||||
@ -1001,7 +1004,7 @@ static int method_list_transfers(sd_bus_message *msg, void *userdata, sd_bus_err
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
HASHMAP_FOREACH(t, m->transfers) {
|
||||
HASHMAP_FOREACH(t, m->transfers, i) {
|
||||
|
||||
r = sd_bus_message_append(
|
||||
reply,
|
||||
@ -1159,12 +1162,13 @@ static int transfer_node_enumerator(
|
||||
Manager *m = userdata;
|
||||
Transfer *t;
|
||||
unsigned k = 0;
|
||||
Iterator i;
|
||||
|
||||
l = new0(char*, hashmap_size(m->transfers) + 1);
|
||||
if (!l)
|
||||
return -ENOMEM;
|
||||
|
||||
HASHMAP_FOREACH(t, m->transfers) {
|
||||
HASHMAP_FOREACH(t, m->transfers, i) {
|
||||
|
||||
l[k] = strdup(t->object_path);
|
||||
if (!l[k])
|
||||
|
||||
@ -450,6 +450,7 @@ int catalog_update(const char* database, const char* root, const char* const* di
|
||||
ssize_t offset;
|
||||
char *payload;
|
||||
CatalogItem *i;
|
||||
Iterator j;
|
||||
unsigned n;
|
||||
int r;
|
||||
int64_t sz;
|
||||
@ -481,7 +482,7 @@ int catalog_update(const char* database, const char* root, const char* const* di
|
||||
return log_oom();
|
||||
|
||||
n = 0;
|
||||
ORDERED_HASHMAP_FOREACH_KEY(payload, i, h) {
|
||||
ORDERED_HASHMAP_FOREACH_KEY(payload, i, h, j) {
|
||||
log_debug("Found " SD_ID128_FORMAT_STR ", language %s",
|
||||
SD_ID128_FORMAT_VAL(i->id),
|
||||
isempty(i->language) ? "C" : i->language);
|
||||
|
||||
@ -1644,13 +1644,14 @@ static int add_units(sd_journal *j) {
|
||||
|
||||
if (!strv_isempty(patterns)) {
|
||||
_cleanup_set_free_free_ Set *units = NULL;
|
||||
Iterator it;
|
||||
char *u;
|
||||
|
||||
r = get_possible_units(j, SYSTEM_UNITS, patterns, &units);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
SET_FOREACH(u, units) {
|
||||
SET_FOREACH(u, units, it) {
|
||||
r = add_matches_for_unit(j, u);
|
||||
if (r < 0)
|
||||
return r;
|
||||
@ -1688,13 +1689,14 @@ static int add_units(sd_journal *j) {
|
||||
|
||||
if (!strv_isempty(patterns)) {
|
||||
_cleanup_set_free_free_ Set *units = NULL;
|
||||
Iterator it;
|
||||
char *u;
|
||||
|
||||
r = get_possible_units(j, USER_UNITS, patterns, &units);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
SET_FOREACH(u, units) {
|
||||
SET_FOREACH(u, units, it) {
|
||||
r = add_matches_for_user_unit(j, u, getuid());
|
||||
if (r < 0)
|
||||
return r;
|
||||
@ -1743,9 +1745,10 @@ static int add_priorities(sd_journal *j) {
|
||||
|
||||
static int add_facilities(sd_journal *j) {
|
||||
void *p;
|
||||
Iterator it;
|
||||
int r;
|
||||
|
||||
SET_FOREACH(p, arg_facilities) {
|
||||
SET_FOREACH(p, arg_facilities, it) {
|
||||
char match[STRLEN("SYSLOG_FACILITY=") + DECIMAL_STR_MAX(int)];
|
||||
|
||||
xsprintf(match, "SYSLOG_FACILITY=%d", PTR_TO_INT(p));
|
||||
@ -1957,13 +1960,14 @@ static int setup_keys(void) {
|
||||
|
||||
static int verify(sd_journal *j) {
|
||||
int r = 0;
|
||||
Iterator i;
|
||||
JournalFile *f;
|
||||
|
||||
assert(j);
|
||||
|
||||
log_show_color(true);
|
||||
|
||||
ORDERED_HASHMAP_FOREACH(f, j->files) {
|
||||
ORDERED_HASHMAP_FOREACH(f, j->files, i) {
|
||||
int k;
|
||||
usec_t first = 0, validated = 0, last = 0;
|
||||
|
||||
@ -2323,8 +2327,9 @@ int main(int argc, char *argv[]) {
|
||||
|
||||
case ACTION_VACUUM: {
|
||||
Directory *d;
|
||||
Iterator i;
|
||||
|
||||
HASHMAP_FOREACH(d, j->directories_by_path) {
|
||||
HASHMAP_FOREACH(d, j->directories_by_path, i) {
|
||||
int q;
|
||||
|
||||
q = journal_directory_vacuum(d->path, arg_vacuum_size, arg_vacuum_n_files, arg_vacuum_time, NULL, !arg_quiet);
|
||||
|
||||
@ -473,9 +473,10 @@ static int do_rotate(
|
||||
|
||||
static void server_process_deferred_closes(Server *s) {
|
||||
JournalFile *f;
|
||||
Iterator i;
|
||||
|
||||
/* Perform any deferred closes which aren't still offlining. */
|
||||
SET_FOREACH(f, s->deferred_closes) {
|
||||
SET_FOREACH(f, s->deferred_closes, i) {
|
||||
if (journal_file_is_offlining(f))
|
||||
continue;
|
||||
|
||||
@ -608,6 +609,7 @@ static int vacuum_offline_user_journals(Server *s) {
|
||||
|
||||
void server_rotate(Server *s) {
|
||||
JournalFile *f;
|
||||
Iterator i;
|
||||
void *k;
|
||||
int r;
|
||||
|
||||
@ -618,7 +620,7 @@ void server_rotate(Server *s) {
|
||||
(void) do_rotate(s, &s->system_journal, "system", s->seal, 0);
|
||||
|
||||
/* Then, rotate all user journals we have open (keeping them open) */
|
||||
ORDERED_HASHMAP_FOREACH_KEY(f, k, s->user_journals) {
|
||||
ORDERED_HASHMAP_FOREACH_KEY(f, k, s->user_journals, i) {
|
||||
r = do_rotate(s, &f, "user", s->seal, PTR_TO_UID(k));
|
||||
if (r >= 0)
|
||||
ordered_hashmap_replace(s->user_journals, k, f);
|
||||
@ -637,6 +639,7 @@ void server_rotate(Server *s) {
|
||||
|
||||
void server_sync(Server *s) {
|
||||
JournalFile *f;
|
||||
Iterator i;
|
||||
int r;
|
||||
|
||||
if (s->system_journal) {
|
||||
@ -645,7 +648,7 @@ void server_sync(Server *s) {
|
||||
log_warning_errno(r, "Failed to sync system journal, ignoring: %m");
|
||||
}
|
||||
|
||||
ORDERED_HASHMAP_FOREACH(f, s->user_journals) {
|
||||
ORDERED_HASHMAP_FOREACH(f, s->user_journals, i) {
|
||||
r = journal_file_set_offline(f, false);
|
||||
if (r < 0)
|
||||
log_warning_errno(r, "Failed to sync user journal, ignoring: %m");
|
||||
@ -2430,6 +2433,7 @@ int server_init(Server *s, const char *namespace) {
|
||||
void server_maybe_append_tags(Server *s) {
|
||||
#if HAVE_GCRYPT
|
||||
JournalFile *f;
|
||||
Iterator i;
|
||||
usec_t n;
|
||||
|
||||
n = now(CLOCK_REALTIME);
|
||||
@ -2437,7 +2441,7 @@ void server_maybe_append_tags(Server *s) {
|
||||
if (s->system_journal)
|
||||
journal_file_maybe_append_tag(s->system_journal, n);
|
||||
|
||||
ORDERED_HASHMAP_FOREACH(f, s->user_journals)
|
||||
ORDERED_HASHMAP_FOREACH(f, s->user_journals, i)
|
||||
journal_file_maybe_append_tag(f, n);
|
||||
#endif
|
||||
}
|
||||
|
||||
@ -834,12 +834,13 @@ int server_restore_streams(Server *s, FDSet *fds) {
|
||||
FOREACH_DIRENT(de, d, goto fail) {
|
||||
unsigned long st_dev, st_ino;
|
||||
bool found = false;
|
||||
Iterator i;
|
||||
int fd;
|
||||
|
||||
if (sscanf(de->d_name, "%lu:%lu", &st_dev, &st_ino) != 2)
|
||||
continue;
|
||||
|
||||
FDSET_FOREACH(fd, fds) {
|
||||
FDSET_FOREACH(fd, fds, i) {
|
||||
struct stat st;
|
||||
|
||||
if (fstat(fd, &st) < 0)
|
||||
|
||||
@ -552,6 +552,7 @@ unsigned mmap_cache_get_missed(MMapCache *m) {
|
||||
static void mmap_cache_process_sigbus(MMapCache *m) {
|
||||
bool found = false;
|
||||
MMapFileDescriptor *f;
|
||||
Iterator i;
|
||||
int r;
|
||||
|
||||
assert(m);
|
||||
@ -571,7 +572,7 @@ static void mmap_cache_process_sigbus(MMapCache *m) {
|
||||
}
|
||||
|
||||
ours = false;
|
||||
HASHMAP_FOREACH(f, m->fds) {
|
||||
HASHMAP_FOREACH(f, m->fds, i) {
|
||||
Window *w;
|
||||
|
||||
LIST_FOREACH(by_fd, w, f->windows) {
|
||||
@ -600,7 +601,7 @@ static void mmap_cache_process_sigbus(MMapCache *m) {
|
||||
if (_likely_(!found))
|
||||
return;
|
||||
|
||||
HASHMAP_FOREACH(f, m->fds) {
|
||||
HASHMAP_FOREACH(f, m->fds, i) {
|
||||
Window *w;
|
||||
|
||||
if (!f->sigbus)
|
||||
|
||||
@ -105,6 +105,7 @@ static int journal_put_error(sd_journal *j, int r, const char *path) {
|
||||
}
|
||||
|
||||
static void detach_location(sd_journal *j) {
|
||||
Iterator i;
|
||||
JournalFile *f;
|
||||
|
||||
assert(j);
|
||||
@ -112,7 +113,7 @@ static void detach_location(sd_journal *j) {
|
||||
j->current_file = NULL;
|
||||
j->current_field = 0;
|
||||
|
||||
ORDERED_HASHMAP_FOREACH(f, j->files)
|
||||
ORDERED_HASHMAP_FOREACH(f, j->files, i)
|
||||
journal_file_reset_location(f);
|
||||
}
|
||||
|
||||
@ -1858,6 +1859,7 @@ static int add_search_paths(sd_journal *j) {
|
||||
}
|
||||
|
||||
static int add_current_paths(sd_journal *j) {
|
||||
Iterator i;
|
||||
JournalFile *f;
|
||||
|
||||
assert(j);
|
||||
@ -1866,7 +1868,7 @@ static int add_current_paths(sd_journal *j) {
|
||||
/* Simply adds all directories for files we have open as directories. We don't expect errors here, so we
|
||||
* treat them as fatal. */
|
||||
|
||||
ORDERED_HASHMAP_FOREACH(f, j->files) {
|
||||
ORDERED_HASHMAP_FOREACH(f, j->files, i) {
|
||||
_cleanup_free_ char *dir;
|
||||
int r;
|
||||
|
||||
@ -2101,6 +2103,7 @@ _public_ int sd_journal_open_directory_fd(sd_journal **ret, int fd, int flags) {
|
||||
}
|
||||
|
||||
_public_ int sd_journal_open_files_fd(sd_journal **ret, int fds[], unsigned n_fds, int flags) {
|
||||
Iterator iterator;
|
||||
JournalFile *f;
|
||||
_cleanup_(sd_journal_closep) sd_journal *j = NULL;
|
||||
unsigned i;
|
||||
@ -2145,7 +2148,7 @@ _public_ int sd_journal_open_files_fd(sd_journal **ret, int fds[], unsigned n_fd
|
||||
fail:
|
||||
/* If we fail, make sure we don't take possession of the files we managed to make use of successfully, and they
|
||||
* remain open */
|
||||
ORDERED_HASHMAP_FOREACH(f, j->files)
|
||||
ORDERED_HASHMAP_FOREACH(f, j->files, iterator)
|
||||
f->close_fd = false;
|
||||
|
||||
return r;
|
||||
@ -2563,6 +2566,7 @@ _public_ int sd_journal_get_timeout(sd_journal *j, uint64_t *timeout_usec) {
|
||||
static void process_q_overflow(sd_journal *j) {
|
||||
JournalFile *f;
|
||||
Directory *m;
|
||||
Iterator i;
|
||||
|
||||
assert(j);
|
||||
|
||||
@ -2576,7 +2580,7 @@ static void process_q_overflow(sd_journal *j) {
|
||||
j->generation++;
|
||||
(void) reiterate_all_paths(j);
|
||||
|
||||
ORDERED_HASHMAP_FOREACH(f, j->files) {
|
||||
ORDERED_HASHMAP_FOREACH(f, j->files, i) {
|
||||
|
||||
if (f->last_seen_generation == j->generation)
|
||||
continue;
|
||||
@ -2585,7 +2589,7 @@ static void process_q_overflow(sd_journal *j) {
|
||||
remove_file_real(j, f);
|
||||
}
|
||||
|
||||
HASHMAP_FOREACH(m, j->directories_by_path) {
|
||||
HASHMAP_FOREACH(m, j->directories_by_path, i) {
|
||||
|
||||
if (m->last_seen_generation == j->generation)
|
||||
continue;
|
||||
@ -2700,6 +2704,7 @@ _public_ int sd_journal_wait(sd_journal *j, uint64_t timeout_usec) {
|
||||
assert_return(!journal_pid_changed(j), -ECHILD);
|
||||
|
||||
if (j->inotify_fd < 0) {
|
||||
Iterator i;
|
||||
JournalFile *f;
|
||||
|
||||
/* This is the first invocation, hence create the
|
||||
@ -2710,7 +2715,7 @@ _public_ int sd_journal_wait(sd_journal *j, uint64_t timeout_usec) {
|
||||
|
||||
/* Server might have done some vacuuming while we weren't watching.
|
||||
Get rid of the deleted files now so they don't stay around indefinitely. */
|
||||
ORDERED_HASHMAP_FOREACH(f, j->files) {
|
||||
ORDERED_HASHMAP_FOREACH(f, j->files, i) {
|
||||
r = journal_file_fstat(f);
|
||||
if (r == -EIDRM)
|
||||
remove_file_real(j, f);
|
||||
@ -2752,6 +2757,7 @@ _public_ int sd_journal_wait(sd_journal *j, uint64_t timeout_usec) {
|
||||
}
|
||||
|
||||
_public_ int sd_journal_get_cutoff_realtime_usec(sd_journal *j, uint64_t *from, uint64_t *to) {
|
||||
Iterator i;
|
||||
JournalFile *f;
|
||||
bool first = true;
|
||||
uint64_t fmin = 0, tmax = 0;
|
||||
@ -2762,7 +2768,7 @@ _public_ int sd_journal_get_cutoff_realtime_usec(sd_journal *j, uint64_t *from,
|
||||
assert_return(from || to, -EINVAL);
|
||||
assert_return(from != to, -EINVAL);
|
||||
|
||||
ORDERED_HASHMAP_FOREACH(f, j->files) {
|
||||
ORDERED_HASHMAP_FOREACH(f, j->files, i) {
|
||||
usec_t fr, t;
|
||||
|
||||
r = journal_file_get_cutoff_realtime_usec(f, &fr, &t);
|
||||
@ -2792,6 +2798,7 @@ _public_ int sd_journal_get_cutoff_realtime_usec(sd_journal *j, uint64_t *from,
|
||||
}
|
||||
|
||||
_public_ int sd_journal_get_cutoff_monotonic_usec(sd_journal *j, sd_id128_t boot_id, uint64_t *from, uint64_t *to) {
|
||||
Iterator i;
|
||||
JournalFile *f;
|
||||
bool found = false;
|
||||
int r;
|
||||
@ -2801,7 +2808,7 @@ _public_ int sd_journal_get_cutoff_monotonic_usec(sd_journal *j, sd_id128_t boot
|
||||
assert_return(from || to, -EINVAL);
|
||||
assert_return(from != to, -EINVAL);
|
||||
|
||||
ORDERED_HASHMAP_FOREACH(f, j->files) {
|
||||
ORDERED_HASHMAP_FOREACH(f, j->files, i) {
|
||||
usec_t fr, t;
|
||||
|
||||
r = journal_file_get_cutoff_monotonic_usec(f, boot_id, &fr, &t);
|
||||
@ -2830,12 +2837,13 @@ _public_ int sd_journal_get_cutoff_monotonic_usec(sd_journal *j, sd_id128_t boot
|
||||
}
|
||||
|
||||
void journal_print_header(sd_journal *j) {
|
||||
Iterator i;
|
||||
JournalFile *f;
|
||||
bool newline = false;
|
||||
|
||||
assert(j);
|
||||
|
||||
ORDERED_HASHMAP_FOREACH(f, j->files) {
|
||||
ORDERED_HASHMAP_FOREACH(f, j->files, i) {
|
||||
if (newline)
|
||||
putchar('\n');
|
||||
else
|
||||
@ -2846,6 +2854,7 @@ void journal_print_header(sd_journal *j) {
|
||||
}
|
||||
|
||||
_public_ int sd_journal_get_usage(sd_journal *j, uint64_t *bytes) {
|
||||
Iterator i;
|
||||
JournalFile *f;
|
||||
uint64_t sum = 0;
|
||||
|
||||
@ -2853,7 +2862,7 @@ _public_ int sd_journal_get_usage(sd_journal *j, uint64_t *bytes) {
|
||||
assert_return(!journal_pid_changed(j), -ECHILD);
|
||||
assert_return(bytes, -EINVAL);
|
||||
|
||||
ORDERED_HASHMAP_FOREACH(f, j->files) {
|
||||
ORDERED_HASHMAP_FOREACH(f, j->files, i) {
|
||||
struct stat st;
|
||||
|
||||
if (fstat(f->fd, &st) < 0)
|
||||
@ -2911,6 +2920,7 @@ _public_ int sd_journal_enumerate_unique(sd_journal *j, const void **data, size_
|
||||
|
||||
for (;;) {
|
||||
JournalFile *of;
|
||||
Iterator i;
|
||||
Object *o;
|
||||
const void *odata;
|
||||
size_t ol;
|
||||
@ -2978,7 +2988,7 @@ _public_ int sd_journal_enumerate_unique(sd_journal *j, const void **data, size_
|
||||
* object by checking if it exists in the earlier
|
||||
* traversed files. */
|
||||
found = false;
|
||||
ORDERED_HASHMAP_FOREACH(of, j->files) {
|
||||
ORDERED_HASHMAP_FOREACH(of, j->files, i) {
|
||||
if (of == j->unique_file)
|
||||
break;
|
||||
|
||||
@ -3050,6 +3060,7 @@ _public_ int sd_journal_enumerate_fields(sd_journal *j, const char **field) {
|
||||
|
||||
for (;;) {
|
||||
JournalFile *f, *of;
|
||||
Iterator i;
|
||||
uint64_t m;
|
||||
Object *o;
|
||||
size_t sz;
|
||||
@ -3126,7 +3137,7 @@ _public_ int sd_journal_enumerate_fields(sd_journal *j, const char **field) {
|
||||
|
||||
/* Let's see if we already returned this field name before. */
|
||||
found = false;
|
||||
ORDERED_HASHMAP_FOREACH(of, j->files) {
|
||||
ORDERED_HASHMAP_FOREACH(of, j->files, i) {
|
||||
if (of == f)
|
||||
break;
|
||||
|
||||
|
||||
@ -65,6 +65,7 @@ static void test_catalog_import_badid(void) {
|
||||
static void test_catalog_import_one(void) {
|
||||
_cleanup_ordered_hashmap_free_free_free_ OrderedHashmap *h = NULL;
|
||||
char *payload;
|
||||
Iterator j;
|
||||
|
||||
const char *input =
|
||||
"-- 0027229ca0644181a76c4e92458afaff dededededededededededededededed\n" \
|
||||
@ -79,7 +80,7 @@ static void test_catalog_import_one(void) {
|
||||
h = test_import(input, -1, 0);
|
||||
assert_se(ordered_hashmap_size(h) == 1);
|
||||
|
||||
ORDERED_HASHMAP_FOREACH(payload, h) {
|
||||
ORDERED_HASHMAP_FOREACH(payload, h, j) {
|
||||
printf("expect: %s\n", expect);
|
||||
printf("actual: %s\n", payload);
|
||||
assert_se(streq(expect, payload));
|
||||
@ -89,6 +90,7 @@ static void test_catalog_import_one(void) {
|
||||
static void test_catalog_import_merge(void) {
|
||||
_cleanup_ordered_hashmap_free_free_free_ OrderedHashmap *h = NULL;
|
||||
char *payload;
|
||||
Iterator j;
|
||||
|
||||
const char *input =
|
||||
"-- 0027229ca0644181a76c4e92458afaff dededededededededededededededed\n" \
|
||||
@ -114,13 +116,14 @@ static void test_catalog_import_merge(void) {
|
||||
h = test_import(input, -1, 0);
|
||||
assert_se(ordered_hashmap_size(h) == 1);
|
||||
|
||||
ORDERED_HASHMAP_FOREACH(payload, h)
|
||||
ORDERED_HASHMAP_FOREACH(payload, h, j)
|
||||
assert_se(streq(combined, payload));
|
||||
}
|
||||
|
||||
static void test_catalog_import_merge_no_body(void) {
|
||||
_cleanup_ordered_hashmap_free_free_free_ OrderedHashmap *h = NULL;
|
||||
char *payload;
|
||||
Iterator j;
|
||||
|
||||
const char *input =
|
||||
"-- 0027229ca0644181a76c4e92458afaff dededededededededededededededed\n" \
|
||||
@ -145,7 +148,7 @@ static void test_catalog_import_merge_no_body(void) {
|
||||
h = test_import(input, -1, 0);
|
||||
assert_se(ordered_hashmap_size(h) == 1);
|
||||
|
||||
ORDERED_HASHMAP_FOREACH(payload, h)
|
||||
ORDERED_HASHMAP_FOREACH(payload, h, j)
|
||||
assert_se(streq(combined, payload));
|
||||
}
|
||||
|
||||
|
||||
@ -81,8 +81,9 @@ static int option_append(uint8_t options[], size_t size, size_t *offset,
|
||||
OrderedHashmap *s = (OrderedHashmap *) optval;
|
||||
struct sd_dhcp_option *p;
|
||||
size_t l = 0;
|
||||
Iterator i;
|
||||
|
||||
ORDERED_HASHMAP_FOREACH(p, s)
|
||||
ORDERED_HASHMAP_FOREACH(p, s, i)
|
||||
l += p->length + 2;
|
||||
|
||||
if (*offset + l + 2 > size)
|
||||
@ -93,7 +94,7 @@ static int option_append(uint8_t options[], size_t size, size_t *offset,
|
||||
|
||||
*offset += 2;
|
||||
|
||||
ORDERED_HASHMAP_FOREACH(p, s) {
|
||||
ORDERED_HASHMAP_FOREACH(p, s, i) {
|
||||
options[*offset] = p->option;
|
||||
options[*offset + 1] = p->length;
|
||||
memcpy(&options[*offset + 2], p->data, p->length);
|
||||
|
||||
@ -81,6 +81,7 @@ int dhcp6_option_append(uint8_t **buf, size_t *buflen, uint16_t code,
|
||||
|
||||
int dhcp6_option_append_vendor_option(uint8_t **buf, size_t *buflen, OrderedHashmap *vendor_options) {
|
||||
sd_dhcp6_option *options;
|
||||
Iterator i;
|
||||
int r;
|
||||
|
||||
assert(buf);
|
||||
@ -88,7 +89,7 @@ int dhcp6_option_append_vendor_option(uint8_t **buf, size_t *buflen, OrderedHash
|
||||
assert(buflen);
|
||||
assert(vendor_options);
|
||||
|
||||
ORDERED_HASHMAP_FOREACH(options, vendor_options) {
|
||||
ORDERED_HASHMAP_FOREACH(options, vendor_options, i) {
|
||||
_cleanup_free_ uint8_t *p = NULL;
|
||||
size_t total;
|
||||
|
||||
|
||||
@ -919,6 +919,7 @@ static int dhcp_client_send_raw(
|
||||
|
||||
static int client_append_common_discover_request_options(sd_dhcp_client *client, DHCPPacket *packet, size_t *optoffset, size_t optlen) {
|
||||
sd_dhcp_option *j;
|
||||
Iterator i;
|
||||
int r;
|
||||
|
||||
assert(client);
|
||||
@ -969,7 +970,7 @@ static int client_append_common_discover_request_options(sd_dhcp_client *client,
|
||||
return r;
|
||||
}
|
||||
|
||||
ORDERED_HASHMAP_FOREACH(j, client->extra_options) {
|
||||
ORDERED_HASHMAP_FOREACH(j, client->extra_options, i) {
|
||||
r = dhcp_option_append(&packet->dhcp, optlen, optoffset, 0,
|
||||
j->option, j->length, j->data);
|
||||
if (r < 0)
|
||||
|
||||
@ -479,6 +479,7 @@ static int server_send_ack(
|
||||
_cleanup_free_ DHCPPacket *packet = NULL;
|
||||
be32_t lease_time;
|
||||
sd_dhcp_option *j;
|
||||
Iterator i;
|
||||
size_t offset;
|
||||
int r;
|
||||
|
||||
@ -530,7 +531,7 @@ static int server_send_ack(
|
||||
return r;
|
||||
}
|
||||
|
||||
ORDERED_HASHMAP_FOREACH(j, server->extra_options) {
|
||||
ORDERED_HASHMAP_FOREACH(j, server->extra_options, i) {
|
||||
r = dhcp_option_append(&packet->dhcp, req->max_optlen, &offset, 0,
|
||||
j->option, j->length, j->data);
|
||||
if (r < 0)
|
||||
|
||||
@ -624,6 +624,7 @@ static int client_send_message(sd_dhcp6_client *client, usec_t time_now) {
|
||||
IN6ADDR_ALL_DHCP6_RELAY_AGENTS_AND_SERVERS_INIT;
|
||||
struct sd_dhcp6_option *j;
|
||||
size_t len, optlen = 512;
|
||||
Iterator i;
|
||||
uint8_t *opt;
|
||||
int r;
|
||||
usec_t elapsed_usec;
|
||||
@ -858,7 +859,7 @@ static int client_send_message(sd_dhcp6_client *client, usec_t time_now) {
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
ORDERED_HASHMAP_FOREACH(j, client->extra_options) {
|
||||
ORDERED_HASHMAP_FOREACH(j, client->extra_options, i) {
|
||||
r = dhcp6_option_append(&opt, &optlen, j->option, j->length, j->data);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
@ -431,6 +431,7 @@ static int lldp_start_timer(sd_lldp *lldp, sd_lldp_neighbor *neighbor) {
|
||||
|
||||
_public_ int sd_lldp_get_neighbors(sd_lldp *lldp, sd_lldp_neighbor ***ret) {
|
||||
sd_lldp_neighbor **l = NULL, *n;
|
||||
Iterator i;
|
||||
int k = 0, r;
|
||||
|
||||
assert_return(lldp, -EINVAL);
|
||||
@ -451,7 +452,7 @@ _public_ int sd_lldp_get_neighbors(sd_lldp *lldp, sd_lldp_neighbor ***ret) {
|
||||
return r;
|
||||
}
|
||||
|
||||
HASHMAP_FOREACH(n, lldp->neighbor_by_id)
|
||||
HASHMAP_FOREACH(n, lldp->neighbor_by_id, i)
|
||||
l[k++] = sd_lldp_neighbor_ref(n);
|
||||
|
||||
assert((size_t) k == hashmap_size(lldp->neighbor_by_id));
|
||||
|
||||
@ -961,8 +961,9 @@ void bus_match_free(struct bus_match_node *node) {
|
||||
return;
|
||||
|
||||
if (BUS_MATCH_CAN_HASH(node->type)) {
|
||||
Iterator i;
|
||||
|
||||
HASHMAP_FOREACH(c, node->compare.children)
|
||||
HASHMAP_FOREACH(c, node->compare.children, i)
|
||||
bus_match_free(c);
|
||||
|
||||
assert(hashmap_isempty(node->compare.children));
|
||||
@ -1053,8 +1054,9 @@ void bus_match_dump(struct bus_match_node *node, unsigned level) {
|
||||
putchar('\n');
|
||||
|
||||
if (BUS_MATCH_CAN_HASH(node->type)) {
|
||||
Iterator i;
|
||||
|
||||
HASHMAP_FOREACH(c, node->compare.children)
|
||||
HASHMAP_FOREACH(c, node->compare.children, i)
|
||||
bus_match_dump(c, level + 1);
|
||||
}
|
||||
|
||||
|
||||
@ -1235,6 +1235,7 @@ static int process_get_managed_objects(
|
||||
_cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
|
||||
_cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
|
||||
_cleanup_set_free_free_ Set *s = NULL;
|
||||
Iterator i;
|
||||
char *path;
|
||||
int r;
|
||||
|
||||
@ -1264,7 +1265,7 @@ static int process_get_managed_objects(
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
SET_FOREACH(path, s) {
|
||||
SET_FOREACH(path, s, i) {
|
||||
r = object_manager_serialize_path_and_fallbacks(bus, reply, path, &error);
|
||||
if (r < 0)
|
||||
return bus_maybe_reply_error(m, r, &error);
|
||||
|
||||
@ -597,6 +597,7 @@ static int bus_send_hello(sd_bus *bus) {
|
||||
|
||||
int bus_start_running(sd_bus *bus) {
|
||||
struct reply_callback *c;
|
||||
Iterator i;
|
||||
usec_t n;
|
||||
int r;
|
||||
|
||||
@ -608,7 +609,7 @@ int bus_start_running(sd_bus *bus) {
|
||||
* adding a fixed value to all entries should not alter the internal order. */
|
||||
|
||||
n = now(CLOCK_MONOTONIC);
|
||||
ORDERED_HASHMAP_FOREACH(c, bus->reply_callbacks) {
|
||||
ORDERED_HASHMAP_FOREACH(c, bus->reply_callbacks, i) {
|
||||
if (c->timeout_usec == 0)
|
||||
continue;
|
||||
|
||||
|
||||
@ -308,15 +308,16 @@ static bool match_sysattr_value(sd_device *device, const char *sysattr, const ch
|
||||
static bool match_sysattr(sd_device_enumerator *enumerator, sd_device *device) {
|
||||
const char *sysattr;
|
||||
const char *value;
|
||||
Iterator i;
|
||||
|
||||
assert(enumerator);
|
||||
assert(device);
|
||||
|
||||
HASHMAP_FOREACH_KEY(value, sysattr, enumerator->nomatch_sysattr)
|
||||
HASHMAP_FOREACH_KEY(value, sysattr, enumerator->nomatch_sysattr, i)
|
||||
if (match_sysattr_value(device, sysattr, value))
|
||||
return false;
|
||||
|
||||
HASHMAP_FOREACH_KEY(value, sysattr, enumerator->match_sysattr)
|
||||
HASHMAP_FOREACH_KEY(value, sysattr, enumerator->match_sysattr, i)
|
||||
if (!match_sysattr_value(device, sysattr, value))
|
||||
return false;
|
||||
|
||||
@ -326,6 +327,7 @@ static bool match_sysattr(sd_device_enumerator *enumerator, sd_device *device) {
|
||||
static bool match_property(sd_device_enumerator *enumerator, sd_device *device) {
|
||||
const char *property;
|
||||
const char *value;
|
||||
Iterator i;
|
||||
|
||||
assert(enumerator);
|
||||
assert(device);
|
||||
@ -333,7 +335,7 @@ static bool match_property(sd_device_enumerator *enumerator, sd_device *device)
|
||||
if (hashmap_isempty(enumerator->match_property))
|
||||
return true;
|
||||
|
||||
HASHMAP_FOREACH_KEY(value, property, enumerator->match_property) {
|
||||
HASHMAP_FOREACH_KEY(value, property, enumerator->match_property, i) {
|
||||
const char *property_dev, *value_dev;
|
||||
|
||||
FOREACH_DEVICE_PROPERTY(device, property_dev, value_dev) {
|
||||
@ -356,11 +358,12 @@ static bool match_property(sd_device_enumerator *enumerator, sd_device *device)
|
||||
|
||||
static bool match_tag(sd_device_enumerator *enumerator, sd_device *device) {
|
||||
const char *tag;
|
||||
Iterator i;
|
||||
|
||||
assert(enumerator);
|
||||
assert(device);
|
||||
|
||||
SET_FOREACH(tag, enumerator->match_tag)
|
||||
SET_FOREACH(tag, enumerator->match_tag, i)
|
||||
if (!sd_device_has_tag(device, tag))
|
||||
return false;
|
||||
|
||||
@ -369,6 +372,7 @@ static bool match_tag(sd_device_enumerator *enumerator, sd_device *device) {
|
||||
|
||||
static bool match_parent(sd_device_enumerator *enumerator, sd_device *device) {
|
||||
const char *syspath_parent, *syspath;
|
||||
Iterator i;
|
||||
|
||||
assert(enumerator);
|
||||
assert(device);
|
||||
@ -378,7 +382,7 @@ static bool match_parent(sd_device_enumerator *enumerator, sd_device *device) {
|
||||
|
||||
assert_se(sd_device_get_syspath(device, &syspath) >= 0);
|
||||
|
||||
SET_FOREACH(syspath_parent, enumerator->match_parent)
|
||||
SET_FOREACH(syspath_parent, enumerator->match_parent, i)
|
||||
if (path_startswith(syspath, syspath_parent))
|
||||
return true;
|
||||
|
||||
@ -387,6 +391,7 @@ static bool match_parent(sd_device_enumerator *enumerator, sd_device *device) {
|
||||
|
||||
static bool match_sysname(sd_device_enumerator *enumerator, const char *sysname) {
|
||||
const char *sysname_match;
|
||||
Iterator i;
|
||||
|
||||
assert(enumerator);
|
||||
assert(sysname);
|
||||
@ -394,7 +399,7 @@ static bool match_sysname(sd_device_enumerator *enumerator, const char *sysname)
|
||||
if (set_isempty(enumerator->match_sysname))
|
||||
return true;
|
||||
|
||||
SET_FOREACH(sysname_match, enumerator->match_sysname)
|
||||
SET_FOREACH(sysname_match, enumerator->match_sysname, i)
|
||||
if (fnmatch(sysname_match, sysname, 0) == 0)
|
||||
return true;
|
||||
|
||||
@ -491,20 +496,21 @@ static int enumerator_scan_dir_and_add_devices(sd_device_enumerator *enumerator,
|
||||
|
||||
static bool match_subsystem(sd_device_enumerator *enumerator, const char *subsystem) {
|
||||
const char *subsystem_match;
|
||||
Iterator i;
|
||||
|
||||
assert(enumerator);
|
||||
|
||||
if (!subsystem)
|
||||
return false;
|
||||
|
||||
SET_FOREACH(subsystem_match, enumerator->nomatch_subsystem)
|
||||
SET_FOREACH(subsystem_match, enumerator->nomatch_subsystem, i)
|
||||
if (fnmatch(subsystem_match, subsystem, 0) == 0)
|
||||
return false;
|
||||
|
||||
if (set_isempty(enumerator->match_subsystem))
|
||||
return true;
|
||||
|
||||
SET_FOREACH(subsystem_match, enumerator->match_subsystem)
|
||||
SET_FOREACH(subsystem_match, enumerator->match_subsystem, i)
|
||||
if (fnmatch(subsystem_match, subsystem, 0) == 0)
|
||||
return true;
|
||||
|
||||
@ -620,11 +626,12 @@ static int enumerator_scan_devices_tag(sd_device_enumerator *enumerator, const c
|
||||
|
||||
static int enumerator_scan_devices_tags(sd_device_enumerator *enumerator) {
|
||||
const char *tag;
|
||||
Iterator i;
|
||||
int r = 0;
|
||||
|
||||
assert(enumerator);
|
||||
|
||||
SET_FOREACH(tag, enumerator->match_tag) {
|
||||
SET_FOREACH(tag, enumerator->match_tag, i) {
|
||||
int k;
|
||||
|
||||
k = enumerator_scan_devices_tag(enumerator, tag);
|
||||
@ -715,8 +722,9 @@ static int parent_crawl_children(sd_device_enumerator *enumerator, const char *p
|
||||
static int enumerator_scan_devices_children(sd_device_enumerator *enumerator) {
|
||||
const char *path;
|
||||
int r = 0, k;
|
||||
Iterator i;
|
||||
|
||||
SET_FOREACH(path, enumerator->match_parent) {
|
||||
SET_FOREACH(path, enumerator->match_parent, i) {
|
||||
k = parent_add_child(enumerator, path);
|
||||
if (k < 0)
|
||||
r = k;
|
||||
|
||||
@ -353,6 +353,7 @@ DEFINE_PUBLIC_TRIVIAL_REF_UNREF_FUNC(sd_device_monitor, sd_device_monitor, devic
|
||||
|
||||
static int passes_filter(sd_device_monitor *m, sd_device *device) {
|
||||
const char *tag, *subsystem, *devtype, *s, *d = NULL;
|
||||
Iterator i;
|
||||
int r;
|
||||
|
||||
assert_return(m, -EINVAL);
|
||||
@ -369,7 +370,7 @@ static int passes_filter(sd_device_monitor *m, sd_device *device) {
|
||||
if (r < 0 && r != -ENOENT)
|
||||
return r;
|
||||
|
||||
HASHMAP_FOREACH_KEY(devtype, subsystem, m->subsystem_filter) {
|
||||
HASHMAP_FOREACH_KEY(devtype, subsystem, m->subsystem_filter, i) {
|
||||
if (!streq(s, subsystem))
|
||||
continue;
|
||||
|
||||
@ -389,7 +390,7 @@ tag:
|
||||
if (set_isempty(m->tag_filter))
|
||||
return 1;
|
||||
|
||||
SET_FOREACH(tag, m->tag_filter)
|
||||
SET_FOREACH(tag, m->tag_filter, i)
|
||||
if (sd_device_has_tag(device, tag) > 0)
|
||||
return 1;
|
||||
|
||||
@ -630,6 +631,7 @@ _public_ int sd_device_monitor_filter_update(sd_device_monitor *m) {
|
||||
struct sock_fprog filter;
|
||||
const char *subsystem, *devtype, *tag;
|
||||
unsigned i = 0;
|
||||
Iterator it;
|
||||
|
||||
assert_return(m, -EINVAL);
|
||||
|
||||
@ -653,7 +655,7 @@ _public_ int sd_device_monitor_filter_update(sd_device_monitor *m) {
|
||||
int tag_matches = set_size(m->tag_filter);
|
||||
|
||||
/* add all tags matches */
|
||||
SET_FOREACH(tag, m->tag_filter) {
|
||||
SET_FOREACH(tag, m->tag_filter, it) {
|
||||
uint64_t tag_bloom_bits = string_bloom64(tag);
|
||||
uint32_t tag_bloom_hi = tag_bloom_bits >> 32;
|
||||
uint32_t tag_bloom_lo = tag_bloom_bits & 0xffffffff;
|
||||
@ -680,7 +682,7 @@ _public_ int sd_device_monitor_filter_update(sd_device_monitor *m) {
|
||||
|
||||
/* add all subsystem matches */
|
||||
if (!hashmap_isempty(m->subsystem_filter)) {
|
||||
HASHMAP_FOREACH_KEY(devtype, subsystem, m->subsystem_filter) {
|
||||
HASHMAP_FOREACH_KEY(devtype, subsystem, m->subsystem_filter, it) {
|
||||
uint32_t hash = string_hash32(subsystem);
|
||||
|
||||
/* load device subsystem value in A */
|
||||
|
||||
@ -732,6 +732,7 @@ int device_new_from_stat_rdev(sd_device **ret, const struct stat *st) {
|
||||
|
||||
int device_copy_properties(sd_device *device_dst, sd_device *device_src) {
|
||||
const char *property, *value;
|
||||
Iterator i;
|
||||
int r;
|
||||
|
||||
assert(device_dst);
|
||||
@ -741,13 +742,13 @@ int device_copy_properties(sd_device *device_dst, sd_device *device_src) {
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
ORDERED_HASHMAP_FOREACH_KEY(value, property, device_src->properties_db) {
|
||||
ORDERED_HASHMAP_FOREACH_KEY(value, property, device_src->properties_db, i) {
|
||||
r = device_add_property_aux(device_dst, property, value, true);
|
||||
if (r < 0)
|
||||
return r;
|
||||
}
|
||||
|
||||
ORDERED_HASHMAP_FOREACH_KEY(value, property, device_src->properties) {
|
||||
ORDERED_HASHMAP_FOREACH_KEY(value, property, device_src->properties, i) {
|
||||
r = device_add_property_aux(device_dst, property, value, false);
|
||||
if (r < 0)
|
||||
return r;
|
||||
@ -920,6 +921,7 @@ int device_update_db(sd_device *device) {
|
||||
|
||||
if (has_info) {
|
||||
const char *property, *value, *tag;
|
||||
Iterator i;
|
||||
|
||||
if (major(device->devnum) > 0) {
|
||||
const char *devlink;
|
||||
@ -937,13 +939,13 @@ int device_update_db(sd_device *device) {
|
||||
if (device->usec_initialized > 0)
|
||||
fprintf(f, "I:"USEC_FMT"\n", device->usec_initialized);
|
||||
|
||||
ORDERED_HASHMAP_FOREACH_KEY(value, property, device->properties_db)
|
||||
ORDERED_HASHMAP_FOREACH_KEY(value, property, device->properties_db, i)
|
||||
fprintf(f, "E:%s=%s\n", property, value);
|
||||
|
||||
FOREACH_DEVICE_TAG(device, tag)
|
||||
fprintf(f, "G:%s\n", tag); /* Any tag */
|
||||
|
||||
SET_FOREACH(tag, device->current_tags)
|
||||
SET_FOREACH(tag, device->current_tags, i)
|
||||
fprintf(f, "Q:%s\n", tag); /* Current tag */
|
||||
}
|
||||
|
||||
|
||||
@ -1502,6 +1502,7 @@ static char *join_string_set(Set *s) {
|
||||
size_t ret_allocated = 0, ret_len;
|
||||
_cleanup_free_ char *ret = NULL;
|
||||
const char *tag;
|
||||
Iterator i;
|
||||
|
||||
if (!GREEDY_REALLOC(ret, ret_allocated, 2))
|
||||
return NULL;
|
||||
@ -1509,7 +1510,7 @@ static char *join_string_set(Set *s) {
|
||||
strcpy(ret, ":");
|
||||
ret_len = 1;
|
||||
|
||||
SET_FOREACH(tag, s) {
|
||||
SET_FOREACH(tag, s, i) {
|
||||
char *e;
|
||||
|
||||
if (!GREEDY_REALLOC(ret, ret_allocated, ret_len + strlen(tag) + 2))
|
||||
|
||||
@ -2870,6 +2870,7 @@ static int process_timer(
|
||||
|
||||
static int process_child(sd_event *e) {
|
||||
sd_event_source *s;
|
||||
Iterator i;
|
||||
int r;
|
||||
|
||||
assert(e);
|
||||
@ -2894,7 +2895,7 @@ static int process_child(sd_event *e) {
|
||||
the callback still sees the process as a zombie.
|
||||
*/
|
||||
|
||||
HASHMAP_FOREACH(s, e->child_sources) {
|
||||
HASHMAP_FOREACH(s, e->child_sources, i) {
|
||||
assert(s->type == SOURCE_CHILD);
|
||||
|
||||
if (s->pending)
|
||||
@ -3099,11 +3100,12 @@ static int event_inotify_data_process(sd_event *e, struct inotify_data *d) {
|
||||
|
||||
if (d->buffer.ev.mask & IN_Q_OVERFLOW) {
|
||||
struct inode_data *inode_data;
|
||||
Iterator i;
|
||||
|
||||
/* The queue overran, let's pass this event to all event sources connected to this inotify
|
||||
* object */
|
||||
|
||||
HASHMAP_FOREACH(inode_data, d->inodes) {
|
||||
HASHMAP_FOREACH(inode_data, d->inodes, i) {
|
||||
sd_event_source *s;
|
||||
|
||||
LIST_FOREACH(inotify.by_inode_data, s, inode_data->event_sources) {
|
||||
@ -3201,11 +3203,12 @@ static int source_dispatch(sd_event_source *s) {
|
||||
|
||||
if (s->type != SOURCE_POST) {
|
||||
sd_event_source *z;
|
||||
Iterator i;
|
||||
|
||||
/* If we execute a non-post source, let's mark all
|
||||
* post sources as pending */
|
||||
|
||||
SET_FOREACH(z, s->event->post_sources) {
|
||||
SET_FOREACH(z, s->event->post_sources, i) {
|
||||
if (z->enabled == SD_EVENT_OFF)
|
||||
continue;
|
||||
|
||||
|
||||
@ -157,6 +157,7 @@ struct udev_list_entry *udev_list_get_entry(struct udev_list *list) {
|
||||
else {
|
||||
_cleanup_free_ struct udev_list_entry **buf = NULL;
|
||||
struct udev_list_entry *entry, **p;
|
||||
Iterator i;
|
||||
size_t j;
|
||||
|
||||
buf = new(struct udev_list_entry *, n);
|
||||
@ -164,7 +165,7 @@ struct udev_list_entry *udev_list_get_entry(struct udev_list *list) {
|
||||
return NULL;
|
||||
|
||||
p = buf;
|
||||
HASHMAP_FOREACH(entry, list->unique_entries)
|
||||
HASHMAP_FOREACH(entry, list->unique_entries, i)
|
||||
*p++ = entry;
|
||||
|
||||
typesafe_qsort(buf, n, udev_list_entry_compare_func);
|
||||
|
||||
@ -168,6 +168,7 @@ int devnode_acl_all(const char *seat,
|
||||
_cleanup_closedir_ DIR *dir = NULL;
|
||||
struct dirent *dent;
|
||||
sd_device *d;
|
||||
Iterator i;
|
||||
char *n;
|
||||
int r;
|
||||
|
||||
@ -238,7 +239,7 @@ int devnode_acl_all(const char *seat,
|
||||
}
|
||||
|
||||
r = 0;
|
||||
SET_FOREACH(n, nodes) {
|
||||
SET_FOREACH(n, nodes, i) {
|
||||
int k;
|
||||
|
||||
log_debug("Changing ACLs at %s for seat %s (uid "UID_FMT"→"UID_FMT"%s%s)",
|
||||
|
||||
@ -391,12 +391,13 @@ int manager_get_idle_hint(Manager *m, dual_timestamp *t) {
|
||||
Session *s;
|
||||
bool idle_hint;
|
||||
dual_timestamp ts = DUAL_TIMESTAMP_NULL;
|
||||
Iterator i;
|
||||
|
||||
assert(m);
|
||||
|
||||
idle_hint = !manager_is_inhibited(m, INHIBIT_IDLE, INHIBIT_BLOCK, t, false, false, 0, NULL);
|
||||
|
||||
HASHMAP_FOREACH(s, m->sessions) {
|
||||
HASHMAP_FOREACH(s, m->sessions, i) {
|
||||
dual_timestamp k;
|
||||
int ih;
|
||||
|
||||
@ -546,9 +547,10 @@ int manager_spawn_autovt(Manager *m, unsigned vtnr) {
|
||||
}
|
||||
|
||||
bool manager_is_lid_closed(Manager *m) {
|
||||
Iterator i;
|
||||
Button *b;
|
||||
|
||||
HASHMAP_FOREACH(b, m->buttons)
|
||||
HASHMAP_FOREACH(b, m->buttons, i)
|
||||
if (b->lid_closed)
|
||||
return true;
|
||||
|
||||
@ -556,9 +558,10 @@ bool manager_is_lid_closed(Manager *m) {
|
||||
}
|
||||
|
||||
static bool manager_is_docked(Manager *m) {
|
||||
Iterator i;
|
||||
Button *b;
|
||||
|
||||
HASHMAP_FOREACH(b, m->buttons)
|
||||
HASHMAP_FOREACH(b, m->buttons, i)
|
||||
if (b->docked)
|
||||
return true;
|
||||
|
||||
|
||||
@ -516,6 +516,7 @@ static int method_list_sessions(sd_bus_message *message, void *userdata, sd_bus_
|
||||
_cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
|
||||
Manager *m = userdata;
|
||||
Session *session;
|
||||
Iterator i;
|
||||
int r;
|
||||
|
||||
assert(message);
|
||||
@ -529,7 +530,7 @@ static int method_list_sessions(sd_bus_message *message, void *userdata, sd_bus_
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
HASHMAP_FOREACH(session, m->sessions) {
|
||||
HASHMAP_FOREACH(session, m->sessions, i) {
|
||||
_cleanup_free_ char *p = NULL;
|
||||
|
||||
p = session_bus_path(session);
|
||||
@ -557,6 +558,7 @@ static int method_list_users(sd_bus_message *message, void *userdata, sd_bus_err
|
||||
_cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
|
||||
Manager *m = userdata;
|
||||
User *user;
|
||||
Iterator i;
|
||||
int r;
|
||||
|
||||
assert(message);
|
||||
@ -570,7 +572,7 @@ static int method_list_users(sd_bus_message *message, void *userdata, sd_bus_err
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
HASHMAP_FOREACH(user, m->users) {
|
||||
HASHMAP_FOREACH(user, m->users, i) {
|
||||
_cleanup_free_ char *p = NULL;
|
||||
|
||||
p = user_bus_path(user);
|
||||
@ -596,6 +598,7 @@ static int method_list_seats(sd_bus_message *message, void *userdata, sd_bus_err
|
||||
_cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
|
||||
Manager *m = userdata;
|
||||
Seat *seat;
|
||||
Iterator i;
|
||||
int r;
|
||||
|
||||
assert(message);
|
||||
@ -609,7 +612,7 @@ static int method_list_seats(sd_bus_message *message, void *userdata, sd_bus_err
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
HASHMAP_FOREACH(seat, m->seats) {
|
||||
HASHMAP_FOREACH(seat, m->seats, i) {
|
||||
_cleanup_free_ char *p = NULL;
|
||||
|
||||
p = seat_bus_path(seat);
|
||||
@ -632,6 +635,7 @@ static int method_list_inhibitors(sd_bus_message *message, void *userdata, sd_bu
|
||||
_cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
|
||||
Manager *m = userdata;
|
||||
Inhibitor *inhibitor;
|
||||
Iterator i;
|
||||
int r;
|
||||
|
||||
assert(message);
|
||||
@ -645,7 +649,7 @@ static int method_list_inhibitors(sd_bus_message *message, void *userdata, sd_bu
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
HASHMAP_FOREACH(inhibitor, m->inhibitors) {
|
||||
HASHMAP_FOREACH(inhibitor, m->inhibitors, i) {
|
||||
|
||||
r = sd_bus_message_append(reply, "(ssssuu)",
|
||||
strempty(inhibit_what_to_string(inhibitor->what)),
|
||||
@ -1495,12 +1499,13 @@ static int have_multiple_sessions(
|
||||
uid_t uid) {
|
||||
|
||||
Session *session;
|
||||
Iterator i;
|
||||
|
||||
assert(m);
|
||||
|
||||
/* Check for other users' sessions. Greeter sessions do not
|
||||
* count, and non-login sessions do not count either. */
|
||||
HASHMAP_FOREACH(session, m->sessions)
|
||||
HASHMAP_FOREACH(session, m->sessions, i)
|
||||
if (session->class == SESSION_USER &&
|
||||
session->user->user_record->uid != uid)
|
||||
return true;
|
||||
@ -3895,6 +3900,7 @@ int match_properties_changed(sd_bus_message *message, void *userdata, sd_bus_err
|
||||
int match_reloading(sd_bus_message *message, void *userdata, sd_bus_error *error) {
|
||||
Manager *m = userdata;
|
||||
Session *session;
|
||||
Iterator i;
|
||||
int b, r;
|
||||
|
||||
assert(message);
|
||||
@ -3912,7 +3918,7 @@ int match_reloading(sd_bus_message *message, void *userdata, sd_bus_error *error
|
||||
/* systemd finished reloading, let's recheck all our sessions */
|
||||
log_debug("System manager has been reloaded, rechecking sessions...");
|
||||
|
||||
HASHMAP_FOREACH(session, m->sessions)
|
||||
HASHMAP_FOREACH(session, m->sessions, i)
|
||||
session_add_to_gc_queue(session);
|
||||
|
||||
return 0;
|
||||
|
||||
@ -372,11 +372,12 @@ bool inhibitor_is_orphan(Inhibitor *i) {
|
||||
|
||||
InhibitWhat manager_inhibit_what(Manager *m, InhibitMode mm) {
|
||||
Inhibitor *i;
|
||||
Iterator j;
|
||||
InhibitWhat what = 0;
|
||||
|
||||
assert(m);
|
||||
|
||||
HASHMAP_FOREACH(i, m->inhibitors)
|
||||
HASHMAP_FOREACH(i, m->inhibitors, j)
|
||||
if (i->mode == mm && i->started)
|
||||
what |= i->what;
|
||||
|
||||
@ -412,13 +413,14 @@ bool manager_is_inhibited(
|
||||
Inhibitor **offending) {
|
||||
|
||||
Inhibitor *i;
|
||||
Iterator j;
|
||||
struct dual_timestamp ts = DUAL_TIMESTAMP_NULL;
|
||||
bool inhibited = false;
|
||||
|
||||
assert(m);
|
||||
assert(w > 0 && w < _INHIBIT_WHAT_MAX);
|
||||
|
||||
HASHMAP_FOREACH(i, m->inhibitors) {
|
||||
HASHMAP_FOREACH(i, m->inhibitors, j) {
|
||||
if (!i->started)
|
||||
continue;
|
||||
|
||||
|
||||
@ -345,13 +345,14 @@ static int seat_node_enumerator(sd_bus *bus, const char *path, void *userdata, c
|
||||
sd_bus_message *message;
|
||||
Manager *m = userdata;
|
||||
Seat *seat;
|
||||
Iterator i;
|
||||
int r;
|
||||
|
||||
assert(bus);
|
||||
assert(path);
|
||||
assert(nodes);
|
||||
|
||||
HASHMAP_FOREACH(seat, m->seats) {
|
||||
HASHMAP_FOREACH(seat, m->seats, i) {
|
||||
char *p;
|
||||
|
||||
p = seat_bus_path(seat);
|
||||
|
||||
@ -635,13 +635,14 @@ static int session_node_enumerator(sd_bus *bus, const char *path, void *userdata
|
||||
sd_bus_message *message;
|
||||
Manager *m = userdata;
|
||||
Session *session;
|
||||
Iterator i;
|
||||
int r;
|
||||
|
||||
assert(bus);
|
||||
assert(path);
|
||||
assert(nodes);
|
||||
|
||||
HASHMAP_FOREACH(session, m->sessions) {
|
||||
HASHMAP_FOREACH(session, m->sessions, i) {
|
||||
char *p;
|
||||
|
||||
p = session_bus_path(session);
|
||||
@ -752,11 +753,12 @@ int session_send_lock(Session *s, bool lock) {
|
||||
|
||||
int session_send_lock_all(Manager *m, bool lock) {
|
||||
Session *session;
|
||||
Iterator i;
|
||||
int r = 0;
|
||||
|
||||
assert(m);
|
||||
|
||||
HASHMAP_FOREACH(session, m->sessions) {
|
||||
HASHMAP_FOREACH(session, m->sessions, i) {
|
||||
int k;
|
||||
|
||||
k = session_send_lock(session, lock);
|
||||
|
||||
@ -408,6 +408,7 @@ void session_device_free(SessionDevice *sd) {
|
||||
|
||||
void session_device_complete_pause(SessionDevice *sd) {
|
||||
SessionDevice *iter;
|
||||
Iterator i;
|
||||
|
||||
if (!sd->active)
|
||||
return;
|
||||
@ -415,7 +416,7 @@ void session_device_complete_pause(SessionDevice *sd) {
|
||||
session_device_stop(sd);
|
||||
|
||||
/* if not all devices are paused, wait for further completion events */
|
||||
HASHMAP_FOREACH(iter, sd->session->devices)
|
||||
HASHMAP_FOREACH(iter, sd->session->devices, i)
|
||||
if (iter->active)
|
||||
return;
|
||||
|
||||
@ -425,10 +426,11 @@ void session_device_complete_pause(SessionDevice *sd) {
|
||||
|
||||
void session_device_resume_all(Session *s) {
|
||||
SessionDevice *sd;
|
||||
Iterator i;
|
||||
|
||||
assert(s);
|
||||
|
||||
HASHMAP_FOREACH(sd, s->devices) {
|
||||
HASHMAP_FOREACH(sd, s->devices, i) {
|
||||
if (sd->active)
|
||||
continue;
|
||||
|
||||
@ -443,10 +445,11 @@ void session_device_resume_all(Session *s) {
|
||||
|
||||
void session_device_pause_all(Session *s) {
|
||||
SessionDevice *sd;
|
||||
Iterator i;
|
||||
|
||||
assert(s);
|
||||
|
||||
HASHMAP_FOREACH(sd, s->devices) {
|
||||
HASHMAP_FOREACH(sd, s->devices, i) {
|
||||
if (!sd->active)
|
||||
continue;
|
||||
|
||||
@ -458,10 +461,11 @@ void session_device_pause_all(Session *s) {
|
||||
unsigned session_device_try_pause_all(Session *s) {
|
||||
unsigned num_pending = 0;
|
||||
SessionDevice *sd;
|
||||
Iterator i;
|
||||
|
||||
assert(s);
|
||||
|
||||
HASHMAP_FOREACH(sd, s->devices) {
|
||||
HASHMAP_FOREACH(sd, s->devices, i) {
|
||||
if (!sd->active)
|
||||
continue;
|
||||
|
||||
|
||||
@ -189,10 +189,11 @@ int session_set_leader(Session *s, pid_t pid) {
|
||||
|
||||
static void session_save_devices(Session *s, FILE *f) {
|
||||
SessionDevice *sd;
|
||||
Iterator i;
|
||||
|
||||
if (!hashmap_isempty(s->devices)) {
|
||||
fprintf(f, "DEVICES=");
|
||||
HASHMAP_FOREACH(sd, s->devices)
|
||||
HASHMAP_FOREACH(sd, s->devices, i)
|
||||
fprintf(f, "%u:%u ", major(sd->dev), minor(sd->dev));
|
||||
fprintf(f, "\n");
|
||||
}
|
||||
|
||||
@ -319,13 +319,14 @@ static int user_node_enumerator(sd_bus *bus, const char *path, void *userdata, c
|
||||
sd_bus_message *message;
|
||||
Manager *m = userdata;
|
||||
User *user;
|
||||
Iterator i;
|
||||
int r;
|
||||
|
||||
assert(bus);
|
||||
assert(path);
|
||||
assert(nodes);
|
||||
|
||||
HASHMAP_FOREACH(user, m->users) {
|
||||
HASHMAP_FOREACH(user, m->users, i) {
|
||||
char *p;
|
||||
|
||||
p = user_bus_path(user);
|
||||
|
||||
@ -1032,6 +1032,7 @@ static int manager_startup(Manager *m) {
|
||||
User *user;
|
||||
Button *button;
|
||||
Inhibitor *inhibitor;
|
||||
Iterator i;
|
||||
|
||||
assert(m);
|
||||
|
||||
@ -1101,16 +1102,16 @@ static int manager_startup(Manager *m) {
|
||||
manager_read_utmp(m);
|
||||
|
||||
/* And start everything */
|
||||
HASHMAP_FOREACH(seat, m->seats)
|
||||
HASHMAP_FOREACH(seat, m->seats, i)
|
||||
(void) seat_start(seat);
|
||||
|
||||
HASHMAP_FOREACH(user, m->users)
|
||||
HASHMAP_FOREACH(user, m->users, i)
|
||||
(void) user_start(user);
|
||||
|
||||
HASHMAP_FOREACH(session, m->sessions)
|
||||
HASHMAP_FOREACH(session, m->sessions, i)
|
||||
(void) session_start(session, NULL, NULL);
|
||||
|
||||
HASHMAP_FOREACH(inhibitor, m->inhibitors) {
|
||||
HASHMAP_FOREACH(inhibitor, m->inhibitors, i) {
|
||||
(void) inhibitor_start(inhibitor);
|
||||
|
||||
/* Let's see if the inhibitor is dead now, then remove it */
|
||||
@ -1120,7 +1121,7 @@ static int manager_startup(Manager *m) {
|
||||
}
|
||||
}
|
||||
|
||||
HASHMAP_FOREACH(button, m->buttons)
|
||||
HASHMAP_FOREACH(button, m->buttons, i)
|
||||
button_check_switches(button);
|
||||
|
||||
manager_dispatch_idle_action(NULL, 0, m);
|
||||
|
||||
@ -442,6 +442,7 @@ static int image_node_enumerator(sd_bus *bus, const char *path, void *userdata,
|
||||
_cleanup_hashmap_free_ Hashmap *images = NULL;
|
||||
_cleanup_strv_free_ char **l = NULL;
|
||||
Image *image;
|
||||
Iterator i;
|
||||
int r;
|
||||
|
||||
assert(bus);
|
||||
@ -456,7 +457,7 @@ static int image_node_enumerator(sd_bus *bus, const char *path, void *userdata,
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
HASHMAP_FOREACH(image, images) {
|
||||
HASHMAP_FOREACH(image, images, i) {
|
||||
char *p;
|
||||
|
||||
p = image_bus_path(image->name);
|
||||
|
||||
@ -1382,13 +1382,14 @@ static int machine_node_enumerator(sd_bus *bus, const char *path, void *userdata
|
||||
_cleanup_strv_free_ char **l = NULL;
|
||||
Machine *machine = NULL;
|
||||
Manager *m = userdata;
|
||||
Iterator i;
|
||||
int r;
|
||||
|
||||
assert(bus);
|
||||
assert(path);
|
||||
assert(nodes);
|
||||
|
||||
HASHMAP_FOREACH(machine, m->machines) {
|
||||
HASHMAP_FOREACH(machine, m->machines, i) {
|
||||
char *p;
|
||||
|
||||
p = machine_bus_path(machine);
|
||||
|
||||
@ -38,6 +38,7 @@ int manager_enqueue_nscd_cache_flush(Manager *m) {
|
||||
|
||||
int manager_find_machine_for_uid(Manager *m, uid_t uid, Machine **ret_machine, uid_t *ret_internal_uid) {
|
||||
Machine *machine;
|
||||
Iterator i;
|
||||
int r;
|
||||
|
||||
assert(m);
|
||||
@ -46,7 +47,7 @@ int manager_find_machine_for_uid(Manager *m, uid_t uid, Machine **ret_machine, u
|
||||
/* Finds the machine for the specified host UID and returns it along with the UID translated into the
|
||||
* internal UID inside the machine */
|
||||
|
||||
HASHMAP_FOREACH(machine, m->machines) {
|
||||
HASHMAP_FOREACH(machine, m->machines, i) {
|
||||
uid_t converted;
|
||||
|
||||
r = machine_owns_uid(machine, uid, &converted);
|
||||
@ -73,12 +74,13 @@ int manager_find_machine_for_uid(Manager *m, uid_t uid, Machine **ret_machine, u
|
||||
|
||||
int manager_find_machine_for_gid(Manager *m, gid_t gid, Machine **ret_machine, gid_t *ret_internal_gid) {
|
||||
Machine *machine;
|
||||
Iterator i;
|
||||
int r;
|
||||
|
||||
assert(m);
|
||||
assert(gid_is_valid(gid));
|
||||
|
||||
HASHMAP_FOREACH(machine, m->machines) {
|
||||
HASHMAP_FOREACH(machine, m->machines, i) {
|
||||
gid_t converted;
|
||||
|
||||
r = machine_owns_gid(machine, gid, &converted);
|
||||
|
||||
@ -185,6 +185,7 @@ static int method_list_machines(sd_bus_message *message, void *userdata, sd_bus_
|
||||
_cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
|
||||
Manager *m = userdata;
|
||||
Machine *machine;
|
||||
Iterator i;
|
||||
int r;
|
||||
|
||||
assert(message);
|
||||
@ -198,7 +199,7 @@ static int method_list_machines(sd_bus_message *message, void *userdata, sd_bus_
|
||||
if (r < 0)
|
||||
return sd_bus_error_set_errno(error, r);
|
||||
|
||||
HASHMAP_FOREACH(machine, m->machines) {
|
||||
HASHMAP_FOREACH(machine, m->machines, i) {
|
||||
_cleanup_free_ char *p = NULL;
|
||||
|
||||
p = machine_bus_path(machine);
|
||||
@ -473,6 +474,7 @@ static int method_list_images(sd_bus_message *message, void *userdata, sd_bus_er
|
||||
_cleanup_hashmap_free_ Hashmap *images = NULL;
|
||||
_unused_ Manager *m = userdata;
|
||||
Image *image;
|
||||
Iterator i;
|
||||
int r;
|
||||
|
||||
assert(message);
|
||||
@ -494,7 +496,7 @@ static int method_list_images(sd_bus_message *message, void *userdata, sd_bus_er
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
HASHMAP_FOREACH(image, images) {
|
||||
HASHMAP_FOREACH(image, images, i) {
|
||||
_cleanup_free_ char *p = NULL;
|
||||
|
||||
p = image_bus_path(image->name);
|
||||
@ -747,6 +749,7 @@ static int method_clean_pool(sd_bus_message *message, void *userdata, sd_bus_err
|
||||
_cleanup_hashmap_free_ Hashmap *images = NULL;
|
||||
bool success = true;
|
||||
Image *image;
|
||||
Iterator i;
|
||||
ssize_t l;
|
||||
|
||||
errno_pipe_fd[0] = safe_close(errno_pipe_fd[0]);
|
||||
@ -767,7 +770,7 @@ static int method_clean_pool(sd_bus_message *message, void *userdata, sd_bus_err
|
||||
goto child_fail;
|
||||
}
|
||||
|
||||
HASHMAP_FOREACH(image, images) {
|
||||
HASHMAP_FOREACH(image, images, i) {
|
||||
|
||||
/* We can't remove vendor images (i.e. those in /usr) */
|
||||
if (IMAGE_IS_VENDOR(image))
|
||||
@ -1418,6 +1421,7 @@ int match_unit_removed(sd_bus_message *message, void *userdata, sd_bus_error *er
|
||||
int match_reloading(sd_bus_message *message, void *userdata, sd_bus_error *error) {
|
||||
Manager *m = userdata;
|
||||
Machine *machine;
|
||||
Iterator i;
|
||||
int b, r;
|
||||
|
||||
assert(message);
|
||||
@ -1434,7 +1438,7 @@ int match_reloading(sd_bus_message *message, void *userdata, sd_bus_error *error
|
||||
/* systemd finished reloading, let's recheck all our machines */
|
||||
log_debug("System manager has been reloaded, rechecking machines...");
|
||||
|
||||
HASHMAP_FOREACH(machine, m->machines)
|
||||
HASHMAP_FOREACH(machine, m->machines, i)
|
||||
machine_add_to_gc_queue(machine);
|
||||
|
||||
return 0;
|
||||
|
||||
@ -265,6 +265,7 @@ static void manager_gc(Manager *m, bool drop_not_started) {
|
||||
|
||||
static int manager_startup(Manager *m) {
|
||||
Machine *machine;
|
||||
Iterator i;
|
||||
int r;
|
||||
|
||||
assert(m);
|
||||
@ -286,7 +287,7 @@ static int manager_startup(Manager *m) {
|
||||
manager_gc(m, false);
|
||||
|
||||
/* And start everything */
|
||||
HASHMAP_FOREACH(machine, m->machines)
|
||||
HASHMAP_FOREACH(machine, m->machines, i)
|
||||
machine_start(machine, NULL, NULL);
|
||||
|
||||
return 0;
|
||||
|
||||
@ -83,6 +83,7 @@ static int context_save(Context *context) {
|
||||
Network *network;
|
||||
NetDev *netdev;
|
||||
Link *link;
|
||||
Iterator i;
|
||||
int k, r;
|
||||
const char *p;
|
||||
|
||||
@ -92,19 +93,19 @@ static int context_save(Context *context) {
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to create directory " NETWORKD_UNIT_DIRECTORY ": %m");
|
||||
|
||||
HASHMAP_FOREACH(network, context->networks_by_name) {
|
||||
HASHMAP_FOREACH(network, context->networks_by_name, i) {
|
||||
k = network_save(network, p);
|
||||
if (k < 0 && r >= 0)
|
||||
r = k;
|
||||
}
|
||||
|
||||
HASHMAP_FOREACH(netdev, context->netdevs_by_name) {
|
||||
HASHMAP_FOREACH(netdev, context->netdevs_by_name, i) {
|
||||
k = netdev_save(netdev, p);
|
||||
if (k < 0 && r >= 0)
|
||||
r = k;
|
||||
}
|
||||
|
||||
HASHMAP_FOREACH(link, context->links_by_name) {
|
||||
HASHMAP_FOREACH(link, context->links_by_name, i) {
|
||||
k = link_save(link, p);
|
||||
if (k < 0 && r >= 0)
|
||||
r = k;
|
||||
|
||||
@ -957,6 +957,7 @@ int parse_cmdline_item(const char *key, const char *value, void *data) {
|
||||
int context_merge_networks(Context *context) {
|
||||
Network *all, *network;
|
||||
Route *route;
|
||||
Iterator i;
|
||||
int r;
|
||||
|
||||
assert(context);
|
||||
@ -973,7 +974,7 @@ int context_merge_networks(Context *context) {
|
||||
if (hashmap_size(context->networks_by_name) <= 1)
|
||||
return 0;
|
||||
|
||||
HASHMAP_FOREACH(network, context->networks_by_name) {
|
||||
HASHMAP_FOREACH(network, context->networks_by_name, i) {
|
||||
if (network == all)
|
||||
continue;
|
||||
|
||||
|
||||
@ -201,6 +201,7 @@ static int netdev_bond_fill_message_create(NetDev *netdev, Link *link, sd_netlin
|
||||
}
|
||||
|
||||
if (b->arp_interval > 0 && !ordered_set_isempty(b->arp_ip_targets)) {
|
||||
Iterator i;
|
||||
void *val;
|
||||
int n = 0;
|
||||
|
||||
@ -208,7 +209,7 @@ static int netdev_bond_fill_message_create(NetDev *netdev, Link *link, sd_netlin
|
||||
if (r < 0)
|
||||
return log_netdev_error_errno(netdev, r, "Could not open contaniner IFLA_BOND_ARP_IP_TARGET : %m");
|
||||
|
||||
ORDERED_SET_FOREACH(val, b->arp_ip_targets) {
|
||||
ORDERED_SET_FOREACH(val, b->arp_ip_targets, i) {
|
||||
r = sd_netlink_message_append_u32(m, n++, PTR_TO_UINT32(val));
|
||||
if (r < 0)
|
||||
return log_netdev_error_errno(netdev, r, "Could not append IFLA_BOND_ARP_ALL_TARGETS attribute: %m");
|
||||
|
||||
@ -275,6 +275,7 @@ static int l2tp_acquire_local_address_one(L2tpTunnel *t, Address *a, union in_ad
|
||||
|
||||
static int l2tp_acquire_local_address(L2tpTunnel *t, Link *link, union in_addr_union *ret) {
|
||||
Address *a;
|
||||
Iterator i;
|
||||
|
||||
assert(t);
|
||||
assert(link);
|
||||
@ -287,11 +288,11 @@ static int l2tp_acquire_local_address(L2tpTunnel *t, Link *link, union in_addr_u
|
||||
return 0;
|
||||
}
|
||||
|
||||
SET_FOREACH(a, link->addresses)
|
||||
SET_FOREACH(a, link->addresses, i)
|
||||
if (l2tp_acquire_local_address_one(t, a, ret) >= 0)
|
||||
return 1;
|
||||
|
||||
SET_FOREACH(a, link->addresses_foreign)
|
||||
SET_FOREACH(a, link->addresses_foreign, i)
|
||||
if (l2tp_acquire_local_address_one(t, a, ret) >= 0)
|
||||
return 1;
|
||||
|
||||
@ -347,6 +348,7 @@ static int l2tp_create_session(NetDev *netdev, L2tpSession *session) {
|
||||
static int l2tp_create_tunnel_handler(sd_netlink *rtnl, sd_netlink_message *m, NetDev *netdev) {
|
||||
L2tpSession *session;
|
||||
L2tpTunnel *t;
|
||||
Iterator i;
|
||||
int r;
|
||||
|
||||
assert(netdev);
|
||||
@ -368,7 +370,7 @@ static int l2tp_create_tunnel_handler(sd_netlink *rtnl, sd_netlink_message *m, N
|
||||
|
||||
log_netdev_debug(netdev, "L2TP tunnel is created");
|
||||
|
||||
ORDERED_HASHMAP_FOREACH(session, t->sessions_by_section)
|
||||
ORDERED_HASHMAP_FOREACH(session, t->sessions_by_section, i)
|
||||
(void) l2tp_create_session(netdev, session);
|
||||
|
||||
return 1;
|
||||
@ -675,6 +677,7 @@ static int l2tp_session_verify(L2tpSession *session) {
|
||||
static int netdev_l2tp_tunnel_verify(NetDev *netdev, const char *filename) {
|
||||
L2tpTunnel *t;
|
||||
L2tpSession *session;
|
||||
Iterator i;
|
||||
|
||||
assert(netdev);
|
||||
assert(filename);
|
||||
@ -698,7 +701,7 @@ static int netdev_l2tp_tunnel_verify(NetDev *netdev, const char *filename) {
|
||||
"%s: L2TP tunnel without tunnel IDs configured. Ignoring",
|
||||
filename);
|
||||
|
||||
ORDERED_HASHMAP_FOREACH(session, t->sessions_by_section)
|
||||
ORDERED_HASHMAP_FOREACH(session, t->sessions_by_section, i)
|
||||
if (l2tp_session_verify(session) < 0)
|
||||
l2tp_session_free(session);
|
||||
|
||||
|
||||
@ -494,6 +494,7 @@ static int netdev_macsec_configure_transmit_association(NetDev *netdev, Transmit
|
||||
static int netdev_macsec_configure(NetDev *netdev, Link *link, sd_netlink_message *m) {
|
||||
TransmitAssociation *a;
|
||||
ReceiveChannel *c;
|
||||
Iterator i;
|
||||
MACsec *s;
|
||||
int r;
|
||||
|
||||
@ -501,13 +502,13 @@ static int netdev_macsec_configure(NetDev *netdev, Link *link, sd_netlink_messag
|
||||
s = MACSEC(netdev);
|
||||
assert(s);
|
||||
|
||||
ORDERED_HASHMAP_FOREACH(a, s->transmit_associations_by_section) {
|
||||
ORDERED_HASHMAP_FOREACH(a, s->transmit_associations_by_section, i) {
|
||||
r = netdev_macsec_configure_transmit_association(netdev, a);
|
||||
if (r < 0)
|
||||
return r;
|
||||
}
|
||||
|
||||
ORDERED_HASHMAP_FOREACH(c, s->receive_channels) {
|
||||
ORDERED_HASHMAP_FOREACH(c, s->receive_channels, i) {
|
||||
r = netdev_macsec_configure_receive_channel(netdev, c);
|
||||
if (r < 0)
|
||||
return r;
|
||||
@ -1147,6 +1148,7 @@ static int netdev_macsec_verify(NetDev *netdev, const char *filename) {
|
||||
TransmitAssociation *a;
|
||||
ReceiveAssociation *n;
|
||||
ReceiveChannel *c;
|
||||
Iterator i;
|
||||
uint8_t an, encoding_an;
|
||||
bool use_for_encoding;
|
||||
int r;
|
||||
@ -1155,7 +1157,7 @@ static int netdev_macsec_verify(NetDev *netdev, const char *filename) {
|
||||
assert(v);
|
||||
assert(filename);
|
||||
|
||||
ORDERED_HASHMAP_FOREACH(c, v->receive_channels_by_section) {
|
||||
ORDERED_HASHMAP_FOREACH(c, v->receive_channels_by_section, i) {
|
||||
r = macsec_receive_channel_verify(c);
|
||||
if (r < 0)
|
||||
macsec_receive_channel_free(c);
|
||||
@ -1164,7 +1166,7 @@ static int netdev_macsec_verify(NetDev *netdev, const char *filename) {
|
||||
an = 0;
|
||||
use_for_encoding = false;
|
||||
encoding_an = 0;
|
||||
ORDERED_HASHMAP_FOREACH(a, v->transmit_associations_by_section) {
|
||||
ORDERED_HASHMAP_FOREACH(a, v->transmit_associations_by_section, i) {
|
||||
r = macsec_transmit_association_verify(a);
|
||||
if (r < 0) {
|
||||
macsec_transmit_association_free(a);
|
||||
@ -1199,7 +1201,7 @@ static int netdev_macsec_verify(NetDev *netdev, const char *filename) {
|
||||
assert(encoding_an < MACSEC_MAX_ASSOCIATION_NUMBER);
|
||||
v->encoding_an = encoding_an;
|
||||
|
||||
ORDERED_HASHMAP_FOREACH(n, v->receive_associations_by_section) {
|
||||
ORDERED_HASHMAP_FOREACH(n, v->receive_associations_by_section, i) {
|
||||
r = macsec_receive_association_verify(n);
|
||||
if (r < 0)
|
||||
macsec_receive_association_free(n);
|
||||
|
||||
@ -24,6 +24,7 @@ static int netdev_macvlan_fill_message_create(NetDev *netdev, Link *link, sd_net
|
||||
assert(m);
|
||||
|
||||
if (m->mode == NETDEV_MACVLAN_MODE_SOURCE && !set_isempty(m->match_source_mac)) {
|
||||
Iterator i;
|
||||
const struct ether_addr *mac_addr;
|
||||
|
||||
r = sd_netlink_message_append_u32(req, IFLA_MACVLAN_MACADDR_MODE, MACVLAN_MACADDR_SET);
|
||||
@ -34,7 +35,7 @@ static int netdev_macvlan_fill_message_create(NetDev *netdev, Link *link, sd_net
|
||||
if (r < 0)
|
||||
return log_netdev_error_errno(netdev, r, "Could not open IFLA_MACVLAN_MACADDR_DATA container: %m");
|
||||
|
||||
SET_FOREACH(mac_addr, m->match_source_mac) {
|
||||
SET_FOREACH(mac_addr, m->match_source_mac, i) {
|
||||
r = sd_netlink_message_append_ether_addr(req, IFLA_MACVLAN_MACADDR, mac_addr);
|
||||
if (r < 0)
|
||||
return log_netdev_error_errno(netdev, r, "Could not append IFLA_MACVLAN_MACADDR attribute: %m");
|
||||
|
||||
@ -395,13 +395,14 @@ static void resolve_endpoints(NetDev *netdev) {
|
||||
};
|
||||
WireguardPeer *peer;
|
||||
Wireguard *w;
|
||||
Iterator i;
|
||||
int r;
|
||||
|
||||
assert(netdev);
|
||||
w = WIREGUARD(netdev);
|
||||
assert(w);
|
||||
|
||||
SET_FOREACH(peer, w->peers_with_unresolved_endpoint) {
|
||||
SET_FOREACH(peer, w->peers_with_unresolved_endpoint, i) {
|
||||
r = resolve_getaddrinfo(netdev->manager->resolve,
|
||||
NULL,
|
||||
peer->endpoint_host,
|
||||
|
||||
@ -2477,6 +2477,7 @@ static int link_up_down(int argc, char *argv[], void *userdata) {
|
||||
_cleanup_(sd_netlink_unrefp) sd_netlink *rtnl = NULL;
|
||||
_cleanup_set_free_ Set *indexes = NULL;
|
||||
int index, r, i;
|
||||
Iterator j;
|
||||
void *p;
|
||||
|
||||
r = sd_netlink_open(&rtnl);
|
||||
@ -2497,7 +2498,7 @@ static int link_up_down(int argc, char *argv[], void *userdata) {
|
||||
return log_oom();
|
||||
}
|
||||
|
||||
SET_FOREACH(p, indexes) {
|
||||
SET_FOREACH(p, indexes, j) {
|
||||
index = PTR_TO_INT(p);
|
||||
r = link_up_down_send_message(rtnl, argv[0], index);
|
||||
if (r < 0) {
|
||||
@ -2515,6 +2516,7 @@ static int link_delete(int argc, char *argv[], void *userdata) {
|
||||
_cleanup_(sd_netlink_unrefp) sd_netlink *rtnl = NULL;
|
||||
_cleanup_set_free_ Set *indexes = NULL;
|
||||
int index, r, i;
|
||||
Iterator j;
|
||||
void *p;
|
||||
|
||||
r = sd_netlink_open(&rtnl);
|
||||
@ -2535,7 +2537,7 @@ static int link_delete(int argc, char *argv[], void *userdata) {
|
||||
return log_oom();
|
||||
}
|
||||
|
||||
SET_FOREACH(p, indexes) {
|
||||
SET_FOREACH(p, indexes, j) {
|
||||
index = PTR_TO_INT(p);
|
||||
r = link_delete_send_message(rtnl, index);
|
||||
if (r < 0) {
|
||||
@ -2639,6 +2641,7 @@ static int verb_reconfigure(int argc, char *argv[], void *userdata) {
|
||||
_cleanup_(sd_netlink_unrefp) sd_netlink *rtnl = NULL;
|
||||
_cleanup_set_free_ Set *indexes = NULL;
|
||||
int index, i, r;
|
||||
Iterator j;
|
||||
void *p;
|
||||
|
||||
r = sd_bus_open_system(&bus);
|
||||
@ -2659,7 +2662,7 @@ static int verb_reconfigure(int argc, char *argv[], void *userdata) {
|
||||
return log_oom();
|
||||
}
|
||||
|
||||
SET_FOREACH(p, indexes) {
|
||||
SET_FOREACH(p, indexes, j) {
|
||||
index = PTR_TO_INT(p);
|
||||
r = bus_call_method(bus, bus_network_mgr, "ReconfigureLink", &error, NULL, "i", index);
|
||||
if (r < 0) {
|
||||
|
||||
@ -75,17 +75,19 @@ static bool address_pool_prefix_is_taken(
|
||||
const union in_addr_union *u,
|
||||
unsigned prefixlen) {
|
||||
|
||||
Iterator i;
|
||||
Link *l;
|
||||
Network *n;
|
||||
|
||||
assert(p);
|
||||
assert(u);
|
||||
|
||||
HASHMAP_FOREACH(l, p->manager->links) {
|
||||
HASHMAP_FOREACH(l, p->manager->links, i) {
|
||||
Address *a;
|
||||
Iterator j;
|
||||
|
||||
/* Don't clash with assigned addresses */
|
||||
SET_FOREACH(a, l->addresses) {
|
||||
SET_FOREACH(a, l->addresses, j) {
|
||||
if (a->family != p->family)
|
||||
continue;
|
||||
|
||||
@ -104,7 +106,7 @@ static bool address_pool_prefix_is_taken(
|
||||
}
|
||||
|
||||
/* And don't clash with configured but un-assigned addresses either */
|
||||
ORDERED_HASHMAP_FOREACH(n, p->manager->networks) {
|
||||
ORDERED_HASHMAP_FOREACH(n, p->manager->networks, i) {
|
||||
Address *a;
|
||||
|
||||
LIST_FOREACH(addresses, a, n->static_addresses) {
|
||||
|
||||
@ -125,6 +125,7 @@ void address_free(Address *address) {
|
||||
|
||||
if (address->link && !address->acd) {
|
||||
NDiscAddress *n;
|
||||
Iterator i;
|
||||
|
||||
set_remove(address->link->addresses, address);
|
||||
set_remove(address->link->addresses_foreign, address);
|
||||
@ -137,7 +138,7 @@ void address_free(Address *address) {
|
||||
set_remove(address->link->dhcp6_addresses_old, address);
|
||||
set_remove(address->link->dhcp6_pd_addresses, address);
|
||||
set_remove(address->link->dhcp6_pd_addresses_old, address);
|
||||
SET_FOREACH(n, address->link->ndisc_addresses)
|
||||
SET_FOREACH(n, address->link->ndisc_addresses, i)
|
||||
if (n->address == address)
|
||||
free(set_remove(address->link->ndisc_addresses, n));
|
||||
|
||||
@ -454,8 +455,9 @@ int address_get(Link *link,
|
||||
|
||||
static bool address_exists_internal(Set *addresses, int family, const union in_addr_union *in_addr) {
|
||||
Address *address;
|
||||
Iterator i;
|
||||
|
||||
SET_FOREACH(address, addresses) {
|
||||
SET_FOREACH(address, addresses, i) {
|
||||
if (address->family != family)
|
||||
continue;
|
||||
if (in_addr_equal(address->family, &address->in_addr, in_addr))
|
||||
|
||||
@ -22,6 +22,7 @@ static int property_get_leases(
|
||||
Link *l = userdata;
|
||||
sd_dhcp_server *s;
|
||||
DHCPLease *lease;
|
||||
Iterator i;
|
||||
int r;
|
||||
|
||||
assert(reply);
|
||||
@ -35,7 +36,7 @@ static int property_get_leases(
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
HASHMAP_FOREACH(lease, s->leases_by_client_id) {
|
||||
HASHMAP_FOREACH(lease, s->leases_by_client_id, i) {
|
||||
r = sd_bus_message_open_container(reply, 'r', "uayayayayt");
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
@ -228,6 +228,7 @@ int dhcp4_server_configure(Link *link) {
|
||||
sd_dhcp_option *p;
|
||||
Link *uplink = NULL;
|
||||
Address *address;
|
||||
Iterator i;
|
||||
int r;
|
||||
|
||||
address = link_find_dhcp_server_address(link);
|
||||
@ -321,7 +322,7 @@ int dhcp4_server_configure(Link *link) {
|
||||
return log_link_error_errno(link, r, "Failed to set timezone for DHCP server: %m");
|
||||
}
|
||||
|
||||
ORDERED_HASHMAP_FOREACH(p, link->network->dhcp_server_send_options) {
|
||||
ORDERED_HASHMAP_FOREACH(p, link->network->dhcp_server_send_options, i) {
|
||||
r = sd_dhcp_server_add_option(link->dhcp_server, p);
|
||||
if (r == -EEXIST)
|
||||
continue;
|
||||
@ -329,7 +330,7 @@ int dhcp4_server_configure(Link *link) {
|
||||
return log_link_error_errno(link, r, "Failed to set DHCPv4 option: %m");
|
||||
}
|
||||
|
||||
ORDERED_HASHMAP_FOREACH(p, link->network->dhcp_server_send_vendor_options) {
|
||||
ORDERED_HASHMAP_FOREACH(p, link->network->dhcp_server_send_vendor_options, i) {
|
||||
r = sd_dhcp_server_add_vendor_option(link->dhcp_server, p);
|
||||
if (r == -EEXIST)
|
||||
continue;
|
||||
|
||||
@ -25,6 +25,7 @@ static int dhcp4_remove_all(Link *link);
|
||||
|
||||
static int dhcp4_release_old_lease(Link *link) {
|
||||
Route *route;
|
||||
Iterator i;
|
||||
int k, r = 0;
|
||||
|
||||
assert(link);
|
||||
@ -36,7 +37,7 @@ static int dhcp4_release_old_lease(Link *link) {
|
||||
|
||||
link_dirty(link);
|
||||
|
||||
SET_FOREACH(route, link->dhcp_routes_old) {
|
||||
SET_FOREACH(route, link->dhcp_routes_old, i) {
|
||||
k = route_remove(route, link, NULL);
|
||||
if (k < 0)
|
||||
r = k;
|
||||
@ -506,11 +507,12 @@ static int dhcp4_remove_address_handler(sd_netlink *rtnl, sd_netlink_message *m,
|
||||
|
||||
static int dhcp4_remove_all(Link *link) {
|
||||
Route *route;
|
||||
Iterator i;
|
||||
int k, r = 0;
|
||||
|
||||
assert(link);
|
||||
|
||||
SET_FOREACH(route, link->dhcp_routes) {
|
||||
SET_FOREACH(route, link->dhcp_routes, i) {
|
||||
k = route_remove(route, link, dhcp4_remove_route_handler);
|
||||
if (k < 0)
|
||||
r = k;
|
||||
@ -1243,6 +1245,7 @@ int dhcp4_set_client_identifier(Link *link) {
|
||||
int dhcp4_configure(Link *link) {
|
||||
sd_dhcp_option *send_option;
|
||||
void *request_options;
|
||||
Iterator i;
|
||||
int r;
|
||||
|
||||
assert(link);
|
||||
@ -1334,7 +1337,7 @@ int dhcp4_configure(Link *link) {
|
||||
return log_link_error_errno(link, r, "DHCP4 CLIENT: Failed to set request flag for timezone: %m");
|
||||
}
|
||||
|
||||
SET_FOREACH(request_options, link->network->dhcp_request_options) {
|
||||
SET_FOREACH(request_options, link->network->dhcp_request_options, i) {
|
||||
uint32_t option = PTR_TO_UINT32(request_options);
|
||||
|
||||
r = sd_dhcp_client_set_request_option(link->dhcp_client, option);
|
||||
@ -1346,7 +1349,7 @@ int dhcp4_configure(Link *link) {
|
||||
return log_link_error_errno(link, r, "DHCP4 CLIENT: Failed to set request flag for '%u': %m", option);
|
||||
}
|
||||
|
||||
ORDERED_HASHMAP_FOREACH(send_option, link->network->dhcp_client_send_options) {
|
||||
ORDERED_HASHMAP_FOREACH(send_option, link->network->dhcp_client_send_options, i) {
|
||||
r = sd_dhcp_client_add_option(link->dhcp_client, send_option);
|
||||
if (r == -EEXIST)
|
||||
continue;
|
||||
@ -1354,7 +1357,7 @@ int dhcp4_configure(Link *link) {
|
||||
return log_link_error_errno(link, r, "DHCP4 CLIENT: Failed to set send option: %m");
|
||||
}
|
||||
|
||||
ORDERED_HASHMAP_FOREACH(send_option, link->network->dhcp_client_send_vendor_options) {
|
||||
ORDERED_HASHMAP_FOREACH(send_option, link->network->dhcp_client_send_vendor_options, i) {
|
||||
r = sd_dhcp_client_add_vendor_option(link->dhcp_client, send_option);
|
||||
if (r == -EEXIST)
|
||||
continue;
|
||||
|
||||
@ -108,12 +108,13 @@ static int dhcp6_pd_remove_old(Link *link, bool force);
|
||||
|
||||
static int dhcp6_pd_address_callback(Address *address) {
|
||||
Address *a;
|
||||
Iterator i;
|
||||
|
||||
assert(address);
|
||||
assert(address->link);
|
||||
|
||||
/* Make this called only once */
|
||||
SET_FOREACH(a, address->link->dhcp6_pd_addresses)
|
||||
SET_FOREACH(a, address->link->dhcp6_pd_addresses, i)
|
||||
a->callback = NULL;
|
||||
|
||||
return dhcp6_pd_remove_old(address->link, true);
|
||||
@ -122,6 +123,7 @@ static int dhcp6_pd_address_callback(Address *address) {
|
||||
static int dhcp6_pd_remove_old(Link *link, bool force) {
|
||||
Address *address;
|
||||
Route *route;
|
||||
Iterator i;
|
||||
int k, r = 0;
|
||||
|
||||
assert(link);
|
||||
@ -136,14 +138,14 @@ static int dhcp6_pd_remove_old(Link *link, bool force) {
|
||||
if (!force) {
|
||||
bool set_callback = !set_isempty(link->dhcp6_pd_addresses);
|
||||
|
||||
SET_FOREACH(address, link->dhcp6_pd_addresses)
|
||||
SET_FOREACH(address, link->dhcp6_pd_addresses, i)
|
||||
if (address_is_ready(address)) {
|
||||
set_callback = false;
|
||||
break;
|
||||
}
|
||||
|
||||
if (set_callback) {
|
||||
SET_FOREACH(address, link->dhcp6_pd_addresses)
|
||||
SET_FOREACH(address, link->dhcp6_pd_addresses, i)
|
||||
address->callback = dhcp6_pd_address_callback;
|
||||
return 0;
|
||||
}
|
||||
@ -153,7 +155,7 @@ static int dhcp6_pd_remove_old(Link *link, bool force) {
|
||||
|
||||
link_dirty(link);
|
||||
|
||||
SET_FOREACH(route, link->dhcp6_pd_routes_old) {
|
||||
SET_FOREACH(route, link->dhcp6_pd_routes_old, i) {
|
||||
k = route_remove(route, link, NULL);
|
||||
if (k < 0)
|
||||
r = k;
|
||||
@ -162,7 +164,7 @@ static int dhcp6_pd_remove_old(Link *link, bool force) {
|
||||
dhcp6_pd_free(hashmap_get(link->manager->dhcp6_prefixes, &route->dst.in6));
|
||||
}
|
||||
|
||||
SET_FOREACH(address, link->dhcp6_pd_addresses_old) {
|
||||
SET_FOREACH(address, link->dhcp6_pd_addresses_old, i) {
|
||||
k = address_remove(address, link, NULL);
|
||||
if (k < 0)
|
||||
r = k;
|
||||
@ -174,6 +176,7 @@ static int dhcp6_pd_remove_old(Link *link, bool force) {
|
||||
int dhcp6_pd_remove(Link *link) {
|
||||
Address *address;
|
||||
Route *route;
|
||||
Iterator i;
|
||||
int k, r = 0;
|
||||
|
||||
assert(link);
|
||||
@ -193,7 +196,7 @@ int dhcp6_pd_remove(Link *link) {
|
||||
|
||||
link_dirty(link);
|
||||
|
||||
SET_FOREACH(route, link->dhcp6_pd_routes) {
|
||||
SET_FOREACH(route, link->dhcp6_pd_routes, i) {
|
||||
k = route_remove(route, link, NULL);
|
||||
if (k < 0)
|
||||
r = k;
|
||||
@ -202,7 +205,7 @@ int dhcp6_pd_remove(Link *link) {
|
||||
dhcp6_pd_free(hashmap_get(link->manager->dhcp6_prefixes, &route->dst.in6));
|
||||
}
|
||||
|
||||
SET_FOREACH(address, link->dhcp6_pd_addresses) {
|
||||
SET_FOREACH(address, link->dhcp6_pd_addresses, i) {
|
||||
k = address_remove(address, link, NULL);
|
||||
if (k < 0)
|
||||
r = k;
|
||||
@ -514,6 +517,7 @@ static void dhcp6_pd_prefix_distribute(Link *dhcp6_link,
|
||||
uint32_t lifetime_valid,
|
||||
bool assign_preferred_subnet_id) {
|
||||
|
||||
Iterator i;
|
||||
Link *link;
|
||||
int r;
|
||||
|
||||
@ -522,7 +526,7 @@ static void dhcp6_pd_prefix_distribute(Link *dhcp6_link,
|
||||
assert(masked_pd_prefix);
|
||||
assert(pd_prefix_len <= 64);
|
||||
|
||||
HASHMAP_FOREACH(link, dhcp6_link->manager->links) {
|
||||
HASHMAP_FOREACH(link, dhcp6_link->manager->links, i) {
|
||||
_cleanup_free_ char *assigned_buf = NULL;
|
||||
union in_addr_union assigned_prefix;
|
||||
|
||||
@ -632,12 +636,13 @@ static int dhcp6_pd_finalize(Link *link) {
|
||||
|
||||
static void dhcp6_pd_prefix_lost(Link *dhcp6_link) {
|
||||
Link *link;
|
||||
Iterator i;
|
||||
int r;
|
||||
|
||||
assert(dhcp6_link);
|
||||
assert(dhcp6_link->manager);
|
||||
|
||||
HASHMAP_FOREACH(link, dhcp6_link->manager->links) {
|
||||
HASHMAP_FOREACH(link, dhcp6_link->manager->links, i) {
|
||||
if (link == dhcp6_link)
|
||||
continue;
|
||||
|
||||
@ -654,12 +659,13 @@ static int dhcp6_remove_old(Link *link, bool force);
|
||||
|
||||
static int dhcp6_address_callback(Address *address) {
|
||||
Address *a;
|
||||
Iterator i;
|
||||
|
||||
assert(address);
|
||||
assert(address->link);
|
||||
|
||||
/* Make this called only once */
|
||||
SET_FOREACH(a, address->link->dhcp6_addresses)
|
||||
SET_FOREACH(a, address->link->dhcp6_addresses, i)
|
||||
a->callback = NULL;
|
||||
|
||||
return dhcp6_remove_old(address->link, true);
|
||||
@ -668,6 +674,7 @@ static int dhcp6_address_callback(Address *address) {
|
||||
static int dhcp6_remove_old(Link *link, bool force) {
|
||||
Address *address;
|
||||
Route *route;
|
||||
Iterator i;
|
||||
int k, r = 0;
|
||||
|
||||
assert(link);
|
||||
@ -681,14 +688,14 @@ static int dhcp6_remove_old(Link *link, bool force) {
|
||||
if (!force) {
|
||||
bool set_callback = !set_isempty(link->dhcp6_addresses);
|
||||
|
||||
SET_FOREACH(address, link->dhcp6_addresses)
|
||||
SET_FOREACH(address, link->dhcp6_addresses, i)
|
||||
if (address_is_ready(address)) {
|
||||
set_callback = false;
|
||||
break;
|
||||
}
|
||||
|
||||
if (set_callback) {
|
||||
SET_FOREACH(address, link->dhcp6_addresses)
|
||||
SET_FOREACH(address, link->dhcp6_addresses, i)
|
||||
address->callback = dhcp6_address_callback;
|
||||
return 0;
|
||||
}
|
||||
@ -698,13 +705,13 @@ static int dhcp6_remove_old(Link *link, bool force) {
|
||||
|
||||
link_dirty(link);
|
||||
|
||||
SET_FOREACH(route, link->dhcp6_routes_old) {
|
||||
SET_FOREACH(route, link->dhcp6_routes_old, i) {
|
||||
k = route_remove(route, link, NULL);
|
||||
if (k < 0)
|
||||
r = k;
|
||||
}
|
||||
|
||||
SET_FOREACH(address, link->dhcp6_addresses_old) {
|
||||
SET_FOREACH(address, link->dhcp6_addresses_old, i) {
|
||||
k = address_remove(address, link, NULL);
|
||||
if (k < 0)
|
||||
r = k;
|
||||
@ -716,6 +723,7 @@ static int dhcp6_remove_old(Link *link, bool force) {
|
||||
static int dhcp6_remove(Link *link) {
|
||||
Address *address;
|
||||
Route *route;
|
||||
Iterator i;
|
||||
int k, r = 0;
|
||||
|
||||
assert(link);
|
||||
@ -734,13 +742,13 @@ static int dhcp6_remove(Link *link) {
|
||||
|
||||
link_dirty(link);
|
||||
|
||||
SET_FOREACH(route, link->dhcp6_routes) {
|
||||
SET_FOREACH(route, link->dhcp6_routes, i) {
|
||||
k = route_remove(route, link, NULL);
|
||||
if (k < 0)
|
||||
r = k;
|
||||
}
|
||||
|
||||
SET_FOREACH(address, link->dhcp6_addresses) {
|
||||
SET_FOREACH(address, link->dhcp6_addresses, i) {
|
||||
k = address_remove(address, link, NULL);
|
||||
if (k < 0)
|
||||
r = k;
|
||||
@ -838,13 +846,14 @@ static int dhcp6_set_unreachable_route(Link *link, const union in_addr_union *ad
|
||||
}
|
||||
|
||||
static int dhcp6_pd_prefix_acquired(Link *dhcp6_link) {
|
||||
Iterator i;
|
||||
Link *link;
|
||||
int r;
|
||||
|
||||
assert(dhcp6_link);
|
||||
assert(dhcp6_link->dhcp6_lease);
|
||||
|
||||
HASHMAP_FOREACH(link, dhcp6_link->manager->links) {
|
||||
HASHMAP_FOREACH(link, dhcp6_link->manager->links, i) {
|
||||
if (link == dhcp6_link)
|
||||
continue;
|
||||
|
||||
@ -909,7 +918,7 @@ static int dhcp6_pd_prefix_acquired(Link *dhcp6_link) {
|
||||
false);
|
||||
}
|
||||
|
||||
HASHMAP_FOREACH(link, dhcp6_link->manager->links) {
|
||||
HASHMAP_FOREACH(link, dhcp6_link->manager->links, i) {
|
||||
if (link == dhcp6_link)
|
||||
continue;
|
||||
|
||||
@ -1221,6 +1230,7 @@ int dhcp6_request_address(Link *link, int ir) {
|
||||
|
||||
int dhcp6_request_prefix_delegation(Link *link) {
|
||||
Link *l;
|
||||
Iterator i;
|
||||
|
||||
assert(link);
|
||||
assert(link->manager);
|
||||
@ -1230,7 +1240,7 @@ int dhcp6_request_prefix_delegation(Link *link) {
|
||||
|
||||
log_link_debug(link, "Requesting DHCPv6 prefixes to be delegated for new link");
|
||||
|
||||
HASHMAP_FOREACH(l, link->manager->links) {
|
||||
HASHMAP_FOREACH(l, link->manager->links, i) {
|
||||
int r, enabled;
|
||||
|
||||
if (l == link)
|
||||
@ -1324,11 +1334,12 @@ static int dhcp6_set_hostname(sd_dhcp6_client *client, Link *link) {
|
||||
|
||||
static bool dhcp6_enable_prefix_delegation(Link *dhcp6_link) {
|
||||
Link *link;
|
||||
Iterator i;
|
||||
|
||||
assert(dhcp6_link);
|
||||
assert(dhcp6_link->manager);
|
||||
|
||||
HASHMAP_FOREACH(link, dhcp6_link->manager->links) {
|
||||
HASHMAP_FOREACH(link, dhcp6_link->manager->links, i) {
|
||||
if (link == dhcp6_link)
|
||||
continue;
|
||||
|
||||
@ -1347,6 +1358,7 @@ int dhcp6_configure(Link *link) {
|
||||
sd_dhcp6_option *send_option;
|
||||
void *request_options;
|
||||
const DUID *duid;
|
||||
Iterator i;
|
||||
int r;
|
||||
|
||||
assert(link);
|
||||
@ -1388,7 +1400,7 @@ int dhcp6_configure(Link *link) {
|
||||
if (r < 0)
|
||||
return log_link_error_errno(link, r, "DHCP6 CLIENT: Failed to set DUID: %m");
|
||||
|
||||
ORDERED_HASHMAP_FOREACH(send_option, link->network->dhcp6_client_send_options) {
|
||||
ORDERED_HASHMAP_FOREACH(send_option, link->network->dhcp6_client_send_options, i) {
|
||||
r = sd_dhcp6_client_add_option(client, send_option);
|
||||
if (r == -EEXIST)
|
||||
continue;
|
||||
@ -1416,7 +1428,7 @@ int dhcp6_configure(Link *link) {
|
||||
return log_link_error_errno(link, r, "DHCP6 CLIENT: Failed to set MUD URL: %m");
|
||||
}
|
||||
|
||||
SET_FOREACH(request_options, link->network->dhcp6_request_options) {
|
||||
SET_FOREACH(request_options, link->network->dhcp6_request_options, i) {
|
||||
uint32_t option = PTR_TO_UINT32(request_options);
|
||||
|
||||
r = sd_dhcp6_client_set_request_option(client, option);
|
||||
@ -1440,7 +1452,7 @@ int dhcp6_configure(Link *link) {
|
||||
return log_link_error_errno(link, r, "DHCP6 CLIENT: Failed to set vendor class: %m");
|
||||
}
|
||||
|
||||
ORDERED_HASHMAP_FOREACH(vendor_option, link->network->dhcp6_client_send_vendor_options) {
|
||||
ORDERED_HASHMAP_FOREACH(vendor_option, link->network->dhcp6_client_send_vendor_options, i) {
|
||||
r = sd_dhcp6_client_add_vendor_option(client, vendor_option);
|
||||
if (r == -EEXIST)
|
||||
continue;
|
||||
|
||||
@ -727,6 +727,7 @@ int link_node_enumerator(sd_bus *bus, const char *path, void *userdata, char ***
|
||||
Manager *m = userdata;
|
||||
unsigned c = 0;
|
||||
Link *link;
|
||||
Iterator i;
|
||||
|
||||
assert(bus);
|
||||
assert(path);
|
||||
@ -737,7 +738,7 @@ int link_node_enumerator(sd_bus *bus, const char *path, void *userdata, char ***
|
||||
if (!l)
|
||||
return -ENOMEM;
|
||||
|
||||
HASHMAP_FOREACH(link, m->links) {
|
||||
HASHMAP_FOREACH(link, m->links, i) {
|
||||
char *p;
|
||||
|
||||
p = link_bus_path(link);
|
||||
|
||||
@ -365,6 +365,7 @@ void link_update_operstate(Link *link, bool also_update_master) {
|
||||
uint8_t scope = RT_SCOPE_NOWHERE;
|
||||
bool changed = false;
|
||||
Address *address;
|
||||
Iterator i;
|
||||
|
||||
assert(link);
|
||||
|
||||
@ -383,7 +384,7 @@ void link_update_operstate(Link *link, bool also_update_master) {
|
||||
if (carrier_state >= LINK_CARRIER_STATE_CARRIER) {
|
||||
Link *slave;
|
||||
|
||||
SET_FOREACH(slave, link->slaves) {
|
||||
SET_FOREACH(slave, link->slaves, i) {
|
||||
link_update_operstate(slave, false);
|
||||
|
||||
if (slave->carrier_state < LINK_CARRIER_STATE_CARRIER)
|
||||
@ -391,7 +392,7 @@ void link_update_operstate(Link *link, bool also_update_master) {
|
||||
}
|
||||
}
|
||||
|
||||
SET_FOREACH(address, link->addresses) {
|
||||
SET_FOREACH(address, link->addresses, i) {
|
||||
if (!address_is_ready(address))
|
||||
continue;
|
||||
|
||||
@ -400,7 +401,7 @@ void link_update_operstate(Link *link, bool also_update_master) {
|
||||
}
|
||||
|
||||
/* for operstate we also take foreign addresses into account */
|
||||
SET_FOREACH(address, link->addresses_foreign) {
|
||||
SET_FOREACH(address, link->addresses_foreign, i) {
|
||||
if (!address_is_ready(address))
|
||||
continue;
|
||||
|
||||
@ -885,9 +886,10 @@ void link_enter_failed(Link *link) {
|
||||
|
||||
static int link_join_netdevs_after_configured(Link *link) {
|
||||
NetDev *netdev;
|
||||
Iterator i;
|
||||
int r;
|
||||
|
||||
HASHMAP_FOREACH(netdev, link->network->stacked_netdevs) {
|
||||
HASHMAP_FOREACH(netdev, link->network->stacked_netdevs, i) {
|
||||
if (netdev->ifindex > 0)
|
||||
/* Assume already enslaved. */
|
||||
continue;
|
||||
@ -1099,6 +1101,7 @@ int link_request_set_routes(Link *link) {
|
||||
|
||||
void link_check_ready(Link *link) {
|
||||
Address *a;
|
||||
Iterator i;
|
||||
|
||||
assert(link);
|
||||
|
||||
@ -1123,7 +1126,7 @@ void link_check_ready(Link *link) {
|
||||
return;
|
||||
}
|
||||
|
||||
SET_FOREACH(a, link->addresses)
|
||||
SET_FOREACH(a, link->addresses, i)
|
||||
if (!address_is_ready(a)) {
|
||||
_cleanup_free_ char *str = NULL;
|
||||
|
||||
@ -1172,7 +1175,7 @@ void link_check_ready(Link *link) {
|
||||
return;
|
||||
}
|
||||
|
||||
SET_FOREACH(n, link->ndisc_addresses)
|
||||
SET_FOREACH(n, link->ndisc_addresses, i)
|
||||
if (!n->marked) {
|
||||
has_ndisc_address = true;
|
||||
break;
|
||||
@ -1256,6 +1259,7 @@ static int link_set_bridge_fdb(Link *link) {
|
||||
|
||||
static int static_address_ready_callback(Address *address) {
|
||||
Address *a;
|
||||
Iterator i;
|
||||
Link *link;
|
||||
|
||||
assert(address);
|
||||
@ -1266,7 +1270,7 @@ static int static_address_ready_callback(Address *address) {
|
||||
if (!link->addresses_configured)
|
||||
return 0;
|
||||
|
||||
SET_FOREACH(a, link->static_addresses)
|
||||
SET_FOREACH(a, link->static_addresses, i)
|
||||
if (!address_is_ready(a)) {
|
||||
_cleanup_free_ char *str = NULL;
|
||||
|
||||
@ -1276,7 +1280,7 @@ static int static_address_ready_callback(Address *address) {
|
||||
}
|
||||
|
||||
/* This should not be called again */
|
||||
SET_FOREACH(a, link->static_addresses)
|
||||
SET_FOREACH(a, link->static_addresses, i)
|
||||
a->callback = NULL;
|
||||
|
||||
link->addresses_ready = true;
|
||||
@ -1563,8 +1567,9 @@ static bool link_reduces_vlan_mtu(Link *link) {
|
||||
static uint32_t link_get_requested_mtu_by_stacked_netdevs(Link *link) {
|
||||
uint32_t mtu = 0;
|
||||
NetDev *dev;
|
||||
Iterator i;
|
||||
|
||||
HASHMAP_FOREACH(dev, link->network->stacked_netdevs)
|
||||
HASHMAP_FOREACH(dev, link->network->stacked_netdevs, i)
|
||||
if (dev->kind == NETDEV_KIND_VLAN && dev->mtu > 0)
|
||||
/* See vlan_dev_change_mtu() in kernel. */
|
||||
mtu = MAX(mtu, link_reduces_vlan_mtu(link) ? dev->mtu + 4 : dev->mtu);
|
||||
@ -2026,6 +2031,7 @@ static int link_set_group(Link *link) {
|
||||
|
||||
static int link_handle_bound_to_list(Link *link) {
|
||||
Link *l;
|
||||
Iterator i;
|
||||
int r;
|
||||
bool required_up = false;
|
||||
bool link_is_up = false;
|
||||
@ -2038,7 +2044,7 @@ static int link_handle_bound_to_list(Link *link) {
|
||||
if (link->flags & IFF_UP)
|
||||
link_is_up = true;
|
||||
|
||||
HASHMAP_FOREACH (l, link->bound_to_links)
|
||||
HASHMAP_FOREACH (l, link->bound_to_links, i)
|
||||
if (link_has_carrier(l)) {
|
||||
required_up = true;
|
||||
break;
|
||||
@ -2058,6 +2064,7 @@ static int link_handle_bound_to_list(Link *link) {
|
||||
}
|
||||
|
||||
static int link_handle_bound_by_list(Link *link) {
|
||||
Iterator i;
|
||||
Link *l;
|
||||
int r;
|
||||
|
||||
@ -2066,7 +2073,7 @@ static int link_handle_bound_by_list(Link *link) {
|
||||
if (hashmap_isempty(link->bound_by_links))
|
||||
return 0;
|
||||
|
||||
HASHMAP_FOREACH (l, link->bound_by_links) {
|
||||
HASHMAP_FOREACH (l, link->bound_by_links, i) {
|
||||
r = link_handle_bound_to_list(l);
|
||||
if (r < 0)
|
||||
return r;
|
||||
@ -2101,6 +2108,7 @@ static int link_put_carrier(Link *link, Link *carrier, Hashmap **h) {
|
||||
static int link_new_bound_by_list(Link *link) {
|
||||
Manager *m;
|
||||
Link *carrier;
|
||||
Iterator i;
|
||||
int r;
|
||||
bool list_updated = false;
|
||||
|
||||
@ -2109,7 +2117,7 @@ static int link_new_bound_by_list(Link *link) {
|
||||
|
||||
m = link->manager;
|
||||
|
||||
HASHMAP_FOREACH(carrier, m->links) {
|
||||
HASHMAP_FOREACH(carrier, m->links, i) {
|
||||
if (!carrier->network)
|
||||
continue;
|
||||
|
||||
@ -2128,7 +2136,7 @@ static int link_new_bound_by_list(Link *link) {
|
||||
if (list_updated)
|
||||
link_dirty(link);
|
||||
|
||||
HASHMAP_FOREACH(carrier, link->bound_by_links) {
|
||||
HASHMAP_FOREACH(carrier, link->bound_by_links, i) {
|
||||
r = link_put_carrier(carrier, link, &carrier->bound_to_links);
|
||||
if (r < 0)
|
||||
return r;
|
||||
@ -2142,6 +2150,7 @@ static int link_new_bound_by_list(Link *link) {
|
||||
static int link_new_bound_to_list(Link *link) {
|
||||
Manager *m;
|
||||
Link *carrier;
|
||||
Iterator i;
|
||||
int r;
|
||||
bool list_updated = false;
|
||||
|
||||
@ -2156,7 +2165,7 @@ static int link_new_bound_to_list(Link *link) {
|
||||
|
||||
m = link->manager;
|
||||
|
||||
HASHMAP_FOREACH (carrier, m->links) {
|
||||
HASHMAP_FOREACH (carrier, m->links, i) {
|
||||
if (strv_fnmatch(link->network->bind_carrier, carrier->ifname)) {
|
||||
r = link_put_carrier(link, carrier, &link->bound_to_links);
|
||||
if (r < 0)
|
||||
@ -2169,7 +2178,7 @@ static int link_new_bound_to_list(Link *link) {
|
||||
if (list_updated)
|
||||
link_dirty(link);
|
||||
|
||||
HASHMAP_FOREACH (carrier, link->bound_to_links) {
|
||||
HASHMAP_FOREACH (carrier, link->bound_to_links, i) {
|
||||
r = link_put_carrier(carrier, link, &carrier->bound_by_links);
|
||||
if (r < 0)
|
||||
return r;
|
||||
@ -2204,8 +2213,9 @@ static int link_new_carrier_maps(Link *link) {
|
||||
|
||||
static void link_free_bound_to_list(Link *link) {
|
||||
Link *bound_to;
|
||||
Iterator i;
|
||||
|
||||
HASHMAP_FOREACH (bound_to, link->bound_to_links) {
|
||||
HASHMAP_FOREACH (bound_to, link->bound_to_links, i) {
|
||||
hashmap_remove(link->bound_to_links, INT_TO_PTR(bound_to->ifindex));
|
||||
|
||||
if (hashmap_remove(bound_to->bound_by_links, INT_TO_PTR(link->ifindex)))
|
||||
@ -2217,8 +2227,9 @@ static void link_free_bound_to_list(Link *link) {
|
||||
|
||||
static void link_free_bound_by_list(Link *link) {
|
||||
Link *bound_by;
|
||||
Iterator i;
|
||||
|
||||
HASHMAP_FOREACH (bound_by, link->bound_by_links) {
|
||||
HASHMAP_FOREACH (bound_by, link->bound_by_links, i) {
|
||||
hashmap_remove(link->bound_by_links, INT_TO_PTR(bound_by->ifindex));
|
||||
|
||||
if (hashmap_remove(bound_by->bound_to_links, INT_TO_PTR(link->ifindex))) {
|
||||
@ -2402,6 +2413,7 @@ static int netdev_join_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *li
|
||||
|
||||
static int link_enter_join_netdev(Link *link) {
|
||||
NetDev *netdev;
|
||||
Iterator i;
|
||||
int r;
|
||||
|
||||
assert(link);
|
||||
@ -2474,7 +2486,7 @@ static int link_enter_join_netdev(Link *link) {
|
||||
}
|
||||
}
|
||||
|
||||
HASHMAP_FOREACH(netdev, link->network->stacked_netdevs) {
|
||||
HASHMAP_FOREACH(netdev, link->network->stacked_netdevs, i) {
|
||||
|
||||
if (netdev->ifindex > 0)
|
||||
/* Assume already enslaved. */
|
||||
@ -2733,6 +2745,7 @@ static bool link_is_static_route_configured(Link *link, Route *route) {
|
||||
|
||||
static bool link_address_is_dynamic(Link *link, Address *address) {
|
||||
Route *route;
|
||||
Iterator i;
|
||||
|
||||
assert(link);
|
||||
assert(address);
|
||||
@ -2743,7 +2756,7 @@ static bool link_address_is_dynamic(Link *link, Address *address) {
|
||||
/* Even when the address is leased from a DHCP server, networkd assign the address
|
||||
* without lifetime when KeepConfiguration=dhcp. So, let's check that we have
|
||||
* corresponding routes with RTPROT_DHCP. */
|
||||
SET_FOREACH(route, link->routes_foreign) {
|
||||
SET_FOREACH(route, link->routes_foreign, i) {
|
||||
if (route->protocol != RTPROT_DHCP)
|
||||
continue;
|
||||
|
||||
@ -2803,6 +2816,7 @@ static int link_drop_foreign_config(Link *link) {
|
||||
Address *address;
|
||||
Neighbor *neighbor;
|
||||
Route *route;
|
||||
Iterator i;
|
||||
int r;
|
||||
|
||||
/* The kernel doesn't notify us about tentative addresses;
|
||||
@ -2813,7 +2827,7 @@ static int link_drop_foreign_config(Link *link) {
|
||||
return r;
|
||||
}
|
||||
|
||||
SET_FOREACH(address, link->addresses_foreign) {
|
||||
SET_FOREACH(address, link->addresses_foreign, i) {
|
||||
/* we consider IPv6LL addresses to be managed by the kernel */
|
||||
if (address->family == AF_INET6 && in_addr_is_link_local(AF_INET6, &address->in_addr) == 1 && link_ipv6ll_enabled(link))
|
||||
continue;
|
||||
@ -2835,7 +2849,7 @@ static int link_drop_foreign_config(Link *link) {
|
||||
}
|
||||
}
|
||||
|
||||
SET_FOREACH(neighbor, link->neighbors_foreign) {
|
||||
SET_FOREACH(neighbor, link->neighbors_foreign, i) {
|
||||
if (link_is_neighbor_configured(link, neighbor)) {
|
||||
r = neighbor_add(link, neighbor->family, &neighbor->in_addr, &neighbor->lladdr, neighbor->lladdr_size, NULL);
|
||||
if (r < 0)
|
||||
@ -2847,7 +2861,7 @@ static int link_drop_foreign_config(Link *link) {
|
||||
}
|
||||
}
|
||||
|
||||
SET_FOREACH(route, link->routes_foreign) {
|
||||
SET_FOREACH(route, link->routes_foreign, i) {
|
||||
/* do not touch routes managed by the kernel */
|
||||
if (route->protocol == RTPROT_KERNEL)
|
||||
continue;
|
||||
@ -2916,9 +2930,10 @@ static int link_drop_config(Link *link) {
|
||||
Address *address, *pool_address;
|
||||
Neighbor *neighbor;
|
||||
Route *route;
|
||||
Iterator i;
|
||||
int r;
|
||||
|
||||
SET_FOREACH(address, link->addresses) {
|
||||
SET_FOREACH(address, link->addresses, i) {
|
||||
/* we consider IPv6LL addresses to be managed by the kernel */
|
||||
if (address->family == AF_INET6 && in_addr_is_link_local(AF_INET6, &address->in_addr) == 1 && link_ipv6ll_enabled(link))
|
||||
continue;
|
||||
@ -2938,13 +2953,13 @@ static int link_drop_config(Link *link) {
|
||||
}
|
||||
}
|
||||
|
||||
SET_FOREACH(neighbor, link->neighbors) {
|
||||
SET_FOREACH(neighbor, link->neighbors, i) {
|
||||
r = neighbor_remove(neighbor, link, NULL);
|
||||
if (r < 0)
|
||||
return r;
|
||||
}
|
||||
|
||||
SET_FOREACH(route, link->routes) {
|
||||
SET_FOREACH(route, link->routes, i) {
|
||||
/* do not touch routes managed by the kernel */
|
||||
if (route->protocol == RTPROT_KERNEL)
|
||||
continue;
|
||||
@ -2979,12 +2994,13 @@ static int link_configure_ipv4_dad(Link *link) {
|
||||
|
||||
static int link_configure_traffic_control(Link *link) {
|
||||
TrafficControl *tc;
|
||||
Iterator i;
|
||||
int r;
|
||||
|
||||
link->tc_configured = false;
|
||||
link->tc_messages = 0;
|
||||
|
||||
ORDERED_HASHMAP_FOREACH(tc, link->network->tc_by_section) {
|
||||
ORDERED_HASHMAP_FOREACH(tc, link->network->tc_by_section, i) {
|
||||
r = traffic_control_configure(link, tc);
|
||||
if (r < 0)
|
||||
return r;
|
||||
@ -3000,12 +3016,13 @@ static int link_configure_traffic_control(Link *link) {
|
||||
|
||||
static int link_configure_sr_iov(Link *link) {
|
||||
SRIOV *sr_iov;
|
||||
Iterator i;
|
||||
int r;
|
||||
|
||||
link->sr_iov_configured = false;
|
||||
link->sr_iov_messages = 0;
|
||||
|
||||
ORDERED_HASHMAP_FOREACH(sr_iov, link->network->sr_iov_by_section) {
|
||||
ORDERED_HASHMAP_FOREACH(sr_iov, link->network->sr_iov_by_section, i) {
|
||||
r = sr_iov_configure(link, sr_iov);
|
||||
if (r < 0)
|
||||
return r;
|
||||
@ -4207,6 +4224,7 @@ int link_update(Link *link, sd_netlink_message *m) {
|
||||
|
||||
static void print_link_hashmap(FILE *f, const char *prefix, Hashmap* h) {
|
||||
bool space = false;
|
||||
Iterator i;
|
||||
Link *link;
|
||||
|
||||
assert(f);
|
||||
@ -4216,7 +4234,7 @@ static void print_link_hashmap(FILE *f, const char *prefix, Hashmap* h) {
|
||||
return;
|
||||
|
||||
fputs(prefix, f);
|
||||
HASHMAP_FOREACH(link, h) {
|
||||
HASHMAP_FOREACH(link, h, i) {
|
||||
if (space)
|
||||
fputc(' ', f);
|
||||
|
||||
@ -4301,6 +4319,7 @@ int link_save(Link *link) {
|
||||
_cleanup_fclose_ FILE *f = NULL;
|
||||
Route *route;
|
||||
Address *a;
|
||||
Iterator i;
|
||||
int r;
|
||||
|
||||
assert(link);
|
||||
@ -4382,7 +4401,7 @@ int link_save(Link *link) {
|
||||
if (link->network->ipv6_accept_ra_use_dns && link->ndisc_rdnss) {
|
||||
NDiscRDNSS *dd;
|
||||
|
||||
SET_FOREACH(dd, link->ndisc_rdnss)
|
||||
SET_FOREACH(dd, link->ndisc_rdnss, i)
|
||||
serialize_in6_addrs(f, &dd->address, 1, &space);
|
||||
}
|
||||
|
||||
@ -4420,7 +4439,7 @@ int link_save(Link *link) {
|
||||
|
||||
fputs("DOMAINS=", f);
|
||||
space = false;
|
||||
ORDERED_SET_FOREACH(p, link->search_domains ?: link->network->search_domains)
|
||||
ORDERED_SET_FOREACH(p, link->search_domains ?: link->network->search_domains, i)
|
||||
fputs_with_space(f, p, NULL, &space);
|
||||
|
||||
if (link->network->dhcp_use_domains == DHCP_USE_DOMAINS_YES) {
|
||||
@ -4435,7 +4454,7 @@ int link_save(Link *link) {
|
||||
if (link->network->ipv6_accept_ra_use_domains == DHCP_USE_DOMAINS_YES) {
|
||||
NDiscDNSSL *dd;
|
||||
|
||||
SET_FOREACH(dd, link->ndisc_dnssl)
|
||||
SET_FOREACH(dd, link->ndisc_dnssl, i)
|
||||
fputs_with_space(f, NDISC_DNSSL_DOMAIN(dd), NULL, &space);
|
||||
}
|
||||
|
||||
@ -4445,7 +4464,7 @@ int link_save(Link *link) {
|
||||
|
||||
fputs("ROUTE_DOMAINS=", f);
|
||||
space = false;
|
||||
ORDERED_SET_FOREACH(p, link->route_domains ?: link->network->route_domains)
|
||||
ORDERED_SET_FOREACH(p, link->route_domains ?: link->network->route_domains, i)
|
||||
fputs_with_space(f, p, NULL, &space);
|
||||
|
||||
if (link->network->dhcp_use_domains == DHCP_USE_DOMAINS_ROUTE) {
|
||||
@ -4460,7 +4479,7 @@ int link_save(Link *link) {
|
||||
if (link->network->ipv6_accept_ra_use_domains == DHCP_USE_DOMAINS_ROUTE) {
|
||||
NDiscDNSSL *dd;
|
||||
|
||||
SET_FOREACH(dd, link->ndisc_dnssl)
|
||||
SET_FOREACH(dd, link->ndisc_dnssl, i)
|
||||
fputs_with_space(f, NDISC_DNSSL_DOMAIN(dd), NULL, &space);
|
||||
}
|
||||
|
||||
@ -4511,7 +4530,7 @@ int link_save(Link *link) {
|
||||
|
||||
fputs("DNSSEC_NTA=", f);
|
||||
space = false;
|
||||
SET_FOREACH(n, nta_anchors)
|
||||
SET_FOREACH(n, nta_anchors, i)
|
||||
fputs_with_space(f, n, NULL, &space);
|
||||
fputc('\n', f);
|
||||
}
|
||||
@ -4520,7 +4539,7 @@ int link_save(Link *link) {
|
||||
|
||||
fputs("ADDRESSES=", f);
|
||||
space = false;
|
||||
SET_FOREACH(a, link->addresses) {
|
||||
SET_FOREACH(a, link->addresses, i) {
|
||||
_cleanup_free_ char *address_str = NULL;
|
||||
|
||||
r = in_addr_to_string(a->family, &a->in_addr, &address_str);
|
||||
@ -4536,7 +4555,7 @@ int link_save(Link *link) {
|
||||
|
||||
fputs("ROUTES=", f);
|
||||
space = false;
|
||||
SET_FOREACH(route, link->routes) {
|
||||
SET_FOREACH(route, link->routes, i) {
|
||||
_cleanup_free_ char *route_str = NULL;
|
||||
|
||||
r = in_addr_to_string(route->family, &route->dst, &route_str);
|
||||
|
||||
@ -20,6 +20,7 @@
|
||||
static int method_list_links(sd_bus_message *message, void *userdata, sd_bus_error *error) {
|
||||
_cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
|
||||
Manager *manager = userdata;
|
||||
Iterator i;
|
||||
Link *link;
|
||||
int r;
|
||||
|
||||
@ -31,7 +32,7 @@ static int method_list_links(sd_bus_message *message, void *userdata, sd_bus_err
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
HASHMAP_FOREACH(link, manager->links) {
|
||||
HASHMAP_FOREACH(link, manager->links, i) {
|
||||
_cleanup_free_ char *path = NULL;
|
||||
|
||||
path = link_bus_path(link);
|
||||
@ -200,6 +201,7 @@ static int bus_method_reconfigure_link(sd_bus_message *message, void *userdata,
|
||||
|
||||
static int bus_method_reload(sd_bus_message *message, void *userdata, sd_bus_error *error) {
|
||||
Manager *manager = userdata;
|
||||
Iterator i;
|
||||
Link *link;
|
||||
int r;
|
||||
|
||||
@ -220,7 +222,7 @@ static int bus_method_reload(sd_bus_message *message, void *userdata, sd_bus_err
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
HASHMAP_FOREACH(link, manager->links) {
|
||||
HASHMAP_FOREACH(link, manager->links, i) {
|
||||
r = link_reconfigure(link, false);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
@ -81,11 +81,12 @@ static int setup_default_address_pool(Manager *m) {
|
||||
|
||||
static int manager_reset_all(Manager *m) {
|
||||
Link *link;
|
||||
Iterator i;
|
||||
int r;
|
||||
|
||||
assert(m);
|
||||
|
||||
HASHMAP_FOREACH(link, m->links) {
|
||||
HASHMAP_FOREACH(link, m->links, i) {
|
||||
r = link_carrier_reset(link);
|
||||
if (r < 0)
|
||||
log_link_warning_errno(link, r, "Could not reset carrier: %m");
|
||||
@ -1518,6 +1519,7 @@ static int manager_save(Manager *m) {
|
||||
_cleanup_strv_free_ char **p = NULL;
|
||||
_cleanup_fclose_ FILE *f = NULL;
|
||||
Link *link;
|
||||
Iterator i;
|
||||
int r;
|
||||
|
||||
assert(m);
|
||||
@ -1544,7 +1546,7 @@ static int manager_save(Manager *m) {
|
||||
if (!route_domains)
|
||||
return -ENOMEM;
|
||||
|
||||
HASHMAP_FOREACH(link, m->links) {
|
||||
HASHMAP_FOREACH(link, m->links, i) {
|
||||
const struct in_addr *addresses;
|
||||
|
||||
if (link->flags & IFF_LOOPBACK)
|
||||
@ -1721,13 +1723,14 @@ fail:
|
||||
static int manager_dirty_handler(sd_event_source *s, void *userdata) {
|
||||
Manager *m = userdata;
|
||||
Link *link;
|
||||
Iterator i;
|
||||
|
||||
assert(m);
|
||||
|
||||
if (m->dirty)
|
||||
manager_save(m);
|
||||
|
||||
SET_FOREACH(link, m->dirty_links)
|
||||
SET_FOREACH(link, m->dirty_links, i)
|
||||
(void) link_save_and_clean(link);
|
||||
|
||||
return 1;
|
||||
@ -1824,13 +1827,14 @@ int manager_new(Manager **ret) {
|
||||
void manager_free(Manager *m) {
|
||||
AddressPool *pool;
|
||||
Link *link;
|
||||
Iterator i;
|
||||
|
||||
if (!m)
|
||||
return;
|
||||
|
||||
free(m->state_file);
|
||||
|
||||
HASHMAP_FOREACH(link, m->links)
|
||||
HASHMAP_FOREACH(link, m->links, i)
|
||||
(void) link_stop_clients(link, true);
|
||||
|
||||
m->dhcp6_prefixes = hashmap_free_with_destructor(m->dhcp6_prefixes, dhcp6_pd_free);
|
||||
@ -1876,6 +1880,7 @@ void manager_free(Manager *m) {
|
||||
|
||||
int manager_start(Manager *m) {
|
||||
Link *link;
|
||||
Iterator i;
|
||||
int r;
|
||||
|
||||
assert(m);
|
||||
@ -1889,7 +1894,7 @@ int manager_start(Manager *m) {
|
||||
|
||||
manager_save(m);
|
||||
|
||||
HASHMAP_FOREACH(link, m->links)
|
||||
HASHMAP_FOREACH(link, m->links, i)
|
||||
(void) link_save(link);
|
||||
|
||||
return 0;
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user