static int login_machine(int argc, char *argv[], void *userdata) {
_cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
- _cleanup_bus_message_unref_ sd_bus_message *reply = NULL;
- _cleanup_bus_close_unref_ sd_bus *container_bus = NULL;
+ _cleanup_bus_message_unref_ sd_bus_message *m = NULL, *reply = NULL;
_cleanup_(pty_forward_freep) PTYForward *forward = NULL;
_cleanup_event_unref_ sd_event *event = NULL;
- _cleanup_free_ char *getty = NULL;
int master = -1, r, ret = 0;
sd_bus *bus = userdata;
- const char *pty, *p;
+ const char *pty;
sigset_t mask;
char last_char = 0;
assert(bus);
- if (arg_transport != BUS_TRANSPORT_LOCAL) {
+ if (arg_transport != BUS_TRANSPORT_LOCAL &&
+ arg_transport != BUS_TRANSPORT_MACHINE) {
log_error("Login only supported on local machines.");
return -ENOTSUP;
}
if (r < 0)
return log_error_errno(r, "Failed to attach bus to event loop: %m");
- r = sd_bus_call_method(bus,
- "org.freedesktop.machine1",
- "/org/freedesktop/machine1",
- "org.freedesktop.machine1.Manager",
- "OpenMachinePTY",
- &error,
- &reply,
- "s", argv[1]);
- if (r < 0) {
- log_error("Failed to get machine PTY: %s", bus_error_message(&error, -r));
- return r;
- }
-
- r = sd_bus_message_read(reply, "hs", &master, &pty);
+ r = sd_bus_message_new_method_call(bus,
+ &m,
+ "org.freedesktop.machine1",
+ "/org/freedesktop/machine1",
+ "org.freedesktop.machine1.Manager",
+ "OpenMachineLogin");
if (r < 0)
- return r;
-
- p = startswith(pty, "/dev/pts/");
- if (!p) {
- log_error("Invalid pty name %s.", pty);
- return -EIO;
- }
+ return bus_log_create_error(r);
- r = sd_bus_open_system_container(&container_bus, argv[1]);
+ r = sd_bus_message_set_allow_interactive_authorization(m, true);
if (r < 0)
- return log_error_errno(r, "Failed to get container bus: %m");
-
- getty = strjoin("container-getty@", p, ".service", NULL);
- if (!getty)
- return log_oom();
+ return bus_log_create_error(r);
- if (unlockpt(master) < 0)
- return log_error_errno(errno, "Failed to unlock tty: %m");
+ r = sd_bus_message_append(m, "s", argv[1]);
+ if (r < 0)
+ return bus_log_create_error(r);
- r = sd_bus_call_method(container_bus,
- "org.freedesktop.systemd1",
- "/org/freedesktop/systemd1",
- "org.freedesktop.systemd1.Manager",
- "StartUnit",
- &error, NULL,
- "ss", getty, "replace");
+ r = sd_bus_call(bus, m, 0, &error, &reply);
if (r < 0) {
- log_error("Failed to start getty service: %s", bus_error_message(&error, r));
+ log_error("Failed to get machine PTY: %s", bus_error_message(&error, -r));
return r;
}
- container_bus = sd_bus_unref(container_bus);
+ r = sd_bus_message_read(reply, "hs", &master, &pty);
+ if (r < 0)
+ return bus_log_parse_error(r);
assert_se(sigemptyset(&mask) == 0);
sigset_add_many(&mask, SIGWINCH, SIGTERM, SIGINT, -1);
break;
case 'M':
- arg_transport = BUS_TRANSPORT_CONTAINER;
+ arg_transport = BUS_TRANSPORT_MACHINE;
arg_host = optarg;
break;