xref: /plan9/sys/src/cmd/plumb/plumb.c (revision 7dd7cddf99dd7472612f1413b4da293630e6b1bc)
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