X-Git-Url: http://git.linux-vserver.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=util-vserver%2Fsrc%2Fsave_ctxinfo.c;h=7becf5b14a6b531e876189a0a86b1ada68315393;hb=0f36b4df430d2619cc3f10647e1762e7493f43fc;hp=7b322c3885a03a0973513812a45dd8d823d4a370;hpb=f66a0ab931904d39698dc7ac8af83571fd8bde05;p=util-vserver.git diff --git a/util-vserver/src/save_ctxinfo.c b/util-vserver/src/save_ctxinfo.c index 7b322c3..7becf5b 100644 --- a/util-vserver/src/save_ctxinfo.c +++ b/util-vserver/src/save_ctxinfo.c @@ -21,11 +21,12 @@ #ifdef HAVE_CONFIG_H # include #endif -#include "compat.h" #include "vserver.h" #include "internal.h" #include "util.h" +#include "wrappers.h" +#include "wrappers-vserver.h" #include #include @@ -33,6 +34,8 @@ #include #include +int wrapper_exit_code = 255; + inline static void checkParams(int argc, char UNUSED * argv[]) { @@ -44,50 +47,44 @@ checkParams(int argc, char UNUSED * argv[]) int main(int argc, char *argv[]) { - char runfile[(checkParams(argc,argv),strlen(argv[1])) + sizeof("/run")]; + char runfile[(checkParams(argc,argv),strlen(argv[1])) + sizeof("/run.rev/99999")]; char dstfile[PATH_MAX]; int fd; - char buf[32]; - ctx_t ctx; + char buf[sizeof(int)*3+2]; + xid_t ctx; ssize_t len; ssize_t len1 = strlen(argv[1]); strcpy(runfile, argv[1]); strcpy(runfile+len1, "/run"); - ctx=vc_X_getctx(0); - if (ctx==-1) { - perror("vc_X_getcctx()"); - return -1; - } + ctx=Evc_get_task_xid(0); - if (readlink(runfile, dstfile, sizeof(dstfile))==-1) { - perror("readlink()"); - return -1; + if (ctx==0) { + WRITE_MSG(2, "save_ctxinfo: Can not operate in context 0\n"); + return 255; } - fd = open(dstfile, O_EXCL|O_CREAT|O_WRONLY, 0644); - if (fd==-1) { - perror("open()"); - return -1; + if (reinterpret_cast(unsigned int)(ctx)>99999) { + WRITE_MSG(2, "save_ctxinfo: unexpected context\n"); + return 255; } - len = utilvserver_uint2str(buf, sizeof(buf), ctx, 10); + Ereadlink(runfile, dstfile, sizeof(dstfile)); + len = utilvserver_fmt_uint(buf, ctx); + fd = Eopen(dstfile, O_EXCL|O_CREAT|O_WRONLY, 0644); if (write(fd, buf, len) !=len || - write(fd, "\n", 1) !=1 || - write(fd, argv[1], len1)!=len1 || write(fd, "\n", 1) !=1) { perror("write()"); return -1; } + Eclose(fd); - if (close(fd)==-1) { - perror("close()"); - return -1; - } + strcat(runfile, ".rev/"); + strcat(runfile, buf); + unlink(runfile); + Esymlink(argv[1], runfile); - execv(argv[2], argv+2); - perror("execv()"); - return -1; + Eexecv(argv[2], argv+2); }