diff options
Diffstat (limited to 'src/login')
-rw-r--r-- | src/login/loginctl.c | 309 | ||||
-rw-r--r-- | src/login/logind-dbus.c | 378 | ||||
-rw-r--r-- | src/login/logind-machine-dbus.c | 360 | ||||
-rw-r--r-- | src/login/logind-machine.c | 403 | ||||
-rw-r--r-- | src/login/logind-machine.h | 99 | ||||
-rw-r--r-- | src/login/logind-user.c | 12 | ||||
-rw-r--r-- | src/login/logind.c | 117 | ||||
-rw-r--r-- | src/login/logind.h | 7 |
8 files changed, 12 insertions, 1673 deletions
diff --git a/src/login/loginctl.c b/src/login/loginctl.c index 3637a408dc..e118deffda 100644 --- a/src/login/loginctl.c +++ b/src/login/loginctl.c @@ -261,69 +261,6 @@ static int list_seats(DBusConnection *bus, char **args, unsigned n) { return 0; } -static int list_machines(DBusConnection *bus, char **args, unsigned n) { - _cleanup_dbus_message_unref_ DBusMessage *reply = NULL; - DBusMessageIter iter, sub, sub2; - unsigned k = 0; - int r; - - pager_open_if_enabled(); - - r = bus_method_call_with_reply ( - bus, - "org.freedesktop.login1", - "/org/freedesktop/login1", - "org.freedesktop.login1.Manager", - "ListMachines", - &reply, - NULL, - DBUS_TYPE_INVALID); - if (r) - return r; - - if (!dbus_message_iter_init(reply, &iter) || - dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_ARRAY || - dbus_message_iter_get_element_type(&iter) != DBUS_TYPE_STRUCT) { - log_error("Failed to parse reply."); - return -EIO; - } - - dbus_message_iter_recurse(&iter, &sub); - - if (on_tty()) - printf("%-32s %-9s %-16s\n", "MACHINE", "CONTAINER", "SERVICE"); - - while (dbus_message_iter_get_arg_type(&sub) != DBUS_TYPE_INVALID) { - const char *name, *class, *service, *object; - - if (dbus_message_iter_get_arg_type(&sub) != DBUS_TYPE_STRUCT) { - log_error("Failed to parse reply."); - return -EIO; - } - - dbus_message_iter_recurse(&sub, &sub2); - - if (bus_iter_get_basic_and_next(&sub2, DBUS_TYPE_STRING, &name, true) < 0 || - bus_iter_get_basic_and_next(&sub2, DBUS_TYPE_STRING, &class, true) < 0 || - bus_iter_get_basic_and_next(&sub2, DBUS_TYPE_STRING, &service, true) < 0 || - bus_iter_get_basic_and_next(&sub2, DBUS_TYPE_OBJECT_PATH, &object, false) < 0) { - log_error("Failed to parse reply."); - return -EIO; - } - - printf("%-32s %-9s %-16s\n", name, class, service); - - k++; - - dbus_message_iter_next(&sub); - } - - if (on_tty()) - printf("\n%u machines listed.\n", k); - - return 0; -} - typedef struct SessionStatusInfo { const char *id; uid_t uid; @@ -362,18 +299,6 @@ typedef struct SeatStatusInfo { char **sessions; } SeatStatusInfo; -typedef struct MachineStatusInfo { - const char *name; - sd_id128_t id; - const char *default_control_group; - const char *class; - const char *service; - const char *slice; - const char *root_directory; - pid_t leader; - usec_t timestamp; -} MachineStatusInfo; - static void print_session_status_info(SessionStatusInfo *i) { char since1[FORMAT_TIMESTAMP_RELATIVE_MAX], *s1; char since2[FORMAT_TIMESTAMP_MAX], *s2; @@ -569,76 +494,6 @@ static void print_seat_status_info(SeatStatusInfo *i) { } } -static void print_machine_status_info(MachineStatusInfo *i) { - char since1[FORMAT_TIMESTAMP_RELATIVE_MAX], *s1; - char since2[FORMAT_TIMESTAMP_MAX], *s2; - assert(i); - - fputs(strna(i->name), stdout); - - if (!sd_id128_equal(i->id, SD_ID128_NULL)) - printf("(" SD_ID128_FORMAT_STR ")\n", SD_ID128_FORMAT_VAL(i->id)); - else - putchar('\n'); - - s1 = format_timestamp_relative(since1, sizeof(since1), i->timestamp); - s2 = format_timestamp(since2, sizeof(since2), i->timestamp); - - if (s1) - printf("\t Since: %s; %s\n", s2, s1); - else if (s2) - printf("\t Since: %s\n", s2); - - if (i->leader > 0) { - _cleanup_free_ char *t = NULL; - - printf("\t Leader: %u", (unsigned) i->leader); - - get_process_comm(i->leader, &t); - if (t) - printf(" (%s)", t); - - putchar('\n'); - } - - if (i->service) { - printf("\t Service: %s", i->service); - - if (i->class) - printf("; class %s", i->class); - - putchar('\n'); - } else if (i->class) - printf("\t Class: %s\n", i->class); - - if (i->slice) - printf("\t Slice: %s\n", i->slice); - if (i->root_directory) - printf("\t Root: %s\n", i->root_directory); - - if (i->default_control_group) { - unsigned c; - int output_flags = - arg_all * OUTPUT_SHOW_ALL | - arg_full * OUTPUT_FULL_WIDTH; - - printf("\t CGroup: %s\n", i->default_control_group); - - if (arg_transport != TRANSPORT_SSH) { - c = columns(); - if (c > 18) - c -= 18; - else - c = 0; - - show_cgroup_and_extra_by_spec(i->default_control_group, - "\t\t ", c, false, &i->leader, - i->leader > 0 ? 1 : 0, - output_flags); - } - } -} - static int status_property_session(const char *name, DBusMessageIter *iter, SessionStatusInfo *i) { assert(name); assert(iter); @@ -912,80 +767,6 @@ static int status_property_seat(const char *name, DBusMessageIter *iter, SeatSta return 0; } -static int status_property_machine(const char *name, DBusMessageIter *iter, MachineStatusInfo *i) { - assert(name); - assert(iter); - assert(i); - - switch (dbus_message_iter_get_arg_type(iter)) { - - case DBUS_TYPE_STRING: { - const char *s; - - dbus_message_iter_get_basic(iter, &s); - - if (!isempty(s)) { - if (streq(name, "Name")) - i->name = s; - else if (streq(name, "DefaultControlGroup")) - i->default_control_group = s; - else if (streq(name, "Class")) - i->class = s; - else if (streq(name, "Service")) - i->service = s; - else if (streq(name, "Slice")) - i->slice = s; - else if (streq(name, "RootDirectory")) - i->root_directory = s; - } - break; - } - - case DBUS_TYPE_UINT32: { - uint32_t u; - - dbus_message_iter_get_basic(iter, &u); - - if (streq(name, "Leader")) - i->leader = (pid_t) u; - - break; - } - - case DBUS_TYPE_UINT64: { - uint64_t u; - - dbus_message_iter_get_basic(iter, &u); - - if (streq(name, "Timestamp")) - i->timestamp = (usec_t) u; - - break; - } - - case DBUS_TYPE_ARRAY: { - DBusMessageIter sub; - - dbus_message_iter_recurse(iter, &sub); - - if (dbus_message_iter_get_arg_type(&sub) == DBUS_TYPE_BYTE && streq(name, "Id")) { - void *v; - int n; - - dbus_message_iter_get_fixed_array(&sub, &v, &n); - if (n == 0) - i->id = SD_ID128_NULL; - else if (n == 16) - memcpy(&i->id, v, n); - } - - break; - } - } - - return 0; -} - static int print_property(const char *name, DBusMessageIter *iter) { assert(name); assert(iter); @@ -1067,7 +848,6 @@ static int show_one(const char *verb, DBusConnection *bus, const char *path, boo SessionStatusInfo session_info = {}; UserStatusInfo user_info = {}; SeatStatusInfo seat_info = {}; - MachineStatusInfo machine_info = {}; assert(path); assert(new_line); @@ -1131,10 +911,8 @@ static int show_one(const char *verb, DBusConnection *bus, const char *path, boo r = status_property_session(name, &sub3, &session_info); else if (strstr(verb, "user")) r = status_property_user(name, &sub3, &user_info); - else if (strstr(verb, "seat")) - r = status_property_seat(name, &sub3, &seat_info); else - r = status_property_machine(name, &sub3, &machine_info); + r = status_property_seat(name, &sub3, &seat_info); if (r < 0) { log_error("Failed to parse reply."); @@ -1149,10 +927,8 @@ static int show_one(const char *verb, DBusConnection *bus, const char *path, boo print_session_status_info(&session_info); else if (strstr(verb, "user")) print_user_status_info(&user_info); - else if (strstr(verb, "seat")) - print_seat_status_info(&seat_info); else - print_machine_status_info(&machine_info); + print_seat_status_info(&seat_info); } r = 0; @@ -1226,7 +1002,7 @@ static int show(DBusConnection *bus, char **args, unsigned n) { DBUS_TYPE_UINT32, &u, DBUS_TYPE_INVALID); - } else if (strstr(args[0], "seat")) { + } else { ret = bus_method_call_with_reply( bus, @@ -1239,18 +1015,6 @@ static int show(DBusConnection *bus, char **args, unsigned n) { DBUS_TYPE_STRING, &args[i], DBUS_TYPE_INVALID); - } else { - - ret = bus_method_call_with_reply( - bus, - "org.freedesktop.login1", - "/org/freedesktop/login1", - "org.freedesktop.login1.Manager", - "GetMachine", - &reply, - NULL, - DBUS_TYPE_STRING, &args[i], - DBUS_TYPE_INVALID); } if (ret < 0) @@ -1334,36 +1098,6 @@ static int kill_session(DBusConnection *bus, char **args, unsigned n) { return 0; } -static int kill_machine(DBusConnection *bus, char **args, unsigned n) { - unsigned i; - - assert(args); - - if (!arg_kill_who) - arg_kill_who = "all"; - - for (i = 1; i < n; i++) { - int r; - - r = bus_method_call_with_reply ( - bus, - "org.freedesktop.login1", - "/org/freedesktop/login1", - "org.freedesktop.login1.Manager", - "KillMachine", - NULL, - NULL, - DBUS_TYPE_STRING, &args[i], - DBUS_TYPE_STRING, &arg_kill_who, - DBUS_TYPE_INT32, &arg_signal, - DBUS_TYPE_INVALID); - if (r) - return r; - } - - return 0; -} - static int enable_linger(DBusConnection *bus, char **args, unsigned n) { unsigned i; dbus_bool_t b, interactive = true; @@ -1567,31 +1301,6 @@ static int terminate_seat(DBusConnection *bus, char **args, unsigned n) { return 0; } -static int terminate_machine(DBusConnection *bus, char **args, unsigned n) { - unsigned i; - - assert(args); - - for (i = 1; i < n; i++) { - int r; - - r = bus_method_call_with_reply ( - bus, - "org.freedesktop.login1", - "/org/freedesktop/login1", - "org.freedesktop.login1.Manager", - "TerminateMachine", - NULL, - NULL, - DBUS_TYPE_STRING, &args[i], - DBUS_TYPE_INVALID); - if (r) - return r; - } - - return 0; -} - static int help(void) { printf("%s [OPTIONS...] {COMMAND} ...\n\n" @@ -1630,12 +1339,7 @@ static int help(void) { " show-seat [NAME...] Show properties of one or more seats\n" " attach [NAME] [DEVICE...] Attach one or more devices to a seat\n" " flush-devices Flush all device associations\n" - " terminate-seat [NAME...] Terminate all sessions on one or more seats\n" - " list-machines List running VMs and containers\n" - " machine-status [NAME...] Show VM/container status\n" - " show-machine [NAME...] Show properties of one or more VMs/containers\n" - " terminate-machine [NAME...] Terminate one or more VMs/containers\n" - " kill-machine [NAME...] Send signal to processes of a VM/container\n", + " terminate-seat [NAME...] Terminate all sessions on one or more seats\n", program_invocation_short_name); return 0; @@ -1784,11 +1488,6 @@ static int loginctl_main(DBusConnection *bus, int argc, char *argv[], DBusError { "attach", MORE, 3, attach }, { "flush-devices", EQUAL, 1, flush_devices }, { "terminate-seat", MORE, 2, terminate_seat }, - { "list-machines", EQUAL, 1, list_machines }, - { "machine-status", MORE, 2, show }, - { "show-machine", MORE, 1, show }, - { "terminate-machine", MORE, 2, terminate_machine }, - { "kill-machine", MORE, 2, kill_machine }, }; int left; diff --git a/src/login/logind-dbus.c b/src/login/logind-dbus.c index d8d25b0041..9a19932af4 100644 --- a/src/login/logind-dbus.c +++ b/src/login/logind-dbus.c @@ -63,14 +63,6 @@ " <arg name=\"id\" type=\"s\" direction=\"in\"/>\n" \ " <arg name=\"seat\" type=\"o\" direction=\"out\"/>\n" \ " </method>\n" \ - " <method name=\"GetMachine\">\n" \ - " <arg name=\"name\" type=\"s\" direction=\"in\"/>\n" \ - " <arg name=\"machine\" type=\"o\" direction=\"out\"/>\n" \ - " </method>\n" \ - " <method name=\"GetMachineByPID\">\n" \ - " <arg name=\"pid\" type=\"u\" direction=\"in\"/>\n" \ - " <arg name=\"machine\" type=\"o\" direction=\"out\"/>\n" \ - " </method>\n" \ " <method name=\"ListSessions\">\n" \ " <arg name=\"sessions\" type=\"a(susso)\" direction=\"out\"/>\n" \ " </method>\n" \ @@ -80,9 +72,6 @@ " <method name=\"ListSeats\">\n" \ " <arg name=\"seats\" type=\"a(so)\" direction=\"out\"/>\n" \ " </method>\n" \ - " <method name=\"ListMachines\">\n" \ - " <arg name=\"machines\" type=\"a(ssso)\" direction=\"out\"/>\n" \ - " </method>\n" \ " <method name=\"CreateSession\">\n" \ " <arg name=\"uid\" type=\"u\" direction=\"in\"/>\n" \ " <arg name=\"leader\" type=\"u\" direction=\"in\"/>\n" \ @@ -108,16 +97,6 @@ " <method name=\"ReleaseSession\">\n" \ " <arg name=\"id\" type=\"s\" direction=\"in\"/>\n" \ " </method>\n" \ - " <method name=\"CreateMachine\">\n" \ - " <arg name=\"name\" type=\"s\" direction=\"in\"/>\n" \ - " <arg name=\"id\" type=\"ay\" direction=\"in\"/>\n" \ - " <arg name=\"service\" type=\"s\" direction=\"in\"/>\n" \ - " <arg name=\"class\" type=\"s\" direction=\"in\"/>\n" \ - " <arg name=\"leader\" type=\"u\" direction=\"in\"/>\n" \ - " <arg name=\"root_directory\" type=\"s\" direction=\"in\"/>\n" \ - " <arg name=\"scope_properties\" type=\"a(sv)\" direction=\"in\"/>\n" \ - " <arg name=\"path\" type=\"o\" direction=\"out\"/>\n" \ - " </method>\n" \ " <method name=\"ActivateSession\">\n" \ " <arg name=\"id\" type=\"s\" direction=\"in\"/>\n" \ " </method>\n" \ @@ -151,9 +130,6 @@ " <method name=\"TerminateSeat\">\n" \ " <arg name=\"id\" type=\"s\" direction=\"in\"/>\n" \ " </method>\n" \ - " <method name=\"TerminateMachine\">\n" \ - " <arg name=\"id\" type=\"s\" direction=\"in\"/>\n" \ - " </method>\n" \ " <method name=\"SetUserLinger\">\n" \ " <arg name=\"uid\" type=\"u\" direction=\"in\"/>\n" \ " <arg name=\"b\" type=\"b\" direction=\"in\"/>\n" \ @@ -231,22 +207,12 @@ " <arg name=\"id\" type=\"s\"/>\n" \ " <arg name=\"path\" type=\"o\"/>\n" \ " </signal>\n" \ - " <signal name=\"MachineNew\">\n" \ - " <arg name=\"machine\" type=\"s\"/>\n" \ - " <arg name=\"path\" type=\"o\"/>\n" \ - " </signal>\n" \ - " <signal name=\"MachineRemoved\">\n" \ - " <arg name=\"machine\" type=\"s\"/>\n" \ - " <arg name=\"path\" type=\"o\"/>\n" \ - " </signal>\n" \ " <signal name=\"PrepareForShutdown\">\n" \ " <arg name=\"active\" type=\"b\"/>\n" \ " </signal>\n" \ " <signal name=\"PrepareForSleep\">\n" \ " <arg name=\"active\" type=\"b\"/>\n" \ " </signal>\n" \ - " <property name=\"Controllers\" type=\"as\" access=\"read\"/>\n" \ - " <property name=\"ResetControllers\" type=\"as\" access=\"read\"/>\n" \ " <property name=\"NAutoVTs\" type=\"u\" access=\"read\"/>\n" \ " <property name=\"KillOnlyUsers\" type=\"as\" access=\"read\"/>\n" \ " <property name=\"KillExcludeUsers\" type=\"as\" access=\"read\"/>\n" \ @@ -689,148 +655,6 @@ fail: return r; } -static bool valid_machine_name(const char *p) { - size_t l; - - if (!filename_is_safe(p)) - return false; - - if (!ascii_is_valid(p)) - return false; - - l = strlen(p); - - if (l < 1 || l> 64) - return false; - - return true; -} - -static int bus_manager_create_machine(Manager *manager, DBusMessage *message) { - - const char *name, *service, *class, *slice, *root_directory; - _cleanup_free_ char *p = NULL; - DBusMessageIter iter, sub; - MachineClass c; - uint32_t leader; - sd_id128_t id; - Machine *m; - int n, r; - void *v; - - assert(manager); - assert(message); - - if (!dbus_message_iter_init(message, &iter) || - dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_STRING) - return -EINVAL; - - dbus_message_iter_get_basic(&iter, &name); - - if (!valid_machine_name(name) || - !dbus_message_iter_next(&iter) || - dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_ARRAY || - dbus_message_iter_get_element_type(&iter) != DBUS_TYPE_BYTE) - return -EINVAL; - - dbus_message_iter_recurse(&iter, &sub); - dbus_message_iter_get_fixed_array(&sub, &v, &n); - - if (n == 0) - id = SD_ID128_NULL; - else if (n == 16) - memcpy(&id, v, n); - else - return -EINVAL; - - if (!dbus_message_iter_next(&iter) || - dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_STRING) - return -EINVAL; - - dbus_message_iter_get_basic(&iter, &service); - - if (!dbus_message_iter_next(&iter) || - dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_STRING) - return -EINVAL; - - dbus_message_iter_get_basic(&iter, &class); - - if (isempty(class)) - c = _MACHINE_CLASS_INVALID; - else { - c = machine_class_from_string(class); - if (c < 0) - return -EINVAL; - } - - if (!dbus_message_iter_next(&iter) || - dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_UINT32) - return -EINVAL; - - dbus_message_iter_get_basic(&iter, &leader); - if (!dbus_message_iter_next(&iter) || - dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_STRING) - return -EINVAL; - - dbus_message_iter_get_basic(&iter, &slice); - if (!(isempty(slice) || (unit_name_is_valid(slice, false) && endswith(slice, ".slice"))) || - !dbus_message_iter_next(&iter) || - dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_STRING) - return -EINVAL; - - dbus_message_iter_get_basic(&iter, &root_directory); - - if (!(isempty(root_directory) || path_is_absolute(root_directory))) - return -EINVAL; - - if (hashmap_get(manager->machines, name)) - return -EEXIST; - - if (leader <= 0) { - leader = bus_get_unix_process_id(manager->bus, dbus_message_get_sender(message), NULL); - if (leader == 0) - return -EINVAL; - } - - r = manager_add_machine(manager, name, &m); - if (r < 0) - goto fail; - - m->leader = leader; - m->class = c; - m->id = id; - - if (!isempty(service)) { - m->service = strdup(service); - if (!m->service) { - r = -ENOMEM; - goto fail; - } - } - - if (!isempty(root_directory)) { - m->root_directory = strdup(root_directory); - if (!m->root_directory) { - r = -ENOMEM; - goto fail; - } - } - - r = machine_start(m); - if (r < 0) - goto fail; - - m->create_message = dbus_message_ref(message); - - return 0; - -fail: - if (m) - machine_add_to_gc_queue(m); - - return r; -} - static int bus_manager_inhibit( Manager *m, DBusConnection *connection, @@ -1673,73 +1497,6 @@ static DBusHandlerResult manager_message_handler( if (!b) goto oom; - } else if (dbus_message_is_method_call(message, "org.freedesktop.login1.Manager", "GetMachine")) { - Machine *machine; - const char *name; - char *p; - bool b; - - if (!dbus_message_get_args( - message, - &error, - DBUS_TYPE_STRING, &name, - DBUS_TYPE_INVALID)) - return bus_send_error_reply(connection, message, &error, -EINVAL); - - machine = hashmap_get(m->machines, name); - if (!machine) - return bus_send_error_reply(connection, message, &error, -ENOENT); - - reply = dbus_message_new_method_return(message); - if (!reply) - goto oom; - - p = machine_bus_path(machine); - if (!p) - goto oom; - - b = dbus_message_append_args( - reply, - DBUS_TYPE_OBJECT_PATH, &p, - DBUS_TYPE_INVALID); - free(p); - - if (!b) - goto oom; - - } else if (dbus_message_is_method_call(message, "org.freedesktop.login1.Manager", "GetMachineByPID")) { - uint32_t pid; - char *p; - Machine *machine; - bool b; - - if (!dbus_message_get_args( - message, - &error, - DBUS_TYPE_UINT32, &pid, - DBUS_TYPE_INVALID)) - return bus_send_error_reply(connection, message, &error, -EINVAL); - - r = manager_get_machine_by_pid(m, pid, &machine); - if (r <= 0) - return bus_send_error_reply(connection, message, NULL, r < 0 ? r : -ENOENT); - - reply = dbus_message_new_method_return(message); - if (!reply) - goto oom; - - p = machine_bus_path(machine); - if (!p) - goto oom; - - b = dbus_message_append_args( - reply, - DBUS_TYPE_OBJECT_PATH, &p, - DBUS_TYPE_INVALID); - free(p); - - if (!b) - goto oom; } else if (dbus_message_is_method_call(message, "org.freedesktop.login1.Manager", "GetSeat")) { const char *name; @@ -1946,48 +1703,6 @@ static DBusHandlerResult manager_message_handler( if (!dbus_message_iter_close_container(&iter, &sub)) goto oom; - } else if (dbus_message_is_method_call(message, "org.freedesktop.login1.Manager", "ListMachines")) { - Machine *machine; - Iterator i; - DBusMessageIter iter, sub; - - reply = dbus_message_new_method_return(message); - if (!reply) - goto oom; - - dbus_message_iter_init_append(reply, &iter); - - if (!dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, "(ssso)", &sub)) - goto oom; - - HASHMAP_FOREACH(machine, m->machines, i) { - _cleanup_free_ char *p = NULL; - DBusMessageIter sub2; - const char *class; - - if (!dbus_message_iter_open_container(&sub, DBUS_TYPE_STRUCT, NULL, &sub2)) - goto oom; - - p = machine_bus_path(machine); - if (!p) - goto oom; - - class = strempty(machine_class_to_string(machine->class)); - - if (!dbus_message_iter_append_basic(&sub2, DBUS_TYPE_STRING, &machine->name) || - !dbus_message_iter_append_basic(&sub2, DBUS_TYPE_STRING, &class) || - !dbus_message_iter_append_basic(&sub2, DBUS_TYPE_STRING, &machine->service) || - !dbus_message_iter_append_basic(&sub2, DBUS_TYPE_OBJECT_PATH, &p)) { - free(p); - goto oom; - } - - if (!dbus_message_iter_close_container(&sub, &sub2)) - goto oom; - } - - if (!dbus_message_iter_close_container(&iter, &sub)) - goto oom; } else if (dbus_message_is_method_call(message, "org.freedesktop.login1.Manager", "Inhibit")) { @@ -2009,12 +1724,6 @@ static DBusHandlerResult manager_message_handler( if (r < 0) return bus_send_error_reply(connection, message, NULL, r); - } else if (dbus_message_is_method_call(message, "org.freedesktop.login1.Manager", "CreateMachine")) { - - r = bus_manager_create_machine(m, message); - if (r < 0) - return bus_send_error_reply(connection, message, NULL, r); - } else if (dbus_message_is_method_call(message, "org.freedesktop.login1.Manager", "ReleaseSession")) { const char *name; Session *session; @@ -2201,45 +1910,6 @@ static DBusHandlerResult manager_message_handler( if (!reply) goto oom; - } else if (dbus_message_is_method_call(message, "org.freedesktop.login1.Manager", "KillMachine")) { - const char *swho; - int32_t signo; - KillWho who; - const char *name; - Machine *machine; - - if (!dbus_message_get_args( - message, - &error, - DBUS_TYPE_STRING, &name, - DBUS_TYPE_STRING, &swho, - DBUS_TYPE_INT32, &signo, - DBUS_TYPE_INVALID)) - return bus_send_error_reply(connection, message, &error, -EINVAL); - - if (isempty(swho)) - who = KILL_ALL; - else { - who = kill_who_from_string(swho); - if (who < 0) - return bus_send_error_reply(connection, message, &error, -EINVAL); - } - - if (signo <= 0 || signo >= _NSIG) - return bus_send_error_reply(connection, message, &error, -EINVAL); - - machine = hashmap_get(m->machines, name); - if (!machine) - return bus_send_error_reply(connection, message, &error, -ENOENT); - - r = machine_kill(machine, who, signo); - if (r < 0) - return bus_send_error_reply(connection, message, NULL, r); - - reply = dbus_message_new_method_return(message); - if (!reply) - goto oom; - } else if (dbus_message_is_method_call(message, "org.freedesktop.login1.Manager", "TerminateSession")) { const char *name; Session *session; @@ -2309,29 +1979,6 @@ static DBusHandlerResult manager_message_handler( if (!reply) goto oom; - } else if (dbus_message_is_method_call(message, "org.freedesktop.login1.Manager", "TerminateMachine")) { - const char *name; - Machine *machine; - - if (!dbus_message_get_args( - message, - &error, - DBUS_TYPE_STRING, &name, - DBUS_TYPE_INVALID)) - return bus_send_error_reply(connection, message, &error, -EINVAL); - - machine = hashmap_get(m->machines, name); - if (!machine) - return bus_send_error_reply(connection, message, &error, -ENOENT); - - r = machine_stop(machine); - if (r < 0) - return bus_send_error_reply(connection, message, NULL, r); - - reply = dbus_message_new_method_return(message); - if (!reply) - goto oom; - } else if (dbus_message_is_method_call(message, "org.freedesktop.login1.Manager", "SetUserLinger")) { uint32_t uid; struct passwd *pw; @@ -2701,7 +2348,6 @@ DBusHandlerResult bus_message_filter( m->action_what = 0; } else { - Machine *mm; Session *s; User *u; @@ -2738,25 +2384,6 @@ DBusHandlerResult bus_message_filter( user_add_to_gc_queue(u); } - - mm = hashmap_get(m->machine_units, unit); - if (mm) { - if (streq_ptr(path, mm->scope_job)) { - free(mm->scope_job); - mm->scope_job = NULL; - - if (mm->started) { - if (streq(result, "done")) - machine_send_create_reply(mm, NULL); - else { - dbus_set_error(&error, BUS_ERROR_JOB_FAILED, "Start job for unit %s failed with '%s'", unit, result); - machine_send_create_reply(mm, &error); - } - } - } - - machine_add_to_gc_queue(mm); - } } } else if (dbus_message_is_signal(message, "org.freedesktop.DBus.Properties", "PropertiesChanged")) { @@ -2771,7 +2398,6 @@ DBusHandlerResult bus_message_filter( unit_name_from_dbus_path(path, &unit); if (unit) { - Machine *mm; Session *s; User *u; @@ -2782,10 +2408,6 @@ DBusHandlerResult bus_message_filter( u = hashmap_get(m->user_units, unit); if (u) user_add_to_gc_queue(u); - - mm = hashmap_get(m->machine_units, unit); - if (mm) - machine_add_to_gc_queue(mm); } } diff --git a/src/login/logind-machine-dbus.c b/src/login/logind-machine-dbus.c deleted file mode 100644 index ae8c5d720a..0000000000 --- a/src/login/logind-machine-dbus.c +++ /dev/null @@ -1,360 +0,0 @@ -/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/ - -/*** - This file is part of systemd. - - Copyright 2011 Lennart Poettering - - systemd is free software; you can redistribute it and/or modify it - under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation; either version 2.1 of the License, or - (at your option) any later version. - - systemd is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with systemd; If not, see <http://www.gnu.org/licenses/>. -***/ - -#include <errno.h> -#include <string.h> - -#include "logind.h" -#include "logind-machine.h" -#include "dbus-common.h" - -#define BUS_MACHINE_INTERFACE \ - " <interface name=\"org.freedesktop.login1.Machine\">\n" \ - " <method name=\"Terminate\"/>\n" \ - " <method name=\"Kill\">\n" \ - " <arg name=\"who\" type=\"s\"/>\n" \ - " <arg name=\"signal\" type=\"s\"/>\n" \ - " </method>\n" \ - " <property name=\"Name\" type=\"s\" access=\"read\"/>\n" \ - " <property name=\"Id\" type=\"ay\" access=\"read\"/>\n" \ - " <property name=\"Timestamp\" type=\"t\" access=\"read\"/>\n" \ - " <property name=\"TimestampMonotonic\" type=\"t\" access=\"read\"/>\n" \ - " <property name=\"Service\" type=\"s\" access=\"read\"/>\n" \ - " <property name=\"Scope\" type=\"s\" access=\"read\"/>\n" \ - " <property name=\"Leader\" type=\"u\" access=\"read\"/>\n" \ - " <property name=\"Class\" type=\"s\" access=\"read\"/>\n" \ - " <property name=\"State\" type=\"s\" access=\"read\"/>\n" \ - " <property name=\"RootDirectory\" type=\"s\" access=\"read\"/>\n" \ - " </interface>\n" - -#define INTROSPECTION \ - DBUS_INTROSPECT_1_0_XML_DOCTYPE_DECL_NODE \ - "<node>\n" \ - BUS_MACHINE_INTERFACE \ - BUS_PROPERTIES_INTERFACE \ - BUS_PEER_INTERFACE \ - BUS_INTROSPECTABLE_INTERFACE \ - "</node>\n" - -#define INTERFACES_LIST \ - BUS_GENERIC_INTERFACES_LIST \ - "org.freedesktop.login1.Machine\0" - -static int bus_machine_append_id(DBusMessageIter *i, const char *property, void *data) { - DBusMessageIter sub; - Machine *m = data; - dbus_bool_t b; - void *p; - - assert(i); - assert(property); - assert(m); - - if (!dbus_message_iter_open_container(i, DBUS_TYPE_ARRAY, "y", &sub)) - return -ENOMEM; - - p = &m->id; - b = dbus_message_iter_append_fixed_array(&sub, DBUS_TYPE_BYTE, &p, 16); - if (!b) - return -ENOMEM; - - if (!dbus_message_iter_close_container(i, &sub)) - return -ENOMEM; - - return 0; -} - -static int bus_machine_append_state(DBusMessageIter *i, const char *property, void *data) { - Machine *m = data; - const char *state; - - assert(i); - assert(property); - assert(m); - - state = machine_state_to_string(machine_get_state(m)); - - if (!dbus_message_iter_append_basic(i, DBUS_TYPE_STRING, &state)) - return -ENOMEM; - - return 0; -} - -static int get_machine_for_path(Manager *m, const char *path, Machine **_machine) { - _cleanup_free_ char *e = NULL; - Machine *machine; - - assert(m); - assert(path); - assert(_machine); - - if (!startswith(path, "/org/freedesktop/login1/machine/")) - return -EINVAL; - - e = bus_path_unescape(path + 32); - if (!e) - return -ENOMEM; - - machine = hashmap_get(m->machines, e); - if (!machine) - return -ENOENT; - - *_machine = machine; - return 0; -} - -static DEFINE_BUS_PROPERTY_APPEND_ENUM(bus_machine_append_class, machine_class, MachineClass); - -static const BusProperty bus_login_machine_properties[] = { - { "Name", bus_property_append_string, "s", offsetof(Machine, name), true }, - { "Id", bus_machine_append_id, "ay", 0 }, - { "Timestamp", bus_property_append_usec, "t", offsetof(Machine, timestamp.realtime) }, - { "TimestampMonotonic", bus_property_append_usec, "t", offsetof(Machine, timestamp.monotonic) }, - { "Service", bus_property_append_string, "s", offsetof(Machine, service), true }, - { "Scope", bus_property_append_string, "s", offsetof(Machine, scope), true }, - { "Leader", bus_property_append_pid, "u", offsetof(Session, leader) }, - { "Class", bus_machine_append_class, "s", offsetof(Machine, class) }, - { "State", bus_machine_append_state, "s", 0 }, - { "RootDirectory", bus_property_append_string, "s", offsetof(Machine, root_directory), true }, - { NULL, } -}; - -static DBusHandlerResult machine_message_dispatch( - Machine *m, - DBusConnection *connection, - DBusMessage *message) { - - DBusError error; - _cleanup_dbus_message_unref_ DBusMessage *reply = NULL; - int r; - - assert(m); - assert(connection); - assert(message); - - if (dbus_message_is_method_call(message, "org.freedesktop.login1.Machine", "Terminate")) { - - r = machine_stop(m); - if (r < 0) - return bus_send_error_reply(connection, message, NULL, r); - - reply = dbus_message_new_method_return(message); - if (!reply) - goto oom; - - } else if (dbus_message_is_method_call(message, "org.freedesktop.login1.Machine", "Kill")) { - const char *swho; - int32_t signo; - KillWho who; - - if (!dbus_message_get_args( - message, - &error, - DBUS_TYPE_STRING, &swho, - DBUS_TYPE_INT32, &signo, - DBUS_TYPE_INVALID)) - return bus_send_error_reply(connection, message, &error, -EINVAL); - - if (isempty(swho)) - who = KILL_ALL; - else { - who = kill_who_from_string(swho); - if (who < 0) - return bus_send_error_reply(connection, message, &error, -EINVAL); - } - - if (signo <= 0 || signo >= _NSIG) - return bus_send_error_reply(connection, message, &error, -EINVAL); - - r = machine_kill(m, who, signo); - if (r < 0) - return bus_send_error_reply(connection, message, NULL, r); - - reply = dbus_message_new_method_return(message); - if (!reply) - goto oom; - - } else { - const BusBoundProperties bps[] = { - { "org.freedesktop.login1.Machine", bus_login_machine_properties, m }, - { NULL, } - }; - - return bus_default_message_handler(connection, message, INTROSPECTION, INTERFACES_LIST, bps); - } - - if (reply) { - if (!bus_maybe_send_reply(connection, message, reply)) - goto oom; - } - - return DBUS_HANDLER_RESULT_HANDLED; - -oom: - dbus_error_free(&error); - - return DBUS_HANDLER_RESULT_NEED_MEMORY; -} - -static DBusHandlerResult machine_message_handler( - DBusConnection *connection, - DBusMessage *message, - void *userdata) { - - Manager *manager = userdata; - Machine *m; - int r; - - r = get_machine_for_path(manager, dbus_message_get_path(message), &m); - if (r < 0) { - - if (r == -ENOMEM) - return DBUS_HANDLER_RESULT_NEED_MEMORY; - - if (r == -ENOENT) { - DBusError e; - - dbus_error_init(&e); - dbus_set_error_const(&e, DBUS_ERROR_UNKNOWN_OBJECT, "Unknown machine"); - return bus_send_error_reply(connection, message, &e, r); - } - - return bus_send_error_reply(connection, message, NULL, r); - } - - return machine_message_dispatch(m, connection, message); -} - -const DBusObjectPathVTable bus_machine_vtable = { - .message_function = machine_message_handler -}; - -char *machine_bus_path(Machine *m) { - _cleanup_free_ char *e = NULL; - - assert(m); - - e = bus_path_escape(m->name); - if (!e) - return NULL; - - return strappend("/org/freedesktop/login1/machine/", e); -} - -int machine_send_signal(Machine *m, bool new_machine) { - _cleanup_dbus_message_unref_ DBusMessage *msg = NULL; - _cleanup_free_ char *p = NULL; - - assert(m); - - msg = dbus_message_new_signal("/org/freedesktop/login1", - "org.freedesktop.login1.Manager", - new_machine ? "MachineNew" : "MachineRemoved"); - - if (!m) - return -ENOMEM; - - p = machine_bus_path(m); - if (!p) - return -ENOMEM; - - if (!dbus_message_append_args( - msg, - DBUS_TYPE_STRING, &m->name, - DBUS_TYPE_OBJECT_PATH, &p, - DBUS_TYPE_INVALID)) - return -ENOMEM; - - if (!dbus_connection_send(m->manager->bus, msg, NULL)) - return -ENOMEM; - - return 0; -} - -int machine_send_changed(Machine *m, const char *properties) { - _cleanup_dbus_message_unref_ DBusMessage *msg = NULL; - _cleanup_free_ char *p = NULL; - - assert(m); - - if (!m->started) - return 0; - - p = machine_bus_path(m); - if (!p) - return -ENOMEM; - - msg = bus_properties_changed_new(p, "org.freedesktop.login1.Machine", properties); - if (!msg) - return -ENOMEM; - - if (!dbus_connection_send(m->manager->bus, msg, NULL)) - return -ENOMEM; - - return 0; -} - -int machine_send_create_reply(Machine *m, DBusError *error) { - _cleanup_dbus_message_unref_ DBusMessage *reply = NULL; - - assert(m); - - if (!m->create_message) - return 0; - - if (error) { - DBusError buffer; - - dbus_error_init(&buffer); - - if (!error || !dbus_error_is_set(error)) { - dbus_set_error_const(&buffer, DBUS_ERROR_INVALID_ARGS, "Invalid Arguments"); - error = &buffer; - } - - reply = dbus_message_new_error(m->create_message, error->name, error->message); - dbus_error_free(&buffer); - - if (!reply) - return log_oom(); - } else { - _cleanup_free_ char *p = NULL; - - p = machine_bus_path(m); - if (!p) - return log_oom(); - - reply = dbus_message_new_method_return(m->create_message); - if (!reply) - return log_oom(); - - if (!dbus_message_append_args(reply, DBUS_TYPE_OBJECT_PATH, &p, DBUS_TYPE_INVALID)) - return log_oom(); - } - - if (!dbus_connection_send(m->manager->bus, reply, NULL)) - return log_oom(); - - dbus_message_unref(m->create_message); - m->create_message = NULL; - - return 0; -} diff --git a/src/login/logind-machine.c b/src/login/logind-machine.c deleted file mode 100644 index a1342c155e..0000000000 --- a/src/login/logind-machine.c +++ /dev/null @@ -1,403 +0,0 @@ -/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/ - -/*** - This file is part of systemd. - - Copyright 2011 Lennart Poettering - - systemd is free software; you can redistribute it and/or modify it - under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation; either version 2.1 of the License, or - (at your option) any later version. - - systemd is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with systemd; If not, see <http://www.gnu.org/licenses/>. -***/ - -#include <string.h> -#include <unistd.h> -#include <errno.h> - -#include <systemd/sd-messages.h> - -#include "util.h" -#include "mkdir.h" -#include "cgroup-util.h" -#include "hashmap.h" -#include "strv.h" -#include "fileio.h" -#include "special.h" -#include "unit-name.h" -#include "dbus-common.h" -#include "logind-machine.h" - -Machine* machine_new(Manager *manager, const char *name) { - Machine *m; - - assert(manager); - assert(name); - - m = new0(Machine, 1); - if (!m) - return NULL; - - m->name = strdup(name); - if (!m->name) - goto fail; - - m->state_file = strappend("/run/systemd/machines/", m->name); - if (!m->state_file) - goto fail; - - if (hashmap_put(manager->machines, m->name, m) < 0) - goto fail; - - m->class = _MACHINE_CLASS_INVALID; - m->manager = manager; - - return m; - -fail: - free(m->state_file); - free(m->name); - free(m); - - return NULL; -} - -void machine_free(Machine *m) { - assert(m); - - if (m->in_gc_queue) - LIST_REMOVE(Machine, gc_queue, m->manager->machine_gc_queue, m); - - if (m->scope) { - hashmap_remove(m->manager->machine_units, m->scope); - free(m->scope); - } - - free(m->scope_job); - - hashmap_remove(m->manager->machines, m->name); - - if (m->create_message) - dbus_message_unref(m->create_message); - - free(m->name); - free(m->state_file); - free(m->service); - free(m->root_directory); - free(m); -} - -int machine_save(Machine *m) { - _cleanup_free_ char *temp_path = NULL; - _cleanup_fclose_ FILE *f = NULL; - int r; - - assert(m); - assert(m->state_file); - - if (!m->started) - return 0; - - r = mkdir_safe_label("/run/systemd/machines", 0755, 0, 0); - if (r < 0) - goto finish; - - r = fopen_temporary(m->state_file, &f, &temp_path); - if (r < 0) - goto finish; - - fchmod(fileno(f), 0644); - - fprintf(f, - "# This is private data. Do not parse.\n" - "NAME=%s\n", - m->name); - - if (m->scope) - fprintf(f, "SCOPE=%s\n", m->scope); - - if (m->scope_job) - fprintf(f, "SCOPE_JOB=%s\n", m->scope_job); - - if (m->service) - fprintf(f, "SERVICE=%s\n", m->service); - - if (m->root_directory) - fprintf(f, "ROOT=%s\n", m->root_directory); - - if (!sd_id128_equal(m->id, SD_ID128_NULL)) - fprintf(f, "ID=" SD_ID128_FORMAT_STR "\n", SD_ID128_FORMAT_VAL(m->id)); - - if (m->leader != 0) - fprintf(f, "LEADER=%lu\n", (unsigned long) m->leader); - - if (m->class != _MACHINE_CLASS_INVALID) - fprintf(f, "CLASS=%s\n", machine_class_to_string(m->class)); - - if (dual_timestamp_is_set(&m->timestamp)) - fprintf(f, - "REALTIME=%llu\n" - "MONOTONIC=%llu\n", - (unsigned long long) m->timestamp.realtime, - (unsigned long long) m->timestamp.monotonic); - - fflush(f); - - if (ferror(f) || rename(temp_path, m->state_file) < 0) { - r = -errno; - unlink(m->state_file); - unlink(temp_path); - } - -finish: - if (r < 0) - log_error("Failed to save machine data for %s: %s", m->name, strerror(-r)); - - return r; -} - -int machine_load(Machine *m) { - _cleanup_free_ char *realtime = NULL, *monotonic = NULL, *id = NULL, *leader = NULL, *class = NULL; - int r; - - assert(m); - - r = parse_env_file(m->state_file, NEWLINE, - "SCOPE", &m->scope, - "SCOPE_JOB", &m->scope_job, - "SERVICE", &m->service, - "ROOT", &m->root_directory, - "ID", &id, - "LEADER", &leader, - "CLASS", &class, - "REALTIME", &realtime, - "MONOTONIC", &monotonic, - NULL); - if (r < 0) { - if (r == -ENOENT) - return 0; - - log_error("Failed to read %s: %s", m->state_file, strerror(-r)); - return r; - } - - if (id) - sd_id128_from_string(id, &m->id); - - if (leader) - parse_pid(leader, &m->leader); - - if (class) { - MachineClass c; - - c = machine_class_from_string(class); - if (c >= 0) - m->class = c; - } - - if (realtime) { - unsigned long long l; - if (sscanf(realtime, "%llu", &l) > 0) - m->timestamp.realtime = l; - } - - if (monotonic) { - unsigned long long l; - if (sscanf(monotonic, "%llu", &l) > 0) - m->timestamp.monotonic = l; - } - - return r; -} - -static int machine_start_scope(Machine *m) { - _cleanup_free_ char *description = NULL; - DBusError error; - char *job; - int r; - - assert(m); - - dbus_error_init(&error); - - if (!m->scope) { - _cleanup_free_ char *escaped = NULL; - - escaped = unit_name_escape(m->name); - if (!escaped) - return log_oom(); - - m->scope = strjoin("machine-", m->name, ".scope", NULL); - if (!m->scope) - return log_oom(); - - r = hashmap_put(m->manager->machine_units, m->scope, m); - if (r < 0) - log_warning("Failed to create mapping between unit and machine"); - } - - description = strappend(m->class == MACHINE_VM ? "Virtual Machine " : "Container ", m->name); - - r = manager_start_scope(m->manager, m->scope, m->leader, SPECIAL_MACHINE_SLICE, description, &error, &job); - if (r < 0) { - log_error("Failed to start machine scope: %s", bus_error(&error, r)); - dbus_error_free(&error); - } - - free(m->scope_job); - m->scope_job = job; - - return r; -} - -int machine_start(Machine *m) { - int r; - - assert(m); - - if (m->started) - return 0; - - /* Create cgroup */ - r = machine_start_scope(m); - if (r < 0) - return r; - - log_struct(LOG_INFO, - MESSAGE_ID(SD_MESSAGE_MACHINE_START), - "NAME=%s", m->name, - "LEADER=%lu", (unsigned long) m->leader, - "MESSAGE=New machine %s.", m->name, - NULL); - - if (!dual_timestamp_is_set(&m->timestamp)) - dual_timestamp_get(&m->timestamp); - - m->started = true; - - /* Save new machine data */ - machine_save(m); - - machine_send_signal(m, true); - - return 0; -} - -static int machine_stop_scope(Machine *m) { - DBusError error; - char *job; - int r; - - assert(m); - - dbus_error_init(&error); - - if (!m->scope) - return 0; - - r = manager_stop_unit(m->manager, m->scope, &error, &job); - if (r < 0) { - log_error("Failed to stop machine scope: %s", bus_error(&error, r)); - dbus_error_free(&error); - return r; - } - - free(m->scope_job); - m->scope_job = job; - - return r; -} - -int machine_stop(Machine *m) { - int r = 0, k; - assert(m); - - if (m->started) - log_struct(LOG_INFO, - MESSAGE_ID(SD_MESSAGE_MACHINE_STOP), - "NAME=%s", m->name, - "LEADER=%lu", (unsigned long) m->leader, - "MESSAGE=Machine %s terminated.", m->name, - NULL); - - /* Kill cgroup */ - k = machine_stop_scope(m); - if (k < 0) - r = k; - - unlink(m->state_file); - machine_add_to_gc_queue(m); - - if (m->started) - machine_send_signal(m, false); - - m->started = false; - - return r; -} - -int machine_check_gc(Machine *m, bool drop_not_started) { - assert(m); - - if (drop_not_started && !m->started) - return 0; - - if (m->scope_job) - return 1; - - if (m->scope) - return manager_unit_is_active(m->manager, m->scope) != 0; - - return 0; -} - -void machine_add_to_gc_queue(Machine *m) { - assert(m); - - if (m->in_gc_queue) - return; - - LIST_PREPEND(Machine, gc_queue, m->manager->machine_gc_queue, m); - m->in_gc_queue = true; -} - -MachineState machine_get_state(Machine *s) { - assert(s); - - if (s->scope_job) - return s->started ? MACHINE_OPENING : MACHINE_CLOSING; - - return MACHINE_RUNNING; -} - -int machine_kill(Machine *m, KillWho who, int signo) { - assert(m); - - if (!m->scope) - return -ESRCH; - - return manager_kill_unit(m->manager, m->scope, who, signo, NULL); -} - -static const char* const machine_class_table[_MACHINE_CLASS_MAX] = { - [MACHINE_CONTAINER] = "container", - [MACHINE_VM] = "vm" -}; - -DEFINE_STRING_TABLE_LOOKUP(machine_class, MachineClass); - -static const char* const machine_state_table[_MACHINE_STATE_MAX] = { - [MACHINE_OPENING] = "opening", - [MACHINE_RUNNING] = "running", - [MACHINE_CLOSING] = "closing" -}; - -DEFINE_STRING_TABLE_LOOKUP(machine_state, MachineState); diff --git a/src/login/logind-machine.h b/src/login/logind-machine.h deleted file mode 100644 index a09f07195a..0000000000 --- a/src/login/logind-machine.h +++ /dev/null @@ -1,99 +0,0 @@ -/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/ - -#pragma once - -/*** - This file is part of systemd. - - Copyright 2013 Lennart Poettering - - systemd is free software; you can redistribute it and/or modify it - under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation; either version 2.1 of the License, or - (at your option) any later version. - - systemd is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with systemd; If not, see <http://www.gnu.org/licenses/>. -***/ - -typedef struct Machine Machine; - -#include "list.h" -#include "util.h" -#include "logind.h" -#include "logind-session.h" - -typedef enum MachineState { - MACHINE_OPENING, /* Machine is being registered */ - MACHINE_RUNNING, /* Machine is running */ - MACHINE_CLOSING, /* Machine is terminating */ - _MACHINE_STATE_MAX, - _MACHINE_STATE_INVALID = -1 -} MachineState; - -typedef enum MachineClass { - MACHINE_CONTAINER, - MACHINE_VM, - _MACHINE_CLASS_MAX, - _MACHINE_CLASS_INVALID = -1 -} MachineClass; - -struct Machine { - Manager *manager; - - char *name; - sd_id128_t id; - - MachineState state; - MachineClass class; - - char *state_file; - char *service; - char *root_directory; - - char *scope; - char *scope_job; - - pid_t leader; - - dual_timestamp timestamp; - - bool in_gc_queue:1; - bool started:1; - - DBusMessage *create_message; - - LIST_FIELDS(Machine, gc_queue); -}; - -Machine* machine_new(Manager *manager, const char *name); -void machine_free(Machine *m); -int machine_check_gc(Machine *m, bool drop_not_started); -void machine_add_to_gc_queue(Machine *m); -int machine_start(Machine *m); -int machine_stop(Machine *m); -int machine_save(Machine *m); -int machine_load(Machine *m); -int machine_kill(Machine *m, KillWho who, int signo); - -char *machine_bus_path(Machine *s); - -MachineState machine_get_state(Machine *u); - -extern const DBusObjectPathVTable bus_machine_vtable; - -int machine_send_signal(Machine *m, bool new_machine); -int machine_send_changed(Machine *m, const char *properties); - -int machine_send_create_reply(Machine *m, DBusError *error); - -const char* machine_class_to_string(MachineClass t) _const_; -MachineClass machine_class_from_string(const char *s) _pure_; - -const char* machine_state_to_string(MachineState t) _const_; -MachineState machine_state_from_string(const char *s) _pure_; diff --git a/src/login/logind-user.c b/src/login/logind-user.c index 316c4cd095..fb961bf64b 100644 --- a/src/login/logind-user.c +++ b/src/login/logind-user.c @@ -354,11 +354,11 @@ static int user_start_slice(User *u) { if (r < 0) { log_error("Failed to start user slice: %s", bus_error(&error, r)); dbus_error_free(&error); + } else { + free(u->slice_job); + u->slice_job = job; } - free(u->slice_job); - u->slice_job = job; - return 0; } @@ -388,11 +388,11 @@ static int user_start_service(User *u) { if (r < 0) { log_error("Failed to start user service: %s", bus_error(&error, r)); dbus_error_free(&error); + } else { + free(u->service_job); + u->service_job = job; } - free(u->service_job); - u->service_job = job; - return 0; } diff --git a/src/login/logind.c b/src/login/logind.c index 7040ac9e8a..e37a1071a2 100644 --- a/src/login/logind.c +++ b/src/login/logind.c @@ -74,18 +74,16 @@ Manager *manager_new(void) { m->users = hashmap_new(trivial_hash_func, trivial_compare_func); m->inhibitors = hashmap_new(string_hash_func, string_compare_func); m->buttons = hashmap_new(string_hash_func, string_compare_func); - m->machines = hashmap_new(string_hash_func, string_compare_func); m->user_units = hashmap_new(string_hash_func, string_compare_func); m->session_units = hashmap_new(string_hash_func, string_compare_func); - m->machine_units = hashmap_new(string_hash_func, string_compare_func); m->session_fds = hashmap_new(trivial_hash_func, trivial_compare_func); m->inhibitor_fds = hashmap_new(trivial_hash_func, trivial_compare_func); m->button_fds = hashmap_new(trivial_hash_func, trivial_compare_func); - if (!m->devices || !m->seats || !m->sessions || !m->users || !m->inhibitors || !m->buttons || !m->machines || - !m->user_units || !m->session_units || !m->machine_units || + if (!m->devices || !m->seats || !m->sessions || !m->users || !m->inhibitors || !m->buttons || + !m->user_units || !m->session_units || !m->session_fds || !m->inhibitor_fds || !m->button_fds) { manager_free(m); return NULL; @@ -113,7 +111,6 @@ void manager_free(Manager *m) { Seat *s; Inhibitor *i; Button *b; - Machine *machine; assert(m); @@ -135,20 +132,15 @@ void manager_free(Manager *m) { while ((b = hashmap_first(m->buttons))) button_free(b); - while ((machine = hashmap_first(m->machines))) - machine_free(machine); - hashmap_free(m->devices); hashmap_free(m->seats); hashmap_free(m->sessions); hashmap_free(m->users); hashmap_free(m->inhibitors); hashmap_free(m->buttons); - hashmap_free(m->machines); hashmap_free(m->user_units); hashmap_free(m->session_units); - hashmap_free(m->machine_units); hashmap_free(m->session_fds); hashmap_free(m->inhibitor_fds); @@ -364,30 +356,6 @@ int manager_add_button(Manager *m, const char *name, Button **_button) { return 0; } -int manager_add_machine(Manager *m, const char *name, Machine **_machine) { - Machine *machine; - - assert(m); - assert(name); - - machine = hashmap_get(m->machines, name); - if (machine) { - if (_machine) - *_machine = machine; - - return 0; - } - - machine = machine_new(m, name); - if (!m) - return -ENOMEM; - - if (_machine) - *_machine = machine; - - return 0; -} - int manager_process_seat_device(Manager *m, struct udev_device *d) { Device *device; int r; @@ -772,48 +740,6 @@ int manager_enumerate_inhibitors(Manager *m) { return r; } -int manager_enumerate_machines(Manager *m) { - _cleanup_closedir_ DIR *d = NULL; - struct dirent *de; - int r = 0; - - assert(m); - - /* Read in machine data stored on disk */ - d = opendir("/run/systemd/machines"); - if (!d) { - if (errno == ENOENT) - return 0; - - log_error("Failed to open /run/systemd/machines: %m"); - return -errno; - } - - FOREACH_DIRENT(de, d, return -errno) { - struct Machine *machine; - int k; - - if (!dirent_is_file(de)) - continue; - - k = manager_add_machine(m, de->d_name, &machine); - if (k < 0) { - log_error("Failed to add machine by file name %s: %s", de->d_name, strerror(-k)); - - r = k; - continue; - } - - machine_add_to_gc_queue(machine); - - k = machine_load(machine); - if (k < 0) - r = k; - } - - return r; -} - int manager_dispatch_seat_udev(Manager *m) { struct udev_device *d; int r; @@ -1018,27 +944,6 @@ int manager_get_user_by_pid(Manager *m, pid_t pid, User **user) { return 1; } -int manager_get_machine_by_pid(Manager *m, pid_t pid, Machine **machine) { - _cleanup_free_ char *unit = NULL; - Machine *mm; - int r; - - assert(m); - assert(pid >= 1); - assert(machine); - - r = cg_pid_get_unit(pid, &unit); - if (r < 0) - return r; - - mm = hashmap_get(m->machine_units, unit); - if (!mm) - return 0; - - *machine = mm; - return 1; -} - static void manager_dispatch_other(Manager *m, int fd) { Session *s; Inhibitor *i; @@ -1098,7 +1003,6 @@ static int manager_connect_bus(Manager *m) { !dbus_connection_register_fallback(m->bus, "/org/freedesktop/login1/seat", &bus_seat_vtable, m) || !dbus_connection_register_fallback(m->bus, "/org/freedesktop/login1/session", &bus_session_vtable, m) || !dbus_connection_register_fallback(m->bus, "/org/freedesktop/login1/user", &bus_user_vtable, m) || - !dbus_connection_register_fallback(m->bus, "/org/freedesktop/login1/machine", &bus_machine_vtable, m) || !dbus_connection_add_filter(m->bus, bus_message_filter, m, NULL)) { r = log_oom(); goto fail; @@ -1298,7 +1202,6 @@ void manager_gc(Manager *m, bool drop_not_started) { Seat *seat; Session *session; User *user; - Machine *machine; assert(m); @@ -1331,16 +1234,6 @@ void manager_gc(Manager *m, bool drop_not_started) { user_free(user); } } - - while ((machine = m->machine_gc_queue)) { - LIST_REMOVE(Machine, gc_queue, m->machine_gc_queue, machine); - machine->in_gc_queue = false; - - if (machine_check_gc(machine, drop_not_started) == 0) { - machine_stop(machine); - machine_free(machine); - } - } } int manager_get_idle_hint(Manager *m, dual_timestamp *t) { @@ -1459,7 +1352,6 @@ int manager_startup(Manager *m) { Session *session; User *user; Inhibitor *inhibitor; - Machine *machine; Iterator i; assert(m); @@ -1496,7 +1388,6 @@ int manager_startup(Manager *m) { manager_enumerate_sessions(m); manager_enumerate_inhibitors(m); manager_enumerate_buttons(m); - manager_enumerate_machines(m); /* Remove stale objects before we start them */ manager_gc(m, false); @@ -1517,9 +1408,6 @@ int manager_startup(Manager *m) { HASHMAP_FOREACH(inhibitor, m->inhibitors, i) inhibitor_start(inhibitor); - HASHMAP_FOREACH(machine, m->machines, i) - machine_start(machine); - manager_dispatch_idle_action(m); return 0; @@ -1671,7 +1559,6 @@ int main(int argc, char *argv[]) { mkdir_label("/run/systemd/seats", 0755); mkdir_label("/run/systemd/users", 0755); mkdir_label("/run/systemd/sessions", 0755); - mkdir_label("/run/systemd/machines", 0755); m = manager_new(); if (!m) { diff --git a/src/login/logind.h b/src/login/logind.h index b7277af73d..f7457c0537 100644 --- a/src/login/logind.h +++ b/src/login/logind.h @@ -41,7 +41,6 @@ typedef struct Manager Manager; #include "logind-inhibit.h" #include "logind-button.h" #include "logind-action.h" -#include "logind-machine.h" struct Manager { DBusConnection *bus; @@ -52,12 +51,10 @@ struct Manager { Hashmap *users; Hashmap *inhibitors; Hashmap *buttons; - Hashmap *machines; LIST_HEAD(Seat, seat_gc_queue); LIST_HEAD(Session, session_gc_queue); LIST_HEAD(User, user_gc_queue); - LIST_HEAD(Machine, machine_gc_queue); struct udev *udev; struct udev_monitor *udev_seat_monitor, *udev_vcsa_monitor, *udev_button_monitor; @@ -85,7 +82,6 @@ struct Manager { Hashmap *session_units; Hashmap *user_units; - Hashmap *machine_units; Hashmap *session_fds; Hashmap *inhibitor_fds; @@ -144,7 +140,6 @@ int manager_add_user(Manager *m, uid_t uid, gid_t gid, const char *name, User ** int manager_add_user_by_name(Manager *m, const char *name, User **_user); int manager_add_user_by_uid(Manager *m, uid_t uid, User **_user); int manager_add_inhibitor(Manager *m, const char* id, Inhibitor **_inhibitor); -int manager_add_machine(Manager *m, const char *name, Machine **_machine); int manager_process_seat_device(Manager *m, struct udev_device *d); int manager_process_button_device(Manager *m, struct udev_device *d); @@ -161,7 +156,6 @@ int manager_enumerate_seats(Manager *m); int manager_enumerate_sessions(Manager *m); int manager_enumerate_users(Manager *m); int manager_enumerate_inhibitors(Manager *m); -int manager_enumerate_machines(Manager *m); int manager_startup(Manager *m); int manager_run(Manager *m); @@ -173,7 +167,6 @@ int manager_get_idle_hint(Manager *m, dual_timestamp *t); int manager_get_user_by_pid(Manager *m, pid_t pid, User **user); int manager_get_session_by_pid(Manager *m, pid_t pid, Session **session); -int manager_get_machine_by_pid(Manager *m, pid_t pid, Machine **machine); extern const DBusObjectPathVTable bus_manager_vtable; |