plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

dial.c (879B)


      1 #include <u.h>
      2 #include <libc.h>
      3 
      4 void
      5 usage(void)
      6 {
      7 	fprint(2, "usage: dial [-e] addr\n");
      8 	exits("usage");
      9 }
     10 
     11 void
     12 killer(void *x, char *msg)
     13 {
     14 	USED(x);
     15 	if(strcmp(msg, "kill") == 0)
     16 		exits(0);
     17 	noted(NDFLT);
     18 }
     19 
     20 void
     21 main(int argc, char **argv)
     22 {
     23 	int fd, pid;
     24 	char buf[8192];
     25 	int n, waitforeof;
     26 
     27 	notify(killer);
     28 	waitforeof = 0;
     29 	ARGBEGIN{
     30 	case 'e':
     31 		waitforeof = 1;
     32 		break;
     33 	default:
     34 		usage();
     35 	}ARGEND
     36 
     37 	if(argc != 1)
     38 		usage();
     39 
     40 	if((fd = dial(argv[0], nil, nil, nil)) < 0)
     41 		sysfatal("dial: %r");
     42 
     43 	switch(pid = fork()){
     44 	case -1:
     45 		sysfatal("fork: %r");
     46 	case 0:
     47 		while((n = read(0, buf, sizeof buf)) > 0)
     48 			if(write(fd, buf, n) < 0)
     49 				break;
     50 		if(!waitforeof)
     51 			postnote(PNPROC, getppid(), "kill");
     52 		exits(nil);
     53 	}
     54 
     55 	while((n = read(fd, buf, sizeof buf)) > 0)
     56 		if(write(1, buf, n) < 0)
     57 			break;
     58 
     59 	postnote(PNPROC, pid, "kill");
     60 	waitpid();
     61 	exits(0);
     62 }