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