00001 #include <stdio.h>
00002 #include <stdlib.h>
00003 #include <unistd.h>
00004 #include <string.h>
00005 #include <strings.h>
00006 #include <syslog.h>
00007 #include <time.h>
00008
00009 #include <sys/types.h>
00010 #include <sys/stat.h>
00011 #include <fcntl.h>
00012 #include <sys/socket.h>
00013 #include <netinet/in.h>
00014 #include <arpa/inet.h>
00015 #include <netdb.h>
00016 #include <signal.h>
00017 #include <errno.h>
00018
00019
00020 #define CONNECT_WAIT 5
00021
00022 static char tbuff[10240] ;
00023
00024
00025
00026
00027
00028
00029 #ifdef __sun
00030 typedef int socklen_t ;
00031 #endif
00032
00033 int main(int argc, char *argv[])
00034 {
00035 int s ;
00036 int ret ;
00037
00038 int port ;
00039 int fd = 0;
00040 static struct sockaddr_in cAddr ;
00041 int cSize ;
00042 static char *buffer ;
00043 time_t t ;
00044 struct tm *tm ;
00045 static char hname[256], hname_short[256] ;
00046 struct hostent *hent ;
00047 int testing = 0 ;
00048
00049 if(argc > 3) {
00050 fprintf(stderr,"Usage: %s <file> [port]\n",argv[0]) ;
00051 syslog(LOG_ERR,"Usage: %s <file> [port]\n",argv[0]) ;
00052 return -1 ;
00053 }
00054
00055
00056 if(argc==3) {
00057 port = atoi(argv[2]) ;
00058 }
00059 else port = 0 ;
00060
00061 if(port) syslog(LOG_INFO,"Started on port %d, file %s\n",port,argv[1]) ;
00062 else syslog(LOG_INFO,"Started on stdin, file %s\n",argv[1]) ;
00063
00064 cSize = sizeof(cAddr) ;
00065
00066 if(strcmp(argv[1],"dummy") == 0) {
00067 testing = 1 ;
00068 }
00069 else {
00070 errno = 0 ;
00071 fd = open(argv[1],O_CREAT | O_APPEND | O_WRONLY,0666) ;
00072 if(fd < 0) {
00073 syslog(LOG_ERR,"File %s open: %s\n",argv[1],strerror(errno)) ;
00074 return -1 ;
00075 }
00076 }
00077
00078 for(;;) {
00079 int sz ;
00080 int cou = 0 ;
00081
00082 s = 0 ;
00083
00084
00085
00086 sz = 16*1024*1024 ;
00087 for(;;) {
00088
00089 ret = setsockopt(s,SOL_SOCKET,SO_RCVBUF,(char *)&sz,sizeof(int)) ;
00090 if(ret == 0) break ;
00091 sz /= 2 ;
00092 } ;
00093
00094 syslog(LOG_INFO,"RCVBUFF set to %d bytes...\n",sz) ;
00095
00096 t = time(NULL) ;
00097 tm = localtime(&t) ;
00098
00099 memset(tbuff,'*',sizeof(tbuff)) ;
00100 sprintf(tbuff,"[%-8s %02d:%02d:%02d %03d] ","STARTUP",tm->tm_hour,tm->tm_min,tm->tm_sec,tm->tm_yday+1) ;
00101 int pre_len = strlen(tbuff) ;
00102 buffer = tbuff + pre_len - 4;
00103
00104 int first = 1 ;
00105
00106 for(;;) {
00107 int i, j ;
00108
00109
00110 ret = recvfrom(s,buffer,sizeof(tbuff)-pre_len-10,0,
00111 (struct sockaddr *)&cAddr, (socklen_t *)&cSize) ;
00112
00113 i = (inet_lnaof(cAddr.sin_addr) & 0xFF00) >> 8 ;
00114 j = inet_lnaof(cAddr.sin_addr) & 0xFF ;
00115
00116
00117 tbuff[sizeof(tbuff)-1] = 0 ;
00118
00119
00120 hent = gethostbyaddr((char *)&cAddr.sin_addr,4,AF_INET) ;
00121
00122
00123 if(!hent) {
00124 sprintf(hname_short,"%03d.%03d",i,j) ;
00125
00126
00127 }
00128 else {
00129 strcpy(hname,hent->h_name) ;
00130 strcpy(hname_short,hent->h_name) ;
00131 char *dot = index(hname_short,'.') ;
00132 if(dot) {
00133 *dot = 0 ;
00134 }
00135
00136 *(hname_short+8) = 0 ;
00137
00138
00139 }
00140
00141
00142
00143 if(ret == 0) {
00144 syslog(LOG_ERR,"Connection closed by host. On UDP???\n") ;
00145 }
00146 if(ret < 0) {
00147 syslog(LOG_ERR,"Read failed [%m] - reconnecting... On UDP???\n") ;
00148 close(s) ;
00149 s = -1 ;
00150 break ;
00151 }
00152
00153 t = time(NULL) ;
00154 tm = localtime(&t) ;
00155
00156 char tmp = *(buffer+4) ;
00157 sprintf(tbuff,"[%-8s %02d:%02d:%02d %03d] ",hname_short,tm->tm_hour,tm->tm_min,tm->tm_sec,tm->tm_yday+1) ;
00158 *(buffer+4) = tmp ;
00159
00160
00161
00162 *(buffer+ret) = 0 ;
00163
00164
00165
00166
00167 int len ;
00168 if(*(buffer+3+strlen(buffer+4)) == '\n') {
00169
00170 len = (buffer+3+strlen(buffer+4))-tbuff ;
00171 }
00172 else {
00173 *(buffer+4+strlen(buffer+4)) = (char) '\n' ;
00174 len = (buffer+4+strlen(buffer+4))-tbuff ;
00175 }
00176
00177 cou++ ;
00178 if(testing) {
00179 if((cou%1000)==0) {
00180 syslog(LOG_INFO,"%s : Got %u packets...\n",argv[1],cou) ;
00181 }
00182 }
00183 else {
00184 if(first) {
00185 syslog(LOG_INFO,"Doing write of %d bytes\n",len+1) ;
00186 }
00187 first = 0;
00188 write(fd,tbuff,len+1) ;
00189 }
00190
00191 }
00192 }
00193
00194 if(testing) ;
00195 else close(fd) ;
00196 return 0 ;
00197 }
00198