static int slice_enumerate(Manager *m) { Unit *u; int r; assert(m); u = manager_get_unit(m, SPECIAL_ROOT_SLICE); if (!u) { u = unit_new(m, sizeof(Slice)); if (!u) return log_oom(); r = unit_add_name(u, SPECIAL_ROOT_SLICE); if (r < 0) { unit_free(u); return log_error_errno(r, "Failed to add -.slice name"); } } u->default_dependencies = false; u->no_gc = true; SLICE(u)->deserialized_state = SLICE_ACTIVE; if (!u->description) u->description = strdup("Root Slice"); if (!u->documentation) (void) strv_extend(&u->documentation, "man:systemd.special(7)"); unit_add_to_load_queue(u); unit_add_to_dbus_queue(u); return 0; }
static void scope_enumerate(Manager *m) { Unit *u; int r; assert(m); /* Let's unconditionally add the "init.scope" special unit * that encapsulates PID 1. Note that PID 1 already is in the * cgroup for this, we hence just need to allocate the object * for it and that's it. */ u = manager_get_unit(m, SPECIAL_INIT_SCOPE); if (!u) { u = unit_new(m, sizeof(Scope)); if (!u) { log_oom(); return; } r = unit_add_name(u, SPECIAL_INIT_SCOPE); if (r < 0) { unit_free(u); log_error_errno(r, "Failed to add init.scope name"); return; } } u->transient = true; u->default_dependencies = false; u->no_gc = true; u->ignore_on_isolate = true; u->refuse_manual_start = true; u->refuse_manual_stop = true; SCOPE(u)->deserialized_state = SCOPE_RUNNING; SCOPE(u)->kill_context.kill_signal = SIGRTMIN+14; /* Prettify things, if we can. */ if (!u->description) u->description = strdup("System and Service Manager"); if (!u->documentation) (void) strv_extend(&u->documentation, "man:systemd(1)"); unit_add_to_load_queue(u); unit_add_to_dbus_queue(u); }
static int device_add_escaped_name(Unit *u, const char *dn) { _cleanup_free_ char *e = NULL; int r; assert(u); assert(dn); assert(dn[0] == '/'); e = unit_name_from_path(dn, ".device"); if (!e) return -ENOMEM; r = unit_add_name(u, e); if (r < 0 && r != -EEXIST) return r; return 0; }
static int device_add_escaped_name(Unit *u, const char *dn) { char *e; int r; assert(u); assert(dn); assert(dn[0] == '/'); if (!(e = unit_name_from_path(dn, ".device"))) return -ENOMEM; r = unit_add_name(u, e); free(e); if (r < 0 && r != -EEXIST) return r; return 0; }
static int test_unit_printf(void) { Manager *m; Unit *u, *u2; int r; _cleanup_free_ char *mid, *bid, *host, *root_uid; struct passwd *root; assert_se(specifier_machine_id('m', NULL, NULL, &mid) >= 0 && mid); assert_se(specifier_boot_id('b', NULL, NULL, &bid) >= 0 && bid); assert_se((host = gethostname_malloc())); assert_se((root = getpwnam("root"))); assert_se(asprintf(&root_uid, "%d", (int) root->pw_uid) > 0); r = manager_new(SYSTEMD_USER, &m); if (r == -EPERM || r == -EACCES || r == -EADDRINUSE) { puts("manager_new: Permission denied. Skipping test."); return EXIT_TEST_SKIP; } assert(r == 0); #define expect(unit, pattern, expected) \ { \ char *e; \ _cleanup_free_ char *t; \ assert_se(unit_full_printf(unit, pattern, &t) >= 0); \ printf("result: %s\nexpect: %s\n", t, expected); \ if ((e = endswith(expected, "*"))) \ assert(strncmp(t, e, e-expected)); \ else \ assert(streq(t, expected)); \ } assert_se(setenv("USER", "root", 1) == 0); assert_se(setenv("HOME", "/root", 1) == 0); assert_se(u = unit_new(m, sizeof(Service))); assert_se(unit_add_name(u, "blah.service") == 0); assert_se(unit_add_name(u, "blah.service") == 0); /* general tests */ expect(u, "%%", "%"); expect(u, "%%s", "%s"); expect(u, "%", ""); // REALLY? /* normal unit */ expect(u, "%n", "blah.service"); expect(u, "%N", "blah"); expect(u, "%p", "blah"); expect(u, "%P", "blah"); expect(u, "%i", ""); expect(u, "%I", ""); expect(u, "%u", root->pw_name); expect(u, "%U", root_uid); expect(u, "%h", root->pw_dir); expect(u, "%s", "/bin/sh"); expect(u, "%m", mid); expect(u, "%b", bid); expect(u, "%H", host); expect(u, "%t", "/run/user/*"); /* templated */ assert_se(u2 = unit_new(m, sizeof(Service))); assert_se(unit_add_name(u2, "*****@*****.**") == 0); assert_se(unit_add_name(u2, "*****@*****.**") == 0); expect(u2, "%n", "*****@*****.**"); expect(u2, "%N", "blah@foo-foo"); expect(u2, "%p", "blah"); expect(u2, "%P", "blah"); expect(u2, "%i", "foo-foo"); expect(u2, "%I", "foo/foo"); expect(u2, "%u", root->pw_name); expect(u2, "%U", root_uid); expect(u2, "%h", root->pw_dir); expect(u2, "%s", "/bin/sh"); expect(u2, "%m", mid); expect(u2, "%b", bid); expect(u2, "%H", host); expect(u2, "%t", "/run/user/*"); manager_free(m); return 0; }
static int test_unit_printf(void) { Manager *m = NULL; Unit *u, *u2; int r; _cleanup_free_ char *mid = NULL, *bid = NULL, *host = NULL, *uid = NULL, *user = NULL, *shell = NULL, *home = NULL; assert_se(specifier_machine_id('m', NULL, NULL, &mid) >= 0 && mid); assert_se(specifier_boot_id('b', NULL, NULL, &bid) >= 0 && bid); assert_se(host = gethostname_malloc()); assert_se(user = getusername_malloc()); assert_se(asprintf(&uid, UID_FMT, getuid())); assert_se(get_home_dir(&home) >= 0); assert_se(get_shell(&shell) >= 0); r = manager_new(UNIT_FILE_USER, true, &m); if (r == -EPERM || r == -EACCES || r == -EADDRINUSE) { puts("manager_new: Permission denied. Skipping test."); return EXIT_TEST_SKIP; } assert_se(r == 0); #define expect(unit, pattern, expected) \ { \ char *e; \ _cleanup_free_ char *t = NULL; \ assert_se(unit_full_printf(unit, pattern, &t) >= 0); \ printf("result: %s\nexpect: %s\n", t, expected); \ if ((e = endswith(expected, "*"))) \ assert_se(strncmp(t, e, e-expected)); \ else \ assert_se(streq(t, expected)); \ } assert_se(setenv("XDG_RUNTIME_DIR", "/run/user/1/", 1) == 0); assert_se(u = unit_new(m, sizeof(Service))); assert_se(unit_add_name(u, "blah.service") == 0); assert_se(unit_add_name(u, "blah.service") == 0); /* general tests */ expect(u, "%%", "%"); expect(u, "%%s", "%s"); expect(u, "%", ""); // REALLY? /* normal unit */ expect(u, "%n", "blah.service"); expect(u, "%f", "/blah"); expect(u, "%N", "blah"); expect(u, "%p", "blah"); expect(u, "%P", "blah"); expect(u, "%i", ""); expect(u, "%u", user); expect(u, "%U", uid); expect(u, "%h", home); expect(u, "%m", mid); expect(u, "%b", bid); expect(u, "%H", host); expect(u, "%t", "/run/user/*"); /* templated */ assert_se(u2 = unit_new(m, sizeof(Service))); assert_se(unit_add_name(u2, "*****@*****.**") == 0); assert_se(unit_add_name(u2, "*****@*****.**") == 0); expect(u2, "%n", "*****@*****.**"); expect(u2, "%N", "blah@foo-foo"); expect(u2, "%f", "/foo/foo"); expect(u2, "%p", "blah"); expect(u2, "%P", "blah"); expect(u2, "%i", "foo-foo"); expect(u2, "%I", "foo/foo"); expect(u2, "%u", user); expect(u2, "%U", uid); expect(u2, "%h", home); expect(u2, "%m", mid); expect(u2, "%b", bid); expect(u2, "%H", host); expect(u2, "%t", "/run/user/*"); manager_free(m); #undef expect return 0; }