#include <stdio.h>
#include <errno.h>
#include <sys/prctl.h>
-#include <sys/capability.h>
#include <getopt.h>
#include <termios.h>
#include <sys/signalfd.h>
#include "base-filesystem.h"
#include "barrier.h"
#include "event-util.h"
+#include "capability.h"
#include "cap-list.h"
#include "btrfs-util.h"
+#include "machine-image.h"
#ifdef HAVE_SECCOMP
#include "seccomp-util.h"
}
static int determine_names(void) {
+ int r;
if (!arg_image && !arg_directory) {
- if (arg_machine)
- arg_directory = strappend("/var/lib/container/", arg_machine);
- else
+ if (arg_machine) {
+ _cleanup_(image_unrefp) Image *i = NULL;
+
+ r = image_find(arg_machine, &i);
+ if (r < 0)
+ return log_error_errno(r, "Failed to find image for machine '%s': %m", arg_machine);
+ else if (r == 0) {
+ log_error("No image for machine '%s': %m", arg_machine);
+ return -ENOENT;
+ }
+
+ if (i->type == IMAGE_GPT)
+ r = set_sanitized_path(&arg_image, i->path);
+ else
+ r = set_sanitized_path(&arg_directory, i->path);
+ if (r < 0)
+ return log_error_errno(r, "Invalid image directory: %m");
+
+ arg_read_only = arg_read_only || i->read_only;
+ } else
arg_directory = get_current_dir_name();
- if (!arg_directory) {
- log_error("Failed to determine path, please use -D.");
+ if (!arg_directory && !arg_machine) {
+ log_error("Failed to determine path, please use -D or -i.");
return -EINVAL;
}
}
int main(int argc, char *argv[]) {
- _cleanup_free_ char *device_path = NULL, *root_device = NULL, *home_device = NULL, *srv_device = NULL;
+ _cleanup_free_ char *device_path = NULL, *root_device = NULL, *home_device = NULL, *srv_device = NULL, *console = NULL;
bool root_device_rw = true, home_device_rw = true, srv_device_rw = true;
_cleanup_close_ int master = -1, image_fd = -1;
_cleanup_close_pair_ int kmsg_socket_pair[2] = { -1, -1 };
_cleanup_fdset_free_ FDSet *fds = NULL;
int r, n_fd_passed, loop_nr = -1;
- const char *console = NULL;
char veth_name[IFNAMSIZ];
bool secondary = false, remove_subvol = false;
sigset_t mask, mask_chld;
goto finish;
}
- console = ptsname(master);
- if (!console) {
- r = log_error_errno(errno, "Failed to determine tty name: %m");
+ r = ptsname_malloc(master, &console);
+ if (r < 0) {
+ r = log_error_errno(r, "Failed to determine tty name: %m");
goto finish;
}
goto finish;
}
- sd_notify(false,
- "READY=1\n"
- "STATUS=Container running.");
-
assert_se(sigemptyset(&mask) == 0);
sigset_add_many(&mask, SIGCHLD, SIGWINCH, SIGTERM, SIGINT, -1);
assert_se(sigprocmask(SIG_BLOCK, &mask, NULL) == 0);
if (barrier_place_and_sync(&barrier)) {
_cleanup_event_unref_ sd_event *event = NULL;
_cleanup_(pty_forward_freep) PTYForward *forward = NULL;
+ char last_char = 0;
int ifi = 0;
r = move_network_interfaces(pid);
/* Notify the child that the parent is ready with all
* its setup, and that the child can now hand over
* control to the code to run inside the container. */
- (void)barrier_place(&barrier);
+ (void) barrier_place(&barrier);
+
+ sd_notify(false,
+ "READY=1\n"
+ "STATUS=Container running.");
r = sd_event_new(&event);
if (r < 0) {
goto finish;
}
+ pty_forward_last_char(forward, &last_char);
+
forward = pty_forward_free(forward);
- if (!arg_quiet)
+ if (!arg_quiet && last_char != '\n')
putc('\n', stdout);
/* Kill if it is not dead yet anyway */