break some functions out into util.c
[unix-history] / usr / src / bin / ps / print.c
CommitLineData
fd57c467
KB
1/*-
2 * Copyright (c) 1990 The Regents of the University of California.
3 * All rights reserved.
4 *
5 * %sccs.include.redist.c%
6 */
7
8#ifndef lint
8faab6ff 9static char sccsid[] = "@(#)print.c 5.11 (Berkeley) %G%";
fd57c467
KB
10#endif /* not lint */
11
fd57c467
KB
12#include <sys/param.h>
13#include <sys/time.h>
14#include <sys/resource.h>
15#include <sys/proc.h>
16#include <sys/stat.h>
fd57c467 17#include <math.h>
8faab6ff 18#include <nlist.h>
fd57c467 19#include <tzfile.h>
8faab6ff 20#include <stdio.h>
fd57c467
KB
21#include <stddef.h>
22#include <string.h>
23#include "ps.h"
24
1d2a7f51
MK
25#ifdef SPPWAIT
26#define NEWVM
27#endif
28
29#ifdef NEWVM
30#include <vm/vm.h>
31#include <sys/ucred.h>
32#include <sys/kinfo_proc.h>
33#else
34#include <machine/pte.h>
35#include <sys/vmparam.h>
36#include <sys/vm.h>
37#endif
38
8faab6ff
KB
39static void printval __P((char*, struct var *));
40
41void
fd57c467
KB
42printheader()
43{
44 register VAR *v;
b595f31e 45 register struct varent *vent;
fd57c467 46
b595f31e
MT
47 for (vent = vhead; vent; vent = vent->next) {
48 v = vent->var;
fd57c467 49 if (v->flag & LJUST) {
b595f31e 50 if (vent->next == NULL) /* last one */
8faab6ff 51 (void)printf("%s", v->header);
fd57c467 52 else
8faab6ff 53 (void)printf("%-*s", v->width, v->header);
fd57c467 54 } else
8faab6ff 55 (void)printf("%*s", v->width, v->header);
b595f31e 56 if (vent->next != NULL)
8faab6ff 57 (void)putchar(' ');
fd57c467 58 }
8faab6ff 59 (void)putchar('\n');
fd57c467
KB
60}
61
8faab6ff
KB
62void
63command(k, ve)
fd57c467 64 KINFO *k;
8faab6ff 65 VARENT *ve;
fd57c467
KB
66{
67 extern int termwidth, totwidth;
8faab6ff 68 VAR *v;
fd57c467 69
8faab6ff
KB
70 v = ve->var;
71 if (ve->next == NULL) {
fd57c467 72 /* last field */
967726ab
KM
73 if (termwidth == UNLIMITED) {
74 if (k->ki_env)
8faab6ff
KB
75 (void)printf("%s ", k->ki_env);
76 (void)printf("%s", k->ki_args);
967726ab 77 } else {
fd57c467 78 register int left = termwidth - (totwidth - v->width);
967726ab 79 register char *cp;
fd57c467
KB
80
81 if (left < 1) /* already wrapped, just use std width */
82 left = v->width;
967726ab
KM
83 cp = k->ki_env;
84 if (cp != 0) {
85 while (--left >= 0 && *cp)
8faab6ff 86 (void)putchar(*cp++);
967726ab
KM
87 if (--left >= 0)
88 putchar(' ');
89 }
90 cp = k->ki_args;
fd57c467 91 while (--left >= 0 && *cp)
8faab6ff 92 (void)putchar(*cp++);
fd57c467
KB
93 }
94 } else
967726ab 95 /* XXX env? */
8faab6ff 96 (void)printf("%-*.*s", v->width, v->width, k->ki_args);
fd57c467
KB
97}
98
8faab6ff
KB
99void
100ucomm(k, ve)
fd57c467 101 KINFO *k;
8faab6ff 102 VARENT *ve;
fd57c467 103{
8faab6ff
KB
104 VAR *v;
105
106 v = ve->var;
107 (void)printf("%-*s", v->width, KI_PROC(k)->p_comm);
fd57c467
KB
108}
109
8faab6ff
KB
110void
111logname(k, ve)
fd57c467 112 KINFO *k;
8faab6ff 113 VARENT *ve;
fd57c467 114{
8faab6ff
KB
115 VAR *v;
116
117 v = ve->var;
1d2a7f51 118#ifndef NEWVM
8faab6ff 119 (void)printf("%-*s", v->width, KI_PROC(k)->p_logname);
1d2a7f51 120#else /* NEWVM */
8faab6ff 121 (void)printf("%-*s", v->width, KI_EPROC(k)->e_login);
1d2a7f51 122#endif /* NEWVM */
fd57c467
KB
123}
124
8faab6ff
KB
125void
126state(k, ve)
fd57c467 127 KINFO *k;
8faab6ff 128 VARENT *ve;
fd57c467 129{
8faab6ff
KB
130 register struct proc *p;
131 register int flag;
132 register char *cp;
133 VAR *v;
fd57c467 134 char buf[16];
8faab6ff
KB
135
136 v = ve->var;
137 p = KI_PROC(k);
138 flag = p->p_flag;
139 cp = buf;
fd57c467
KB
140
141 switch (p->p_stat) {
142
143 case SSTOP:
144 *cp = 'T';
145 break;
146
147 case SSLEEP:
148 if (flag & SSINTR) /* interuptable (long) */
149 *cp = p->p_slptime >= MAXSLP ? 'I' : 'S';
150 else
151 *cp = (flag & SPAGE) ? 'P' : 'D';
152 break;
153
154 case SRUN:
155 case SIDL:
156 *cp = 'R';
157 break;
158
159 case SZOMB:
160 *cp = 'Z';
161 break;
162
163 default:
164 *cp = '?';
165 }
166 cp++;
167 if (flag & SLOAD) {
1d2a7f51 168#ifndef NEWVM
fd57c467
KB
169 if (p->p_rssize > p->p_maxrss)
170 *cp++ = '>';
1d2a7f51 171#endif
fd57c467
KB
172 } else
173 *cp++ = 'W';
174 if (p->p_nice < NZERO)
175 *cp++ = '<';
176 else if (p->p_nice > NZERO)
177 *cp++ = 'N';
dfc2fdfb 178#ifndef NEWVM
fd57c467
KB
179 if (flag & SUANOM)
180 *cp++ = 'A';
181 else if (flag & SSEQL)
182 *cp++ = 'S';
dfc2fdfb 183#endif
fd57c467
KB
184 if (flag & STRC)
185 *cp++ = 'X';
1d2a7f51 186 if (flag & SWEXIT && p->p_stat != SZOMB)
fd57c467 187 *cp++ = 'E';
1d2a7f51
MK
188#ifdef NEWVM
189 if (flag & SPPWAIT)
190#else
fd57c467 191 if (flag & SVFORK)
1d2a7f51 192#endif
fd57c467 193 *cp++ = 'V';
dfc2fdfb
MK
194#ifdef NEWVM
195 if (flag & (SSYS|SLOCK|SKEEP|SPHYSIO))
196#else
fd57c467 197 if (flag & (SSYS|SLOCK|SULOCK|SKEEP|SPHYSIO))
dfc2fdfb 198#endif
fd57c467 199 *cp++ = 'L';
967726ab 200 if (KI_EPROC(k)->e_flag & EPROC_SLEADER)
fd57c467 201 *cp++ = 's';
967726ab 202 if ((flag & SCTTY) && KI_EPROC(k)->e_pgid == KI_EPROC(k)->e_tpgid)
fd57c467
KB
203 *cp++ = '+';
204 *cp = '\0';
8faab6ff 205 (void)printf("%-*s", v->width, buf);
fd57c467
KB
206}
207
8faab6ff
KB
208void
209pri(k, ve)
fd57c467 210 KINFO *k;
8faab6ff 211 VARENT *ve;
fd57c467 212{
8faab6ff
KB
213 VAR *v;
214
215 v = ve->var;
216 (void)printf("%*d", v->width, KI_PROC(k)->p_pri - PZERO);
fd57c467
KB
217}
218
8faab6ff
KB
219void
220uname(k, ve)
fd57c467 221 KINFO *k;
8faab6ff 222 VARENT *ve;
fd57c467 223{
8faab6ff
KB
224 VAR *v;
225
226 v = ve->var;
1d2a7f51 227#ifndef NEWVM
8faab6ff 228 (void)printf("%-*s", v->width, user_from_uid(KI_PROC(k)->p_uid, 0));
1d2a7f51 229#else /* NEWVM */
8faab6ff 230 (void)printf("%-*s", v->width,
967726ab 231 user_from_uid(KI_EPROC(k)->e_ucred.cr_uid, 0));
1d2a7f51 232#endif /* NEWVM */
fd57c467
KB
233}
234
8faab6ff
KB
235void
236runame(k, ve)
fd57c467 237 KINFO *k;
8faab6ff 238 VARENT *ve;
fd57c467 239{
8faab6ff
KB
240 VAR *v;
241
242 v = ve->var;
1d2a7f51 243#ifndef NEWVM
8faab6ff 244 (void)printf("%-*s", v->width, user_from_uid(KI_PROC(k)->p_ruid, 0));
1d2a7f51 245#else /* NEWVM */
8faab6ff 246 (void)printf("%-*s", v->width,
967726ab 247 user_from_uid(KI_EPROC(k)->e_pcred.p_ruid, 0));
1d2a7f51 248#endif /* NEWVM */
fd57c467
KB
249}
250
8faab6ff
KB
251void
252tdev(k, ve)
fd57c467 253 KINFO *k;
8faab6ff 254 VARENT *ve;
fd57c467 255{
8faab6ff
KB
256 VAR *v;
257 dev_t dev;
258 char buff[16];
fd57c467 259
8faab6ff
KB
260 v = ve->var;
261 dev = KI_EPROC(k)->e_tdev;
fd57c467 262 if (dev == NODEV)
8faab6ff 263 (void)printf("%*s", v->width, "??");
fd57c467 264 else {
8faab6ff
KB
265 (void)snprintf(buff, sizeof(buff),
266 "%d/%d", major(dev), minor(dev));
267 (void)printf("%*s", v->width, buff);
fd57c467
KB
268 }
269}
270
8faab6ff
KB
271void
272tname(k, ve)
fd57c467 273 KINFO *k;
8faab6ff 274 VARENT *ve;
fd57c467 275{
8faab6ff 276 VAR *v;
fd57c467 277 dev_t dev;
8faab6ff 278 char *ttname;
fd57c467 279
8faab6ff 280 v = ve->var;
967726ab 281 dev = KI_EPROC(k)->e_tdev;
fd57c467 282 if (dev == NODEV || (ttname = devname(dev, S_IFCHR)) == NULL)
8faab6ff 283 (void)printf("%-*s", v->width, "??");
fd57c467
KB
284 else {
285 if (strncmp(ttname, "tty", 3) == 0)
286 ttname += 3;
8faab6ff 287 (void)printf("%*.*s%c", v->width-1, v->width-1, ttname,
967726ab 288 KI_EPROC(k)->e_flag & EPROC_CTTY ? ' ' : '-');
fd57c467
KB
289 }
290}
291
8faab6ff
KB
292void
293longtname(k, ve)
fd57c467 294 KINFO *k;
8faab6ff 295 VARENT *ve;
fd57c467 296{
8faab6ff 297 VAR *v;
fd57c467 298 dev_t dev;
8faab6ff
KB
299 char *ttname;
300
301 v = ve->var;
fd57c467 302
967726ab 303 dev = KI_EPROC(k)->e_tdev;
fd57c467 304 if (dev == NODEV || (ttname = devname(dev, S_IFCHR)) == NULL)
8faab6ff 305 (void)printf("%-*s", v->width, "??");
fd57c467 306 else
8faab6ff 307 (void)printf("%-*s", v->width, ttname);
fd57c467
KB
308}
309
8faab6ff
KB
310void
311started(k, ve)
fd57c467 312 KINFO *k;
8faab6ff 313 VARENT *ve;
fd57c467 314{
8faab6ff 315 VAR *v;
fd57c467
KB
316 static time_t now;
317 struct tm *tp;
318 char buf[100];
319
8faab6ff 320 v = ve->var;
967726ab 321 if (!k->ki_u.u_valid) {
8faab6ff 322 (void)printf("%-*s", v->width, "-");
fd57c467
KB
323 return;
324 }
325
967726ab 326 tp = localtime(&k->ki_u.u_start.tv_sec);
fd57c467
KB
327 if (!now)
328 (void)time(&now);
967726ab 329 if (now - k->ki_u.u_start.tv_sec < 24 * SECSPERHOUR) {
be84eea2 330 static char fmt[] = "%l:@M%p";
3be22949 331 fmt[3] = '%'; /* I *hate* SCCS... */
8faab6ff 332 (void)strftime(buf, sizeof(buf) - 1, fmt, tp);
967726ab 333 } else if (now - k->ki_u.u_start.tv_sec < 7 * SECSPERDAY) {
be84eea2 334 static char fmt[] = "%a@I%p";
3be22949 335 fmt[2] = '%'; /* I *hate* SCCS... */
8faab6ff 336 (void)strftime(buf, sizeof(buf) - 1, fmt, tp);
3be22949 337 } else
8faab6ff
KB
338 (void)strftime(buf, sizeof(buf) - 1, "%e%b%y", tp);
339 (void)printf("%-*s", v->width, buf);
fd57c467
KB
340}
341
8faab6ff
KB
342void
343lstarted(k, ve)
fd57c467 344 KINFO *k;
8faab6ff 345 VARENT *ve;
fd57c467 346{
8faab6ff 347 VAR *v;
fd57c467
KB
348 char buf[100];
349
8faab6ff
KB
350 v = ve->var;
351
967726ab 352 if (!k->ki_u.u_valid) {
8faab6ff 353 (void)printf("%-*s", v->width, "-");
fd57c467
KB
354 return;
355 }
8faab6ff 356 (void)strftime(buf, sizeof(buf) -1, "%C",
967726ab 357 localtime(&k->ki_u.u_start.tv_sec));
8faab6ff 358 (void)printf("%-*s", v->width, buf);
fd57c467
KB
359}
360
8faab6ff
KB
361void
362wchan(k, ve)
fd57c467 363 KINFO *k;
8faab6ff 364 VARENT *ve;
fd57c467 365{
8faab6ff
KB
366 VAR *v;
367
368 v = ve->var;
967726ab
KM
369 if (KI_PROC(k)->p_wchan) {
370 if (KI_PROC(k)->p_wmesg)
8faab6ff 371 (void)printf("%-*.*s", v->width, v->width,
967726ab 372 KI_EPROC(k)->e_wmesg);
fd57c467 373 else
8faab6ff 374 (void)printf("%-*x", v->width,
967726ab 375 (int)KI_PROC(k)->p_wchan &~ KERNBASE);
fd57c467 376 } else
8faab6ff 377 (void)printf("%-*s", v->width, "-");
fd57c467
KB
378}
379
380#define pgtok(a) (((a)*NBPG)/1024)
381
8faab6ff
KB
382void
383vsize(k, ve)
fd57c467 384 KINFO *k;
8faab6ff 385 VARENT *ve;
fd57c467 386{
8faab6ff
KB
387 VAR *v;
388
389 v = ve->var;
390 (void)printf("%*d", v->width,
1d2a7f51 391#ifndef NEWVM
967726ab 392 pgtok(KI_PROC(k)->p_dsize + KI_PROC(k)->p_ssize + KI_EPROC(k)->e_xsize));
1d2a7f51 393#else /* NEWVM */
967726ab
KM
394 pgtok(KI_EPROC(k)->e_vm.vm_dsize + KI_EPROC(k)->e_vm.vm_ssize +
395 KI_EPROC(k)->e_vm.vm_tsize));
1d2a7f51 396#endif /* NEWVM */
fd57c467
KB
397}
398
8faab6ff
KB
399void
400rssize(k, ve)
fd57c467 401 KINFO *k;
8faab6ff 402 VARENT *ve;
fd57c467 403{
8faab6ff
KB
404 VAR *v;
405
406 v = ve->var;
1d2a7f51 407#ifndef NEWVM
8faab6ff 408 (void)printf("%*d", v->width,
967726ab
KM
409 pgtok(KI_PROC(k)->p_rssize + (KI_EPROC(k)->e_xccount ?
410 (KI_EPROC(k)->e_xrssize / KI_EPROC(k)->e_xccount) : 0)));
1d2a7f51
MK
411#else /* NEWVM */
412 /* XXX don't have info about shared */
8faab6ff 413 (void)printf("%*d", v->width, pgtok(KI_EPROC(k)->e_vm.vm_rssize));
1d2a7f51 414#endif /* NEWVM */
fd57c467
KB
415}
416
8faab6ff
KB
417void
418p_rssize(k, ve) /* doesn't account for text */
fd57c467 419 KINFO *k;
8faab6ff 420 VARENT *ve;
fd57c467 421{
8faab6ff
KB
422 VAR *v;
423
424 v = ve->var;
1d2a7f51 425#ifndef NEWVM
8faab6ff 426 (void)printf("%*d", v->width, pgtok(KI_PROC(k)->p_rssize));
1d2a7f51 427#else /* NEWVM */
8faab6ff 428 (void)printf("%*d", v->width, pgtok(KI_EPROC(k)->e_vm.vm_rssize));
1d2a7f51 429#endif /* NEWVM */
fd57c467
KB
430}
431
8faab6ff
KB
432void
433cputime(k, ve)
fd57c467 434 KINFO *k;
8faab6ff 435 VARENT *ve;
fd57c467
KB
436{
437 extern int sumrusage;
8faab6ff 438 VAR *v;
fd57c467
KB
439 long secs;
440 long psecs; /* "parts" of a second. first micro, then centi */
441 char obuff[128];
442
8faab6ff 443 v = ve->var;
967726ab 444 if (KI_PROC(k)->p_stat == SZOMB || !k->ki_u.u_valid) {
fd57c467
KB
445 secs = 0;
446 psecs = 0;
447 } else {
967726ab
KM
448 secs = KI_PROC(k)->p_utime.tv_sec +
449 KI_PROC(k)->p_stime.tv_sec;
450 psecs = KI_PROC(k)->p_utime.tv_usec +
451 KI_PROC(k)->p_stime.tv_usec;
fd57c467 452 if (sumrusage) {
967726ab
KM
453 secs += k->ki_u.u_cru.ru_utime.tv_sec +
454 k->ki_u.u_cru.ru_stime.tv_sec;
455 psecs += k->ki_u.u_cru.ru_utime.tv_usec +
456 k->ki_u.u_cru.ru_stime.tv_usec;
fd57c467
KB
457 }
458 /*
459 * round and scale to 100's
460 */
461 psecs = (psecs + 5000) / 10000;
6728dbc4
KB
462 secs += psecs / 100;
463 psecs = psecs % 100;
fd57c467 464 }
8faab6ff
KB
465 (void)snprintf(obuff, sizeof(obuff),
466 "%3ld:%02ld.%02ld", secs/60, secs%60, psecs);
467 (void)printf("%*s", v->width, obuff);
fd57c467
KB
468}
469
470double
471getpcpu(k)
472 KINFO *k;
473{
474 extern fixpt_t ccpu;
475 extern int fscale, nlistread, rawcpu;
476 struct proc *p;
477 static int failure;
478
479 if (!nlistread)
480 failure = donlist();
481 if (failure)
482 return (0.0);
483
967726ab 484 p = KI_PROC(k);
fd57c467
KB
485#define fxtofl(fixpt) ((double)(fixpt) / fscale)
486
487 /* XXX - I don't like this */
488 if (p->p_time == 0 || (p->p_flag & SLOAD) == 0)
489 return (0.0);
490 if (rawcpu)
491 return (100.0 * fxtofl(p->p_pctcpu));
492 return (100.0 * fxtofl(p->p_pctcpu) /
493 (1.0 - exp(p->p_time * log(fxtofl(ccpu)))));
494}
495
8faab6ff
KB
496void
497pcpu(k, ve)
fd57c467 498 KINFO *k;
8faab6ff 499 VARENT *ve;
fd57c467 500{
8faab6ff
KB
501 VAR *v;
502
503 v = ve->var;
504 (void)printf("%*.1f", v->width, getpcpu(k));
fd57c467
KB
505}
506
507double
508getpmem(k)
509 KINFO *k;
510{
6e7a85b8 511 extern int mempages, nlistread;
fd57c467
KB
512 static int failure;
513 struct proc *p;
514 struct eproc *e;
515 double fracmem;
516 int szptudot;
517
518 if (!nlistread)
519 failure = donlist();
520 if (failure)
521 return (0.0);
522
967726ab
KM
523 p = KI_PROC(k);
524 e = KI_EPROC(k);
fd57c467
KB
525 if ((p->p_flag & SLOAD) == 0)
526 return (0.0);
1d2a7f51 527#ifndef NEWVM
fd57c467 528 szptudot = UPAGES + clrnd(ctopt(p->p_dsize + p->p_ssize + e->e_xsize));
6e7a85b8 529 fracmem = ((float)p->p_rssize + szptudot)/CLSIZE/mempages;
fd57c467 530 if (p->p_textp && e->e_xccount)
6e7a85b8 531 fracmem += ((float)e->e_xrssize)/CLSIZE/e->e_xccount/mempages;
1d2a7f51
MK
532#else /* NEWVM */
533 /* XXX want pmap ptpages, segtab, etc. (per architecture) */
534 szptudot = UPAGES;
535 /* XXX don't have info about shared */
6e7a85b8 536 fracmem = ((float)e->e_vm.vm_rssize + szptudot)/CLSIZE/mempages;
1d2a7f51 537#endif /* NEWVM */
fd57c467
KB
538 return (100.0 * fracmem);
539}
540
8faab6ff
KB
541void
542pmem(k, ve)
fd57c467 543 KINFO *k;
8faab6ff 544 VARENT *ve;
fd57c467 545{
8faab6ff
KB
546 VAR *v;
547
548 v = ve->var;
549 (void)printf("%*.1f", v->width, getpmem(k));
fd57c467
KB
550}
551
8faab6ff
KB
552void
553pagein(k, ve)
fd57c467 554 KINFO *k;
8faab6ff 555 VARENT *ve;
fd57c467 556{
8faab6ff
KB
557 VAR *v;
558
559 v = ve->var;
560 (void)printf("%*d", v->width,
561 k->ki_u.u_valid ? k->ki_u.u_ru.ru_majflt : 0);
fd57c467
KB
562}
563
8faab6ff
KB
564void
565maxrss(k, ve)
fd57c467 566 KINFO *k;
8faab6ff 567 VARENT *ve;
fd57c467 568{
8faab6ff
KB
569 VAR *v;
570
571 v = ve->var;
1d2a7f51 572#ifndef NEWVM /* not yet */
967726ab 573 if (KI_PROC(k)->p_maxrss != (RLIM_INFINITY/NBPG))
8faab6ff 574 (void)printf("%*d", v->width, pgtok(KI_PROC(k)->p_maxrss));
fd57c467 575 else
1d2a7f51 576#endif /* NEWVM */
8faab6ff 577 (void)printf("%*s", v->width, "-");
fd57c467
KB
578}
579
8faab6ff
KB
580void
581tsize(k, ve)
fd57c467 582 KINFO *k;
8faab6ff 583 VARENT *ve;
fd57c467 584{
8faab6ff
KB
585 VAR *v;
586
587 v = ve->var;
1d2a7f51 588#ifndef NEWVM
8faab6ff 589 (void)printf("%*d", v->width, pgtok(KI_EPROC(k)->e_xsize));
1d2a7f51 590#else /* NEWVM */
8faab6ff 591 (void)printf("%*d", v->width, pgtok(KI_EPROC(k)->e_vm.vm_tsize));
1d2a7f51 592#endif /* NEWVM */
fd57c467
KB
593}
594
1d2a7f51 595#ifndef NEWVM
8faab6ff
KB
596void
597trss(k, ve)
fd57c467 598 KINFO *k;
8faab6ff 599 VARENT *ve;
fd57c467 600{
8faab6ff
KB
601 VAR *v;
602
603 v = ve->var;
604 (void)printf("%*d", v->width, pgtok(KI_EPROC(k)->e_xrssize));
fd57c467 605}
1d2a7f51 606#endif /* NEWVM */
fd57c467
KB
607
608/*
609 * Generic output routines. Print fields from various prototype
610 * structures.
611 */
8faab6ff
KB
612void
613pvar(k, ve)
fd57c467 614 KINFO *k;
8faab6ff 615 VARENT *ve;
fd57c467 616{
8faab6ff
KB
617 VAR *v;
618
619 v = ve->var;
967726ab 620 printval((char *)((char *)KI_PROC(k) + v->off), v);
fd57c467
KB
621}
622
8faab6ff
KB
623void
624evar(k, ve)
fd57c467 625 KINFO *k;
8faab6ff 626 VARENT *ve;
fd57c467 627{
8faab6ff
KB
628 VAR *v;
629
630 v = ve->var;
967726ab 631 printval((char *)((char *)KI_EPROC(k) + v->off), v);
fd57c467
KB
632}
633
8faab6ff
KB
634void
635uvar(k, ve)
fd57c467 636 KINFO *k;
8faab6ff 637 VARENT *ve;
fd57c467 638{
8faab6ff
KB
639 VAR *v;
640
641 v = ve->var;
967726ab
KM
642 if (k->ki_u.u_valid)
643 printval((char *)((char *)&k->ki_u + v->off), v);
fd57c467 644 else
8faab6ff 645 (void)printf("%*s", v->width, "-");
fd57c467
KB
646}
647
8faab6ff
KB
648void
649rvar(k, ve)
fd57c467 650 KINFO *k;
8faab6ff 651 VARENT *ve;
fd57c467 652{
8faab6ff
KB
653 VAR *v;
654
655 v = ve->var;
967726ab
KM
656 if (k->ki_u.u_valid)
657 printval((char *)((char *)(&k->ki_u.u_ru) + v->off), v);
fd57c467 658 else
8faab6ff 659 (void)printf("%*s", v->width, "-");
fd57c467
KB
660}
661
8faab6ff 662static void
fd57c467
KB
663printval(bp, v)
664 char *bp;
665 VAR *v;
666{
667 static char ofmt[32] = "%";
8faab6ff 668 register char *fcp, *cp;
fd57c467 669
8faab6ff
KB
670 cp = ofmt + 1;
671 fcp = v->fmt;
fd57c467
KB
672 if (v->flag & LJUST)
673 *cp++ = '-';
674 *cp++ = '*';
675 while (*cp++ = *fcp++);
676
677 switch (v->type) {
678 case CHAR:
8faab6ff 679 (void)printf(ofmt, v->width, *(char *)bp);
fd57c467
KB
680 break;
681 case UCHAR:
8faab6ff 682 (void)printf(ofmt, v->width, *(u_char *)bp);
fd57c467
KB
683 break;
684 case SHORT:
8faab6ff 685 (void)printf(ofmt, v->width, *(short *)bp);
fd57c467
KB
686 break;
687 case USHORT:
8faab6ff 688 (void)printf(ofmt, v->width, *(u_short *)bp);
fd57c467
KB
689 break;
690 case LONG:
8faab6ff 691 (void)printf(ofmt, v->width, *(long *)bp);
fd57c467
KB
692 break;
693 case ULONG:
8faab6ff 694 (void)printf(ofmt, v->width, *(u_long *)bp);
fd57c467
KB
695 break;
696 case KPTR:
8faab6ff 697 (void)printf(ofmt, v->width, *(u_long *)bp &~ KERNBASE);
fd57c467
KB
698 break;
699 default:
9ed1608e 700 err("unknown type %d", v->type);
fd57c467
KB
701 }
702}