You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							133 lines
						
					
					
						
							3.1 KiB
						
					
					
				
			
		
		
	
	
							133 lines
						
					
					
						
							3.1 KiB
						
					
					
				| /* | |
|  * --- SDE-COPYRIGHT-NOTE-BEGIN --- | |
|  * This copyright note is auto-generated by ./scripts/Create-CopyPatch. | |
|  * | |
|  * Filename: package/.../sysfiles/btee.c | |
|  * Copyright (C) 2004 - 2006 The T2 SDE Project | |
|  * | |
|  * More information can be found in the files COPYING and README. | |
|  * | |
|  * This program is free software; you can redistribute it and/or modify | |
|  * it under the terms of the GNU General Public License as published by | |
|  * the Free Software Foundation; version 2 of the License. A copy of the | |
|  * GNU General Public License can be found in the file COPYING. | |
|  * --- SDE-COPYRIGHT-NOTE-END --- | |
|  */ | |
| /*  btee.c, a buffered tee clone   -   written for ROCK Linux | |
|  | |
|     Copyright (C) 1998, 1999, 2001, 2003  Clifford Wolf | |
|  | |
|     This program is free software; you can redistribute it and/or modify | |
|     it under the terms of the GNU General Public License as published by | |
|     the Free Software Foundation; either version 2 of the License, or | |
|     (at your option) any later version. | |
|  | |
|     This program is distributed in the hope that it will be useful, | |
|     but WITHOUT ANY WARRANTY; without even the implied warranty of | |
|     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | |
|     GNU General Public License for more details. | |
|  | |
|     You should have received a copy of the GNU General Public License | |
|     along with this program; if not, write to the Free Software | |
|     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |
| */ | |
|  | |
| #define _GNU_SOURCE | |
|  | |
| #include <stdio.h> | |
| #include <unistd.h> | |
| #include <sys/types.h> | |
| #include <sys/stat.h> | |
| #include <signal.h> | |
| #include <stdlib.h> | |
| #include <fcntl.h> | |
|  | |
| #define BUFFER_SIZE (8*1024-1) | |
| static char buffer[BUFFER_SIZE+1]; | |
|  | |
| #define EOT 004 | |
|  | |
| void exit_handler(int sig) { | |
| 	exit(1); | |
| } | |
|  | |
| int main(int argc, char ** argv) { | |
| 	int rc, mode, x, y; | |
| 	int remove_zeros=0; | |
| 	int pos=0, killme=0; | |
|  | |
| 	if ( argc!=3 || (argv[1][0]!='a' && argv[1][0]!='t') ) { | |
| 		printf("Usage: %s {a|t} [file]\n",argv[0]); | |
| 		return 1; | |
| 	} | |
|  | |
| 	if (argv[1][0]=='a') | |
| 		mode=O_WRONLY|O_CREAT|O_APPEND; | |
| 	else | |
| 		mode=O_WRONLY|O_CREAT|O_TRUNC; | |
|  | |
| 	signal(SIGALRM, exit_handler); | |
|  | |
| 	while (1) { | |
| 		if (killme == 1) { | |
| 			killme = -1; | |
| 			alarm(3); | |
| 		} | |
|  | |
| 		if (pos >= BUFFER_SIZE) { | |
| 			fprintf(stderr, "%s: Buffer is full -> " | |
| 			        "drop data!\n",argv[0]); | |
| 			pos=0; | |
| 		} | |
|  | |
| 		rc=read(0,buffer+pos,BUFFER_SIZE-pos); | |
| 		if (rc <= 0) return 0; | |
| 		buffer[pos+rc+1]=0; | |
|  | |
| 		if (rc>0) { | |
| 			for (x=0; x<rc; x++) { | |
| 				if ( buffer[pos+x] != EOT ) | |
| 					write(1,buffer+pos+x,1); | |
| 			} | |
|  | |
| 			for (x=0; x<rc; x++) { | |
| 				if (buffer[pos+x]==EOT) { | |
| 					/* We wait a few seconds so we are | |
| 					 * still able to pipe thru 'early | |
| 					 * errors' from daemons. */ | |
| 					buffer[pos+x]=0; | |
| 					if (!killme) killme = 1; | |
| 					remove_zeros=1; | |
| 				} | |
| 				if (buffer[pos+x]=='\r' && | |
| 				    buffer[pos+x+1]!='\n') { | |
| 					for (y=pos+x; y>=0; y--) { | |
| 						if (buffer[y]=='\n') break; | |
| 						buffer[y]=0; | |
| 					} | |
| 					remove_zeros=1; | |
| 				} | |
| 			} | |
|  | |
| 			pos+=rc; | |
|  | |
| 			if (remove_zeros) { | |
| 				for (x=y=0; x<pos; x++) { | |
| 					if (buffer[x]) | |
| 						buffer[y++]=buffer[x]; | |
| 				} | |
| 				pos=y; remove_zeros=0; | |
| 			} | |
|  | |
| 			rc=open(argv[2],mode,0666); | |
| 			if (rc>=0) { | |
| 				write(rc,buffer,pos); | |
| 				close(rc); | |
| 				pos=0; | |
| 				mode=O_WRONLY|O_APPEND; | |
| 			} | |
| 		} | |
| 	} | |
|  | |
| 	return 0; | |
| }
 | |
| 
 |