code: plan9front

ref: b67b2eeac8acf220d33c8e354fe17d8f1d1efdcc
dir: /rc/bin/usbtree/

View raw version
#!/bin/rc
rfork e

cd '#u/usb'

root=()
for(ep in ep*.0){
	< $ep/ctl {
		info1=`{read}
		info2=`{read}
	}	
	info1_^$ep=$info1
	info2_^$ep=$info2
	if(~ $info1(18) hub){
		hub=$info1(19)
		if(~ $hub 0)
			root=($root $ep)
		if not {
			hub=ep^$hub^'.0'
			devhub_^$ep=$hub
			if(~ $info1(20) port){
				port=$info1(21)
				portdev_^$hub^_^$port=$ep
			}
		}
	}
}

fn indent {
	sed 's/^/	/g'
}

fn printdev {
	info2=info2_^$1
	info2=$$info2
	echo $1^':' $info2
	if(~ $info2(1) *hub){
		for(port in `{seq 1 16}){
			x=portdev_^$1^_^$port
			if(~ $#$x 1){
				echo '  port'^$port^': '
				printdev $$x | indent
			}
		}
	}
}

for(ep in $root) {
	printdev $ep
}