added warnings regarding procfs-security
[util-vserver.git] / util-vserver / src / vserver-stat.c
index 60810e1..17425c1 100644 (file)
@@ -133,7 +133,7 @@ getUptime()
   char         buffer[64];
   char *       errptr;
   size_t       len;
-  time_t       secs;
+  uint64_t     secs;
   uint32_t     msecs=0;
 
     // open the /proc/uptime file
@@ -426,22 +426,41 @@ showContexts(struct Vector *vec)
     shortenTime(buf+44, uptime - ptr->start_time_oldest);
 
     switch (ptr->xid) {
-      case 0           :  strncpy(buf+55, "root server",       20); break;
-      case 1           :  strncpy(buf+55, "monitoring server", 20); break;
+      case 0           :  strcpy(buf+55, "root server"      ); break;
+      case 1           :  strcpy(buf+55, "monitoring server"); break;
       default          : {
        char *          name     = 0;
        char *          cfgpath  = 0;
        vcCfgStyle      cfgstyle = vcCFG_AUTO;
 
-       if ((cfgpath = vc_getVserverByCtx(ptr->xid, &cfgstyle, 0))!=0 &&
-           (name    = vc_getVserverName(cfgpath, cfgstyle))!=0)
-         strncpy(buf+55, name, 20);
+       if ((cfgpath = vc_getVserverByCtx(ptr->xid, &cfgstyle, 0))==0 ||
+           (name    = vc_getVserverName(cfgpath, cfgstyle))==0) {
+         name     = strdup("");
+         cfgstyle = vcCFG_NONE;
+       }
+       
+       switch (cfgstyle) {
+         case vcCFG_LEGACY     : {
+           size_t      len = MIN(strlen(name), 18);
+           buf[55]     = '[';
+           memcpy(buf+56,     name, len);
+           memcpy(buf+56+len, "]",  2);
+           break;
+         }
+         default               : {
+           size_t      len = MIN(strlen(name), 20);
+           memcpy(buf+55, name, len);
+           buf[55+len] = '\0';
+           break;
+         }
+       }
+       
        free(name);
        free(cfgpath);
       }
     }
 
-    write(1, buf, 80);
+    write(1, buf, strlen(buf));
     write(1, "\n", 1);
   }
 }
@@ -474,6 +493,12 @@ int main(int argc, char **argv)
     exit(1);
   }
 
+  if (access("/proc/uptime",R_OK)==-1 && errno==ENOENT)
+    WRITE_MSG(2,
+             "WARNING: can not access /proc/uptime. Usually, this is caused by\n"
+             "         procfs-security. Please read the FAQ for more details\n"
+             "         http://www.linux-vserver.org/index.php?page=Linux-Vserver+FAQ\n");
+
   Vector_init(&xid_data, sizeof(struct XidData));
 
   Echdir(PROC_DIR_NAME);