X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fexecute.c;h=755b4700fc0c02fbbe1bcb1b03459ff45998e6db;hp=f35e916e4cbedca7892531917715b090ef1c82b6;hb=b9aea9547a5398685c28288b7dabfede55e0a39b;hpb=d06dacd0020af7e31ff6089deff339b00ed979e3 diff --git a/src/execute.c b/src/execute.c index f35e916e4..755b4700f 100644 --- a/src/execute.c +++ b/src/execute.c @@ -36,6 +36,7 @@ #include #include #include +#include #ifdef HAVE_PAM #include @@ -52,6 +53,7 @@ #include "namespace.h" #include "tcpwrap.h" #include "exit-status.h" +#include "missing.h" /* This assumes there is a 'tty' group */ #define TTY_MODE 0620 @@ -1038,6 +1040,11 @@ int exec_spawn(ExecCommand *command, goto fail; } + /* If a socket is connected to STDIN/STDOUT/STDERR, we + * must sure to drop O_NONBLOCK */ + if (socket_fd >= 0) + fd_nonblock(socket_fd, false); + if (!keep_stdin) if (setup_input(context, socket_fd, apply_tty_stdin) < 0) { r = EXIT_STDIN; @@ -1061,15 +1068,27 @@ int exec_spawn(ExecCommand *command, goto fail; } - if (context->oom_adjust_set) { + if (context->oom_score_adjust_set) { char t[16]; - snprintf(t, sizeof(t), "%i", context->oom_adjust); + snprintf(t, sizeof(t), "%i", context->oom_score_adjust); char_array_0(t); - if (write_one_line_file("/proc/self/oom_adj", t) < 0) { - r = EXIT_OOM_ADJUST; - goto fail; + if (write_one_line_file("/proc/self/oom_score_adj", t) < 0) { + /* Compatibility with Linux <= 2.6.35 */ + + int adj; + + adj = (context->oom_score_adjust * -OOM_DISABLE) / OOM_SCORE_ADJ_MAX; + adj = CLAMP(adj, OOM_DISABLE, OOM_ADJUST_MAX); + + snprintf(t, sizeof(t), "%i", adj); + char_array_0(t); + + if (write_one_line_file("/proc/self/oom_adj", t) < 0) { + r = EXIT_OOM_ADJUST; + goto fail; + } } } @@ -1456,10 +1475,10 @@ void exec_context_dump(ExecContext *c, FILE* f, const char *prefix) { "%sNice: %i\n", prefix, c->nice); - if (c->oom_adjust_set) + if (c->oom_score_adjust_set) fprintf(f, - "%sOOMAdjust: %i\n", - prefix, c->oom_adjust); + "%sOOMScoreAdjust: %i\n", + prefix, c->oom_score_adjust); for (i = 0; i < RLIM_NLIMITS; i++) if (c->rlimit[i])