- lseek(kmem, (long)nl[X_NPROC].n_value, 0);
- read(kmem, &nproc, sizeof(nproc));
- pr = (struct pr *)calloc(nproc, sizeof (struct pr));
- np = 0;
- lseek(kmem, (long)nl[X_PROC].n_value, 0);
- read(kmem, &aproc, sizeof(aproc));
- for (pn=0; pn<nproc; pn++) {
- lseek(kmem, (int)(aproc + pn), 0);
- read(kmem, &mproc, sizeof mproc);
- /* decide if it's an interesting process */
- if (mproc.p_stat==0 || mproc.p_pgrp==0)
- continue;
- /* find & read in the user structure */
- if ((mproc.p_flag & SLOAD) == 0) {
- /* not in memory - get from swap device */
- addr = mproc.p_swaddr<<9;
- lseek(swap, (long)addr, 0);
- if (read(swap, &up, sizeof(up)) != sizeof(up)) {
- continue;
- }
- } else {
- int p0br, cc;
-#define INTPPG (NBPG / sizeof (int))
- struct pte pagetbl[NBPG / sizeof (struct pte)];
- /* loaded, get each page from memory separately */
- szpt = mproc.p_szpt;
- p0br = (int)mproc.p_p0br;
- pte = &Usrptma[btokmx(mproc.p_p0br) + szpt-1];
- lseek(kmem, (long)pte, 0);
- if (read(kmem, &apte, sizeof(apte)) != sizeof(apte))
- continue;
- lseek(mem, ctob(apte.pg_pfnum), 0);
- if (read(mem,pagetbl,sizeof(pagetbl)) != sizeof(pagetbl))
-cont:
- continue;
- for(cc=0; cc<UPAGES; cc++) { /* get u area */
- int upage = pagetbl[NPTEPG-UPAGES+cc].pg_pfnum;
- lseek(mem,ctob(upage),0);
- if (read(mem,((int *)&up)+INTPPG*cc,NBPG) != NBPG)
- goto cont;
- }
- szpt = up.u_pcb.pcb_szpt;
- pr[np].w_seekaddr = ctob(apte.pg_pfnum);
- }
- vstodb(0, CLSIZE, &up.u_smap, &db, 1);
- pr[np].w_lastpg = ctob(db.db_base);
- if (up.u_ttyp == NULL)
- continue;
-
- /* save the interesting parts */
- pr[np].w_pid = mproc.p_pid;
- pr[np].w_flag = mproc.p_flag;
- pr[np].w_size = mproc.p_dsize + mproc.p_ssize;
- pr[np].w_igintr = (((int)up.u_signal[2]==1) + 2*((int)up.u_signal[2]>1) + 3*((int)up.u_signal[3]==1)) + 6*((int)up.u_signal[3]>1);
- pr[np].w_time =
- up.u_ru.ru_utime.tv_sec + up.u_ru.ru_stime.tv_sec;
- pr[np].w_ctime =
- up.u_cru.ru_utime.tv_sec + up.u_cru.ru_stime.tv_sec;
- pr[np].w_tty = up.u_ttyd;
- up.u_comm[14] = 0; /* Bug: This bombs next field. */
- strcpy(pr[np].w_comm, up.u_comm);
- /*
- * Get args if there's a chance we'll print it.
- * Cant just save pointer: getargs returns static place.
- * Cant use strcpyn: that crock blank pads.
- */
- pr[np].w_args[0] = 0;
- strcatn(pr[np].w_args,getargs(&pr[np]),ARGWIDTH);
- if (pr[np].w_args[0]==0 || pr[np].w_args[0]=='-' && pr[np].w_args[1]<=' ' || pr[np].w_args[0] == '?') {
- strcat(pr[np].w_args, " (");
- strcat(pr[np].w_args, pr[np].w_comm);
- strcat(pr[np].w_args, ")");
+ mib[0] = CTL_KERN;
+ mib[1] = KERN_BOOTTIME;
+ size = sizeof(boottime);
+ if (sysctl(mib, 2, &boottime, &size, NULL, 0) != -1 &&
+ boottime.tv_sec != 0) {
+ uptime = now - boottime.tv_sec;
+ uptime += 30;
+ days = uptime / SECSPERDAY;
+ uptime %= SECSPERDAY;
+ hrs = uptime / SECSPERHOUR;
+ uptime %= SECSPERHOUR;
+ mins = uptime / SECSPERMIN;
+ (void)printf(" up");
+ if (days > 0)
+ (void)printf(" %d day%s,", days, days > 1 ? "s" : "");
+ if (hrs > 0 && mins > 0)
+ (void)printf(" %2d:%02d,", hrs, mins);
+ else {
+ if (hrs > 0)
+ (void)printf(" %d hr%s,",
+ hrs, hrs > 1 ? "s" : "");
+ if (mins > 0)
+ (void)printf(" %d min%s,",
+ mins, mins > 1 ? "s" : "");