1*9a747e4fSDavid du Colombier #include <u.h>
2*9a747e4fSDavid du Colombier #include <libc.h>
3*9a747e4fSDavid du Colombier #include "compat.h"
4*9a747e4fSDavid du Colombier
5*9a747e4fSDavid du Colombier typedef struct Exporter Exporter;
6*9a747e4fSDavid du Colombier struct Exporter
7*9a747e4fSDavid du Colombier {
8*9a747e4fSDavid du Colombier int fd;
9*9a747e4fSDavid du Colombier Chan **roots;
10*9a747e4fSDavid du Colombier int nroots;
11*9a747e4fSDavid du Colombier };
12*9a747e4fSDavid du Colombier
13*9a747e4fSDavid du Colombier int
mounter(char * mntpt,int how,int fd,int n)14*9a747e4fSDavid du Colombier mounter(char *mntpt, int how, int fd, int n)
15*9a747e4fSDavid du Colombier {
16*9a747e4fSDavid du Colombier char buf[32];
17*9a747e4fSDavid du Colombier int i, ok, mfd;
18*9a747e4fSDavid du Colombier
19*9a747e4fSDavid du Colombier ok = 1;
20*9a747e4fSDavid du Colombier for(i = 0; i < n; i++){
21*9a747e4fSDavid du Colombier snprint(buf, sizeof buf, "%d", i);
22*9a747e4fSDavid du Colombier mfd = dup(fd, -1);
23*9a747e4fSDavid du Colombier if(mount(mfd, -1, mntpt, how, buf) == -1){
24*9a747e4fSDavid du Colombier close(mfd);
25*9a747e4fSDavid du Colombier fprint(2, "can't mount on %s: %r\n", mntpt);
26*9a747e4fSDavid du Colombier ok = 0;
27*9a747e4fSDavid du Colombier break;
28*9a747e4fSDavid du Colombier }
29*9a747e4fSDavid du Colombier close(mfd);
30*9a747e4fSDavid du Colombier if(how == MREPL)
31*9a747e4fSDavid du Colombier how = MAFTER;
32*9a747e4fSDavid du Colombier }
33*9a747e4fSDavid du Colombier
34*9a747e4fSDavid du Colombier close(fd);
35*9a747e4fSDavid du Colombier
36*9a747e4fSDavid du Colombier return ok;
37*9a747e4fSDavid du Colombier }
38*9a747e4fSDavid du Colombier
39*9a747e4fSDavid du Colombier static void
extramp(void * v)40*9a747e4fSDavid du Colombier extramp(void *v)
41*9a747e4fSDavid du Colombier {
42*9a747e4fSDavid du Colombier Exporter *ex;
43*9a747e4fSDavid du Colombier
44*9a747e4fSDavid du Colombier rfork(RFNAMEG);
45*9a747e4fSDavid du Colombier ex = v;
46*9a747e4fSDavid du Colombier sysexport(ex->fd, ex->roots, ex->nroots);
47*9a747e4fSDavid du Colombier shutdown();
48*9a747e4fSDavid du Colombier exits(nil);
49*9a747e4fSDavid du Colombier }
50*9a747e4fSDavid du Colombier
51*9a747e4fSDavid du Colombier int
exporter(Dev ** dt,int * fd,int * sfd)52*9a747e4fSDavid du Colombier exporter(Dev **dt, int *fd, int *sfd)
53*9a747e4fSDavid du Colombier {
54*9a747e4fSDavid du Colombier Chan **roots;
55*9a747e4fSDavid du Colombier Exporter ex;
56*9a747e4fSDavid du Colombier int p[2], i, n, ed;
57*9a747e4fSDavid du Colombier
58*9a747e4fSDavid du Colombier for(n = 0; dt[n] != nil; n++)
59*9a747e4fSDavid du Colombier ;
60*9a747e4fSDavid du Colombier if(!n){
61*9a747e4fSDavid du Colombier werrstr("no devices specified");
62*9a747e4fSDavid du Colombier return 0;
63*9a747e4fSDavid du Colombier }
64*9a747e4fSDavid du Colombier
65*9a747e4fSDavid du Colombier ed = errdepth(-1);
66*9a747e4fSDavid du Colombier if(waserror()){
67*9a747e4fSDavid du Colombier werrstr(up->error);
68*9a747e4fSDavid du Colombier return 0;
69*9a747e4fSDavid du Colombier }
70*9a747e4fSDavid du Colombier
71*9a747e4fSDavid du Colombier roots = smalloc(n * sizeof *roots);
72*9a747e4fSDavid du Colombier for(i = 0; i < n; i++){
73*9a747e4fSDavid du Colombier (*dt[i]->reset)();
74*9a747e4fSDavid du Colombier (*dt[i]->init)();
75*9a747e4fSDavid du Colombier roots[i] = (*dt[i]->attach)("");
76*9a747e4fSDavid du Colombier }
77*9a747e4fSDavid du Colombier poperror();
78*9a747e4fSDavid du Colombier errdepth(ed);
79*9a747e4fSDavid du Colombier
80*9a747e4fSDavid du Colombier if(pipe(p) < 0){
81*9a747e4fSDavid du Colombier werrstr("can't make pipe: %r");
82*9a747e4fSDavid du Colombier return 0;
83*9a747e4fSDavid du Colombier }
84*9a747e4fSDavid du Colombier
85*9a747e4fSDavid du Colombier *sfd = p[0];
86*9a747e4fSDavid du Colombier *fd = p[1];
87*9a747e4fSDavid du Colombier
88*9a747e4fSDavid du Colombier ex.fd = *sfd;
89*9a747e4fSDavid du Colombier ex.roots = roots;
90*9a747e4fSDavid du Colombier ex.nroots = n;
91*9a747e4fSDavid du Colombier kproc("exporter", extramp, &ex);
92*9a747e4fSDavid du Colombier
93*9a747e4fSDavid du Colombier return n;
94*9a747e4fSDavid du Colombier }
95