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