|
|
1.1 root 1: #include "ps.h"
2: #include <sys/vmmac.h>
3:
4: #define NSTACK 8192
5: #define NCMD 63
6: #define CMDSIZ (4*((DIRSIZ + 3 + 3)/4))
7:
8: char stack[NSTACK], cmdline[CMDSIZ];
9:
10: char *
11: getargs(f, pp, up)
12: int f; register struct proc *pp; register struct user *up;
13: {
14: register char *sp; char *argp, *argend, *envend;
15: int nstack, staddr, stblk;
16:
17: nstack = ctob(up->u_ssize);
18: if (nstack > NSTACK)
19: nstack = NSTACK;
20: staddr = STTOP - nstack;
21:
22: if (pp->p_flag & SLOAD) {
23: if (!Seek(f, staddr) || !Read(f, stack, nstack))
24: goto ucommand;
25: } else {
26: stblk = up->u_smap.dm_map[dndmap()] + DMMIN;
27: if (!Seek(drum, stblk*NBPG/ctod(1) - nstack) ||
28: !Read(drum, stack, nstack))
29: goto ucommand;
30: }
31:
32: sp = stack + nstack;
33: while (*--sp == 0)
34: if (sp <= stack) goto ucommand;
35: envend = sp + 2;
36:
37: sp = (char *)((long)sp & (~3));
38: while (*(long *)(sp -= 4) != 0)
39: if (sp <= stack) goto ucommand;
40: argp = sp + 4;
41:
42: while (*(long *)(sp -= 4) != 0)
43: if (sp <= stack) goto ucommand;
44: argend = *(long *)(sp + 4) - staddr + stack; /* envp[0] */
45:
46: if (argend <= argp || argend > envend )
47: argend = envend;
48: if (argend > (sp = argp + NCMD))
49: argend = sp;
50: for (sp = argp; sp < argend; sp++) {
51: if (*sp == 0 || *sp == '\t')
52: *sp = ' ';
53: else if (*sp < ' ' || *sp >= 0177)
54: *sp = '?';
55: }
56: while (sp[-1] == ' ')
57: sp--;
58: *sp = 0;
59: return argp;
60:
61: ucommand:
62: sprintf(cmdline, "(%-.*s)", DIRSIZ, up->u_comm);
63: return cmdline;
64: }
65:
66: dndmap()
67: {
68: register f, n; char cbuf[16];
69: static called, delta;
70: if (called++)
71: return delta;
72: if ((f = open("/etc/ndmap", 0)) < 0)
73: return 0;
74: n = read(f, cbuf, sizeof cbuf-1);
75: close(f);
76: if (n <= 0)
77: return 0;
78: cbuf[n] = 0;
79: return (delta = atoi(cbuf) - NDMAP);
80: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.