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