1906943f9SDavid du Colombier /*
2906943f9SDavid du Colombier * usb/disk - usb mass storage file server
3906943f9SDavid du Colombier */
4906943f9SDavid du Colombier #include <u.h>
5906943f9SDavid du Colombier #include <libc.h>
6906943f9SDavid du Colombier #include <fcall.h>
7906943f9SDavid du Colombier #include <thread.h>
8*fd362a73SDavid du Colombier #include <disk.h>
9906943f9SDavid du Colombier #include "scsireq.h"
10906943f9SDavid du Colombier #include "usb.h"
11906943f9SDavid du Colombier #include "usbfs.h"
12906943f9SDavid du Colombier #include "ums.h"
13906943f9SDavid du Colombier
14906943f9SDavid du Colombier enum
15906943f9SDavid du Colombier {
16906943f9SDavid du Colombier Arglen = 80,
17906943f9SDavid du Colombier };
18906943f9SDavid du Colombier
19906943f9SDavid du Colombier static void
usage(void)20906943f9SDavid du Colombier usage(void)
21906943f9SDavid du Colombier {
22ed868a7cSDavid du Colombier fprint(2, "usage: %s [-Dd] [-N nb] [-m mnt] [-s srv] [dev...]\n", argv0);
23906943f9SDavid du Colombier threadexitsall("usage");
24906943f9SDavid du Colombier }
25906943f9SDavid du Colombier
26906943f9SDavid du Colombier static int csps[] = {
27906943f9SDavid du Colombier CSP(Clstorage,Subatapi,Protobulk),
28906943f9SDavid du Colombier CSP(Clstorage,Sub8070,Protobulk),
29906943f9SDavid du Colombier CSP(Clstorage,Subscsi,Protobulk),
30906943f9SDavid du Colombier 0,
31906943f9SDavid du Colombier };
32906943f9SDavid du Colombier
33906943f9SDavid du Colombier void
threadmain(int argc,char ** argv)34906943f9SDavid du Colombier threadmain(int argc, char **argv)
35906943f9SDavid du Colombier {
36906943f9SDavid du Colombier char args[Arglen];
37ed868a7cSDavid du Colombier char *as, *ae, *srv, *mnt;
38906943f9SDavid du Colombier
39906943f9SDavid du Colombier srv = nil;
40906943f9SDavid du Colombier mnt = "/n/disk";
41906943f9SDavid du Colombier
42906943f9SDavid du Colombier quotefmtinstall();
43906943f9SDavid du Colombier ae = args+sizeof(args);
44906943f9SDavid du Colombier as = seprint(args, ae, "disk");
45906943f9SDavid du Colombier ARGBEGIN{
46906943f9SDavid du Colombier case 'D':
47906943f9SDavid du Colombier usbfsdebug++;
48906943f9SDavid du Colombier break;
49906943f9SDavid du Colombier case 'd':
50906943f9SDavid du Colombier usbdebug++;
51906943f9SDavid du Colombier as = seprint(as, ae, " -d");
52906943f9SDavid du Colombier break;
53ed868a7cSDavid du Colombier case 'N':
54ed868a7cSDavid du Colombier as = seprint(as, ae, " -N %s", EARGF(usage()));
55ed868a7cSDavid du Colombier break;
56906943f9SDavid du Colombier case 'm':
57906943f9SDavid du Colombier mnt = EARGF(usage());
58906943f9SDavid du Colombier break;
59906943f9SDavid du Colombier case 's':
60906943f9SDavid du Colombier srv = EARGF(usage());
6113b40997SDavid du Colombier break;
62906943f9SDavid du Colombier default:
63906943f9SDavid du Colombier usage();
64906943f9SDavid du Colombier }ARGEND
65906943f9SDavid du Colombier
66906943f9SDavid du Colombier rfork(RFNOTEG);
67906943f9SDavid du Colombier threadsetgrp(threadid());
68906943f9SDavid du Colombier fmtinstall('U', Ufmt);
69906943f9SDavid du Colombier usbfsinit(srv, mnt, &usbdirfs, MBEFORE);
70906943f9SDavid du Colombier startdevs(args, argv, argc, matchdevcsp, csps, diskmain);
71906943f9SDavid du Colombier threadexits(nil);
72906943f9SDavid du Colombier }
73