|
|
researchv9-SUN3(old)
#include "ps.h"
#include <sys/vmmac.h>
#define NSTACK 8192
#define NCMD 63
#define CMDSIZ (4*((DIRSIZ + 3 + 3)/4))
char stack[NSTACK], cmdline[CMDSIZ];
char *
getargs(f, pp, up)
int f; register struct proc *pp; register struct user *up;
{
register char *sp; char *argp, *argend, *envend;
int nstack, staddr, stblk;
nstack = ctob(up->u_ssize);
if (nstack > NSTACK)
nstack = NSTACK;
staddr = STTOP - nstack;
if (pp->p_flag & SLOAD) {
if (!Seek(f, staddr) || !Read(f, stack, nstack))
goto ucommand;
} else {
stblk = up->u_smap.dm_map[dndmap()] + DMMIN;
if (!Seek(drum, stblk*NBPG/ctod(1) - nstack) ||
!Read(drum, stack, nstack))
goto ucommand;
}
sp = stack + nstack;
while (*--sp == 0)
if (sp <= stack) goto ucommand;
envend = sp + 2;
sp = (char *)((long)sp & (~3));
while (*(long *)(sp -= 4) != 0)
if (sp <= stack) goto ucommand;
argp = sp + 4;
while (*(long *)(sp -= 4) != 0)
if (sp <= stack) goto ucommand;
argend = *(long *)(sp + 4) - staddr + stack; /* envp[0] */
if (argend <= argp || argend > envend )
argend = envend;
if (argend > (sp = argp + NCMD))
argend = sp;
for (sp = argp; sp < argend; sp++) {
if (*sp == 0 || *sp == '\t')
*sp = ' ';
else if (*sp < ' ' || *sp >= 0177)
*sp = '?';
}
while (sp[-1] == ' ')
sp--;
*sp = 0;
return argp;
ucommand:
sprintf(cmdline, "(%-.*s)", DIRSIZ, up->u_comm);
return cmdline;
}
dndmap()
{
register f, n; char cbuf[16];
static called, delta;
if (called++)
return delta;
if ((f = open("/etc/ndmap", 0)) < 0)
return 0;
n = read(f, cbuf, sizeof cbuf-1);
close(f);
if (n <= 0)
return 0;
cbuf[n] = 0;
return (delta = atoi(cbuf) - NDMAP);
}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.