xref: /plan9/sys/src/cmd/lp/ipcopen.c (revision bd389b369d90320ffee8121f40c4c30619f88097)
1*bd389b36SDavid du Colombier #include <u.h>
2*bd389b36SDavid du Colombier #include <libc.h>
3*bd389b36SDavid du Colombier 
4*bd389b36SDavid du Colombier int ppid;
5*bd389b36SDavid du Colombier 
6*bd389b36SDavid du Colombier /*
7*bd389b36SDavid du Colombier  * predefined
8*bd389b36SDavid du Colombier  */
9*bd389b36SDavid du Colombier void pass(int from, int to);
10*bd389b36SDavid du Colombier 
11*bd389b36SDavid du Colombier 
12*bd389b36SDavid du Colombier /*
13*bd389b36SDavid du Colombier  *  Connect to given datakit port
14*bd389b36SDavid du Colombier  */
main(int argc,char * argv[])15*bd389b36SDavid du Colombier main(int argc, char *argv[])
16*bd389b36SDavid du Colombier {
17*bd389b36SDavid du Colombier 	int fd0, fd1;
18*bd389b36SDavid du Colombier 	int cpid;
19*bd389b36SDavid du Colombier 	char c;
20*bd389b36SDavid du Colombier 	char *cp, *devdir, *buf;
21*bd389b36SDavid du Colombier 
22*bd389b36SDavid du Colombier 	if (argc != 4) {
23*bd389b36SDavid du Colombier 		fprint(2, "usage: %s destination network service\n", argv[0]);
24*bd389b36SDavid du Colombier 		exits("incorrect number of arguments");
25*bd389b36SDavid du Colombier 	}
26*bd389b36SDavid du Colombier 	if(!(cp = malloc((long)(strlen(argv[1])+strlen(argv[2])+strlen(argv[3])+8)))) {
27*bd389b36SDavid du Colombier 		perror("malloc");
28*bd389b36SDavid du Colombier 		exits("malloc failed");
29*bd389b36SDavid du Colombier 	}
30*bd389b36SDavid du Colombier 	sprint(cp, "%s!%s!%s", argv[2], argv[1], argv[3]);
31*bd389b36SDavid du Colombier 	if (dial(cp, &devdir, 0) < 0) {
32*bd389b36SDavid du Colombier 		fprint(2, "dialing %s\n", cp);
33*bd389b36SDavid du Colombier 		perror("dial");
34*bd389b36SDavid du Colombier 		exits("can't dial");
35*bd389b36SDavid du Colombier 	}
36*bd389b36SDavid du Colombier 
37*bd389b36SDavid du Colombier 	/*
38*bd389b36SDavid du Colombier 	 * Initialize the input fd, and copy bytes.
39*bd389b36SDavid du Colombier 	 */
40*bd389b36SDavid du Colombier 
41*bd389b36SDavid du Colombier 	if(!(buf = malloc((long)(strlen(devdir)+6)))) {
42*bd389b36SDavid du Colombier 		perror("malloc");
43*bd389b36SDavid du Colombier 		exits("malloc failed");
44*bd389b36SDavid du Colombier 	}
45*bd389b36SDavid du Colombier 	sprint(buf, "%s/data", devdir);
46*bd389b36SDavid du Colombier 	fd0=open(buf, OREAD);
47*bd389b36SDavid du Colombier 	fd1=open(buf, OWRITE);
48*bd389b36SDavid du Colombier 	if(fd0<0 || fd1<0) {
49*bd389b36SDavid du Colombier 		print("can't open", buf);
50*bd389b36SDavid du Colombier 		exits("can't open port");
51*bd389b36SDavid du Colombier 	}
52*bd389b36SDavid du Colombier 	ppid = getpid();
53*bd389b36SDavid du Colombier 	switch(cpid = fork()){
54*bd389b36SDavid du Colombier 	case -1:
55*bd389b36SDavid du Colombier 		perror("fork failed");
56*bd389b36SDavid du Colombier 		exits("fork failed");
57*bd389b36SDavid du Colombier 	case 0:
58*bd389b36SDavid du Colombier 		close(0);
59*bd389b36SDavid du Colombier 		close(fd1);
60*bd389b36SDavid du Colombier 		pass(fd0, 1);	/* from remote */
61*bd389b36SDavid du Colombier 		hangup(fd0);
62*bd389b36SDavid du Colombier 		close(1);
63*bd389b36SDavid du Colombier 		close(fd0);
64*bd389b36SDavid du Colombier 		exits("");
65*bd389b36SDavid du Colombier 	default:
66*bd389b36SDavid du Colombier 		close(1);
67*bd389b36SDavid du Colombier 		close(fd0);
68*bd389b36SDavid du Colombier 		pass(0, fd1);	/* to remote */
69*bd389b36SDavid du Colombier 		hangup(fd1);
70*bd389b36SDavid du Colombier 		close(0);
71*bd389b36SDavid du Colombier 		close(fd1);
72*bd389b36SDavid du Colombier 		exits("");
73*bd389b36SDavid du Colombier 	}
74*bd389b36SDavid du Colombier }
75*bd389b36SDavid du Colombier 
76*bd389b36SDavid du Colombier void
pass(int from,int to)77*bd389b36SDavid du Colombier pass(int from, int to)
78*bd389b36SDavid du Colombier {
79*bd389b36SDavid du Colombier 	char buf[1024];
80*bd389b36SDavid du Colombier 	int ppid, cpid;
81*bd389b36SDavid du Colombier 	int n, tot = 0;
82*bd389b36SDavid du Colombier 
83*bd389b36SDavid du Colombier 	while ((n=read(from, buf, sizeof(buf))) > 0) {
84*bd389b36SDavid du Colombier 		if (n==1 && tot==0 && *buf=='\0')
85*bd389b36SDavid du Colombier 			break;
86*bd389b36SDavid du Colombier 		tot += n;
87*bd389b36SDavid du Colombier 		if (write(to, buf, n)!=n) {
88*bd389b36SDavid du Colombier 			perror("pass write error");
89*bd389b36SDavid du Colombier 			exits("pass write error");
90*bd389b36SDavid du Colombier 		}
91*bd389b36SDavid du Colombier 	}
92*bd389b36SDavid du Colombier }
93