chiark / gitweb /
console: rework automatic getty on kernel console logic again
[elogind.git] / src / manager.c
index 4e8ddfb2357f473b02cb33db5d31ac22c9277c42..0afc99243e29a3bbf1774b20f2bdade6ba011fb0 100644 (file)
@@ -57,6 +57,7 @@
 #include "path-lookup.h"
 #include "special.h"
 #include "bus-errors.h"
+#include "exit-status.h"
 
 /* As soon as 16 units are in our GC queue, make sure to run a gc sweep */
 #define GC_QUEUE_ENTRIES_MAX 16
@@ -111,6 +112,8 @@ static int manager_setup_notify(Manager *m) {
         if (!(m->notify_socket = strdup(sa.un.sun_path+1)))
                 return -ENOMEM;
 
+        log_debug("Using notification socket %s", m->notify_socket);
+
         return 0;
 }
 
@@ -446,6 +449,7 @@ void manager_free(Manager *m) {
 #endif
 
         free(m->notify_socket);
+        free(m->console);
 
         lookup_paths_free(&m->lookup_paths);
         strv_free(m->environment);
@@ -1786,7 +1790,7 @@ static int manager_process_notify_fd(Manager *m) {
                         if (n >= 0)
                                 return -EIO;
 
-                        if (errno == EAGAIN)
+                        if (errno == EAGAIN || errno == EINTR)
                                 break;
 
                         return -errno;
@@ -1885,7 +1889,9 @@ static int manager_dispatch_sigchld(Manager *m) {
                           (long unsigned) si.si_pid,
                           sigchld_code_to_string(si.si_code),
                           si.si_status,
-                          strna(si.si_code == CLD_EXITED ? exit_status_to_string(si.si_status) : signal_to_string(si.si_status)));
+                          strna(si.si_code == CLD_EXITED
+                                ? exit_status_to_string(si.si_status, EXIT_STATUS_FULL)
+                                : signal_to_string(si.si_status)));
 
                 if (!u)
                         continue;
@@ -1928,7 +1934,7 @@ static int manager_process_signal_fd(Manager *m) {
                         if (n >= 0)
                                 return -EIO;
 
-                        if (errno == EAGAIN)
+                        if (errno == EINTR || errno == EAGAIN)
                                 break;
 
                         return -errno;
@@ -2550,6 +2556,22 @@ void manager_reset_maintenance(Manager *m) {
                 unit_reset_maintenance(u);
 }
 
+int manager_set_console(Manager *m, const char *console) {
+        char *c;
+
+        assert(m);
+
+        if (!(c = strdup(console)))
+                return -ENOMEM;
+
+        free(m->console);
+        m->console = c;
+
+        log_debug("Using kernel console %s", c);
+
+        return 0;
+}
+
 static const char* const manager_running_as_table[_MANAGER_RUNNING_AS_MAX] = {
         [MANAGER_SYSTEM] = "system",
         [MANAGER_SESSION] = "session"