--- ischroot.c.orig 2013-03-12 22:00:36.235819225 +1300 +++ ischroot.c 2013-03-12 22:33:08.744874725 +1300 @@ -76,9 +76,31 @@ return 2; /* Root can not read /proc/1/root, assume vserver or similar */ return 0; - } else if ((st1.st_dev == st2.st_dev) && (st1.st_ino == st2.st_ino)) + } else if ((st1.st_dev == st2.st_dev) && (st1.st_ino == st2.st_ino)) { + /* but look more closely for vserver, see if VxID != 0 */ + + FILE *status=fopen("/proc/self/status", "r"); + size_t linesiz=0; + char* linebuf=0; + char* vxidline=0; + ssize_t linelen=0; + unsigned int vxid = 0; + while (linelen=getline(&linebuf, &linesiz, status)>0) { + vxidline = strstr(linebuf, "VxID:"); + if (vxidline != NULL) { + sscanf(linebuf, "%*s %u", &vxid); + + if (vxid == 0) + /* Host system */ + return 1; + else + return 0; + } + } + free (linebuf); + fclose(status); return 1; - else + } else return 0; }