|
|
1.1 ! root 1: #ifndef lint ! 2: static char *sccsid = "@(#)w.c 4.12 (Berkeley) 5/27/83"; ! 3: #endif ! 4: /* ! 5: * w - print system status (who and what) ! 6: * ! 7: * This program is similar to the systat command on Tenex/Tops 10/20 ! 8: * It needs read permission on /dev/mem, /dev/kmem, and /dev/drum. ! 9: */ ! 10: #include <sys/param.h> ! 11: #include <nlist.h> ! 12: #include <stdio.h> ! 13: #include <ctype.h> ! 14: #include <utmp.h> ! 15: #include <sys/stat.h> ! 16: #include <sys/dir.h> ! 17: #include <sys/user.h> ! 18: #include <sys/proc.h> ! 19: #include <machine/pte.h> ! 20: #include <sys/vm.h> ! 21: ! 22: #define NMAX sizeof(utmp.ut_name) ! 23: #define LMAX sizeof(utmp.ut_line) ! 24: ! 25: #define ARGWIDTH 40 /* # chars left on 80 col crt for args */ ! 26: ! 27: struct pr { ! 28: short w_pid; /* proc.p_pid */ ! 29: char w_flag; /* proc.p_flag */ ! 30: short w_size; /* proc.p_size */ ! 31: long w_seekaddr; /* where to find args */ ! 32: long w_lastpg; /* disk address of stack */ ! 33: int w_igintr; /* INTR+3*QUIT, 0=die, 1=ign, 2=catch */ ! 34: time_t w_time; /* CPU time used by this process */ ! 35: time_t w_ctime; /* CPU time used by children */ ! 36: dev_t w_tty; /* tty device of process */ ! 37: char w_comm[15]; /* user.u_comm, null terminated */ ! 38: char w_args[ARGWIDTH+1]; /* args if interesting process */ ! 39: } *pr; ! 40: int nproc; ! 41: ! 42: struct nlist nl[] = { ! 43: { "_proc" }, ! 44: #define X_PROC 0 ! 45: { "_swapdev" }, ! 46: #define X_SWAPDEV 1 ! 47: { "_Usrptmap" }, ! 48: #define X_USRPTMA 2 ! 49: { "_usrpt" }, ! 50: #define X_USRPT 3 ! 51: { "_nswap" }, ! 52: #define X_NSWAP 4 ! 53: { "_avenrun" }, ! 54: #define X_AVENRUN 5 ! 55: { "_boottime" }, ! 56: #define X_BOOTTIME 6 ! 57: { "_nproc" }, ! 58: #define X_NPROC 7 ! 59: { "_dmmin" }, ! 60: #define X_DMMIN 8 ! 61: { "_dmmax" }, ! 62: #define X_DMMAX 9 ! 63: { "" }, ! 64: }; ! 65: ! 66: FILE *ps; ! 67: FILE *ut; ! 68: FILE *bootfd; ! 69: int kmem; ! 70: int mem; ! 71: int swap; /* /dev/kmem, mem, and swap */ ! 72: int nswap; ! 73: int dmmin, dmmax; ! 74: dev_t tty; ! 75: char doing[520]; /* process attached to terminal */ ! 76: time_t proctime; /* cpu time of process in doing */ ! 77: double avenrun[3]; ! 78: struct proc *aproc; ! 79: ! 80: #define DIV60(t) ((t+30)/60) /* x/60 rounded */ ! 81: #define TTYEQ (tty == pr[i].w_tty) ! 82: #define IGINT (1+3*1) /* ignoring both SIGINT & SIGQUIT */ ! 83: ! 84: char *getargs(); ! 85: char *fread(); ! 86: char *asctime(); ! 87: char *rindex(); ! 88: FILE *popen(); ! 89: struct tm *localtime(); ! 90: ! 91: int debug; /* true if -d flag: debugging output */ ! 92: int header = 1; /* true if -h flag: don't print heading */ ! 93: int lflag = 1; /* true if -l flag: long style output */ ! 94: int login; /* true if invoked as login shell */ ! 95: int idle; /* number of minutes user is idle */ ! 96: int nusers; /* number of users logged in now */ ! 97: char * sel_user; /* login of particular user selected */ ! 98: char firstchar; /* first char of name of prog invoked as */ ! 99: time_t jobtime; /* total cpu time visible */ ! 100: time_t now; /* the current time of day */ ! 101: int nowd; /* current day of month */ ! 102: struct tm *nowt; /* current time as time struct */ ! 103: struct timeval boottime; ! 104: time_t uptime; /* time of last reboot & elapsed time since */ ! 105: int np; /* number of processes currently active */ ! 106: struct utmp utmp; ! 107: struct proc mproc; ! 108: union { ! 109: struct user U_up; ! 110: char pad[NBPG][UPAGES]; ! 111: } Up; ! 112: #define up Up.U_up ! 113: ! 114: main(argc, argv) ! 115: char **argv; ! 116: { ! 117: int days, hrs, mins; ! 118: register int i, j; ! 119: char *cp; ! 120: register int curpid, level; ! 121: char obuf[BUFSIZ]; ! 122: ! 123: setbuf(stdout, obuf); ! 124: login = (argv[0][0] == '-'); ! 125: cp = rindex(argv[0], '/'); ! 126: firstchar = login ? argv[0][1] : (cp==0) ? argv[0][0] : cp[1]; ! 127: cp = argv[0]; /* for Usage */ ! 128: ! 129: while (argc > 1) { ! 130: if (argv[1][0] == '-') { ! 131: for (i=1; argv[1][i]; i++) { ! 132: switch(argv[1][i]) { ! 133: ! 134: case 'd': ! 135: debug++; ! 136: break; ! 137: ! 138: case 'h': ! 139: header = 0; ! 140: break; ! 141: ! 142: case 'l': ! 143: lflag++; ! 144: break; ! 145: ! 146: case 's': ! 147: lflag = 0; ! 148: break; ! 149: ! 150: case 'u': ! 151: case 'w': ! 152: firstchar = argv[1][i]; ! 153: break; ! 154: ! 155: default: ! 156: printf("Bad flag %s\n", argv[1]); ! 157: exit(1); ! 158: } ! 159: } ! 160: } else { ! 161: if (!isalnum(argv[1][0]) || argc > 2) { ! 162: printf("Usage: %s [ -hlsuw ] [ user ]\n", cp); ! 163: exit(1); ! 164: } else ! 165: sel_user = argv[1]; ! 166: } ! 167: argc--; argv++; ! 168: } ! 169: ! 170: if ((kmem = open("/dev/kmem", 0)) < 0) { ! 171: fprintf(stderr, "No kmem\n"); ! 172: exit(1); ! 173: } ! 174: nlist("/vmunix", nl); ! 175: if (nl[0].n_type==0) { ! 176: fprintf(stderr, "No namelist\n"); ! 177: exit(1); ! 178: } ! 179: ! 180: if (firstchar != 'u') ! 181: readpr(); ! 182: ! 183: ut = fopen("/etc/utmp","r"); ! 184: time(&now); ! 185: nowt = localtime(&now); ! 186: nowd = nowt->tm_yday; ! 187: if (header) { ! 188: /* Print time of day */ ! 189: printf("%12.12s", asctime(nowt)+4); ! 190: ! 191: /* ! 192: * Print how long system has been up. ! 193: * (Found by looking for "boottime" in kernel) ! 194: */ ! 195: lseek(kmem, (long)nl[X_BOOTTIME].n_value, 0); ! 196: read(kmem, &boottime, sizeof (boottime)); ! 197: ! 198: uptime = now - boottime.tv_sec; ! 199: uptime += 30; ! 200: days = uptime / (60*60*24); ! 201: uptime %= (60*60*24); ! 202: hrs = uptime / (60*60); ! 203: uptime %= (60*60); ! 204: mins = uptime / 60; ! 205: ! 206: printf(" up"); ! 207: if (days > 0) ! 208: printf(" %d day%s,", days, days>1?"s":""); ! 209: if (hrs > 0 && mins > 0) { ! 210: printf(" %2d:%02d,", hrs, mins); ! 211: } else { ! 212: if (hrs > 0) ! 213: printf(" %d hr%s,", hrs, hrs>1?"s":""); ! 214: if (mins > 0) ! 215: printf(" %d min%s,", mins, mins>1?"s":""); ! 216: } ! 217: ! 218: /* Print number of users logged in to system */ ! 219: while (fread(&utmp, sizeof(utmp), 1, ut)) { ! 220: if (utmp.ut_name[0] != '\0') ! 221: nusers++; ! 222: } ! 223: rewind(ut); ! 224: printf(" %d users", nusers); ! 225: ! 226: /* ! 227: * Print 1, 5, and 15 minute load averages. ! 228: * (Found by looking in kernel for avenrun). ! 229: */ ! 230: printf(", load average:"); ! 231: lseek(kmem, (long)nl[X_AVENRUN].n_value, 0); ! 232: read(kmem, avenrun, sizeof(avenrun)); ! 233: for (i = 0; i < (sizeof(avenrun)/sizeof(avenrun[0])); i++) { ! 234: if (i > 0) ! 235: printf(","); ! 236: printf(" %.2f", avenrun[i]); ! 237: } ! 238: printf("\n"); ! 239: if (firstchar == 'u') ! 240: exit(0); ! 241: ! 242: /* Headers for rest of output */ ! 243: if (lflag) ! 244: printf("User tty login@ idle JCPU PCPU what\n"); ! 245: else ! 246: printf("User tty idle what\n"); ! 247: fflush(stdout); ! 248: } ! 249: ! 250: ! 251: for (;;) { /* for each entry in utmp */ ! 252: if (fread(&utmp, sizeof(utmp), 1, ut) == NULL) { ! 253: fclose(ut); ! 254: exit(0); ! 255: } ! 256: if (utmp.ut_name[0] == '\0') ! 257: continue; /* that tty is free */ ! 258: if (sel_user && strcmpn(utmp.ut_name, sel_user, NMAX) != 0) ! 259: continue; /* we wanted only somebody else */ ! 260: ! 261: gettty(); ! 262: jobtime = 0; ! 263: proctime = 0; ! 264: strcpy(doing, "-"); /* default act: normally never prints */ ! 265: level = 0; ! 266: curpid = -1; ! 267: idle = findidle(); ! 268: for (i=0; i<np; i++) { /* for each process on this tty */ ! 269: if (!(TTYEQ)) ! 270: continue; ! 271: jobtime += pr[i].w_time + pr[i].w_ctime; ! 272: proctime += pr[i].w_time; ! 273: if (debug) { ! 274: printf("\t\t%d\t%s", pr[i].w_pid, pr[i].w_args); ! 275: if ((j=pr[i].w_igintr) > 0) ! 276: if (j==IGINT) ! 277: printf(" &"); ! 278: else ! 279: printf(" & %d %d", j%3, j/3); ! 280: printf("\n"); ! 281: } ! 282: /* compute priority for print: shell<background<regular */ ! 283: if(pr[i].w_args[0] == '-') ! 284: j = 1; ! 285: else if(pr[i].w_igintr==IGINT) ! 286: j = 2; ! 287: else ! 288: j = 3; ! 289: if(j>level || j==level && pr[i].w_pid>curpid){ ! 290: level = j; ! 291: curpid = pr[i].w_pid; ! 292: strcpy(doing, lflag ? pr[i].w_args : pr[i].w_comm); ! 293: #ifdef notdef ! 294: if (doing[0]==0 || doing[0]=='-' && doing[1]<=' ' || doing[0] == '?') { ! 295: strcat(doing, " ("); ! 296: strcat(doing, pr[i].w_comm); ! 297: strcat(doing, ")"); ! 298: } ! 299: #endif ! 300: } ! 301: } ! 302: putline(); ! 303: } ! 304: } ! 305: ! 306: /* figure out the major/minor device # pair for this tty */ ! 307: gettty() ! 308: { ! 309: char ttybuf[20]; ! 310: struct stat statbuf; ! 311: ! 312: ttybuf[0] = 0; ! 313: strcpy(ttybuf, "/dev/"); ! 314: strcat(ttybuf, utmp.ut_line); ! 315: stat(ttybuf, &statbuf); ! 316: tty = statbuf.st_rdev; ! 317: } ! 318: ! 319: /* ! 320: * putline: print out the accumulated line of info about one user. ! 321: */ ! 322: putline() ! 323: { ! 324: register int tm; ! 325: ! 326: /* print login name of the user */ ! 327: printf("%-*.*s ", NMAX, NMAX, utmp.ut_name); ! 328: ! 329: /* print tty user is on */ ! 330: #ifdef notdef ! 331: if (lflag) ! 332: /* long form: all (up to) LMAX chars */ ! 333: printf("%-*.*s", LMAX, LMAX, utmp.ut_line); ! 334: else { ! 335: #endif ! 336: /* short form: 2 chars, skipping 'tty' if there */ ! 337: if (utmp.ut_line[0]=='t' && utmp.ut_line[1]=='t' && utmp.ut_line[2]=='y') ! 338: printf("%-2.2s ", &utmp.ut_line[3]); ! 339: else ! 340: printf("%-2.2s ", utmp.ut_line); ! 341: #ifdef notdef ! 342: } ! 343: #endif ! 344: ! 345: if (lflag) ! 346: /* print when the user logged in */ ! 347: prtat(localtime(&utmp.ut_time)); ! 348: ! 349: /* print idle time */ ! 350: prttime(idle, 60*24); ! 351: ! 352: if (lflag) { ! 353: /* print CPU time for all processes & children */ ! 354: prttime(jobtime, 60*60); ! 355: /* print cpu time for interesting process */ ! 356: prttime(proctime, 60*60); ! 357: } ! 358: ! 359: /* what user is doing, either command tail or args */ ! 360: printf("%-.*s\n", ARGWIDTH, doing); ! 361: fflush(stdout); ! 362: } ! 363: ! 364: /* find & return number of minutes current tty has been idle */ ! 365: findidle() ! 366: { ! 367: struct stat stbuf; ! 368: long lastaction, diff; ! 369: char ttyname[20]; ! 370: ! 371: strcpy(ttyname, "/dev/"); ! 372: strcatn(ttyname, utmp.ut_line, LMAX); ! 373: stat(ttyname, &stbuf); ! 374: time(&now); ! 375: lastaction = stbuf.st_atime; ! 376: diff = now - lastaction; ! 377: diff = DIV60(diff); ! 378: if (diff < 0) diff = 0; ! 379: return(diff); ! 380: } ! 381: ! 382: /* ! 383: * prttime prints a time in days, hours, minutes or hours, minutes, seconds. ! 384: */ ! 385: prttime(tim, big) ! 386: register time_t tim; ! 387: register big; ! 388: { ! 389: if(tim >= big) { ! 390: printf("%d%c", tim/big, big==60*60 ? ':' : 'd'); ! 391: tim %= big; ! 392: printf("%02d:%02d ", tim/60, tim%60); ! 393: } ! 394: else if (tim >= 60) ! 395: printf("%2d:%02d ", tim/60, tim%60); ! 396: else if (tim > 0) ! 397: printf("%5d ", tim); ! 398: else ! 399: printf(" "); ! 400: } ! 401: ! 402: /* prtat prints a time given a pointer to a time of day; ! 403: date is printed if not today */ ! 404: prtat(p) ! 405: register struct tm *p; ! 406: { ! 407: if(p->tm_yday != nowd) ! 408: printf("%2d ", p->tm_mday); ! 409: else ! 410: printf(" "); ! 411: printf("%02d:%02d ", p->tm_hour, p->tm_min); ! 412: } ! 413: ! 414: /* ! 415: * readpr finds and reads in the array pr, containing the interesting ! 416: * parts of the proc and user tables for each live process. ! 417: */ ! 418: readpr() ! 419: { ! 420: int pn, mf, addr, c; ! 421: int szpt, pfnum, i; ! 422: struct pte *Usrptma, *usrpt, *pte, apte; ! 423: struct dblock db; ! 424: ! 425: Usrptma = (struct pte *) nl[X_USRPTMA].n_value; ! 426: usrpt = (struct pte *) nl[X_USRPT].n_value; ! 427: if((mem = open("/dev/mem", 0)) < 0) { ! 428: fprintf(stderr, "No mem\n"); ! 429: exit(1); ! 430: } ! 431: if ((swap = open("/dev/drum", 0)) < 0) { ! 432: fprintf(stderr, "No drum\n"); ! 433: exit(1); ! 434: } ! 435: /* ! 436: * read mem to find swap dev. ! 437: */ ! 438: lseek(kmem, (long)nl[X_SWAPDEV].n_value, 0); ! 439: read(kmem, &nl[X_SWAPDEV].n_value, sizeof(nl[X_SWAPDEV].n_value)); ! 440: /* ! 441: * Find base of and parameters of swap ! 442: */ ! 443: lseek(kmem, (long)nl[X_NSWAP].n_value, 0); ! 444: read(kmem, &nswap, sizeof(nswap)); ! 445: lseek(kmem, (long)nl[X_DMMIN].n_value, 0); ! 446: read(kmem, &dmmin, sizeof(dmmin)); ! 447: lseek(kmem, (long)nl[X_DMMAX].n_value, 0); ! 448: read(kmem, &dmmax, sizeof(dmmax)); ! 449: /* ! 450: * Locate proc table ! 451: */ ! 452: lseek(kmem, (long)nl[X_NPROC].n_value, 0); ! 453: read(kmem, &nproc, sizeof(nproc)); ! 454: pr = (struct pr *)calloc(nproc, sizeof (struct pr)); ! 455: np = 0; ! 456: lseek(kmem, (long)nl[X_PROC].n_value, 0); ! 457: read(kmem, &aproc, sizeof(aproc)); ! 458: for (pn=0; pn<nproc; pn++) { ! 459: lseek(kmem, (int)(aproc + pn), 0); ! 460: read(kmem, &mproc, sizeof mproc); ! 461: /* decide if it's an interesting process */ ! 462: if (mproc.p_stat==0 || mproc.p_pgrp==0) ! 463: continue; ! 464: /* find & read in the user structure */ ! 465: if ((mproc.p_flag & SLOAD) == 0) { ! 466: /* not in memory - get from swap device */ ! 467: addr = dtob(mproc.p_swaddr); ! 468: lseek(swap, (long)addr, 0); ! 469: if (read(swap, &up, sizeof(up)) != sizeof(up)) { ! 470: continue; ! 471: } ! 472: } else { ! 473: int p0br, cc; ! 474: #define INTPPG (NBPG / sizeof (int)) ! 475: struct pte pagetbl[NBPG / sizeof (struct pte)]; ! 476: /* loaded, get each page from memory separately */ ! 477: szpt = mproc.p_szpt; ! 478: p0br = (int)mproc.p_p0br; ! 479: pte = &Usrptma[btokmx(mproc.p_p0br) + szpt-1]; ! 480: lseek(kmem, (long)pte, 0); ! 481: if (read(kmem, &apte, sizeof(apte)) != sizeof(apte)) ! 482: continue; ! 483: lseek(mem, ctob(apte.pg_pfnum), 0); ! 484: if (read(mem,pagetbl,sizeof(pagetbl)) != sizeof(pagetbl)) ! 485: cont: ! 486: continue; ! 487: for(cc=0; cc<UPAGES; cc++) { /* get u area */ ! 488: int upage = pagetbl[NPTEPG-UPAGES+cc].pg_pfnum; ! 489: lseek(mem,ctob(upage),0); ! 490: if (read(mem,((int *)&up)+INTPPG*cc,NBPG) != NBPG) ! 491: goto cont; ! 492: } ! 493: szpt = up.u_pcb.pcb_szpt; ! 494: pr[np].w_seekaddr = ctob(apte.pg_pfnum); ! 495: } ! 496: vstodb(0, CLSIZE, &up.u_smap, &db, 1); ! 497: pr[np].w_lastpg = dtob(db.db_base); ! 498: if (up.u_ttyp == NULL) ! 499: continue; ! 500: ! 501: /* save the interesting parts */ ! 502: pr[np].w_pid = mproc.p_pid; ! 503: pr[np].w_flag = mproc.p_flag; ! 504: pr[np].w_size = mproc.p_dsize + mproc.p_ssize; ! 505: pr[np].w_igintr = (((int)up.u_signal[2]==1) + ! 506: 2*((int)up.u_signal[2]>1) + 3*((int)up.u_signal[3]==1)) + ! 507: 6*((int)up.u_signal[3]>1); ! 508: pr[np].w_time = ! 509: up.u_ru.ru_utime.tv_sec + up.u_ru.ru_stime.tv_sec; ! 510: pr[np].w_ctime = ! 511: up.u_cru.ru_utime.tv_sec + up.u_cru.ru_stime.tv_sec; ! 512: pr[np].w_tty = up.u_ttyd; ! 513: up.u_comm[14] = 0; /* Bug: This bombs next field. */ ! 514: strcpy(pr[np].w_comm, up.u_comm); ! 515: /* ! 516: * Get args if there's a chance we'll print it. ! 517: * Cant just save pointer: getargs returns static place. ! 518: * Cant use strcpyn: that crock blank pads. ! 519: */ ! 520: pr[np].w_args[0] = 0; ! 521: strcatn(pr[np].w_args,getargs(&pr[np]),ARGWIDTH); ! 522: if (pr[np].w_args[0]==0 || pr[np].w_args[0]=='-' && pr[np].w_args[1]<=' ' || pr[np].w_args[0] == '?') { ! 523: strcat(pr[np].w_args, " ("); ! 524: strcat(pr[np].w_args, pr[np].w_comm); ! 525: strcat(pr[np].w_args, ")"); ! 526: } ! 527: np++; ! 528: } ! 529: } ! 530: ! 531: /* ! 532: * getargs: given a pointer to a proc structure, this looks at the swap area ! 533: * and tries to reconstruct the arguments. This is straight out of ps. ! 534: */ ! 535: char * ! 536: getargs(p) ! 537: struct pr *p; ! 538: { ! 539: int c, addr, nbad; ! 540: static int abuf[CLSIZE*NBPG/sizeof(int)]; ! 541: struct pte pagetbl[NPTEPG]; ! 542: register int *ip; ! 543: register char *cp, *cp1; ! 544: ! 545: if ((p->w_flag & SLOAD) == 0) { ! 546: lseek(swap, p->w_lastpg, 0); ! 547: if (read(swap, abuf, sizeof(abuf)) != sizeof(abuf)) ! 548: return(p->w_comm); ! 549: } else { ! 550: c = p->w_seekaddr; ! 551: lseek(mem,c,0); ! 552: if (read(mem,pagetbl,NBPG) != NBPG) ! 553: return(p->w_comm); ! 554: if (pagetbl[NPTEPG-CLSIZE-UPAGES].pg_fod==0 && pagetbl[NPTEPG-CLSIZE-UPAGES].pg_pfnum) { ! 555: lseek(mem,ctob(pagetbl[NPTEPG-CLSIZE-UPAGES].pg_pfnum),0); ! 556: if (read(mem,abuf,sizeof(abuf)) != sizeof(abuf)) ! 557: return(p->w_comm); ! 558: } else { ! 559: lseek(swap, p->w_lastpg, 0); ! 560: if (read(swap, abuf, sizeof(abuf)) != sizeof(abuf)) ! 561: return(p->w_comm); ! 562: } ! 563: } ! 564: abuf[sizeof(abuf)/sizeof(abuf[0])-1] = 0; ! 565: for (ip = &abuf[sizeof(abuf)/sizeof(abuf[0])-2]; ip > abuf;) { ! 566: /* Look from top for -1 or 0 as terminator flag. */ ! 567: if (*--ip == -1 || *ip == 0) { ! 568: cp = (char *)(ip+1); ! 569: if (*cp==0) ! 570: cp++; ! 571: nbad = 0; /* up to 5 funny chars as ?'s */ ! 572: for (cp1 = cp; cp1 < (char *)&abuf[sizeof(abuf)/sizeof(abuf[0])]; cp1++) { ! 573: c = *cp1&0177; ! 574: if (c==0) /* nulls between args => spaces */ ! 575: *cp1 = ' '; ! 576: else if (c < ' ' || c > 0176) { ! 577: if (++nbad >= 5) { ! 578: *cp1++ = ' '; ! 579: break; ! 580: } ! 581: *cp1 = '?'; ! 582: } else if (c=='=') { /* Oops - found an ! 583: * environment var, back ! 584: * over & erase it. */ ! 585: *cp1 = 0; ! 586: while (cp1>cp && *--cp1!=' ') ! 587: *cp1 = 0; ! 588: break; ! 589: } ! 590: } ! 591: while (*--cp1==' ') /* strip trailing spaces */ ! 592: *cp1 = 0; ! 593: return(cp); ! 594: } ! 595: } ! 596: return (p->w_comm); ! 597: } ! 598: ! 599: /* ! 600: * Given a base/size pair in virtual swap area, ! 601: * return a physical base/size pair which is the ! 602: * (largest) initial, physically contiguous block. ! 603: */ ! 604: vstodb(vsbase, vssize, dmp, dbp, rev) ! 605: register int vsbase; ! 606: int vssize; ! 607: struct dmap *dmp; ! 608: register struct dblock *dbp; ! 609: { ! 610: register int blk = dmmin; ! 611: register swblk_t *ip = dmp->dm_map; ! 612: ! 613: vsbase = ctod(vsbase); ! 614: vssize = ctod(vssize); ! 615: if (vsbase < 0 || vsbase + vssize > dmp->dm_size) ! 616: panic("vstodb"); ! 617: while (vsbase >= blk) { ! 618: vsbase -= blk; ! 619: if (blk < dmmax) ! 620: blk *= 2; ! 621: ip++; ! 622: } ! 623: if (*ip <= 0 || *ip + blk > nswap) ! 624: panic("vstodb *ip"); ! 625: dbp->db_size = min(vssize, blk - vsbase); ! 626: dbp->db_base = *ip + (rev ? blk - (vsbase + dbp->db_size) : vsbase); ! 627: } ! 628: ! 629: panic(cp) ! 630: char *cp; ! 631: { ! 632: ! 633: /* printf("%s\n", cp); */ ! 634: } ! 635: ! 636: min(a, b) ! 637: { ! 638: ! 639: return (a < b ? a : b); ! 640: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.