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 4f604b18 2004-06-09 devnull if(fsplumb == nil)
53 4f604b18 2004-06-09 devnull fsplumb = nsmount("plumb", "");
54 4f604b18 2004-06-09 devnull if(fsplumb == nil)
55 4f604b18 2004-06-09 devnull return nil;
56 4f604b18 2004-06-09 devnull return fsopen(fsplumb, name, mode);
57 4f604b18 2004-06-09 devnull }
58 4f604b18 2004-06-09 devnull
59 4f604b18 2004-06-09 devnull int
60 b4e8c4b6 2005-01-04 devnull plumbsendtofid(CFid *fid, Plumbmsg *m)
61 4f604b18 2004-06-09 devnull {
62 4f604b18 2004-06-09 devnull char *buf;
63 4f604b18 2004-06-09 devnull int n;
64 4f604b18 2004-06-09 devnull
65 4f604b18 2004-06-09 devnull if(fid == nil){
66 4f604b18 2004-06-09 devnull werrstr("invalid fid");
67 4f604b18 2004-06-09 devnull return -1;
68 4f604b18 2004-06-09 devnull }
69 4f604b18 2004-06-09 devnull buf = plumbpack(m, &n);
70 4f604b18 2004-06-09 devnull if(buf == nil)
71 4f604b18 2004-06-09 devnull return -1;
72 4f604b18 2004-06-09 devnull n = fswrite(fid, buf, n);
73 4f604b18 2004-06-09 devnull free(buf);
74 4f604b18 2004-06-09 devnull return n;
75 4f604b18 2004-06-09 devnull }
76 4f604b18 2004-06-09 devnull
77 4f604b18 2004-06-09 devnull int
78 4f604b18 2004-06-09 devnull plumbsend(int fd, Plumbmsg *m)
79 4f604b18 2004-06-09 devnull {
80 4f604b18 2004-06-09 devnull if(fd == -1){
81 4f604b18 2004-06-09 devnull werrstr("invalid fd");
82 4f604b18 2004-06-09 devnull return -1;
83 4f604b18 2004-06-09 devnull }
84 4f604b18 2004-06-09 devnull if(fd != pfd){
85 4f604b18 2004-06-09 devnull werrstr("fd is not the plumber");
86 4f604b18 2004-06-09 devnull return -1;
87 4f604b18 2004-06-09 devnull }
88 4f604b18 2004-06-09 devnull return plumbsendtofid(pfid, m);
89 4f604b18 2004-06-09 devnull }
90 4f604b18 2004-06-09 devnull
91 4f604b18 2004-06-09 devnull Plumbmsg*
92 4f604b18 2004-06-09 devnull plumbrecv(int fd)
93 4f604b18 2004-06-09 devnull {
94 4f604b18 2004-06-09 devnull char *buf;
95 4f604b18 2004-06-09 devnull Plumbmsg *m;
96 4f604b18 2004-06-09 devnull int n, more;
97 4f604b18 2004-06-09 devnull
98 4f604b18 2004-06-09 devnull buf = malloc(8192);
99 4f604b18 2004-06-09 devnull if(buf == nil)
100 4f604b18 2004-06-09 devnull return nil;
101 4f604b18 2004-06-09 devnull n = read(fd, buf, 8192);
102 4f604b18 2004-06-09 devnull m = nil;
103 4f604b18 2004-06-09 devnull if(n > 0){
104 4f604b18 2004-06-09 devnull m = plumbunpackpartial(buf, n, &more);
105 4f604b18 2004-06-09 devnull if(m==nil && more>0){
106 4f604b18 2004-06-09 devnull /* we now know how many more bytes to read for complete message */
107 4f604b18 2004-06-09 devnull buf = realloc(buf, n+more);
108 4f604b18 2004-06-09 devnull if(buf == nil)
109 4f604b18 2004-06-09 devnull return nil;
110 4f604b18 2004-06-09 devnull if(readn(fd, buf+n, more) == more)
111 4f604b18 2004-06-09 devnull m = plumbunpackpartial(buf, n+more, nil);
112 4f604b18 2004-06-09 devnull }
113 4f604b18 2004-06-09 devnull }
114 4f604b18 2004-06-09 devnull free(buf);
115 4f604b18 2004-06-09 devnull return m;
116 4f604b18 2004-06-09 devnull }
117 4f604b18 2004-06-09 devnull
118 4f604b18 2004-06-09 devnull Plumbmsg*
119 b4e8c4b6 2005-01-04 devnull plumbrecvfid(CFid *fid)
120 4f604b18 2004-06-09 devnull {
121 4f604b18 2004-06-09 devnull char *buf;
122 4f604b18 2004-06-09 devnull Plumbmsg *m;
123 4f604b18 2004-06-09 devnull int n, more;
124 4f604b18 2004-06-09 devnull
125 4f604b18 2004-06-09 devnull buf = malloc(8192);
126 4f604b18 2004-06-09 devnull if(buf == nil)
127 4f604b18 2004-06-09 devnull return nil;
128 4f604b18 2004-06-09 devnull n = fsread(fid, buf, 8192);
129 4f604b18 2004-06-09 devnull m = nil;
130 4f604b18 2004-06-09 devnull if(n > 0){
131 4f604b18 2004-06-09 devnull m = plumbunpackpartial(buf, n, &more);
132 4f604b18 2004-06-09 devnull if(m==nil && more>0){
133 4f604b18 2004-06-09 devnull /* we now know how many more bytes to read for complete message */
134 4f604b18 2004-06-09 devnull buf = realloc(buf, n+more);
135 4f604b18 2004-06-09 devnull if(buf == nil)
136 4f604b18 2004-06-09 devnull return nil;
137 4f604b18 2004-06-09 devnull if(fsreadn(fid, buf+n, more) == more)
138 4f604b18 2004-06-09 devnull m = plumbunpackpartial(buf, n+more, nil);
139 4f604b18 2004-06-09 devnull }
140 4f604b18 2004-06-09 devnull }
141 4f604b18 2004-06-09 devnull free(buf);
142 4f604b18 2004-06-09 devnull return m;
143 4f604b18 2004-06-09 devnull }
144 4f604b18 2004-06-09 devnull