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