Openvz patch for atop 1.25

I needed to be able to see what containers were doing what on openvz, so I wrote a patch for it. This will allow you to see what veid a process belongs to. It will also let you group processes by veid and sort them based on whatever atop will let you sort by (cpu, disk, memory etc.). If you think it might be helpful to you, here it is:
diff --git a/Makefile b/Makefile
index d5b0b49..7fb6978 100644
--- a/Makefile
+++ b/Makefile
@@ -15,7 +15,7 @@ ROTPATH  = /etc/logrotate.d
 PMPATH1  = /usr/lib/pm-utils/sleep.d
 PMPATH2  = /usr/lib64/pm-utils/sleep.d
 
-CFLAGS  += -O2 -I. -Wall	 # -DHTTPSTATS
+CFLAGS  += -O2 -I. -Wall # -DOPENVZ	 # -DHTTPSTATS
 LDFLAGS += -lncurses -lm -lz
 OBJMOD0  = version.o
 OBJMOD1  = various.o  deviate.o   procdbase.o
diff --git a/atop b/atop
deleted file mode 100755
index 42b4214..0000000
Binary files a/atop and /dev/null differ
diff --git a/atop.h b/atop.h
index 2ce4cc3..12c9875 100644
--- a/atop.h
+++ b/atop.h
@@ -126,6 +126,9 @@ int		compmem(const void *, const void *);
 int		compnet(const void *, const void *);
 int		compusr(const void *, const void *);
 int		compnam(const void *, const void *);
+#if OPENVZ
+int		compveid(const void *, const void *);
+#endif
 
 int		cpucompar (const void *, const void *);
 int		diskcompar(const void *, const void *);
diff --git a/photoproc.c b/photoproc.c
index 47a3dac..face12a 100644
--- a/photoproc.c
+++ b/photoproc.c
@@ -304,6 +304,9 @@ fillproc(struct pstat *curproc)
 	int		pid, ppid, prio, policy, rtprio, nice,
 			ruid, euid, suid, fsuid, rgid, egid, sgid, fsgid,
 			curcpu, nthreads, sleepavg;
+#if OPENVZ
+	int		veid;
+#endif
 	count_t		utime, stime, starttime;
 	count_t		minflt, majflt, size, rss, nswap,
 			startcode, endcode,
@@ -394,6 +397,13 @@ fillproc(struct pstat *curproc)
 			sscanf(line, "Threads: %d", &nthreads);
 			break;
 		}
+#if OPENVZ
+		if (memcmp(line, "envID:", 6)==0)
+		{
+			sscanf(line, "envID: %d", &veid);
+			break;
+		}
+#endif
 	}
 
 	fclose(fp);
@@ -440,6 +450,9 @@ fillproc(struct pstat *curproc)
 	** store required info in process-structure
 	*/
 	curproc->gen.pid      = pid;
+#if OPENVZ
+	curproc->gen.veid     = veid;
+#endif
 	curproc->gen.ppid     = ppid;
 	curproc->gen.ruid     = ruid;
 	curproc->gen.euid     = euid;
diff --git a/photoproc.h b/photoproc.h
index 98d4eb7..c1e2a81 100644
--- a/photoproc.h
+++ b/photoproc.h
@@ -34,6 +34,9 @@ struct pstat {
 	/* GENERAL PROCESS INFO 					*/
 	struct gen {
 		int	pid;		/* process identification 	*/
+#if OPENVZ
+		int veid;		/*process openvz container	*/
+#endif
 		int	ppid;           /* parent process identification*/
 		int	ruid;		/* real  user  identification 	*/
 		int	euid;		/* eff.  user  identification 	*/
diff --git a/showgeneric.c b/showgeneric.c
index d30b436..683035c 100644
--- a/showgeneric.c
+++ b/showgeneric.c
@@ -293,6 +293,9 @@ static int	maxintlines = 999;  /* maximum interface lines          */
 
 static int	cumusers(struct pstat *, struct pstat *, int);
 static int	cumprocs(struct pstat *, struct pstat *, int);
+#if OPENVZ
+static int	cumveid(struct pstat *, struct pstat *, int);
+#endif
 static long	getnumval(char *, long, int);
 
 
@@ -431,6 +434,12 @@ generic_samp(time_t curtime, int nsecs,
 				showtype  = MCUMPROC;
 				break;
 
+#if OPENVZ
+			   case MCUMVEID:
+				showtype  = MCUMVEID;
+				break;
+#endif
+
 			   case MSYSFIXED:
 				if (fixedhead)
 					fixedhead=0;
@@ -694,7 +703,7 @@ generic_samp(time_t curtime, int nsecs,
 		** list of processes and accumulate resource consumption
 		** of all processes in the current list
 		*/
-		if (showtype == MCUMUSER || showtype == MCUMPROC)
+		if (showtype == MCUMUSER || showtype == MCUMPROC || showtype == MCUMVEID)
 		{
 			/*
 			** remember info based on individual processes
@@ -722,6 +731,11 @@ generic_samp(time_t curtime, int nsecs,
 			   case MCUMPROC:
 				nact = cumprocs(save_pstat, pstat, save_nact);
 				break;
+#if OPENVZ
+			   case MCUMVEID:
+				nact = cumveid(save_pstat, pstat, save_nact);
+				break;
+#endif
 			}
 
 			lastorder = 0;	/* force new sort */
@@ -786,7 +800,7 @@ generic_samp(time_t curtime, int nsecs,
 		** if cumulative figures per user shown,
 		** release temporary space and restore per-process values
 		*/
-		if (showtype == MCUMUSER || showtype == MCUMPROC)
+		if (showtype == MCUMUSER || showtype == MCUMPROC || showtype == MCUMVEID)
 		{
 			free(pstat);
 
@@ -1108,6 +1122,18 @@ generic_samp(time_t curtime, int nsecs,
 				showtype  = MCUMPROC;
 				firstproc = 0;
 				break;
+#if OPENVZ
+			  /*
+			   ** accumulated resource consumption per veid
+			   */
+			   case MCUMVEID:
+				statmsg = "Consumption per veid; use 'a' to "
+					"toggle between all/active processes";
+
+				showtype  = MCUMVEID;
+				firstproc = 0;
+				break;
+#endif
 
 			   /*
 			   ** help wanted?
@@ -1684,6 +1710,71 @@ cumprocs(struct pstat *curprocs, struct pstat *curprogs, int numprocs)
 	return numprogs;
 }
 
+#if OPENVZ
+/*
+** accumulate all processes with the same veid (i.e. same virutal machine)
+** into a new list
+*/
+static int
+cumveid(struct pstat *curprocs, struct pstat *curprogs, int numprocs)
+{
+	register int	i, numprogs;
+
+	/*
+	** sort list of active processes in order of process-name
+	*/
+	qsort(curprocs, numprocs, sizeof(struct pstat), compveid);
+
+	/*
+	** accumulate all processes with same name in the new list
+	*/
+	for (numprogs=i=0; i < numprocs; i++, curprocs++)
+	{
+		if ( curprogs->gen.veid != curprocs->gen.veid )
+		{
+			if (curprogs->gen.veid)
+			{
+				numprogs++;
+				curprogs++;
+			}
+			curprogs->gen.veid = curprocs->gen.veid;
+		}
+
+		curprogs->gen.pid++;		/* misuse as counter */
+
+		curprogs->gen.nthr   += curprocs->gen.nthr;
+		curprogs->cpu.utime  += curprocs->cpu.utime;
+		curprogs->cpu.stime  += curprocs->cpu.stime;
+
+		curprogs->dsk.rio    += curprocs->dsk.rio;
+		curprogs->dsk.wio    += curprocs->dsk.wio;
+			
+		curprogs->dsk.rsz    += curprocs->dsk.rsz;
+		curprogs->dsk.wsz    += curprocs->dsk.wsz;
+			
+		curprogs->net.tcpsnd += curprocs->net.tcpsnd;
+		curprogs->net.tcprcv += curprocs->net.tcprcv;
+		curprogs->net.udpsnd += curprocs->net.udpsnd;
+		curprogs->net.udprcv += curprocs->net.udprcv;
+		curprogs->net.rawsnd += curprocs->net.rawsnd;
+		curprogs->net.rawrcv += curprocs->net.rawrcv;
+
+		if (curprocs->gen.state != 'E')
+		{
+			curprogs->mem.rmem   += curprocs->mem.rmem;
+			curprogs->mem.vmem   += curprocs->mem.vmem;
+			curprogs->mem.rgrow  += curprocs->mem.rgrow;
+			curprogs->mem.vgrow  += curprocs->mem.vgrow;
+		}
+	}
+
+	if (curprogs->gen.veid)
+		numprogs++;
+
+	return numprogs;
+}
+#endif
+
 /*
 ** get a numerical value from the user and verify 
 */
@@ -1776,6 +1867,10 @@ static struct helptext {
 	{"\t'%c' - total resource consumption per user\n", 	MCUMUSER},
 	{"\t'%c' - total resource consumption per program (i.e. same "
 	 "process name)\n",					MCUMPROC},
+#if OPENVZ
+	{"\t'%c' - total resource consumption per veid (i.e. same "
+	 "openvz container)\n",					MCUMVEID},
+#endif
 	{"\n",							' '},
 	{"Selections:\n",					' '},
 	{"\t'%c' - focus on specific user name    (regular expression)\n",
@@ -1926,8 +2021,14 @@ generic_usage(void)
 	printf("\t  -%c  show cumulated process-info per user\n",
 			MCUMUSER);
 	printf("\t  -%c  show cumulated process-info per program "
-	                "(i.e. same name)\n\n",
+	                "(i.e. same name)\n",
 			MCUMPROC);
+#if OPENVZ
+	printf("\t  -%c  show cumulated process-info per veid "
+	                "(i.e. same openvz container)\n",
+			MCUMVEID);
+#endif
+    printf("\n");
 	printf("\t  -%c  sort processes in order of cpu-consumption "
 	                "(default)\n",
 			MSORTCPU);
@@ -2134,6 +2235,12 @@ do_flags(char *name, char *val)
 			showtype  = MCUMPROC;
 			break;
 
+#if OPENVZ
+		   case MCUMVEID:
+			showtype  = MCUMVEID;
+			break;
+#endif
+
 		   case MALLPROC:
 			deviatonly  = 0;
 			break;
diff --git a/showgeneric.h b/showgeneric.h
index 06a4254..2350e90 100644
--- a/showgeneric.h
+++ b/showgeneric.h
@@ -62,6 +62,7 @@ struct selection {
 
 #define	MCUMUSER	'u'
 #define	MCUMPROC	'p'
+#define	MCUMVEID	'O'
 
 #define	MSORTCPU	'C'
 #define	MSORTDSK	'D'
diff --git a/showlinux.c b/showlinux.c
index c9fdbf7..07d717d 100644
--- a/showlinux.c
+++ b/showlinux.c
@@ -429,6 +429,9 @@ sys_printdef *netintfsyspdefs[] = {
 proc_printdef *allprocpdefs[]= 
 {
 	&procprt_PID,
+#if OPENVZ
+	&procprt_VEID,
+#endif
 	&procprt_PPID,
 	&procprt_SYSCPU,
 	&procprt_USRCPU,
@@ -506,6 +509,7 @@ proc_printpair cmdprocs[MAXITEMS];
 proc_printpair ownprocs[MAXITEMS];
 proc_printpair totusers[MAXITEMS];
 proc_printpair totprocs[MAXITEMS];
+proc_printpair totveid[MAXITEMS];
 
 
 /*****************************************************************/
@@ -1070,7 +1074,11 @@ priphead(int curlist, int totlist, char showtype, char showorder, char autosort)
                 {
                         // No patches, iostat data is available
                         make_proc_prints(genprocs, MAXITEMS, 
+#if OPENVZ
+                                "PID:10 VEID:10 RUID:3 EUID:2 THR:4 "
+#else
                                 "PID:10 RUID:3 EUID:2 THR:4 "
+#endif
                                 "SYSCPU:9 USRCPU:9 "
                                 "VGROW:8 RGROW:8 "
                                 "RDDSK:7 WRDSK:7 "
@@ -1158,10 +1166,14 @@ priphead(int curlist, int totlist, char showtype, char showorder, char autosort)
                         "built-in netprocs");
 
                 make_proc_prints(varprocs, MAXITEMS,
+#if OPENVZ
+                        "PID:10 PPID:9 VEID:10 RUID:8 RGID:8 EUID:5 EGID:4 "
+#else
                         "PID:10 PPID:9 RUID:8 RGID:8 EUID:5 EGID:4 "
-     			"SUID:3 SGID:2 FSUID:3 FSGID:2 "
+#endif
+                        "SUID:3 SGID:2 FSUID:3 FSGID:2 "
                         "STDATE:7 STTIME:7 ENDATE:5 ENTIME:5 "
-			"ST:6 EXC:6 S:6 SORTITEM:10 CMD:10", 
+                        "ST:6 EXC:6 S:6 SORTITEM:10 CMD:10", 
                         "built-in varprocs");
 
                 make_proc_prints(cmdprocs, MAXITEMS,
@@ -1179,6 +1191,14 @@ priphead(int curlist, int totlist, char showtype, char showorder, char autosort)
                         "RSIZE:8 RDDSK:7 WRDSK:7 RNET:6 SNET:6" 
                         "SORTITEM:10 CMD:10", 
                         "built-in totprocs");
+
+#if OPENVZ
+                make_proc_prints(totveid, MAXITEMS, 
+                        "NPROCS:10 SYSCPU:9 USRCPU:9 VSIZE:8 "
+                        "RSIZE:8 RDDSK:7 WRDSK:7 RNET:6 SNET:6 "
+                        "SORTITEM:10 VEID:10",
+                        "built-in totveid");
+#endif
         }
 
         /*
@@ -1234,6 +1254,12 @@ priphead(int curlist, int totlist, char showtype, char showorder, char autosort)
            case MCUMPROC:
                 showhdrline(totprocs, curlist, totlist, showorder, autosort);
                 break;
+
+#if OPENVZ
+           case MCUMVEID:
+                showhdrline(totveid, curlist, totlist, showorder, autosort);
+                break;
+#endif
         }
 }
 
@@ -1403,6 +1429,12 @@ priproc(struct pstat *pstat, int firstproc, int lastproc, int curline,
                    case MCUMPROC:
                         showprocline(totprocs, curstat, perc, nsecs, avgval);
                         break;
+
+#if OPENVZ
+                   case MCUMVEID:
+                        showprocline(totveid, curstat, perc, nsecs, avgval);
+                        break;
+#endif
                 }
 
                 curline++;
@@ -1997,6 +2029,18 @@ compnam(const void *a, const void *b)
 
         return strcmp(nama, namb);
 }
+#if OPENVZ
+int
+compveid(const void *a, const void *b)
+{
+        register int veida = ((struct pstat *)a)->gen.veid;
+        register int veidb = ((struct pstat *)b)->gen.veid;
+
+        if (veida > veidb) return  1;
+        if (veida < veidb) return -1;
+                           return  0;
+}
+#endif
 
 /*
 ** handle modifications from the /etc/atoprc and ~/.atoprc file
diff --git a/showlinux.h b/showlinux.h
index 76476ac..9357ba4 100644
--- a/showlinux.h
+++ b/showlinux.h
@@ -220,6 +220,9 @@ char *procprt_NOTAVAIL_7(struct pstat *curstat, int avgval, int nsecs);
 
 extern proc_printdef *allprocpdefs[];
 extern proc_printdef procprt_PID;
+#if OPENVZ
+extern proc_printdef procprt_VEID;
+#endif
 extern proc_printdef procprt_PPID;
 extern proc_printdef procprt_SYSCPU;
 extern proc_printdef procprt_USRCPU;
diff --git a/showprocs.c b/showprocs.c
index 1554b26..99e8025 100644
--- a/showprocs.c
+++ b/showprocs.c
@@ -445,6 +445,33 @@ proc_printdef procprt_PID =
    { "  PID", "PID", procprt_PID_a, procprt_PID_e, 5 };
 
 /***************************************************************/
+#if OPENVZ
+char *
+procprt_VEID_a(struct pstat *curstat, int avgval, int nsecs)
+{
+        static char buf[10];
+
+        sprintf(buf, "%-8d", curstat->gen.veid);
+        return buf;
+}
+
+char *
+procprt_VEID_e(struct pstat *curstat, int avgval, int nsecs)
+{
+        static char buf[10];
+
+        if (curstat->gen.veid == 0)
+                return "    ?";
+
+        sprintf(buf, "%-8d", curstat->gen.veid);
+        return buf;
+}
+
+proc_printdef procprt_VEID = 
+   { "VEID    ", "VEID", procprt_VEID_a, procprt_VEID_e, 8 };
+
+#endif
+/***************************************************************/
 char *
 procprt_PPID_a(struct pstat *curstat, int avgval, int nsecs)
 {