#include "cgroup-util.h"
#include "path-util.h"
#include "audit-fd.h"
-#include "efivars.h"
+#include "boot-timestamps.h"
#include "env-util.h"
/* As soon as 5s passed since a unit was added to our GC queue, make sure to run a gc sweep */
*p++ = '*';
if (pos < width-1)
p = mempset(p, ' ', width-1-pos);
- p = stpcpy(p, ANSI_HIGHLIGHT_OFF);
+ strcpy(p, ANSI_HIGHLIGHT_OFF);
}
}
/* m->n_running_jobs must be consistent with the contents of m->jobs,
* so the above loop must have succeeded in finding j. */
assert(counter == print_nr + 1);
+ assert(j);
cylon_pos = m->jobs_in_progress_iteration % 14;
if (cylon_pos >= 8)
}
static int manager_default_environment(Manager *m) {
- const char *path = "PATH=" DEFAULT_PATH;
-
assert(m);
if (m->running_as == SYSTEMD_SYSTEM) {
* The initial passed environ is untouched to keep
* /proc/self/environ valid; it is used for tagging
* the init process inside containers. */
- m->environment = strv_new(path, NULL);
+ m->environment = strv_new("PATH=" DEFAULT_PATH,
+ NULL);
/* Import locale variables LC_*= from configuration */
locale_setup(&m->environment);
int manager_new(SystemdRunningAs running_as, bool reexecuting, Manager **_m) {
Manager *m;
int r = -ENOMEM;
+ bool try_bus_connect = false;
assert(_m);
assert(running_as >= 0);
#ifdef ENABLE_EFI
if (detect_container(NULL) <= 0)
- efi_get_boot_timestamps(&m->userspace_timestamp, &m->firmware_timestamp, &m->loader_timestamp);
+ boot_timestamps(&m->userspace_timestamp, &m->firmware_timestamp, &m->loader_timestamp);
#endif
m->running_as = running_as;
if (r < 0)
goto fail;
- /* Try to connect to the busses, if possible. */
- if ((running_as == SYSTEMD_USER && getenv("DBUS_SESSION_BUS_ADDRESS")) ||
- running_as == SYSTEMD_SYSTEM) {
- r = bus_init(m, reexecuting || running_as != SYSTEMD_SYSTEM);
- if (r < 0)
- goto fail;
- } else
+ if (running_as == SYSTEMD_SYSTEM)
+ try_bus_connect = reexecuting;
+ else if (getenv("DBUS_SESSION_BUS_ADDRESS"))
+ try_bus_connect = true;
+ else
log_debug("Skipping DBus session bus connection attempt - no DBUS_SESSION_BUS_ADDRESS set...");
+ /* Try to connect to the busses, if possible. */
+ r = bus_init(m, try_bus_connect);
+ if (r < 0)
+ goto fail;
+
m->taint_usr = dir_is_empty("/usr") > 0;
*_m = m;
unit_gc_sweep(u, gc_marker);
- LIST_REMOVE(Unit, gc_queue, m->gc_queue, u);
+ LIST_REMOVE(gc_queue, m->gc_queue, u);
u->in_gc_queue = false;
n++;
for (i = 0; i < RLIMIT_NLIMITS; i++)
free(m->rlimit[i]);
+ assert(hashmap_isempty(m->units_requiring_mounts_for));
+ hashmap_free(m->units_requiring_mounts_for);
+
free(m);
}
/* Let's ask every type to load all units from disk/kernel
* that it might know */
for (c = 0; c < _UNIT_TYPE_MAX; c++)
- if (unit_vtable[c]->enumerate)
- if ((q = unit_vtable[c]->enumerate(m)) < 0)
+ if (unit_vtable[c]->enumerate) {
+ q = unit_vtable[c]->enumerate(m);
+ if (q < 0)
r = q;
+ }
manager_dispatch_load_queue(m);
return r;
int manager_open_serialization(Manager *m, FILE **_f) {
char *path = NULL;
- int fd;
+ int fd = -1;
FILE *f;
assert(_f);
int manager_reload(Manager *m) {
int r, q;
- FILE *f;
- FDSet *fds;
+ _cleanup_fclose_ FILE *f = NULL;
+ _cleanup_fdset_free_ FDSet *fds = NULL;
assert(m);
fds = fdset_new();
if (!fds) {
m->n_reloading --;
- r = -ENOMEM;
- goto finish;
+ return -ENOMEM;
}
r = manager_serialize(m, f, fds, false);
if (r < 0) {
m->n_reloading --;
- goto finish;
+ return r;
}
if (fseeko(f, 0, SEEK_SET) < 0) {
m->n_reloading --;
- r = -errno;
- goto finish;
+ return -errno;
}
/* From here on there is no way back. */
m->send_reloading_done = true;
-finish:
- if (f)
- fclose(f);
-
- if (fds)
- fdset_free(fds);
-
return r;
}
}
int manager_environment_add(Manager *m, char **environment) {
-
char **e = NULL;
assert(m);
+
e = strv_env_merge(2, m->environment, environment);
if (!e)
return -ENOMEM;
+
strv_free(m->environment);
m->environment = e;
+
return 0;
}
va_end(ap);
}
+int manager_get_unit_by_path(Manager *m, const char *path, const char *suffix, Unit **_found) {
+ _cleanup_free_ char *p = NULL;
+ Unit *found;
+
+ assert(m);
+ assert(path);
+ assert(suffix);
+ assert(_found);
+
+ p = unit_name_from_path(path, suffix);
+ if (!p)
+ return -ENOMEM;
+
+ found = manager_get_unit(m, p);
+ if (!found) {
+ *_found = NULL;
+ return 0;
+ }
+
+ *_found = found;
+ return 1;
+}
+
+Set *manager_get_units_requiring_mounts_for(Manager *m, const char *path) {
+ char p[strlen(path)+1];
+
+ assert(m);
+ assert(path);
+
+ strcpy(p, path);
+ path_kill_slashes(p);
+
+ return hashmap_get(m->units_requiring_mounts_for, streq(p, "/") ? "" : p);
+}
+
void watch_init(Watch *w) {
assert(w);