Blame


1 4f604b18 2004-06-09 devnull #include <u.h>
2 4f604b18 2004-06-09 devnull #include <libc.h>
3 4f604b18 2004-06-09 devnull #include <fcall.h>
4 b4e8c4b6 2005-01-04 devnull #include <9pclient.h>
5 4f604b18 2004-06-09 devnull #include "plumb.h"
6 4f604b18 2004-06-09 devnull
7 b4e8c4b6 2005-01-04 devnull static CFsys *fsplumb;
8 4f604b18 2004-06-09 devnull static int pfd = -1;
9 b4e8c4b6 2005-01-04 devnull static CFid *pfid;
10 4f604b18 2004-06-09 devnull
11 4f604b18 2004-06-09 devnull int
12 4f604b18 2004-06-09 devnull plumbopen(char *name, int omode)
13 4f604b18 2004-06-09 devnull {
14 4f604b18 2004-06-09 devnull if(fsplumb == nil)
15 4f604b18 2004-06-09 devnull fsplumb = nsmount("plumb", "");
16 4f604b18 2004-06-09 devnull if(fsplumb == nil)
17 4f604b18 2004-06-09 devnull return -1;
18 4f604b18 2004-06-09 devnull /*
19 4f604b18 2004-06-09 devnull * It's important that when we send something,
20 4f604b18 2004-06-09 devnull * we find out whether it was a valid plumb write.
21 4f604b18 2004-06-09 devnull * (If it isn't, the client might fall back to some
22 4f604b18 2004-06-09 devnull * other mechanism or indicate to the user what happened.)
23 4f604b18 2004-06-09 devnull * We can't use a pipe for this, so we have to use the
24 4f604b18 2004-06-09 devnull * fid interface. But we need to return a fd.
25 4f604b18 2004-06-09 devnull * Return a fd for /dev/null so that we return a unique
26 4f604b18 2004-06-09 devnull * file descriptor. In plumbsend we'll look for pfd
27 4f604b18 2004-06-09 devnull * and use the recorded fid instead.
28 4f604b18 2004-06-09 devnull */
29 4f604b18 2004-06-09 devnull if((omode&3) == OWRITE){
30 4f604b18 2004-06-09 devnull if(pfd != -1){
31 4f604b18 2004-06-09 devnull werrstr("already have plumb send open");
32 4f604b18 2004-06-09 devnull return -1;
33 4f604b18 2004-06-09 devnull }
34 4f604b18 2004-06-09 devnull pfd = open("/dev/null", OWRITE);
35 4f604b18 2004-06-09 devnull if(pfd < 0)
36 4f604b18 2004-06-09 devnull return -1;
37 4f604b18 2004-06-09 devnull pfid = fsopen(fsplumb, name, omode);
38 4f604b18 2004-06-09 devnull if(pfid == nil){
39 4f604b18 2004-06-09 devnull close(pfd);
40 4f604b18 2004-06-09 devnull pfd = -1;
41 4f604b18 2004-06-09 devnull return -1;
42 4f604b18 2004-06-09 devnull }
43 4f604b18 2004-06-09 devnull return pfd;
44 4f604b18 2004-06-09 devnull }
45 4f604b18 2004-06-09 devnull
46 4f604b18 2004-06-09 devnull return fsopenfd(fsplumb, name, omode);
47 4f604b18 2004-06-09 devnull }
48 4f604b18 2004-06-09 devnull
49 b4e8c4b6 2005-01-04 devnull CFid*
50 4f604b18 2004-06-09 devnull plumbopenfid(char *name, int mode)
51 4f604b18 2004-06-09 devnull {
52 57d7df40 2005-03-18 devnull if(fsplumb == nil){
53 4f604b18 2004-06-09 devnull fsplumb = nsmount("plumb", "");
54 57d7df40 2005-03-18 devnull if(fsplumb == nil){
55 57d7df40 2005-03-18 devnull werrstr("mount plumb: %r");
56 57d7df40 2005-03-18 devnull return nil;
57 57d7df40 2005-03-18 devnull }
58 57d7df40 2005-03-18 devnull }
59 4f604b18 2004-06-09 devnull return fsopen(fsplumb, name, mode);
60 4f604b18 2004-06-09 devnull }
61 4f604b18 2004-06-09 devnull
62 4f604b18 2004-06-09 devnull int
63 b4e8c4b6 2005-01-04 devnull plumbsendtofid(CFid *fid, Plumbmsg *m)
64 4f604b18 2004-06-09 devnull {
65 4f604b18 2004-06-09 devnull char *buf;
66 4f604b18 2004-06-09 devnull int n;
67 4f604b18 2004-06-09 devnull
68 4f604b18 2004-06-09 devnull if(fid == nil){
69 4f604b18 2004-06-09 devnull werrstr("invalid fid");
70 4f604b18 2004-06-09 devnull return -1;
71 4f604b18 2004-06-09 devnull }
72 4f604b18 2004-06-09 devnull buf = plumbpack(m, &n);
73 4f604b18 2004-06-09 devnull if(buf == nil)
74 4f604b18 2004-06-09 devnull return -1;
75 4f604b18 2004-06-09 devnull n = fswrite(fid, buf, n);
76 4f604b18 2004-06-09 devnull free(buf);
77 4f604b18 2004-06-09 devnull return n;
78 4f604b18 2004-06-09 devnull }
79 4f604b18 2004-06-09 devnull
80 4f604b18 2004-06-09 devnull int
81 4f604b18 2004-06-09 devnull plumbsend(int fd, Plumbmsg *m)
82 4f604b18 2004-06-09 devnull {
83 4f604b18 2004-06-09 devnull if(fd == -1){
84 4f604b18 2004-06-09 devnull werrstr("invalid fd");
85 4f604b18 2004-06-09 devnull return -1;
86 4f604b18 2004-06-09 devnull }
87 4f604b18 2004-06-09 devnull if(fd != pfd){
88 4f604b18 2004-06-09 devnull werrstr("fd is not the plumber");
89 4f604b18 2004-06-09 devnull return -1;
90 4f604b18 2004-06-09 devnull }
91 4f604b18 2004-06-09 devnull return plumbsendtofid(pfid, m);
92 4f604b18 2004-06-09 devnull }
93 4f604b18 2004-06-09 devnull
94 4f604b18 2004-06-09 devnull Plumbmsg*
95 4f604b18 2004-06-09 devnull plumbrecv(int fd)
96 4f604b18 2004-06-09 devnull {
97 4f604b18 2004-06-09 devnull char *buf;
98 4f604b18 2004-06-09 devnull Plumbmsg *m;
99 4f604b18 2004-06-09 devnull int n, more;
100 4f604b18 2004-06-09 devnull
101 4f604b18 2004-06-09 devnull buf = malloc(8192);
102 4f604b18 2004-06-09 devnull if(buf == nil)
103 4f604b18 2004-06-09 devnull return nil;
104 4f604b18 2004-06-09 devnull n = read(fd, buf, 8192);
105 4f604b18 2004-06-09 devnull m = nil;
106 4f604b18 2004-06-09 devnull if(n > 0){
107 4f604b18 2004-06-09 devnull m = plumbunpackpartial(buf, n, &more);
108 4f604b18 2004-06-09 devnull if(m==nil && more>0){
109 4f604b18 2004-06-09 devnull /* we now know how many more bytes to read for complete message */
110 4f604b18 2004-06-09 devnull buf = realloc(buf, n+more);
111 4f604b18 2004-06-09 devnull if(buf == nil)
112 4f604b18 2004-06-09 devnull return nil;
113 4f604b18 2004-06-09 devnull if(readn(fd, buf+n, more) == more)
114 4f604b18 2004-06-09 devnull m = plumbunpackpartial(buf, n+more, nil);
115 4f604b18 2004-06-09 devnull }
116 4f604b18 2004-06-09 devnull }
117 4f604b18 2004-06-09 devnull free(buf);
118 4f604b18 2004-06-09 devnull return m;
119 4f604b18 2004-06-09 devnull }
120 4f604b18 2004-06-09 devnull
121 4f604b18 2004-06-09 devnull Plumbmsg*
122 b4e8c4b6 2005-01-04 devnull plumbrecvfid(CFid *fid)
123 4f604b18 2004-06-09 devnull {
124 4f604b18 2004-06-09 devnull char *buf;
125 4f604b18 2004-06-09 devnull Plumbmsg *m;
126 4f604b18 2004-06-09 devnull int n, more;
127 4f604b18 2004-06-09 devnull
128 4f604b18 2004-06-09 devnull buf = malloc(8192);
129 4f604b18 2004-06-09 devnull if(buf == nil)
130 4f604b18 2004-06-09 devnull return nil;
131 4f604b18 2004-06-09 devnull n = fsread(fid, buf, 8192);
132 4f604b18 2004-06-09 devnull m = nil;
133 4f604b18 2004-06-09 devnull if(n > 0){
134 4f604b18 2004-06-09 devnull m = plumbunpackpartial(buf, n, &more);
135 4f604b18 2004-06-09 devnull if(m==nil && more>0){
136 4f604b18 2004-06-09 devnull /* we now know how many more bytes to read for complete message */
137 4f604b18 2004-06-09 devnull buf = realloc(buf, n+more);
138 4f604b18 2004-06-09 devnull if(buf == nil)
139 4f604b18 2004-06-09 devnull return nil;
140 4f604b18 2004-06-09 devnull if(fsreadn(fid, buf+n, more) == more)
141 4f604b18 2004-06-09 devnull m = plumbunpackpartial(buf, n+more, nil);
142 4f604b18 2004-06-09 devnull }
143 4f604b18 2004-06-09 devnull }
144 4f604b18 2004-06-09 devnull free(buf);
145 4f604b18 2004-06-09 devnull return m;
146 4f604b18 2004-06-09 devnull }
147 4f604b18 2004-06-09 devnull