Blob
1 _ni=0; // network indent level3 defn4 _ni() {5 loop 1,_ni do {6 print("\t");7 }8 }10 defn11 ipdev(n) {12 _ipfs(*(ipfs+4*n));13 }15 // the funny _foo/foo pairs exist so that if we get16 // interrupted in the middle of one of these, _ni will17 // get reset to 0 next time an external call happens.19 defn20 _ipfs(fs) {21 complex Fs fs;22 local i;24 print("ipfs(", fs\X, ") #I", fs.dev\D, "\n");25 i=0;26 _ni = _ni+1;27 while i < fs.np do {28 _proto(*(fs.p+i*4));29 i = i + 1;30 }31 _ni = _ni-1;32 }34 defn35 ipfs(fs) {36 _ni = 0;37 _ipfs(fs);38 }40 defn41 _proto(p) {42 local c;43 complex Proto p;44 _ni();45 print("proto(", p\X, ") ", *(p.name\s), "\n");46 _ni = _ni+1;47 local i;48 i = 0;49 while i < p.nc do {50 c = *(p.conv+i*4);51 complex Conv c;52 if c != 0 && c.inuse then53 _conv(*(p.conv+i*4));54 i = i + 1;55 }56 _ni = _ni - 1;57 }59 defn60 proto(p) {61 _ni = 0;62 _proto(p);63 }65 defn66 _conv(c) {67 complex Conv c;68 _ni();69 local p;70 p = c.p;71 complex Proto p;72 print("conv(", c\X, ") ", *(p.name\s), "/", c.x\D, " ",73 iptostr(*(c.laddr+12)), "!", c.lport\D, " ", iptostr(*(c.raddr+12)),74 "!", c.rport\D, " rq ", qtostr(c.rq), " wq ", qtostr(c.wq),75 " eq ", qtostr(c.eq), "\n");76 }78 defn79 conv(c) {80 _ni = 0;81 _conv(c);82 }84 defn85 iptostr(a)86 {87 // BUG: little endian88 return itoa(a&0xFF)+"."+itoa((a>>8)&0xFF)+"."+itoa((a>>16)&0xFF)+"."+itoa((a>>24)&0xFF);89 }91 defn92 qtostr(q)93 {94 complex Queue q;96 return "queue("+itoa(q, "%lux")+") ["+itoa(q.len, "%d")+","+itoa(q.dlen, "%d")+","+itoa(qblocks(q), "%d")+"]";97 }99 defn100 qblocks(q)101 {102 complex Queue q;103 local b, n;105 b = q.bfirst;106 n = 0;107 while b != 0 do {108 n = n + 1;109 complex Block b;110 b = b.next;111 }112 return n;113 }115 defn116 _queue(q)117 {118 complex Queue q;119 local b;121 print("queue(", q\X, ") len ", q.len\D, " dlen ", q.dlen\D, " limit ", q.limit\D, " nblocks ", qblocks(q)\D);122 if q.state & Qstarve then123 print(" starve");124 if q.state & Qmsg then125 print(" msg");126 if q.state & Qclosed then127 print(" closed");128 if q.state & Qflow then129 print(" flow");130 if q.state & Qcoalesce then131 print(" coalesce");132 print("\n");134 b = q.bfirst;135 _ni = _ni+1;136 while b != 0 do {137 _block(b);138 complex Block b;139 b = b.next;140 }141 _ni = _ni - 1;142 }144 defn145 queue(q)146 {147 _ni = 0;148 _queue(q);149 }151 defn152 _block(b)153 {154 complex Block b;156 _ni();157 print("block(", b\X, ") base ", b.base\X, " rp ", b.rp\X, "/", b.rp-b.base\D, " wp ", b.wp\X, "/", b.wp-b.base\D, " lim ", b.lim\X, "/", b.lim-b.base\D, "\n");158 }160 defn161 block(b)162 {163 _ni = 0;164 block(b);165 }167 print(acidfile);168 needacid("tcp");169 needacid("qio");