acid files
diff --git a/acid/network b/acid/network
new file mode 100644
index 0000000..ea6f992
--- /dev/null
+++ b/acid/network
@@ -0,0 +1,169 @@
+_ni=0;	// network indent level
+
+defn
+_ni() {
+	loop 1,_ni do {
+		print("\t");
+	}
+}
+
+defn
+ipdev(n) {
+	_ipfs(*(ipfs+4*n));
+}
+
+// the funny _foo/foo pairs exist so that if we get
+// interrupted in the middle of one of these, _ni will 
+// get reset to 0 next time an external call happens.
+
+defn
+_ipfs(fs) {
+	complex Fs fs;
+	local i;
+
+	print("ipfs(", fs\X, ")  #I", fs.dev\D, "\n");
+	i=0;
+	_ni = _ni+1;
+	while i < fs.np do {
+		_proto(*(fs.p+i*4));
+		i = i + 1;
+	}
+	_ni = _ni-1;
+}
+
+defn
+ipfs(fs) {
+	_ni = 0;
+	_ipfs(fs);
+}
+
+defn
+_proto(p) {
+	local c;
+	complex Proto p;
+	_ni();
+	print("proto(", p\X, ") ", *(p.name\s), "\n");
+	_ni = _ni+1;
+	local i;
+	i = 0;
+	while i < p.nc do {
+		c = *(p.conv+i*4);
+		complex Conv c;
+		if c != 0 && c.inuse then 
+			_conv(*(p.conv+i*4));
+		i = i + 1;
+	}
+	_ni = _ni - 1;
+}
+
+defn
+proto(p) {
+	_ni = 0;
+	_proto(p);
+}
+
+defn
+_conv(c) {
+	complex Conv c;
+	_ni();
+	local p;
+	p = c.p;
+	complex Proto p;
+	print("conv(", c\X, ") ", *(p.name\s), "/", c.x\D, " ", 
+		iptostr(*(c.laddr+12)), "!", c.lport\D, " ", iptostr(*(c.raddr+12)), 
+		"!", c.rport\D, " rq ", qtostr(c.rq), " wq ", qtostr(c.wq), 
+		" eq ", qtostr(c.eq), "\n");
+}
+
+defn
+conv(c) {
+	_ni = 0;
+	_conv(c);
+}
+
+defn
+iptostr(a)
+{
+	// BUG: little endian
+	return itoa(a&0xFF)+"."+itoa((a>>8)&0xFF)+"."+itoa((a>>16)&0xFF)+"."+itoa((a>>24)&0xFF);
+}
+
+defn
+qtostr(q)
+{
+	complex Queue q;
+
+	return "queue("+itoa(q, "%lux")+") ["+itoa(q.len, "%d")+","+itoa(q.dlen, "%d")+","+itoa(qblocks(q), "%d")+"]";
+}
+
+defn
+qblocks(q)
+{
+	complex Queue q;
+	local b, n;
+
+	b = q.bfirst;
+	n = 0;
+	while b != 0 do { 
+		n = n + 1;
+		complex Block b;
+		b = b.next;
+	}
+	return n;
+}
+
+defn
+_queue(q)
+{
+	complex Queue q;
+	local b;
+
+	print("queue(", q\X, ") len ", q.len\D, " dlen ", q.dlen\D, " limit ", q.limit\D, " nblocks ", qblocks(q)\D);
+	if q.state & Qstarve then 
+		print(" starve");
+	if q.state & Qmsg then
+		print(" msg");
+	if q.state & Qclosed then
+		print(" closed");
+	if q.state & Qflow then
+		print(" flow");
+	if q.state & Qcoalesce then
+		print(" coalesce");
+	print("\n");
+
+	b = q.bfirst;
+	_ni = _ni+1;
+	while b != 0 do {
+		_block(b);
+		complex Block b;
+		b = b.next;
+	}
+	_ni = _ni - 1;
+}
+
+defn
+queue(q)
+{
+	_ni = 0;
+	_queue(q);
+}
+
+defn
+_block(b)
+{
+	complex Block b;
+
+	_ni();
+	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");
+}
+
+defn
+block(b)
+{
+	_ni = 0;
+	block(b);
+}
+
+print(acidfile);
+needacid("tcp");
+needacid("qio");