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; |
|
}
|
|
|