X-Git-Url: http://git.linux-vserver.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=util-vserver%2Fsrc%2Fvserver-info.c;h=d695fee402b477593e10b8a2d0319984fe8f6640;hb=faa778968d1a7dfeaebc9fe4b847e691dc62fd15;hp=de79e6f626a0bc7458411c632b6bac6c35b9bc64;hpb=adf0073d3ca2a50a8bfdf8331091294bbf1be40c;p=util-vserver.git diff --git a/util-vserver/src/vserver-info.c b/util-vserver/src/vserver-info.c index de79e6f..d695fee 100644 --- a/util-vserver/src/vserver-info.c +++ b/util-vserver/src/vserver-info.c @@ -52,7 +52,7 @@ typedef enum { tgNONE,tgCONTEXT, tgID, tgRUNNING, tgINITPID, tgINITPID_PID, tgXID, tgUTS, tgSYSINFO, tgFEATURE, tgCANONIFY, - tgVERIFYCAP, tgXIDTYPE, + tgVERIFYCAP, tgXIDTYPE, tgVERIFYPROC, } VserverTag; static struct { @@ -80,6 +80,7 @@ static struct { { "PXID", tgPXID, "returns the xid of the parent context" }, { "CANONIFY", tgCANONIFY, "canonifies the vserver-name and removes dangerous characters" }, { "VERIFYCAP", tgVERIFYCAP, "test if the kernel supports linux capabilities" }, + { "VERIFYPROC", tgVERIFYPROC, "test if /proc can be read by contexts!=0" }, { "XIDTYPE", tgXIDTYPE, "returns the type of the given XID" }, }; @@ -159,6 +160,26 @@ utsText2Tag(char const *str) } static bool +verifyProc() +{ + char const *errptr; + + if (!switchToWatchXid(&errptr)) { + perror(errptr); + return false; + } + + if (access("/proc/uptime", R_OK)==-1) { + if (errno!=ENOENT) + perror("access(\"/proc/uptime\")"); + + return false; + } + + return true; +} + +static bool verifyCap() { struct __user_cap_header_struct header; @@ -299,6 +320,13 @@ getInitPid_emulated(char *buf, xid_t xid) return 0; } +#else // VC_ENABLE_API_COMPAT +static char * +getInitPid_emulated(char UNUSED *buf, xid_t UNUSED xid) +{ + WRITE_MSG(2, "tools were built without compat API, getInitPid() not available\n"); + return 0; +} #endif // VC_ENABLE_API_COMPAT static char * @@ -467,9 +495,17 @@ execQuery(char const *vserver, VserverTag tag, int argc, char *argv[]) res = vc_getVserverAppDir(vserver, vcCFG_AUTO, argc==0 ? "" : argv[0]); break; - case tgRUNNING : - res = (vc_getVserverCtx(vserver, vcCFG_AUTO, false, 0)==VC_NOCTX) ? 0 : "1"; + case tgRUNNING : { + signed long xid; // type is a small hack, but should be ok... + struct vc_vx_info info; + + if (isNumber(vserver, &xid, true) && xid>=0) + res = (vc_get_vx_info(xid, &info)==-1) ? 0 : "1"; + else + res = (vc_getVserverCtx(vserver, vcCFG_AUTO, false, 0)==VC_NOCTX) ? 0 : "1"; + break; + } case tgCANONIFY : strcpy(buf, vserver); @@ -485,6 +521,7 @@ execQuery(char const *vserver, VserverTag tag, int argc, char *argv[]) case tgSYSINFO : return printSysInfo(buf); break; case tgFEATURE : return testFeature(argc,argv); break; case tgVERIFYCAP : return verifyCap() ? 0 : 1; break; + case tgVERIFYPROC : return verifyProc() ? 0 : 1; break; default : {