| /* | 
 |  * tee-- pipe fitting | 
 |  */ | 
 |  | 
 | #include <u.h> | 
 | #include <libc.h> | 
 |  | 
 | int	uflag; | 
 | int	aflag; | 
 | int	openf[100]; | 
 |  | 
 | char in[8192]; | 
 |  | 
 | int	intignore(void*, char*); | 
 |  | 
 | void | 
 | main(int argc, char **argv) | 
 | { | 
 | 	int i; | 
 | 	int r, n; | 
 |  | 
 | 	ARGBEGIN { | 
 | 	case 'a': | 
 | 		aflag++; | 
 | 		break; | 
 |  | 
 | 	case 'i': | 
 | 		atnotify(intignore, 1); | 
 | 		break; | 
 |  | 
 | 	case 'u': | 
 | 		uflag++; | 
 | 		/* uflag is ignored and undocumented; it's a relic from Unix */ | 
 | 		break; | 
 |  | 
 | 	default: | 
 | 		fprint(2, "usage: tee [-ai] [file ...]\n"); | 
 | 		exits("usage"); | 
 | 	} ARGEND | 
 |  | 
 | 	USED(argc); | 
 | 	n = 0; | 
 | 	while(*argv) { | 
 | 		if(aflag) { | 
 | 			openf[n] = open(argv[0], OWRITE); | 
 | 			if(openf[n] < 0) | 
 | 				openf[n] = create(argv[0], OWRITE, 0666); | 
 | 			seek(openf[n], 0L, 2); | 
 | 		} else | 
 | 			openf[n] = create(argv[0], OWRITE, 0666); | 
 | 		if(openf[n] < 0) { | 
 | 			fprint(2, "tee: cannot open %s: %r\n", argv[0]); | 
 | 		} else | 
 | 			n++; | 
 | 		argv++; | 
 | 	} | 
 | 	openf[n++] = 1; | 
 |  | 
 | 	for(;;) { | 
 | 		r = read(0, in, sizeof in); | 
 | 		if(r <= 0) | 
 | 			exits(nil); | 
 | 		for(i=0; i<n; i++) | 
 | 			write(openf[i], in, r); | 
 | 	} | 
 | } | 
 |  | 
 | int | 
 | intignore(void *a, char *msg) | 
 | { | 
 | 	USED(a); | 
 | 	if(strcmp(msg, "interrupt") == 0) | 
 | 		return 1; | 
 | 	return 0; | 
 | } |