chiark / gitweb /
execute: robustness against journald failures
[elogind.git] / src / core / execute.c
index 7dc15044b4982866719a40801f0cee18378b903e..b878c331d58b6c642726b2e0effbc89098baefde 100644 (file)
@@ -64,6 +64,8 @@
 #include "loopback-setup.h"
 #include "path-util.h"
 #include "syscall-list.h"
+#include "env-util.h"
+#include "fileio.h"
 
 #define IDLE_TIMEOUT_USEC (5*USEC_PER_SEC)
 
@@ -321,6 +323,7 @@ static int setup_input(const ExecContext *context, int socket_fd, bool apply_tty
 static int setup_output(const ExecContext *context, int socket_fd, const char *ident, const char *unit_id, bool apply_tty_stdin) {
         ExecOutput o;
         ExecInput i;
+        int r;
 
         assert(context);
         assert(ident);
@@ -365,7 +368,12 @@ static int setup_output(const ExecContext *context, int socket_fd, const char *i
         case EXEC_OUTPUT_KMSG_AND_CONSOLE:
         case EXEC_OUTPUT_JOURNAL:
         case EXEC_OUTPUT_JOURNAL_AND_CONSOLE:
-                return connect_logger_as(context, o, ident, unit_id, STDOUT_FILENO);
+                r = connect_logger_as(context, o, ident, unit_id, STDOUT_FILENO);
+                if (r < 0) {
+                        log_error("Failed to connect stdout of %s to the journal socket: %s", unit_id, strerror(-r));
+                        r = open_null_as(O_WRONLY, STDOUT_FILENO);
+                }
+                return r;
 
         case EXEC_OUTPUT_SOCKET:
                 assert(socket_fd >= 0);
@@ -379,6 +387,7 @@ static int setup_output(const ExecContext *context, int socket_fd, const char *i
 static int setup_error(const ExecContext *context, int socket_fd, const char *ident, const char *unit_id, bool apply_tty_stdin) {
         ExecOutput o, e;
         ExecInput i;
+        int r;
 
         assert(context);
         assert(ident);
@@ -420,7 +429,12 @@ static int setup_error(const ExecContext *context, int socket_fd, const char *id
         case EXEC_OUTPUT_KMSG_AND_CONSOLE:
         case EXEC_OUTPUT_JOURNAL:
         case EXEC_OUTPUT_JOURNAL_AND_CONSOLE:
-                return connect_logger_as(context, e, ident, unit_id, STDERR_FILENO);
+                r = connect_logger_as(context, e, ident, unit_id, STDERR_FILENO);
+                if (r < 0) {
+                        log_error("Failed to connect stderr of %s to the journal socket: %s", unit_id, strerror(-r));
+                        r = open_null_as(O_WRONLY, STDERR_FILENO);
+                }
+                return r;
 
         case EXEC_OUTPUT_SOCKET:
                 assert(socket_fd >= 0);
@@ -957,7 +971,7 @@ static int apply_seccomp(uint32_t *syscall_filter) {
         for (i = 0, n = 0; i < syscall_max(); i++)
                 if (syscall_filter[i >> 4] & (1 << (i & 31))) {
                         struct sock_filter item[] = {
-                                BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, i, 0, 1),
+                                BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, INDEX_TO_SYSCALL(i), 0, 1),
                                 BPF_STMT(BPF_RET+BPF_K, SECCOMP_RET_ALLOW)
                         };
 
@@ -1024,8 +1038,8 @@ int exec_spawn(ExecCommand *command,
 
         r = exec_context_load_environment(context, &files_env);
         if (r < 0) {
-                log_struct(LOG_ERR,
-                           "UNIT=%s", unit_id,
+                log_struct_unit(LOG_ERR,
+                           unit_id,
                            "MESSAGE=Failed to load environment files: %s", strerror(-r),
                            "ERRNO=%d", -r,
                            NULL);
@@ -1039,8 +1053,8 @@ int exec_spawn(ExecCommand *command,
         if (!line)
                 return log_oom();
 
-        log_struct(LOG_DEBUG,
-                   "UNIT=%s", unit_id,
+        log_struct_unit(LOG_DEBUG,
+                   unit_id,
                    "MESSAGE=About to execute %s", line,
                    NULL);
         free(line);
@@ -1512,8 +1526,8 @@ int exec_spawn(ExecCommand *command,
                 _exit(r);
         }
 
-        log_struct(LOG_DEBUG,
-                   "UNIT=%s", unit_id,
+        log_struct_unit(LOG_DEBUG,
+                   unit_id,
                    "MESSAGE=Forked %s as %lu",
                           command->path, (unsigned long) pid,
                    NULL);
@@ -1827,7 +1841,7 @@ void exec_context_dump(ExecContext *c, FILE* f, const char *prefix) {
                         prefix, c->cpu_sched_priority,
                         prefix, yes_no(c->cpu_sched_reset_on_fork));
                 free(policy_str);
-       }
+        }
 
         if (c->cpuset) {
                 fprintf(f, "%sCPUAffinity:", prefix);