Fix determining OpenVZ VEID on Linux kernels >= 2.6.18. diff -Naur htop-0.8.1.orig/ProcessList.c htop-0.8.1/ProcessList.c --- htop-0.8.1.orig/ProcessList.c 2008-09-23 08:23:14.000000000 +0200 +++ htop-0.8.1/ProcessList.c 2009-02-24 00:09:37.000000000 +0100 @@ -625,20 +625,28 @@ process->vpid = process->pid; process->veid = 0; } else { - snprintf(statusfilename, MAX_NAME, "%s/%s/stat", dirname, name); + snprintf(statusfilename, MAX_NAME, "%s/%s/status", dirname, name); status = ProcessList_fopen(this, statusfilename, "r"); if (status == NULL) goto errorReadingProcess; - num = ProcessList_fread(this, status, - "%*u %*s %*c %*u %*u %*u %*u %*u %*u %*u " - "%*u %*u %*u %*u %*u %*u %*u %*u " - "%*u %*u %*u %*u %*u %*u %*u %*u " - "%*u %*u %*u %*u %*u %*u %*u %*u " - "%*u %*u %*u %*u %*u %*u %*u %*u " - "%*u %*u %*u %*u %*u %*u %*u " - "%u %u", - &process->vpid, &process->veid); - fclose(status); + else { + char buffer[256]; + process->veid = 0; + while (!feof(status)) { + char* ok = fgets(buffer, 255, status); + if (!ok) + break; + + if (String_startsWith(buffer, "envID:")) { + int veid; + int ok = ProcessList_read(this, buffer, "envID:\t%d", &veid); + if (ok >= 1) { + process->veid = veid; + } + } + } + fclose(status); + } } #endif