- struct proc *xproc, *aproc;
- int nproc;
- register struct proc *pp;
- register loc, np;
- struct pte apte;
-
- nproc = getw(nl[SNPROC].n_value);
- xproc = (struct proc *)calloc(nproc, sizeof (struct proc));
- lseek(fc, (int)(aproc = (struct proc *)getw(nl[SPROC].n_value)), 0);
- read(fc, xproc, nproc * sizeof (struct proc));
- np = 0;
- for (pp=xproc; pp < &xproc[nproc]; pp++)
- if (pp->p_stat)
- np++;
- if (totflg) {
- printf("%3d/%3d processes\n", np, nproc);
- return;
- }
- printf("%d/%d processes\n", np, nproc);
- printf(" LOC S F POIP PRI SIG UID SLP TIM CPU NI PGRP PID PPID ADDR RSS SRSS SIZE WCHAN LINK TEXTP CLKT\n");
- for (pp=xproc; pp<&xproc[nproc]; pp++) {
- if (pp->p_stat==0 && allflg==0)
- continue;
- printf("%8x", aproc + (pp - xproc));
- printf(" %2d", pp->p_stat);
- printf(" %4x", pp->p_flag & 0xffff);
- printf(" %4d", pp->p_poip);
- printf(" %3d", pp->p_pri);
- printf(" %8x", pp->p_sig);
- printf(" %4d", pp->p_uid);
- printf(" %3d", pp->p_slptime);
- printf(" %3d", pp->p_time);
- printf(" %4d", pp->p_cpu&0377);
- printf(" %3d", pp->p_nice);
- printf(" %6d", pp->p_pgrp);
- printf(" %6d", pp->p_pid);
- printf(" %6d", pp->p_ppid);
- if (kflg)
- pp->p_addr = (struct pte *)clear((int)pp->p_addr);
- lseek(fc, (long)(Usrptma+btokmx(pp->p_addr)), 0);
- read(fc, &apte, sizeof(apte));
- printf(" %8x", ctob(apte.pg_pfnum+1) - sizeof(struct pte) * UPAGES);
- printf(" %4x", pp->p_rssize);
- printf(" %4x", pp->p_swrss);
- printf(" %5x", pp->p_dsize+pp->p_ssize);
- printf(" %7x", clear(pp->p_wchan));
- printf(" %7x", clear(pp->p_link));
- printf(" %7x", clear(pp->p_textp));
- printf(" %u", pp->p_clktim);
- printf("\n");
- }
+ register int flag;
+ struct inode inode, *ip = &inode;
+ char flagbuf[16], *flags = flagbuf;
+ char *name;
+ mode_t type;
+
+ KGETRET(VTOI(vp), &inode, sizeof(struct inode), "vnode's inode");
+ flag = ip->i_flag;
+ if (flag & ILOCKED)
+ *flags++ = 'L';
+ if (flag & IWANT)
+ *flags++ = 'W';
+ if (flag & IRENAME)
+ *flags++ = 'R';
+ if (flag & IUPD)
+ *flags++ = 'U';
+ if (flag & IACC)
+ *flags++ = 'A';
+ if (flag & ICHG)
+ *flags++ = 'C';
+ if (flag & IMOD)
+ *flags++ = 'M';
+ if (flag & ISHLOCK)
+ *flags++ = 'S';
+ if (flag & IEXLOCK)
+ *flags++ = 'E';
+ if (flag & ILWAIT)
+ *flags++ = 'Z';
+ if (flag == 0)
+ *flags++ = '-';
+ *flags = '\0';
+
+ (void)printf(" %6d %5s", ip->i_number, flagbuf);
+ type = ip->i_mode & S_IFMT;
+ if (S_ISCHR(ip->i_mode) || S_ISBLK(ip->i_mode))
+ if (usenumflag || ((name = devname(ip->i_rdev, type)) == NULL))
+ (void)printf(" %2d,%-2d",
+ major(ip->i_rdev), minor(ip->i_rdev));
+ else
+ (void)printf(" %7s", name);
+ else
+ (void)printf(" %7qd", ip->i_size);
+ return (0);