ref: cbe4b116989c0bfec49b9ae7a1d9a85ead6648ae
dir: /sys/src/cmd/vnc/exporter.c/
#include <u.h> #include <libc.h> #include "compat.h" typedef struct Exporter Exporter; struct Exporter { int fd; Chan **roots; int nroots; }; int mounter(char *mntpt, int how, int fd, int n) { char buf[32]; int i, ok, mfd; ok = 1; for(i = 0; i < n; i++){ snprint(buf, sizeof buf, "%d", i); mfd = dup(fd, -1); if(mount(mfd, -1, mntpt, how, buf) == -1){ close(mfd); fprint(2, "can't mount on %s: %r\n", mntpt); ok = 0; break; } close(mfd); if(how == MREPL) how = MAFTER; } close(fd); return ok; } static void extramp(void *v) { Exporter *ex; rfork(RFNAMEG); ex = v; sysexport(ex->fd, ex->roots, ex->nroots); shutdown(); exits(nil); } int exporter(Dev **dt, int *fd, int *sfd) { Chan **roots; Exporter ex; int p[2], i, n, ed; for(n = 0; dt[n] != nil; n++) ; if(!n){ werrstr("no devices specified"); return 0; } ed = errdepth(-1); if(waserror()){ werrstr(up->error); return 0; } roots = smalloc(n * sizeof *roots); for(i = 0; i < n; i++){ (*dt[i]->reset)(); (*dt[i]->init)(); roots[i] = (*dt[i]->attach)(""); } poperror(); errdepth(ed); if(pipe(p) < 0){ werrstr("can't make pipe: %r"); return 0; } *sfd = p[0]; *fd = p[1]; ex.fd = *sfd; ex.roots = roots; ex.nroots = n; kproc("exporter", extramp, &ex); return n; }