+ printf("%9.1x", fp->f_inode);
+ printf(" %ld\n", fp->f_un.f_offset);
+ }
+}
+
+doswap()
+{
+ struct proc proc[NPROC];
+ struct text xtext[NTEXT];
+ struct map swapmap[SMAPSIZ];
+ register struct proc *pp;
+ int nswap, used, tused, free;
+ register struct map *mp;
+ register struct text *xp;
+
+ lseek(fc, (long)nl[SPROC].n_value, 0);
+ read(fc, proc, sizeof(proc));
+ lseek(fc, (long)nl[SWAPMAP].n_value, 0);
+ read(fc, swapmap, sizeof(swapmap));
+ lseek(fc, (long)nl[SNSWAP].n_value, 0);
+ read(fc, &nswap, sizeof(nswap));
+ free = 0;
+ for (mp = swapmap; mp < &swapmap[SMAPSIZ]; mp++)
+ free += mp->m_size;
+ lseek(fc, (long)nl[STEXT].n_value, 0);
+ read(fc, xtext, sizeof(xtext));
+ tused = 0;
+ for (xp = xtext; xp < &xtext[NTEXT]; xp++)
+ if (xp->x_iptr!=NULL)
+ tused += xdsize(xp);
+ used = tused;
+ for (pp = proc; pp < &proc[NPROC]; pp++) {
+ if (pp->p_stat == 0 || pp->p_stat == SZOMB)
+ continue;
+ if (pp->p_flag & SSYS)
+ continue;
+ used += up(pp->p_dsize) + up(pp->p_ssize);
+ if ((pp->p_flag&SLOAD) == 0)
+ used += vusize(pp);
+ }
+ /* a DMMAX block goes to argmap */
+ if (totflg) {
+ printf("%3d/%3d 00k swap\n", used/2/100, (used+free)/2/100);
+ return;
+ }
+ printf("%d used (%d text), %d free, %d missing\n",
+ used/2, tused/2, free/2, (nswap - DMMAX - (used + free))/2);
+}
+
+up(size)
+ register int size;
+{
+ register int i, block;
+
+ i = 0;
+ block = DMMIN;
+ while (i < size) {
+ i += block;
+ if (block < DMMAX)
+ block *= 2;