added warnings regarding procfs-security
[util-vserver.git] / util-vserver / src / vserver-stat.c
index 765bcf1..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);
   }
 }
@@ -452,6 +471,7 @@ int main(int argc, char **argv)
   struct dirent*       dir_entry;
   pid_t                        my_pid;
   struct Vector                xid_data;
+  char const *         errptr;
 
   if (argc==2) {
     if (strcmp(argv[1], "--help")   ==0) showHelp(1, argv[0], 0);
@@ -468,13 +488,16 @@ int main(int argc, char **argv)
     // do not include own stat
   my_pid = getpid();
 
-#if 1
-    // try to switch in context 1
-  if (vc_get_task_xid(0)!=1)
-    Evc_new_s_context(1, 0,0);
-#else
-#  warning Compiling in debug-code
-#endif
+  if (!switchToWatchXid(&errptr)) {
+    perror(errptr);
+    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));