added yum-2.6.0-chroot.patch
[util-vserver.git] / util-vserver / src / vserver-info.c
index de79e6f..d695fee 100644 (file)
@@ -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            : {