-char *
-kvm_getargs(p, up)
- struct proc *p;
- struct user *up;
-{
- char cmdbuf[CLBYTES*2];
- union {
- char argc[CLBYTES*2];
- int argi[CLBYTES*2/sizeof (int)];
- } argspac;
- register char *cp;
- register int *ip;
- char c;
- int nbad;
- struct dblock db;
- char *file;
-
- if (up == NULL || p->p_pid == 0 || p->p_pid == 2)
- goto retucomm;
- if ((p->p_flag & SLOAD) == 0 || argaddr1 == 0) {
- if (swap < 0 || p->p_ssize == 0)
- goto retucomm;
- vstodb(0, CLSIZE, &up->u_smap, &db, 1);
- (void) lseek(swap, (long)dtob(db.db_base), 0);
- if (read(swap, (char *)&argspac.argc[CLBYTES], CLBYTES)
- != CLBYTES)
- goto bad;
- vstodb(1, CLSIZE, &up->u_smap, &db, 1);
- (void) lseek(swap, (long)dtob(db.db_base), 0);
- if (read(swap, (char *)&argspac.argc[0], CLBYTES) != CLBYTES)
- goto bad;
- file = swapf;
- } else {
- if (argaddr0) {
- lseek(mem, (long)argaddr0, 0);
- if (read(mem, (char *)&argspac, CLBYTES) != CLBYTES)
- goto bad;
- } else
- bzero(&argspac, CLBYTES);
- lseek(mem, (long)argaddr1, 0);
- if (read(mem, &argspac.argc[CLBYTES], CLBYTES) != CLBYTES)
- goto bad;
- file = memf;
- }
- ip = &argspac.argi[CLBYTES*2/sizeof (int)];
- ip -= 2; /* last arg word and .long 0 */
- while (*--ip) {
- if (ip == argspac.argi)
- goto retucomm;
- }
- *(char *)ip = ' ';
- ip++;
- nbad = 0;
- for (cp = (char *)ip; cp < &argspac.argc[CLBYTES*2]; cp++) {
- c = *cp & 0177;
- if (c == 0)
- *cp = ' ';
- else if (c < ' ' || c > 0176) {
- if (++nbad >= 5*(0+1)) { /* eflg -> 0 XXX */
- *cp++ = ' ';
- break;
- }
- *cp = '?';
- } else if (0 == 0 && c == '=') { /* eflg -> 0 XXX */
- while (*--cp != ' ')
- if (cp <= (char *)ip)
- break;
- break;
- }
- }
- *cp = 0;
- while (*--cp == ' ')
- *cp = 0;
- cp = (char *)ip;
- (void) strncpy(cmdbuf, cp, &argspac.argc[CLBYTES*2] - cp);
- if (cp[0] == '-' || cp[0] == '?' || cp[0] <= ' ') {
- (void) strcat(cmdbuf, " (");
- (void) strncat(cmdbuf, p->p_comm, sizeof(p->p_comm));
- (void) strcat(cmdbuf, ")");
- }
- return (cmdbuf);
-
-bad:
- seterr("error locating command name for pid %d from %s\n",
- p->p_pid, file);
-retucomm:
- (void) strcpy(cmdbuf, " (");
- (void) strncat(cmdbuf, p->p_comm, sizeof (p->p_comm));
- (void) strcat(cmdbuf, ")");
- return (cmdbuf);