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 }