xref: /plan9/sys/src/cmd/usb/disk/main.c (revision fd362a73ff89ae80075dd82c9aad2a3468f0f3c9)
1 /*
2  * usb/disk - usb mass storage file server
3  */
4 #include <u.h>
5 #include <libc.h>
6 #include <fcall.h>
7 #include <thread.h>
8 #include <disk.h>
9 #include "scsireq.h"
10 #include "usb.h"
11 #include "usbfs.h"
12 #include "ums.h"
13 
14 enum
15 {
16 	Arglen = 80,
17 };
18 
19 static void
usage(void)20 usage(void)
21 {
22 	fprint(2, "usage: %s [-Dd] [-N nb] [-m mnt] [-s srv] [dev...]\n", argv0);
23 	threadexitsall("usage");
24 }
25 
26 static int csps[] = {
27 	CSP(Clstorage,Subatapi,Protobulk),
28 	CSP(Clstorage,Sub8070,Protobulk),
29 	CSP(Clstorage,Subscsi,Protobulk),
30 	0,
31 };
32 
33 void
threadmain(int argc,char ** argv)34 threadmain(int argc, char **argv)
35 {
36 	char args[Arglen];
37 	char *as, *ae, *srv, *mnt;
38 
39 	srv = nil;
40 	mnt = "/n/disk";
41 
42 	quotefmtinstall();
43 	ae = args+sizeof(args);
44 	as = seprint(args, ae, "disk");
45 	ARGBEGIN{
46 	case 'D':
47 		usbfsdebug++;
48 		break;
49 	case 'd':
50 		usbdebug++;
51 		as = seprint(as, ae, " -d");
52 		break;
53 	case 'N':
54 		as = seprint(as, ae, " -N %s", EARGF(usage()));
55 		break;
56 	case 'm':
57 		mnt = EARGF(usage());
58 		break;
59 	case 's':
60 		srv = EARGF(usage());
61 		break;
62 	default:
63 		usage();
64 	}ARGEND
65 
66 	rfork(RFNOTEG);
67 	threadsetgrp(threadid());
68 	fmtinstall('U', Ufmt);
69 	usbfsinit(srv, mnt, &usbdirfs, MBEFORE);
70 	startdevs(args, argv, argc, matchdevcsp, csps, diskmain);
71 	threadexits(nil);
72 }
73