chiark / gitweb /
nspawn: don't make up -1 as error code
[elogind.git] / src / nspawn / nspawn.c
index da4c116f363368888ad42360f228842b8105fa17..7e96efd425425f4f2d196356a38201774ff5b06e 100644 (file)
@@ -758,7 +758,7 @@ static int mount_binds(const char *dest, char **l, bool ro) {
                  * and char devices. */
                 if (S_ISDIR(source_st.st_mode)) {
                         r = mkdir_label(where, 0755);
-                        if (r < 0) {
+                        if (r < 0 && errno != EEXIST) {
                                 log_error("Failed to create mount point %s: %s", where, strerror(-r));
 
                                 return r;
@@ -1289,7 +1289,7 @@ static int setup_hostname(void) {
         if (arg_share_system)
                 return 0;
 
-        if (sethostname(arg_machine, strlen(arg_machine)) < 0)
+        if (sethostname_idempotent(arg_machine) < 0)
                 return -errno;
 
         return 0;
@@ -1545,7 +1545,7 @@ static int register_machine(pid_t pid, int local_ifindex) {
                         return r;
                 }
 
-                r = sd_bus_message_append(m, "(sv)", "DeviceAllow", "a(ss)", 10,
+                r = sd_bus_message_append(m, "(sv)", "DeviceAllow", "a(ss)", 11,
                                           /* Allow the container to
                                            * access and create the API
                                            * device nodes, so that
@@ -1558,6 +1558,7 @@ static int register_machine(pid_t pid, int local_ifindex) {
                                           "/dev/random", "rwm",
                                           "/dev/urandom", "rwm",
                                           "/dev/tty", "rwm",
+                                          "/dev/net/tun", "rwm",
                                           /* Allow the container
                                            * access to ptys. However,
                                            * do not permit the
@@ -2930,33 +2931,30 @@ static int wait_for_container(pid_t pid, ContainerStatus *container) {
         }
 
         switch (status.si_code) {
+
         case CLD_EXITED:
                 r = status.si_status;
                 if (r == 0) {
                         if (!arg_quiet)
-                                log_debug("Container %s exited successfully.",
-                                          arg_machine);
+                                log_debug("Container %s exited successfully.", arg_machine);
 
                         *container = CONTAINER_TERMINATED;
-                } else {
-                        log_error("Container %s failed with error code %i.",
-                                  arg_machine, status.si_status);
-                }
+                } else
+                        log_error("Container %s failed with error code %i.", arg_machine, status.si_status);
+
                 break;
 
         case CLD_KILLED:
                 if (status.si_status == SIGINT) {
                         if (!arg_quiet)
-                                log_info("Container %s has been shut down.",
-                                         arg_machine);
+                                log_info("Container %s has been shut down.", arg_machine);
 
                         *container = CONTAINER_TERMINATED;
                         r = 0;
                         break;
                 } else if (status.si_status == SIGHUP) {
                         if (!arg_quiet)
-                                log_info("Container %s is being rebooted.",
-                                         arg_machine);
+                                log_info("Container %s is being rebooted.", arg_machine);
 
                         *container = CONTAINER_REBOOTED;
                         r = 0;
@@ -2965,15 +2963,13 @@ static int wait_for_container(pid_t pid, ContainerStatus *container) {
                 /* CLD_KILLED fallthrough */
 
         case CLD_DUMPED:
-                log_error("Container %s terminated by signal %s.",
-                          arg_machine, signal_to_string(status.si_status));
-                r = -1;
+                log_error("Container %s terminated by signal %s.", arg_machine, signal_to_string(status.si_status));
+                r = -EIO;
                 break;
 
         default:
-                log_error("Container %s failed due to unknown reason.",
-                          arg_machine);
-                r = -1;
+                log_error("Container %s failed due to unknown reason.", arg_machine);
+                r = -EIO;
                 break;
         }