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