tnetwork - plan9port - [fork] Plan 9 from user space
 (HTM) git clone git://src.adamsgaard.dk/plan9port
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
       tnetwork (2484B)
       ---
            1 _ni=0;        // network indent level
            2 
            3 defn
            4 _ni() {
            5         loop 1,_ni do {
            6                 print("\t");
            7         }
            8 }
            9 
           10 defn
           11 ipdev(n) {
           12         _ipfs(*(ipfs+4*n));
           13 }
           14 
           15 // the funny _foo/foo pairs exist so that if we get
           16 // interrupted in the middle of one of these, _ni will 
           17 // get reset to 0 next time an external call happens.
           18 
           19 defn
           20 _ipfs(fs) {
           21         complex Fs fs;
           22         local i;
           23 
           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 }
           33 
           34 defn
           35 ipfs(fs) {
           36         _ni = 0;
           37         _ipfs(fs);
           38 }
           39 
           40 defn
           41 _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 then 
           53                         _conv(*(p.conv+i*4));
           54                 i = i + 1;
           55         }
           56         _ni = _ni - 1;
           57 }
           58 
           59 defn
           60 proto(p) {
           61         _ni = 0;
           62         _proto(p);
           63 }
           64 
           65 defn
           66 _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 }
           77 
           78 defn
           79 conv(c) {
           80         _ni = 0;
           81         _conv(c);
           82 }
           83 
           84 defn
           85 iptostr(a)
           86 {
           87         // BUG: little endian
           88         return itoa(a&0xFF)+"."+itoa((a>>8)&0xFF)+"."+itoa((a>>16)&0xFF)+"."+itoa((a>>24)&0xFF);
           89 }
           90 
           91 defn
           92 qtostr(q)
           93 {
           94         complex Queue q;
           95 
           96         return "queue("+itoa(q, "%lux")+") ["+itoa(q.len, "%d")+","+itoa(q.dlen, "%d")+","+itoa(qblocks(q), "%d")+"]";
           97 }
           98 
           99 defn
          100 qblocks(q)
          101 {
          102         complex Queue q;
          103         local b, n;
          104 
          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 }
          114 
          115 defn
          116 _queue(q)
          117 {
          118         complex Queue q;
          119         local b;
          120 
          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 then 
          123                 print(" starve");
          124         if q.state & Qmsg then
          125                 print(" msg");
          126         if q.state & Qclosed then
          127                 print(" closed");
          128         if q.state & Qflow then
          129                 print(" flow");
          130         if q.state & Qcoalesce then
          131                 print(" coalesce");
          132         print("\n");
          133 
          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 }
          143 
          144 defn
          145 queue(q)
          146 {
          147         _ni = 0;
          148         _queue(q);
          149 }
          150 
          151 defn
          152 _block(b)
          153 {
          154         complex Block b;
          155 
          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 }
          159 
          160 defn
          161 block(b)
          162 {
          163         _ni = 0;
          164         block(b);
          165 }
          166 
          167 print(acidfile);
          168 needacid("tcp");
          169 needacid("qio");