85
85
*----------------------------------------------------------------------------
88
ProcMgrProcInfoArray *
89
89
ProcMgr_ListProcesses(void)
91
ProcMgr_ProcList *procList = NULL;
96
DynBuf dbProcStartTime;
91
ProcMgrProcInfoArray *procList = NULL;
92
ProcMgrProcInfo processInfo;
99
95
struct dirent *ent;
101
DynBuf_Init(&dbProcId);
102
DynBuf_Init(&dbProcCmd);
103
DynBuf_Init(&dbProcStartTime);
104
DynBuf_Init(&dbProcOwner);
97
procList = Util_SafeCalloc(1, sizeof *procList);
98
ProcMgrProcInfoArray_Init(procList, 0);
99
processInfo.procOwner = NULL;
100
processInfo.procCmd = NULL;
106
102
dir = opendir("/proc");
107
103
if (NULL == dir) {
108
104
Warning("ProcMgr_ListProcesses unable to open /proc\n");
115
109
struct passwd *pwd;
117
char *userName = NULL;
118
110
char tempPath[MAXPATHLEN];
119
time_t processStartTime;
120
111
psinfo_t procInfo;
121
112
size_t strLen = 0;
122
113
size_t numRead = 0;
179
167
tmp = ExtractCommandLineFromAddressSpaceFile(&procInfo);
180
168
if (tmp != NULL) {
181
cmdLineTemp = Unicode_Alloc(tmp, STRING_ENCODING_DEFAULT);
169
processInfo.procCmd = Unicode_Alloc(tmp, STRING_ENCODING_DEFAULT);
184
cmdLineTemp = Unicode_Alloc(procInfo.pr_psargs,
185
STRING_ENCODING_DEFAULT);
172
processInfo.procCmd = Unicode_Alloc(procInfo.pr_psargs,
173
STRING_ENCODING_DEFAULT);
188
cmdLineTemp = Unicode_Alloc(procInfo.pr_psargs,
189
STRING_ENCODING_DEFAULT);
176
processInfo.procCmd = Unicode_Alloc(procInfo.pr_psargs,
177
STRING_ENCODING_DEFAULT);
193
* Store the command line string pointer in dynbuf.
195
DynBuf_Append(&dbProcCmd, &cmdLineTemp, sizeof cmdLineTemp);
198
181
* Store the pid in dynbuf.
200
pid = procInfo.pr_pid;
201
DynBuf_Append(&dbProcId, &pid, sizeof pid);
183
processInfo.procId = procInfo.pr_pid;
204
186
* Store the owner of the process.
206
188
pwd = getpwuid(procInfo.pr_uid);
207
userName = (NULL == pwd)
208
? Str_Asprintf(&strLen, "%d", (int) procInfo.pr_uid)
209
: Unicode_Alloc(pwd->pw_name, STRING_ENCODING_DEFAULT);
210
DynBuf_Append(&dbProcOwner, &userName, sizeof userName);
189
processInfo.procOwner = (NULL == pwd)
190
? Str_SafeAsprintf(&strLen, "%d", (int) procInfo.pr_uid)
191
: Unicode_Alloc(pwd->pw_name, STRING_ENCODING_DEFAULT);
213
* Store the time that the process started.
194
* Store the process info into a list buffer.
215
DynBuf_Append(&dbProcStartTime,
217
sizeof processStartTime);
196
if (!ProcMgrProcInfoArray_Push(procList, processInfo)) {
197
Warning("%s: failed to expand DynArray - out of memory\n",
201
processInfo.procCmd = NULL;
202
processInfo.procOwner = NULL;
218
203
} // while (TRUE)
205
if (0 < ProcMgrProcInfoArray_Count(procList)) {
222
if (0 == DynBuf_GetSize(&dbProcId)) {
228
* We're done adding to DynBuf. Trim off any unused allocated space.
229
* DynBuf_Trim() followed by DynBuf_Detach() avoids a memcpy().
231
DynBuf_Trim(&dbProcId);
232
DynBuf_Trim(&dbProcCmd);
233
DynBuf_Trim(&dbProcStartTime);
234
DynBuf_Trim(&dbProcOwner);
237
* Create a ProcMgr_ProcList and populate its fields.
239
procList = (ProcMgr_ProcList *) Util_SafeCalloc(1, sizeof(ProcMgr_ProcList));
240
ASSERT_MEM_ALLOC(procList);
242
procList->procCount = DynBuf_GetSize(&dbProcId) / sizeof(pid_t);
244
procList->procIdList = (pid_t *) DynBuf_Detach(&dbProcId);
245
ASSERT_MEM_ALLOC(procList->procIdList);
246
procList->procCmdList = (char **) DynBuf_Detach(&dbProcCmd);
247
ASSERT_MEM_ALLOC(procList->procCmdList);
248
procList->startTime = (time_t *) DynBuf_Detach(&dbProcStartTime);
249
ASSERT_MEM_ALLOC(procList->startTime);
250
procList->procOwnerList = (char **) DynBuf_Detach(&dbProcOwner);
251
ASSERT_MEM_ALLOC(procList->procOwnerList);
254
DynBuf_Destroy(&dbProcId);
255
DynBuf_Destroy(&dbProcCmd);
256
DynBuf_Destroy(&dbProcStartTime);
257
DynBuf_Destroy(&dbProcOwner);
212
free(processInfo.procOwner);
213
free(processInfo.procCmd);
260
216
ProcMgr_FreeProcList(procList);