Warning: Attempt to read property "date" on null in /usr/local/www/websvn.planix.org/blame.php on line 247

Warning: Attempt to read property "msg" on null in /usr/local/www/websvn.planix.org/blame.php on line 247
WebSVN – planix.SVN – Blame – /os/branches/feature_fixcpp/sys/src/cmd/lp/ipcopen.c – Rev 2

Subversion Repositories planix.SVN

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

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