dtcm: Coverity 89670, 88380 and 88201
[oweals/cde.git] / cde / programs / dtprintinfo / util / Process.C
1 /*
2  * CDE - Common Desktop Environment
3  *
4  * Copyright (c) 1993-2012, The Open Group. All rights reserved.
5  *
6  * These libraries and programs are free software; you can
7  * redistribute them and/or modify them under the terms of the GNU
8  * Lesser General Public License as published by the Free Software
9  * Foundation; either version 2 of the License, or (at your option)
10  * any later version.
11  *
12  * These libraries and programs are distributed in the hope that
13  * they will be useful, but WITHOUT ANY WARRANTY; without even the
14  * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15  * PURPOSE. See the GNU Lesser General Public License for more
16  * details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with these libraries and programs; if not, write
20  * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
21  * Floor, Boston, MA 02110-1301 USA
22  */
23 /* $XConsortium: Process.C /main/3 1996/10/01 16:10:01 drk $ */
24 /*                                                                      *
25  * (c) Copyright 1993, 1994 Hewlett-Packard Company                     *
26  * (c) Copyright 1993, 1994 International Business Machines Corp.       *
27  * (c) Copyright 1993, 1994 Sun Microsystems, Inc.                      *
28  * (c) Copyright 1993, 1994 Novell, Inc.                                *
29  */
30
31 #include "Process.h"
32 #include "Invoke.h"
33
34 #include <string.h>
35 #include <stdlib.h>
36
37 Process::Process()
38 {
39 #ifdef aix
40    (void)Invoke("ps -e -F \"pid ppid uid command\"", &procs);
41 #elif defined(__FreeBSD__)
42    (void)Invoke("/bin/ps ax -o pid,ppid,uid,comm", &procs);
43 #else
44    (void)Invoke("/bin/ps -el | awk '{printf(\"%s %s %s %s\\n\",$4,$5,$3,$NF)}'",
45                 &procs);
46 #endif
47    pprocs = (char **)malloc(sizeof(char *));
48    NumProcs = 0;
49    strtok(procs, "\n");
50    while(pprocs[NumProcs] = strtok(NULL, "\n"))
51     {
52       NumProcs++;
53       pprocs = (char **)realloc(pprocs, sizeof(char *) * (NumProcs + 1));
54     }
55    last_pid = -1;
56 }
57
58 Process::~Process()
59 {
60    free(procs);
61    free(pprocs);
62 }
63
64 char *Process::GetByPid(pid_t _pid)
65 {
66    int i;
67
68    if (last_pid == _pid)
69       return last_proc;
70    if (_pid)
71       for (i = 0; i < NumProcs; i++)
72        {
73          long long_pid, long_ppid, long_uid;
74          sscanf(pprocs[i], "%ld %ld %ld", &long_pid, &long_ppid, &long_uid);
75          pid = (pid_t)long_pid;
76          ppid = (pid_t)long_ppid;
77          uid = (uid_t)long_uid;
78
79          if (_pid == pid)
80           {
81              last_pid = _pid;
82              last_proc = pprocs[i];
83              return pprocs[i];
84           }
85        }
86    return NULL;
87 }
88
89 pid_t Process::Parent(pid_t pid)
90 {
91    char *proc = GetByPid(pid);
92    if (proc)
93       return ppid;
94    else
95       return (pid_t)-1;
96 }
97
98 uid_t Process::UID(pid_t pid)
99 {
100    char *proc = GetByPid(pid);
101    if (proc)
102       return uid;
103    else
104       return (uid_t)-1;
105 }
106
107 char *Process::Command(pid_t _pid)
108 {
109    char *proc = GetByPid(_pid);
110    if (proc)
111     {
112       char *s;
113       // Find first field
114       for (s = proc; *s == ' '; s++)
115          ;
116       for ( ; *s != ' '; s++)
117          ;
118       // Find second field
119       for ( ; *s == ' '; s++)
120          ;
121       for ( ; *s != ' '; s++)
122          ;
123       // Find third field
124       for ( ; *s == ' '; s++)
125          ;
126       for ( ; *s != ' '; s++)
127          ;
128       // Find fourth field
129       for ( ; *s == ' '; s++)
130          ;
131       return s;
132     }
133    else
134       return NULL;
135 }