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