xref: /plan9/sys/src/cmd/usb/ether/main.c (revision a650be7d984b0294fadd12cd786574e09003d20c)
1 /*
2  * usb/ether - usb ethernet adapter.
3  * BUG: This should use /dev/etherfile to
4  * use the kernel ether device code.
5  */
6 #include <u.h>
7 #include <libc.h>
8 #include <fcall.h>
9 #include <thread.h>
10 #include "usb.h"
11 #include "usbfs.h"
12 #include "ether.h"
13 
14 enum
15 {
16 	Arglen = 80,
17 };
18 
19 static void
usage(void)20 usage(void)
21 {
22 	fprint(2, "usage: %s [-a addr] [-Dd] [-N nb] [-m mnt] [-s srv] [dev...]\n", argv0);
23 	threadexitsall("usage");
24 }
25 
26 /*
27  * Ether devices may be weird.
28  * Be optimistic and try to use any communication
29  * device or one of the `vendor specific class' devices
30  * that we know are ethernets.
31  */
32 static int
matchether(char * info,void *)33 matchether(char *info, void*)
34 {
35 	Cinfo *ip;
36 	char buf[50];
37 
38 	/*
39 	 * I have an ether reporting comms.0.0
40 	 */
41 	if(strstr(info, "comms") != nil)
42 		return 0;
43 	for(ip = cinfo; ip->vid != 0; ip++){
44 		snprint(buf, sizeof(buf), "vid %#06x did %#06x", ip->vid, ip->did);
45 		if(strstr(info, buf) != nil)
46 			return 0;
47 	}
48 	return -1;
49 }
50 
51 void
threadmain(int argc,char ** argv)52 threadmain(int argc, char **argv)
53 {
54 	char args[Arglen];
55 	char *as, *ae, *srv, *mnt;
56 
57 	srv = nil;
58 	mnt = "/net";
59 
60 	quotefmtinstall();
61 	ae = args+sizeof(args);
62 	as = seprint(args, ae, "ether");
63 	ARGBEGIN{
64 	case 'a':
65 		as = seprint(as, ae, " -a %s", EARGF(usage()));
66 		break;
67 	case 'D':
68 		usbfsdebug++;
69 		break;
70 	case 'd':
71 		usbdebug++;
72 		as = seprint(as, ae, " -d");
73 		break;
74 	case 'N':
75 		as = seprint(as, ae, " -N %s", EARGF(usage()));
76 		break;
77 	case 'm':
78 		mnt = EARGF(usage());
79 		break;
80 	case 's':
81 		srv = EARGF(usage());
82 		break;
83 	default:
84 		usage();
85 	}ARGEND
86 
87 	rfork(RFNOTEG);
88 	threadsetgrp(threadid());
89 	fmtinstall('U', Ufmt);
90 	usbfsinit(srv, mnt, &usbdirfs, MAFTER|MCREATE);
91 	startdevs(args, argv, argc, matchether, nil, ethermain);
92 	threadexits(nil);
93 }
94