added command-setparams.c and sys_clone.h
[util-vserver.git] / util-vserver / lib_internal / util-exitlikeprocess.c
index 9aa80c4..4a94eb1 100644 (file)
 #  include <config.h>
 #endif
 
+#include "util.h"
+#include <lib/internal.h>
+
 #include <stdlib.h>
 #include <sys/types.h>
 #include <sys/resource.h>
 #include <sys/wait.h>
 #include <unistd.h>
 #include <signal.h>
+#include <sys/resource.h>
+#include <stdio.h>
 
 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);
+  }
 }