vshost-util-vserver

Build script and sources for util-vserver.
git clone https://ccx.te2000.cz/git/vshost-util-vserver
Log | Files | Refs

exitlikeprocess.c (1775B)


      1 // $Id$    --*- c -*--
      2 
      3 // Copyright (C) 2004 Enrico Scholz <enrico.scholz@informatik.tu-chemnitz.de>
      4 //  
      5 // This program is free software; you can redistribute it and/or modify
      6 // it under the terms of the GNU General Public License as published by
      7 // the Free Software Foundation; version 2 of the License.
      8 //  
      9 // This program is distributed in the hope that it will be useful,
     10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
     11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     12 // GNU General Public License for more details.
     13 //  
     14 // You should have received a copy of the GNU General Public License
     15 // along with this program; if not, write to the Free Software
     16 // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
     17 
     18 
     19 #ifdef HAVE_CONFIG_H
     20 #  include <config.h>
     21 #endif
     22 
     23 #include <stdlib.h>
     24 #include <sys/types.h>
     25 #include <sys/resource.h>
     26 #include <sys/wait.h>
     27 #include <unistd.h>
     28 #include <signal.h>
     29 #include <sys/resource.h>
     30 #include <stdio.h>
     31 #include <errno.h>
     32 
     33 #include "vserver.h"
     34 
     35 static int pid;
     36 static void
     37 signalHandler(int signum)
     38 {
     39   xid_t xid = vc_get_task_xid(pid);
     40   if (xid)
     41     vc_ctx_kill(xid, pid, signum);
     42   else
     43     kill(pid, signum);
     44 }
     45 
     46 void
     47 vc_exitLikeProcess(int p, int ret)
     48 {
     49   int status, i;
     50 
     51   pid = p;
     52 
     53   for (i = 0; i < 32; i++)
     54     signal(i, signalHandler);
     55 
     56 retry:
     57   if (wait4(pid, &status, 0,0)==-1) {
     58     if (errno==EINTR)
     59       goto retry;
     60     perror("wait()");
     61     exit(ret);
     62   }
     63 
     64   if (WIFEXITED(status))
     65     exit(WEXITSTATUS(status));
     66 
     67   if (WIFSIGNALED(status)) {
     68     struct rlimit	lim = { 0,0 };
     69 
     70     // prevent coredumps which might override the real ones
     71     setrlimit(RLIMIT_CORE, &lim);
     72       
     73     kill(getpid(), WTERMSIG(status));
     74     exit(1);
     75   }
     76   else
     77     exit(ret);
     78 }