Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
att
GitHub Repository: att/ast
Path: blob/master/src/cmd/std/pss-kvm.c
1808 views
1
/***********************************************************************
2
* *
3
* This software is part of the ast package *
4
* Copyright (c) 1989-2011 AT&T Intellectual Property *
5
* and is licensed under the *
6
* Eclipse Public License, Version 1.0 *
7
* by AT&T Intellectual Property *
8
* *
9
* A copy of the License is available at *
10
* http://www.eclipse.org/org/documents/epl-v10.html *
11
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
12
* *
13
* Information and Software Systems Research *
14
* AT&T Research *
15
* Florham Park NJ *
16
* *
17
* Glenn Fowler <[email protected]> *
18
* *
19
***********************************************************************/
20
#pragma prototyped
21
/*
22
* Glenn Fowler
23
* AT&T Research
24
*
25
* process status stream PSS_METHOD_kvm implementation
26
*/
27
28
#include "psslib.h"
29
30
#if PSS_METHOD != PSS_METHOD_kvm
31
32
NoN(pss_kvm)
33
34
#else
35
36
#include <kvm.h>
37
#if _sys_time
38
#include <sys/time.h>
39
#endif
40
#if _sys_param
41
#include <sys/param.h>
42
#endif
43
#if _sys_proc
44
#include <sys/proc.h>
45
#endif
46
#include <sys/sysctl.h>
47
#include <sys/tty.h>
48
49
#if !_mem_p_pid_extern_proc
50
#define extern_proc proc
51
#endif
52
53
#ifndef SIDL
54
#ifdef LSIDL
55
#define SIDL LSIDL
56
#else
57
#define SIDL 1
58
#endif
59
#endif
60
#ifndef SRUN
61
#ifdef LSRUN
62
#define SRUN LSRUN
63
#else
64
#define SRUN 2
65
#endif
66
#endif
67
#ifndef SSLEEP
68
#ifdef LSSLEEP
69
#define SSLEEP LSSLEEP
70
#else
71
#define SSLEEP 3
72
#endif
73
#endif
74
#ifndef SSTOP
75
#ifdef LSSTOP
76
#define SSTOP LSSTOP
77
#else
78
#define SSTOP 4
79
#endif
80
#endif
81
#ifndef SZOMB
82
#ifdef LSZOMB
83
#define SZOMB LSZOMB
84
#else
85
#define SZOMB 5
86
#endif
87
#endif
88
#ifndef SDEAD
89
#ifdef LSDEAD
90
#define SDEAD LSDEAD
91
#else
92
#define SDEAD 6
93
#endif
94
#endif
95
#ifndef SONPROC
96
#ifdef LSONPROC
97
#define SONPROC LSONPROC
98
#else
99
#define SONPROC 7
100
#endif
101
#endif
102
#ifndef SSUSPENDED
103
#ifdef LSSUSPENDED
104
#define SSUSPENDED LSSUSPENDED
105
#else
106
#define SSUSPENDED 8
107
#endif
108
#endif
109
110
typedef struct State_s
111
{
112
kvm_t* kd;
113
struct kinfo_proc* kp;
114
struct kinfo_proc* ke;
115
struct extern_proc* pr;
116
struct eproc* px;
117
} State_t;
118
119
static int
120
kvm_init(Pss_t* pss)
121
{
122
register State_t* state;
123
124
if (!(state = vmnewof(pss->vm, 0, State_t, 1, 0)))
125
{
126
if (pss->disc->errorf)
127
(*pss->disc->errorf)(pss, pss->disc, ERROR_SYSTEM|2, "out of space");
128
return -1;
129
}
130
if (!(state->kd = kvm_open(NiL, NiL, 0, O_RDONLY, NiL)))
131
{
132
if (pss->disc->errorf)
133
(*pss->disc->errorf)(pss, pss->disc, ERROR_SYSTEM|1, "kvm open error");
134
return -1;
135
}
136
pss->data = state;
137
error(1, "%s: pss method is currently incomplete", pss->meth->name);
138
return 1;
139
}
140
141
static int
142
kvm_done(Pss_t* pss)
143
{
144
register State_t* state = (State_t*)pss->data;
145
146
kvm_close(state->kd);
147
return 1;
148
}
149
150
static int
151
kvm_readf(Pss_t* pss, Pss_id_t pid)
152
{
153
register State_t* state = (State_t*)pss->data;
154
int count;
155
156
if (pid)
157
{
158
if (!(state->kp = kvm_getprocs(state->kd, KERN_PROC_PID, pid, &count)))
159
return -1;
160
state->ke = state->kp + count;
161
}
162
else if (!state->kp)
163
{
164
if (!(state->kp = kvm_getprocs(state->kd, KERN_PROC_ALL, 0, &count)))
165
return -1;
166
state->ke = state->kp + count;
167
}
168
if (state->kp >= state->ke)
169
return 0;
170
pss->pid = state->kp->kp_proc.p_pid;
171
state->pr = &state->kp->kp_proc;
172
state->px = &state->kp->kp_eproc;
173
state->kp++;
174
return 1;
175
}
176
177
static int
178
kvm_part(register Pss_t* pss, register Pssent_t* pe)
179
{
180
register State_t* state = (State_t*)pss->data;
181
182
pe->pid = state->pr->p_pid;
183
pe->pgrp = state->px->e_pgid;
184
pe->tty = state->px->e_tdev;
185
pe->uid = state->px->e_ucred.cr_uid;
186
#if 0
187
pe->sid = state->px->e_sess->s_sid;
188
#endif
189
switch (state->pr->p_stat)
190
{
191
case SIDL: pe->state = 'I'; break;
192
case SRUN: pe->state = 'R'; break;
193
case SSLEEP: pe->state = 'S'; break;
194
case SSTOP: pe->state = 'T'; break;
195
case SZOMB: pe->state = 'Z'; break;
196
default: pe->state = 'O'; break;
197
}
198
return 1;
199
}
200
201
static int
202
kvm_full(register Pss_t* pss, register Pssent_t* pe)
203
{
204
register State_t* state = (State_t*)pss->data;
205
unsigned long fields = pss->disc->fields & pss->meth->fields;
206
char* s;
207
int i;
208
209
if (pe->state != PSS_ZOMBIE)
210
{
211
if (fields & PSS_args)
212
{
213
s = state->pr->p_comm;
214
if (s[0] == '(' && s[i = strlen(s) - 1] == ')')
215
{
216
s[i] = 0;
217
s++;
218
}
219
pe->args = s;
220
}
221
if (fields & PSS_command)
222
{
223
s = state->pr->p_comm;
224
if (s[0] == '(' && s[i = strlen(s) - 1] == ')')
225
{
226
s[i] = 0;
227
s++;
228
}
229
pe->command = s;
230
}
231
}
232
#if _mem_p_addr_extern_proc
233
pe->addr = state->pr->p_addr;
234
#endif
235
#if _mem_p_wchan_extern_proc
236
pe->wchan = state->pr->p_wchan;
237
#endif
238
pe->flags = state->pr->p_flag;
239
pe->nice = state->pr->p_nice;
240
pe->ppid = state->px->e_ppid;
241
#if PSS_pri && _mem_p_usrpri_extern_proc
242
pe->pri = state->pr->p_usrpri;
243
#endif
244
#ifdef FWIDTH
245
pe->cpu = state->pr->p_pctcpu >> FWIDTH;
246
#endif
247
pe->refcount = state->px->e_xccount;
248
pe->rss = state->px->e_xrssize;
249
#if _mem_e_xsize_eproc
250
pe->size = state->px->e_xsize;
251
#else
252
pe->size = state->px->e_vm.vm_tsize + state->px->e_vm.vm_dsize + state->px->e_vm.vm_ssize;
253
#endif
254
#if _mem_p_starttime_extern_proc
255
pe->start = state->pr->p_starttime.tv_sec;
256
#endif
257
pe->time = state->pr->p_rtime.tv_sec;
258
return 1;
259
}
260
261
static Pssmeth_t kvm_method =
262
{
263
"kvm",
264
"[-version?@(#)$Id: pss kvm (AT&T Research) 2008-01-31 $\n]"
265
"[-author?Glenn Fowler <[email protected]>]",
266
PSS_all,
267
kvm_init,
268
kvm_readf,
269
kvm_part,
270
kvm_full,
271
0,
272
0,
273
0,
274
kvm_done
275
};
276
277
Pssmeth_t* _pss_method = &kvm_method;
278
279
#endif
280
281