Setting const variable with no type to 'int' (likely the default the
[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 librararies 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 #else
42    (void)Invoke("/bin/ps -el | awk '{printf(\"%s %s %s %s\\n\",$4,$5,$3,$NF)}'",
43                 &procs);
44 #endif
45    pprocs = (char **)malloc(sizeof(char *));
46    NumProcs = 0;
47    strtok(procs, "\n");
48    while(pprocs[NumProcs] = strtok(NULL, "\n"))
49     {
50       NumProcs++;
51       pprocs = (char **)realloc(pprocs, sizeof(char *) * (NumProcs + 1));
52     }
53    last_pid = -1;
54 }
55
56 Process::~Process()
57 {
58    free(procs);
59    free(pprocs);
60 }
61
62 char *Process::GetByPid(pid_t _pid)
63 {
64    int i;
65
66    if (last_pid == _pid)
67       return last_proc;
68    if (_pid)
69       for (i = 0; i < NumProcs; i++)
70        {
71          long long_pid, long_ppid, long_uid;
72          sscanf(pprocs[i], "%ld %ld %ld", &long_pid, &long_ppid, &long_uid);
73          pid = (pid_t)long_pid;
74          ppid = (pid_t)long_ppid;
75          uid = (uid_t)long_uid;
76
77          if (_pid == pid)
78           {
79              last_pid = _pid;
80              last_proc = pprocs[i];
81              return pprocs[i];
82           }
83        }
84    return NULL;
85 }
86
87 pid_t Process::Parent(pid_t pid)
88 {
89    char *proc = GetByPid(pid);
90    if (proc)
91       return ppid;
92    else
93       return (pid_t)-1;
94 }
95
96 uid_t Process::UID(pid_t pid)
97 {
98    char *proc = GetByPid(pid);
99    if (proc)
100       return uid;
101    else
102       return (uid_t)-1;
103 }
104
105 char *Process::Command(pid_t _pid)
106 {
107    char *proc = GetByPid(_pid);
108    if (proc)
109     {
110       char *s;
111       // Find first field
112       for (s = proc; *s == ' '; s++)
113          ;
114       for ( ; *s != ' '; s++)
115          ;
116       // Find second field
117       for ( ; *s == ' '; s++)
118          ;
119       for ( ; *s != ' '; s++)
120          ;
121       // Find third field
122       for ( ; *s == ' '; s++)
123          ;
124       for ( ; *s != ' '; s++)
125          ;
126       // Find fourth field
127       for ( ; *s == ' '; s++)
128          ;
129       return s;
130     }
131    else
132       return NULL;
133 }