Blame


1 b8c14089 2003-11-23 devnull #include <u.h>
2 b8c14089 2003-11-23 devnull #include <libc.h>
3 b8c14089 2003-11-23 devnull #include <plumb.h>
4 f063dad9 2004-02-29 devnull #include <thread.h>
5 ca30274b 2005-03-18 devnull #include <9pclient.h>
6 b8c14089 2003-11-23 devnull
7 b8c14089 2003-11-23 devnull char *plumbfile = nil;
8 b8c14089 2003-11-23 devnull Plumbmsg m;
9 b8c14089 2003-11-23 devnull
10 b8c14089 2003-11-23 devnull void
11 b8c14089 2003-11-23 devnull usage(void)
12 b8c14089 2003-11-23 devnull {
13 4da83e7c 2004-03-05 devnull fprint(2, "usage: plumb [-p plumbfile] [-a 'attr=value ...'] [-s src] [-d dst] [-t type] [-w wdir] -i | data1\n");
14 b10db40d 2005-01-04 devnull threadexitsall("usage");
15 b8c14089 2003-11-23 devnull }
16 b8c14089 2003-11-23 devnull
17 b8c14089 2003-11-23 devnull void
18 b8c14089 2003-11-23 devnull gather(void)
19 b8c14089 2003-11-23 devnull {
20 b8c14089 2003-11-23 devnull char buf[8192];
21 b8c14089 2003-11-23 devnull int n;
22 b8c14089 2003-11-23 devnull
23 b8c14089 2003-11-23 devnull m.ndata = 0;
24 b8c14089 2003-11-23 devnull m.data = nil;
25 b8c14089 2003-11-23 devnull while((n = read(0, buf, sizeof buf)) > 0){
26 b8c14089 2003-11-23 devnull m.data = realloc(m.data, m.ndata+n);
27 b8c14089 2003-11-23 devnull if(m.data == nil){
28 b8c14089 2003-11-23 devnull fprint(2, "plumb: alloc failed: %r\n");
29 b10db40d 2005-01-04 devnull threadexitsall("alloc");
30 b8c14089 2003-11-23 devnull }
31 b8c14089 2003-11-23 devnull memmove(m.data+m.ndata, buf, n);
32 b8c14089 2003-11-23 devnull m.ndata += n;
33 b8c14089 2003-11-23 devnull }
34 b8c14089 2003-11-23 devnull if(n < 0){
35 b8c14089 2003-11-23 devnull fprint(2, "plumb: i/o error on input: %r\n");
36 b10db40d 2005-01-04 devnull threadexitsall("read");
37 b8c14089 2003-11-23 devnull }
38 b8c14089 2003-11-23 devnull }
39 b8c14089 2003-11-23 devnull
40 b8c14089 2003-11-23 devnull void
41 f063dad9 2004-02-29 devnull threadmain(int argc, char *argv[])
42 b8c14089 2003-11-23 devnull {
43 b8c14089 2003-11-23 devnull char buf[1024], *p;
44 b8c14089 2003-11-23 devnull int fd, i, input;
45 b8c14089 2003-11-23 devnull
46 b8c14089 2003-11-23 devnull input = 0;
47 b8c14089 2003-11-23 devnull m.src = "plumb";
48 b8c14089 2003-11-23 devnull m.dst = nil;
49 b8c14089 2003-11-23 devnull m.wdir = getwd(buf, sizeof buf);
50 b8c14089 2003-11-23 devnull m.type = "text";
51 b8c14089 2003-11-23 devnull m.attr = nil;
52 b8c14089 2003-11-23 devnull ARGBEGIN{
53 ca30274b 2005-03-18 devnull case '9':
54 ca30274b 2005-03-18 devnull chatty9pclient = 1;
55 ca30274b 2005-03-18 devnull break;
56 b8c14089 2003-11-23 devnull case 'a':
57 b8c14089 2003-11-23 devnull p = ARGF();
58 b8c14089 2003-11-23 devnull if(p == nil)
59 b8c14089 2003-11-23 devnull usage();
60 b8c14089 2003-11-23 devnull m.attr = plumbaddattr(m.attr, plumbunpackattr(p));
61 b8c14089 2003-11-23 devnull break;
62 b8c14089 2003-11-23 devnull case 'd':
63 b8c14089 2003-11-23 devnull m.dst = ARGF();
64 b8c14089 2003-11-23 devnull if(m.dst == nil)
65 b8c14089 2003-11-23 devnull usage();
66 b8c14089 2003-11-23 devnull break;
67 b8c14089 2003-11-23 devnull case 'i':
68 b8c14089 2003-11-23 devnull input++;
69 b8c14089 2003-11-23 devnull break;
70 b8c14089 2003-11-23 devnull case 't':
71 b8c14089 2003-11-23 devnull case 'k': /* for backwards compatibility */
72 b8c14089 2003-11-23 devnull m.type = ARGF();
73 b8c14089 2003-11-23 devnull if(m.type == nil)
74 b8c14089 2003-11-23 devnull usage();
75 b8c14089 2003-11-23 devnull break;
76 b8c14089 2003-11-23 devnull case 'p':
77 b8c14089 2003-11-23 devnull plumbfile = ARGF();
78 b8c14089 2003-11-23 devnull if(plumbfile == nil)
79 b8c14089 2003-11-23 devnull usage();
80 b8c14089 2003-11-23 devnull break;
81 b8c14089 2003-11-23 devnull case 's':
82 b8c14089 2003-11-23 devnull m.src = ARGF();
83 b8c14089 2003-11-23 devnull if(m.src == nil)
84 b8c14089 2003-11-23 devnull usage();
85 b8c14089 2003-11-23 devnull break;
86 b8c14089 2003-11-23 devnull case 'w':
87 b8c14089 2003-11-23 devnull m.wdir = ARGF();
88 b8c14089 2003-11-23 devnull if(m.wdir == nil)
89 b8c14089 2003-11-23 devnull usage();
90 b8c14089 2003-11-23 devnull break;
91 b8c14089 2003-11-23 devnull }ARGEND
92 b8c14089 2003-11-23 devnull
93 b8c14089 2003-11-23 devnull if((input && argc>0) || (!input && argc<1))
94 b8c14089 2003-11-23 devnull usage();
95 b8c14089 2003-11-23 devnull if(plumbfile != nil)
96 b8c14089 2003-11-23 devnull fd = open(plumbfile, OWRITE);
97 b8c14089 2003-11-23 devnull else
98 b8c14089 2003-11-23 devnull fd = plumbopen("send", OWRITE);
99 b8c14089 2003-11-23 devnull if(fd < 0){
100 b8c14089 2003-11-23 devnull fprint(2, "plumb: can't open plumb file: %r\n");
101 b10db40d 2005-01-04 devnull threadexitsall("open");
102 b8c14089 2003-11-23 devnull }
103 b8c14089 2003-11-23 devnull if(input){
104 b8c14089 2003-11-23 devnull gather();
105 b8c14089 2003-11-23 devnull if(plumblookup(m.attr, "action") == nil)
106 b8c14089 2003-11-23 devnull m.attr = plumbaddattr(m.attr, plumbunpackattr("action=showdata"));
107 b8c14089 2003-11-23 devnull if(plumbsend(fd, &m) < 0){
108 b8c14089 2003-11-23 devnull fprint(2, "plumb: can't send message: %r\n");
109 b10db40d 2005-01-04 devnull threadexitsall("error");
110 b8c14089 2003-11-23 devnull }
111 b10db40d 2005-01-04 devnull threadexitsall(nil);
112 b8c14089 2003-11-23 devnull }
113 b8c14089 2003-11-23 devnull for(i=0; i<argc; i++){
114 b8c14089 2003-11-23 devnull if(input == 0){
115 b8c14089 2003-11-23 devnull m.data = argv[i];
116 b8c14089 2003-11-23 devnull m.ndata = -1;
117 b8c14089 2003-11-23 devnull }
118 b8c14089 2003-11-23 devnull if(plumbsend(fd, &m) < 0){
119 b8c14089 2003-11-23 devnull fprint(2, "plumb: can't send message: %r\n");
120 b10db40d 2005-01-04 devnull threadexitsall("error");
121 b8c14089 2003-11-23 devnull }
122 b8c14089 2003-11-23 devnull }
123 f063dad9 2004-02-29 devnull threadexitsall(nil);
124 b8c14089 2003-11-23 devnull }