X-Git-Url: http://git.linux-vserver.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=util-vserver%2Flib_internal%2Futil-exitlikeprocess.c;h=4a94eb109f6d2766c8b14deccc04aac7f3aa80de;hb=8f6d0b27ae3d010574986b1b86b15f35e2fa800c;hp=9aa80c4d0fe102c6e4e4cae8ae0156b9438ca9c2;hpb=1511b7b7154dcd6b08eef59d55a6642fa0aaaef7;p=util-vserver.git diff --git a/util-vserver/lib_internal/util-exitlikeprocess.c b/util-vserver/lib_internal/util-exitlikeprocess.c index 9aa80c4..4a94eb1 100644 --- a/util-vserver/lib_internal/util-exitlikeprocess.c +++ b/util-vserver/lib_internal/util-exitlikeprocess.c @@ -20,25 +20,71 @@ # include #endif +#include "util.h" +#include + #include #include #include #include #include #include +#include +#include void -exitLikeProcess(int pid) +exitLikeProcess(int pid, char const *cmd, int ret) { - int status; + int status; - if (wait4(pid, &status, 0,0)==-1) return; + if (wait4(pid, &status, 0,0)==-1) { + + perror("wait()"); + exit(ret); + } if (WIFEXITED(status)) exit(WEXITSTATUS(status)); if (WIFSIGNALED(status)) { + struct rlimit lim = { 0,0 }; + + if (cmd) { + char buf[sizeof(int)*3 + 2]; + size_t l = utilvserver_fmt_uint(buf, pid); + + WRITE_MSG(2, "command '"); + WRITE_STR(2, cmd); + WRITE_MSG(2, "' (pid "); + write (2, buf, l); + WRITE_MSG(2, ") exited with signal "); + l = utilvserver_fmt_uint(buf, WTERMSIG(status)); + write (2, buf, l); + WRITE_MSG(2, "; following it...\n"); + } + + // prevent coredumps which might override the real ones + setrlimit(RLIMIT_CORE, &lim); + kill(getpid(), WTERMSIG(status)); exit(1); } + else { + char buf[sizeof(int)*3 + 2]; + size_t l = utilvserver_fmt_uint(buf, WTERMSIG(status)); + + WRITE_MSG(2, "Unexpected status "); + write (2, buf, l); + WRITE_MSG(2, " from '"); + if (cmd) { + WRITE_STR(2, cmd); + WRITE_MSG(2, " (pid "); + } + l = utilvserver_fmt_uint(buf, pid); + write (2, buf, l); + if (cmd) WRITE_MSG(2, ")\n"); + else WRITE_MSG(2, "\n"); + + exit(ret); + } }