|
|
1.1 ! root 1: ! 2: #include <nlist.h> ! 3: #include "/usr/sys/h/param.h" ! 4: #include <ctype.h> ! 5: #include "/usr/sys/h/stream.h" ! 6: #include "/usr/sys/h/inode.h" ! 7: #include "/usr/sys/h/conf.h" ! 8: ! 9: struct nlist nl[] ={ ! 10: #define QNL 0 ! 11: {"_queue"}, ! 12: #define BLNL 1 ! 13: {"_cblock"}, ! 14: #define STNL 2 ! 15: {"_streams"}, ! 16: #define QFNL 3 ! 17: {"_qfreelist"}, ! 18: #define DTNL 4 ! 19: {"_dtlinfo"}, ! 20: #define DKPNL 5 ! 21: { "_dkpinfo" }, ! 22: #define NBLOCK 6 ! 23: { "_Nblock"}, ! 24: #define NQUEUE 7 ! 25: { "_Nqueue"}, ! 26: #define NSTREAM 8 ! 27: { "_Nstream"}, ! 28: #define C 9 ! 29: {"_cblockC"}, ! 30: #define M 10 ! 31: {"_cblockM"}, ! 32: #define N4 11 ! 33: {"_Nblk4"}, ! 34: #define N16 12 ! 35: {"_Nblk16"}, ! 36: #define N64 13 ! 37: {"_Nblk64"}, ! 38: #define NBIG 14 ! 39: {"_Nblkbig"}, ! 40: #define DZNL 15 ! 41: {"_dzinfo"}, ! 42: #define CDKPNL 16 ! 43: { "_cdkpinfo" }, ! 44: { "" }, ! 45: }; ! 46: ! 47: struct qinit **qall; ! 48: char *ball; ! 49: char *core = "/dev/mem"; ! 50: char *sys = "/unix"; ! 51: int mem; ! 52: int Nblock; ! 53: int Nqueue; ! 54: int Nstream; ! 55: ! 56: struct dt { ! 57: char nack; ! 58: char cack; ! 59: char nchar; ! 60: char state; ! 61: short lastecho; ! 62: struct queue *queue; ! 63: }; ! 64: ! 65: ! 66: struct dkp { ! 67: struct queue *rdq; /* associated read queue */ ! 68: struct block *inp; /* msg being collected */ ! 69: struct block *inpe; /* end of msg */ ! 70: short state; /* flags */ ! 71: short trx; /* # bytes in trailer being collected */ ! 72: short indata; /* # bytes in message being collected */ ! 73: u_char iseq; /* last good input sequence number */ ! 74: u_char lastecho; /* last echo/rej sent */ ! 75: u_char WS; /* first non-accepted message */ ! 76: u_char WACK; /* first non-received message */ ! 77: u_char WNX; /* next message to be sent */ ! 78: u_char XW; /* size of xmit window */ ! 79: u_char timer; /* timeout for xmit */ ! 80: u_char outcnt; /* count output chars cor char mode */ ! 81: u_char trbuf[3]; /* trailer being collected */ ! 82: struct block *xb[8]; /* the xmit window buffer */ ! 83: }; ! 84: #define DK_OPEN 01 ! 85: #define DK_LCLOSE 02 ! 86: #define DK_RCLOSE 04 ! 87: #define DK_XCHARMODE 010 ! 88: #define DK_RCHARMODE 0200 ! 89: #define DK_OPENING 020 ! 90: ! 91: struct dz { ! 92: short state; ! 93: short flags; ! 94: struct block *oblock; ! 95: struct queue *rdq; ! 96: char board; ! 97: char line; ! 98: char speed; ! 99: }; ! 100: ! 101: #define getme(s, kind, off, type) _get(kind, off, sizeof(type), &s) ! 102: ! 103: struct flags { ! 104: int flag; ! 105: char *name; ! 106: }; ! 107: ! 108: struct flags stflags[] = { ! 109: IOCWAIT, "IOC", ! 110: RSLEEP, "RSLEEP", ! 111: WSLEEP, "WSLEEP", ! 112: HUNGUP, "HUNGUP", ! 113: RSEL, "RSEL", ! 114: WSEL, "WSEL", ! 115: EXCL, "EXCL", ! 116: STWOPEN, "WOPEN", ! 117: 0 ! 118: }; ! 119: ! 120: struct flags qflags[] = { ! 121: QUSE, "use", ! 122: QREADR, "read", ! 123: QNOENB, "noenb", ! 124: QENAB, "enab", ! 125: QWANTR, "wantr", ! 126: QWANTW, "wantw", ! 127: QFULL, "full", ! 128: QDELIM, "delim", ! 129: QBIGB, "bigb", ! 130: 0 ! 131: }; ! 132: ! 133: #define CLOG1 01 ! 134: #define CLOG2 02 ! 135: #define STOPDT 04 ! 136: #define USEDT 010 ! 137: struct flags dtflags[] = { ! 138: CLOG1, "clog1", ! 139: CLOG2, "clog2", ! 140: STOPDT, "stop", ! 141: USEDT, "use", ! 142: 0 ! 143: }; ! 144: ! 145: struct flags dkpflags[] = { ! 146: DK_OPEN, "open", ! 147: DK_LCLOSE, "lclose", ! 148: DK_RCLOSE, "rclose", ! 149: DK_XCHARMODE, "xcharmode", ! 150: DK_RCHARMODE, "rcharmode", ! 151: DK_OPENING, "opening", ! 152: 0 ! 153: }; ! 154: ! 155: #define DZEXIST 01 ! 156: #define DZISOPEN 02 ! 157: #define DZWOPEN 04 ! 158: #define DZTIME 010 ! 159: #define DZCARR 020 ! 160: #define DZSTOP 040 ! 161: #define DZHUPCL 0100 ! 162: ! 163: struct flags dzflags[] = { ! 164: DZEXIST, "exists", ! 165: DZISOPEN, "open", ! 166: DZWOPEN, "wopen", ! 167: DZTIME, "time", ! 168: DZCARR, "carrier", ! 169: DZSTOP, "stop", ! 170: DZHUPCL, "hupcl", ! 171: 0 ! 172: }; ! 173: ! 174: int vflag; ! 175: int sflag; ! 176: int mflag; ! 177: ! 178: main(argc, argv) ! 179: char **argv; ! 180: { ! 181: struct queue q; ! 182: struct block b; ! 183: struct stdata s; ! 184: int i; ! 185: int nq = 0; ! 186: int blkcur[4],blkmin[4]; ! 187: int b4, b16, b64, bBIG; ! 188: ! 189: for (;;argc--, argv++) { ! 190: if (argc>1 && strcmp(argv[1], "-v")==0) { ! 191: vflag++; ! 192: continue; ! 193: } ! 194: if (argc>1 && strcmp(argv[1], "-m")==0) { ! 195: mflag++; ! 196: continue; ! 197: } ! 198: if (argc>1 && strcmp(argv[1], "-V")==0) { ! 199: vflag = 2; ! 200: continue; ! 201: } ! 202: if (argc>1 && strcmp(argv[1], "-s")==0) { ! 203: sflag++; ! 204: continue; ! 205: } ! 206: break; ! 207: } ! 208: if (argc>1) ! 209: sys = argv[1]; ! 210: if (argc>2) ! 211: core = argv[2]; ! 212: nlist(sys, nl); ! 213: mem = open(core, 0); ! 214: if (mem<0) { ! 215: printf("can't open %s\n", core); ! 216: exit(1); ! 217: } ! 218: getme(blkcur[0], C, 0, blkcur); ! 219: getme(blkmin[0], M, 0, blkmin); ! 220: getme(b4, N4, 0, b4); ! 221: getme(b16, N16, 0, b16); ! 222: getme(b64, N64, 0, b64); ! 223: getme(bBIG, NBIG, 0, int); ! 224: getme(Nqueue, NQUEUE, 0, int); ! 225: getme(Nstream, NSTREAM, 0, int); ! 226: getme(Nblock, NBLOCK, 0, int); ! 227: printf("blocks max: %.0f%% (%d,%d,%d,%d)\n", ! 228: 100.*(Nblock-blkmin[0]-blkmin[1]-blkmin[2])/Nblock, ! 229: b4-blkmin[0], b16-blkmin[1], b64-blkmin[2], bBIG-blkmin[3]); ! 230: ball = (char *)malloc(Nblock*sizeof(char)); ! 231: qall = (struct qinit **)malloc(Nqueue*sizeof(struct queue *)); ! 232: for (i=0; i<Nblock; i++) ! 233: ball[i] = 0; ! 234: for (i=0; i<Nqueue; i++) { ! 235: getme(q, QNL, i, struct queue); ! 236: if (q.flag==0) ! 237: qall[i] = 0; ! 238: else { ! 239: qall[i] = q.qinfo; ! 240: nq++; ! 241: } ! 242: } ! 243: for (i=0; i<Nstream; i++) { ! 244: pstream(i); ! 245: } ! 246: for (i=0; i<Nqueue; i++) { ! 247: if (qall[i]) ! 248: printf("Loose queue %d, info %x\n", i, qall[i]); ! 249: } ! 250: printf("%d queues in use\n", nq); ! 251: bfreecount(); ! 252: nq = 0; ! 253: for (i=0; i<Nblock; i++) ! 254: if (ball[i]==0) { ! 255: struct block b; ! 256: if (mflag) { ! 257: getme(b, BLNL, i, struct block); ! 258: pblock(&b); ! 259: } ! 260: nq++; ! 261: } ! 262: if (!sflag) ! 263: printf("%d blocks missing\n", nq); ! 264: nq = 0; ! 265: for (i=0; i<Nblock; i++) { ! 266: if (ball[i]==0 && nq < 5) { ! 267: printf("%x\n", (struct block *)nl[BLNL].n_value+i); ! 268: nq++; ! 269: } ! 270: } ! 271: } ! 272: ! 273: pstream(i) ! 274: { ! 275: struct stdata s; ! 276: struct queue rq, wq; ! 277: struct inode ino; ! 278: struct queue *rqp, *wqp; ! 279: struct stdata *sp; ! 280: struct streamtab st, st1, st2, st3; ! 281: int d; ! 282: int forward = 1; ! 283: ! 284: sp = (struct stdata *)getme(s, STNL, i, struct stdata); ! 285: if (s.wrq==NULL) ! 286: return; ! 287: if (!sflag) ! 288: printf("\nstream %d: ", i); ! 289: getme(ino, s.inode, 0, struct inode); ! 290: d = ino.i_un.i_rdev; ! 291: if (!sflag) { ! 292: printf("dev %d,%d ", major(d), minor(d)); ! 293: printf("count %d ", s.count); ! 294: flags(stflags, s.flag); ! 295: if (vflag) ! 296: printf(" pgrp %d", s.pgrp); ! 297: printf("\n"); ! 298: } ! 299: wqp = (struct queue *)getme(wq, s.wrq, 0, struct queue); ! 300: rqp = (struct queue *)getme(rq, RD(s.wrq), 0, struct queue); ! 301: if ((struct stdata *)rq.ptr != sp) ! 302: printf("rq ptr? = %x\n", rq.ptr); ! 303: getme(st, DTNL, 0, struct streamtab); ! 304: getme(st1, DKPNL, 0, struct streamtab); ! 305: getme(st3, CDKPNL, 0, struct streamtab); ! 306: getme(st2, DZNL, 0, struct streamtab); ! 307: for (;;) { ! 308: d = rqp - (struct queue *)nl[QNL].n_value; ! 309: if (d<0 || d>=Nqueue) ! 310: printf("?"); ! 311: else ! 312: qall[d] = 0; ! 313: d = wqp - (struct queue *)nl[QNL].n_value; ! 314: if (d<0 || d>=Nqueue) ! 315: printf("?"); ! 316: else ! 317: qall[d] = 0; ! 318: if (!sflag) { ! 319: printf(" RQ %x: ", rqp); ! 320: flags(qflags, rq.flag); ! 321: if (vflag) ! 322: printf(" ptr %x, inf %x", rq.ptr, rq.qinfo); ! 323: printf("\n"); ! 324: pblocks(&rq); ! 325: printf(" WQ %x: ", wqp); ! 326: flags(qflags, wq.flag); ! 327: if (vflag) ! 328: printf(" ptr %x, inf %x", wq.ptr, wq.qinfo); ! 329: printf("\n"); ! 330: pblocks(&wq); ! 331: if (wq.qinfo == st.wrinit) ! 332: pdtline(&wq); ! 333: if (wq.qinfo == st1.wrinit || wq.qinfo == st3.wrinit) ! 334: dkpline(&wq); ! 335: if (wq.qinfo == st2.wrinit) ! 336: dzfacts(&wq); ! 337: } ! 338: if (forward) { ! 339: if (wq.next == NULL) ! 340: break; ! 341: wqp = (struct queue *) ! 342: getme(wq, wq.next, 0, struct queue); ! 343: if (wq.flag&QREADR) { ! 344: printf(" <>\n"); ! 345: forward = 0; ! 346: rqp = wqp; ! 347: rq = wq; ! 348: wqp = (struct queue *) ! 349: getme(wq, WR(rqp), 0, struct queue); ! 350: } else ! 351: rqp = (struct queue *) ! 352: getme(rq, RD(wqp), 0, struct queue); ! 353: } else { ! 354: if (rq.next == NULL) ! 355: break; ! 356: rqp = (struct queue *) ! 357: getme(rq, rq.next, 0, struct queue); ! 358: if ((rq.flag&QREADR) == 0) { ! 359: printf(" <>\n"); ! 360: forward = 1; ! 361: wqp = rqp; ! 362: wq = rq; ! 363: rqp = (struct queue *) ! 364: getme(rq, RD(wqp), 0, struct queue); ! 365: } else ! 366: wqp = (struct queue *) ! 367: getme(wq, WR(rqp), 0, struct queue); ! 368: } ! 369: } ! 370: } ! 371: ! 372: pdtline(q) ! 373: register struct queue *q; ! 374: { ! 375: struct dt dt; ! 376: ! 377: getme(dt, q->ptr, 0, struct dt); ! 378: printf(" nack %o cack %o nchar %d lastecho %o q %lx ", dt.nack,dt.cack, ! 379: dt.nchar, dt.lastecho, dt.queue); ! 380: flags(dtflags, dt.state); ! 381: printf("\n"); ! 382: } ! 383: ! 384: dzfacts(q) ! 385: register struct queue *q; ! 386: { ! 387: struct dz dz; ! 388: ! 389: getme(dz, q->ptr, 0, struct dz); ! 390: printf(" DZ: "); ! 391: flags(dzflags, dz.state); ! 392: printf("\n"); ! 393: } ! 394: ! 395: dkpline(q) ! 396: register struct queue *q; ! 397: { ! 398: struct dkp dkp; ! 399: register i; ! 400: ! 401: getme(dkp, q->ptr, 0, struct dkp); ! 402: printf(" WS %o WACK %o WNX %o iseq %o; ", dkp.WS, dkp.WACK, ! 403: dkp.WNX, dkp.iseq); ! 404: flags(dkpflags, dkp.state); ! 405: printf("\n "); ! 406: for (i=0; i<8; i++) ! 407: printf(" %x", dkp.xb[i]); ! 408: printf("\n"); ! 409: } ! 410: ! 411: pblocks(q) ! 412: register struct queue *q; ! 413: { ! 414: struct block b, *bp; ! 415: int nb = 0; ! 416: u_char buf[512]; ! 417: register i, bno; ! 418: ! 419: bp = q->first; ! 420: for (i = 0; i < 1000; i++) { ! 421: if (bp==NULL) ! 422: break; ! 423: bno = bp - (struct block *)nl[BLNL].n_value; ! 424: nb++; ! 425: baccount(bno); ! 426: getme(b, bp, 0, struct block); ! 427: if (vflag && (i<10 || vflag>1)) ! 428: pblock(&b); ! 429: bp = b.next; ! 430: } ! 431: if (i>=10) ! 432: printf("(gave up) "); ! 433: if (nb > 0) ! 434: printf(" %d blocks\n", nb); ! 435: } ! 436: ! 437: pblock(bp) ! 438: register struct block *bp; ! 439: { ! 440: register u_char *cp; ! 441: register i = 0; ! 442: u_char buf[1024]; ! 443: ! 444: printf(" %.3o:", bp->type); ! 445: cp = buf; ! 446: getme(buf[0], bp->rptr, 0, buf); ! 447: while (bp->rptr < bp->wptr) { ! 448: if (i >= 16) { ! 449: printf("\n "); ! 450: i = 0; ! 451: } ! 452: if (*cp<040 || *cp>=0177) ! 453: printf(" %.3o ", *cp); ! 454: else ! 455: printf("%c", *cp); ! 456: cp++; ! 457: bp->rptr++; ! 458: i++; ! 459: } ! 460: printf("\n"); ! 461: } ! 462: ! 463: flags(fp, w) ! 464: register struct flags *fp; ! 465: { ! 466: int any = 0; ! 467: while (fp->name) { ! 468: if (fp->flag&w) { ! 469: if (any) ! 470: printf(", "); ! 471: any++; ! 472: printf("%s", fp->name); ! 473: } ! 474: fp++; ! 475: } ! 476: } ! 477: ! 478: _get(addr, off, size, loc) ! 479: unsigned long addr; ! 480: char *loc; ! 481: { ! 482: ! 483: if (addr < 20) ! 484: addr = nl[addr].n_value; ! 485: addr += off*size; ! 486: lseek(mem, addr&0x7fffffff, 0); ! 487: read(mem, loc, size); ! 488: return(addr); ! 489: } ! 490: ! 491: bfreecount() ! 492: { ! 493: struct block b; ! 494: struct block *bp; ! 495: register i; ! 496: ! 497: for (i=0; i<3; i++) { ! 498: getme(bp, QFNL, i, struct block *); ! 499: while (bp) { ! 500: baccount(bp - (struct block *)nl[BLNL].n_value); ! 501: getme(b, bp, 0, struct block); ! 502: bp = b.next; ! 503: } ! 504: } ! 505: } ! 506: ! 507: baccount(bno) ! 508: { ! 509: if (bno < 0 || bno >= Nblock) ! 510: printf("funny block %d\n", bno); ! 511: else if (ball[bno]) ! 512: printf("dup block %d\n", bno); ! 513: else ! 514: ball[bno]++; ! 515: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.