blob: 37b6b80f9b8013e60d80dd64d76e654bc945f107 [file] [log] [blame]
rscb3994ec2003-12-11 17:50:28 +00001#include <u.h>
2#include <libc.h>
3
4int
5post9pservice(int fd, char *name)
6{
7 int i;
8 char *ns, *s;
9 Waitmsg *w;
10
rsc9f95eb62005-07-18 00:05:41 +000011 if(strchr(name, '!')) /* assume is already network address */
12 s = strdup(name);
13 else{
14 if((ns = getns()) == nil)
15 return -1;
16 s = smprint("unix!%s/%s", ns, name);
17 free(ns);
18 }
rscb3994ec2003-12-11 17:50:28 +000019 if(s == nil)
20 return -1;
rsc05d8c6d2004-09-23 03:06:04 +000021 switch(fork()){
rscb3994ec2003-12-11 17:50:28 +000022 case -1:
23 return -1;
24 case 0:
25 dup(fd, 0);
26 dup(fd, 1);
27 for(i=3; i<20; i++)
28 close(i);
29 execlp("9pserve", "9pserve", "-u", s, (char*)0);
30 fprint(2, "exec 9pserve: %r\n");
31 _exits("exec");
32 default:
33 w = wait();
rsc005a85f2005-01-07 08:02:54 +000034 if(w == nil)
35 return -1;
rscb3994ec2003-12-11 17:50:28 +000036 close(fd);
37 free(s);
38 if(w->msg && w->msg[0]){
39 free(w);
40 werrstr("9pserve failed");
41 return -1;
42 }
43 free(w);
44 return 0;
45 }
46}