xref: /plan9-contrib/sys/src/cmd/vnc/exporter.c (revision 9a747e4fd48b9f4522c70c07e8f882a15030f964)
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