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>
6 b8c14089 2003-11-23 devnull char *plumbfile = nil;
7 b8c14089 2003-11-23 devnull Plumbmsg m;
10 b8c14089 2003-11-23 devnull usage(void)
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");
17 b8c14089 2003-11-23 devnull gather(void)
19 b8c14089 2003-11-23 devnull char buf[8192];
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");
30 b8c14089 2003-11-23 devnull memmove(m.data+m.ndata, buf, n);
31 b8c14089 2003-11-23 devnull m.ndata += n;
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");
40 f063dad9 2004-02-29 devnull threadmain(int argc, char *argv[])
42 b8c14089 2003-11-23 devnull char buf[1024], *p;
43 b8c14089 2003-11-23 devnull int fd, i, input;
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)
56 b8c14089 2003-11-23 devnull m.attr = plumbaddattr(m.attr, plumbunpackattr(p));
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)
63 b8c14089 2003-11-23 devnull case 'i':
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)
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)
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)
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)
89 b8c14089 2003-11-23 devnull if((input && argc>0) || (!input && argc<1))
91 b8c14089 2003-11-23 devnull if(plumbfile != nil)
92 b8c14089 2003-11-23 devnull fd = open(plumbfile, OWRITE);
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");
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");
107 b10db40d 2005-01-04 devnull threadexitsall(nil);
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;
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");
119 f063dad9 2004-02-29 devnull threadexitsall(nil);