vshost-util-vserver

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

save_ctxinfo.c (2589B)


      1 // $Id$    --*- c++ -*--
      2 
      3 // Copyright (C) 2003 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 // Saves current ctx + vserver-info into 'argv[1] + /run' which must be a dead
     19 // symlink
     20 
     21 #ifdef HAVE_CONFIG_H
     22 #  include <config.h>
     23 #endif
     24 
     25 #include "pathconfig.h"
     26 #include "vserver.h"
     27 #include "internal.h"
     28 #include "util.h"
     29 
     30 #include <sys/types.h>
     31 #include <sys/stat.h>
     32 #include <fcntl.h>
     33 #include <stdio.h>
     34 #include <limits.h>
     35 #include <errno.h>
     36 
     37 #define ENSC_WRAPPERS_PREFIX	"save_ctxinfo: "
     38 #define ENSC_WRAPPERS_VSERVER	1
     39 #define ENSC_WRAPPERS_UNISTD	1
     40 #define ENSC_WRAPPERS_FCNTL	1
     41 #include <wrappers.h>
     42 
     43 int	wrapper_exit_code = 255;
     44 
     45 inline static void
     46 checkParams(int argc, char UNUSED * argv[])
     47 {
     48   if (argc<3) {
     49     WRITE_MSG(2, "Usage:  save_ctxinfo <VSERVER_DIR> <cmd> <args>*\n");
     50     exit(255);
     51   }
     52 }
     53 
     54 int main(int argc, char *argv[])
     55 {
     56   char		runfile[(checkParams(argc,argv),strlen(argv[1])) + sizeof(DEFAULT_PKGSTATEREVDIR "/99999")];
     57   char		dstfile[PATH_MAX];
     58   int		fd;
     59   char		buf[sizeof(int)*3+2];
     60   xid_t		ctx;
     61   ssize_t	len;
     62   ssize_t	len1 = strlen(argv[1]);
     63 
     64   strcpy(runfile,      argv[1]);
     65   strcpy(runfile+len1, "/run");
     66 
     67   ctx=Evc_get_task_xid(0);
     68 
     69   if (ctx==0) {
     70     WRITE_MSG(2, "save_ctxinfo: Can not operate in context 0\n");
     71     return 255;
     72   }
     73 
     74   if (reinterpret_cast(unsigned int)(ctx)>99999) {
     75     WRITE_MSG(2, "save_ctxinfo: unexpected context\n");
     76     return 255;
     77   }
     78 
     79   len          = EreadlinkD(runfile, dstfile, sizeof(dstfile)-1);
     80   dstfile[len] = '\0';
     81   len          = utilvserver_fmt_uint(buf, ctx);
     82 
     83   fd = EopenD(dstfile, O_EXCL|O_CREAT|O_WRONLY, 0644);
     84   if (write(fd, buf,     len) !=len  ||
     85       write(fd, "\n",    1)   !=1) {
     86     perror("save_ctxinfo: write()");
     87     return -1;
     88   }
     89   Eclose(fd);
     90 
     91   strcpy(runfile, DEFAULT_PKGSTATEREVDIR "/");
     92   strncat(runfile, buf, len);
     93   unlink(runfile);
     94   EsymlinkD(argv[1], runfile);
     95 
     96   Eexecv(argv[2], argv+2);
     97 }