--- zabbix-2.0.2-orig/src/libs/zbxsysinfo/aix/proc.c	2012-07-31 11:16:46.000000000 +0200
+++ zabbix-2.0.2/src/libs/zbxsysinfo/aix/proc.c	2012-09-11 14:01:26.476919309 +0200
@@ -29,25 +29,6 @@
 #define DO_MIN 2
 #define DO_AVG 3
 
-#ifdef HAVE_SYS_PROCFS_H
-static int	check_procstate(psinfo_t *psinfo, int zbx_proc_stat)
-{
-	if (zbx_proc_stat == ZBX_PROC_STAT_ALL)
-		return SUCCEED;
-
-	switch (zbx_proc_stat)
-	{
-		case ZBX_PROC_STAT_RUN:
-			return (psinfo->pr_lwp.pr_sname == PR_SNAME_TSRUN) ? SUCCEED : FAIL;
-		case ZBX_PROC_STAT_SLEEP:
-			return (psinfo->pr_lwp.pr_sname == PR_SNAME_TSSLEEP) ? SUCCEED : FAIL;
-		case ZBX_PROC_STAT_ZOMB:
-			return (psinfo->pr_lwp.pr_sname == PR_SNAME_TSZOMB) ? SUCCEED : FAIL;
-	}
-
-	return FAIL;
-}
-#else
 static int	check_procstate(struct procsinfo *procsinfo, int zbx_proc_stat)
 {
 	if (zbx_proc_stat == ZBX_PROC_STAT_ALL)
@@ -65,24 +46,16 @@
 
 	return FAIL;
 }
-#endif /* HAVE_SYS_PROCFS_H */
 
 int	PROC_MEM(const char *cmd, const char *param, unsigned flags, AGENT_RESULT *result)
 {
 	char			tmp[MAX_STRING_LEN],
 				procname[MAX_STRING_LEN],
+				proccommargs[MAX_STRING_LEN],
 				proccomm[MAX_STRING_LEN];
-#ifdef HAVE_SYS_PROCFS_H
-	DIR			*dir;
-	struct dirent		*entries;
-	struct stat		buf;
-	struct psinfo		psinfo;
-	int			fd = -1;
-#else
 	struct procsinfo	procsinfo;
 	pid_t			pid = 0;
 	AGENT_RESULT		proc_args;
-#endif /* HAVE_SYS_PROCFS_H */
 	struct passwd		*usrinfo = NULL;
 	zbx_uint64_t		value = 0;
 	int			do_task;
@@ -129,58 +102,6 @@
 	if (0 != get_param(param, 4, proccomm, sizeof(proccomm)))
 		*proccomm = '\0';
 
-#ifdef HAVE_SYS_PROCFS_H /* AIX 5.x */
-	if (NULL == (dir = opendir("/proc")))
-		return SYSINFO_RET_FAIL;
-
-	while (NULL != (entries = readdir(dir)))
-	{
-		if (-1 != fd)
-		{
-			close(fd);
-			fd = -1;
-		}
-
-		zbx_snprintf(tmp, sizeof(tmp), "/proc/%s/psinfo", entries->d_name);
-
-		if (0 != stat(tmp, &buf))
-			continue;
-
-		if (-1 == (fd = open(tmp, O_RDONLY)))
-			continue;
-
-		if (-1 == read(fd, &psinfo, sizeof(psinfo)))
-			continue;
-
-		if ('\0' != *procname && 0 != strcmp(procname, psinfo.pr_fname))
-			continue;
-
-		if (NULL != usrinfo && usrinfo->pw_uid != psinfo.pr_uid)
-			continue;
-
-		if ('\0' != *proccomm && NULL == zbx_regexp_match(psinfo.pr_psargs, proccomm, NULL))
-			continue;
-
-		value = psinfo.pr_size;
-		value <<= 10;	/* kB to Byte */
-
-		if (0 == proccount++)
-			memsize = value;
-		else
-		{
-			if (do_task == DO_MAX)
-				memsize = MAX(memsize, value);
-			else if (do_task == DO_MIN)
-				memsize = MIN(memsize, value);
-			else
-				memsize += value;
-		}
-	}
-
-	closedir(dir);
-	if (-1 != fd)
-		close(fd);
-#else
 	while (0 < getprocs(&procsinfo, (int)sizeof(struct procsinfo), NULL, 0, &pid, 1))
 	{
 		if ('\0' != *procname && 0 != strcmp(procname, procsinfo.pi_comm))
@@ -191,23 +112,25 @@
 
 		if ('\0' != *proccomm)
 		{
-			init_result(&proc_args);
-
-			zbx_snprintf(tmp, sizeof(tmp), "ps -p %i -oargs=", procsinfo.pi_pid);
-
-			if (SYSINFO_RET_OK != EXECUTE_STR(cmd, tmp, flags, &proc_args))
-			{
-				free_result(&proc_args);
-				continue;
-			}
-			if (NULL == zbx_regexp_match(proc_args.str, proccomm, NULL))
-			{
-				free_result(&proc_args);
-				continue;
-			}
-
-			free_result(&proc_args);
-		}
+                        if (0 == getargs (&procsinfo, sizeof(procsinfo), &proccommargs[0], sizeof(proccommargs)))
+                        {
+                                int i=0;
+                                int sz = sizeof(proccommargs);
+                                while (i < sz )
+                                {
+                                        if (proccommargs[i] == 0 && proccommargs[i+1] == 0) break;
+                                        if (0 == proccommargs[i]) proccommargs[i] = ' ';
+                                        i++;
+                                }
+                        }
+                        else
+                                *proccommargs = '\0'; /* case when process exited before we got to it*/
+
+                        if (NULL == zbx_regexp_match(proccommargs,proccomm, NULL))
+                        {
+                                continue;
+                        }
+                }
 
 		value = procsinfo.pi_size;
 		value <<= 10;	/* kB to Byte */
@@ -224,7 +147,6 @@
 				memsize += value;
 		}
         }
-#endif /* HAVE_SYS_PROCFS_H */
 
 	if (do_task == DO_AVG)
 	{
@@ -240,18 +162,11 @@
 {
 	char			tmp[MAX_STRING_LEN],
 				procname[MAX_STRING_LEN],
+				proccommargs[MAX_STRING_LEN],
 				proccomm[MAX_STRING_LEN];
-#ifdef HAVE_SYS_PROCFS_H
-	DIR			*dir;
-	struct dirent		*entries;
-	struct stat		buf;
-	struct psinfo		psinfo;
-	int			fd = -1;
-#else
 	struct procsinfo	procsinfo;
 	pid_t			pid = 0;
 	AGENT_RESULT		proc_args;
-#endif /* HAVE_SYS_PROCFS_H */
 	struct passwd		*usrinfo = NULL;
 	zbx_uint64_t		value = 0;
 	int			zbx_proc_stat;
@@ -297,48 +212,6 @@
 	if (0 != get_param(param, 4, proccomm, sizeof(proccomm)))
 		*proccomm = '\0';
 
-#ifdef HAVE_SYS_PROCFS_H /* AIX 5.x */
-	if (NULL == (dir = opendir("/proc")))
-		return SYSINFO_RET_FAIL;
-
-	while (NULL != (entries = readdir(dir)))
-	{
-		if (-1 != fd)
-		{
-			close(fd);
-			fd = -1;
-		}
-
-		zbx_snprintf(tmp, sizeof(tmp), "/proc/%s/psinfo", entries->d_name);
-
-		if (0 != stat(tmp, &buf))
-			continue;
-
-		if (-1 == (fd = open(tmp, O_RDONLY)))
-			continue;
-
-		if (-1 == read(fd, &psinfo, sizeof(psinfo)))
-			continue;
-
-		if ('\0' != *procname && 0 != strcmp(procname, psinfo.pr_fname))
-			continue;
-
-		if (NULL != usrinfo && usrinfo->pw_uid != psinfo.pr_uid)
-			continue;
-
-		if (FAIL == check_procstate(&psinfo, zbx_proc_stat))
-			continue;
-
-		if ('\0' != *proccomm && NULL == zbx_regexp_match(psinfo.pr_psargs, proccomm, NULL))
-			continue;
-
-		proccount++;
-	}
-
-	closedir(dir);
-	if (-1 != fd)
-		close(fd);
-#else
 	while (0 < getprocs(&procsinfo, (int)sizeof(struct procsinfo), NULL, 0, &pid, 1))
 	{
 		if ('\0' != *procname && 0 != strcmp(procname, procsinfo.pi_comm))
@@ -352,27 +225,26 @@
 
 		if ('\0' != *proccomm)
 		{
-			init_result(&proc_args);
-
-			zbx_snprintf(tmp, sizeof(tmp), "ps -p %i -oargs=", procsinfo.pi_pid);
-
-			if (SYSINFO_RET_OK != EXECUTE_STR(cmd, tmp, flags, &proc_args))
-			{
-				free_result(&proc_args);
-				continue;
-			}
-			if (NULL == zbx_regexp_match(proc_args.str, proccomm, NULL))
-			{
-				free_result(&proc_args);
-				continue;
-			}
-
-			free_result(&proc_args);
-		}
-
-		proccount++;
+		        if (0 == getargs (&procsinfo, sizeof(procsinfo), &proccommargs[0], sizeof(proccommargs)))
+		        {
+		                int i=0;
+                                int sz = sizeof(proccommargs);
+                                while (i < sz )
+                                {
+                                        if (proccommargs[i] == 0 && proccommargs[i+1] == 0) break;
+                                        if (0 == proccommargs[i]) proccommargs[i] = ' ';
+                                        i++;
+                                }
+                        }
+                        else
+                                *proccommargs = '\0'; /* case when process exited before we got to it*/
+                        if (NULL == zbx_regexp_match(proccommargs,proccomm, NULL))
+                        {
+                                continue;
+                        }
+                }
+                proccount++;
         }
-#endif /* HAVE_SYS_PROCFS_H */
 
 	SET_UI64_RESULT(result, proccount);
 
