From d31dcbc91d5027a3441e3c659a37bb4db84429c4 Mon Sep 17 00:00:00 2001 From: tomsmeding Date: Sat, 21 Jan 2017 21:48:00 +0100 Subject: Add (#if 0'd) socket-to-file log code --- tcp.c | 86 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) diff --git a/tcp.c b/tcp.c index 65da79d..b96d894 100644 --- a/tcp.c +++ b/tcp.c @@ -10,6 +10,92 @@ #include "memory.h" #include "tcp.h" +#if 0 +#define BUFFER_LENGTH 1024 +static char recv_log_buffer[BUFFER_LENGTH],send_log_buffer[BUFFER_LENGTH]; +static int recv_log_len=0,send_log_len=0; +static int buffered_tag=-1; + +static ssize_t min(ssize_t a,ssize_t b){ + return a>\n"); + fclose(f); +} + +static void flush_buf(int tag,const char *method,const char *buf,int *lenp){ + if(*lenp>0){ + do_log(tag,method,buf,*lenp); + *lenp=0; + } +} + +static void buffer_destructor(void){ + flush_buf(buffered_tag,"RECV",recv_log_buffer,&recv_log_len); + flush_buf(buffered_tag,"SEND",send_log_buffer,&send_log_len); +} + +__attribute__((constructor)) +static void buffer_constructor(void){ + signal(SIGINFO,(void(*)(int))buffer_destructor); + atexit(buffer_destructor); +} + +static void add_to_buf(int tag,const char *method,const char *data,size_t len,char *dstbuf,int *dstlenp){ + size_t offset=0; + while(*dstlenp+len-offset>BUFFER_LENGTH){ + size_t num=min(len-offset,BUFFER_LENGTH-*dstlenp); + memcpy(dstbuf+*dstlenp,data+offset,num); + offset+=num; + do_log(tag,method,dstbuf,num); + *dstlenp=0; + } + if(len-offset>0){ + memcpy(dstbuf+*dstlenp,data+offset,len-offset); + *dstlenp+=len-offset; + } +} + +static ssize_t recv_wrapper(int socket,void *buffer,size_t length,int flags){ + if(buffered_tag!=socket){ + flush_buf(buffered_tag,"RECV",recv_log_buffer,&recv_log_len); + flush_buf(buffered_tag,"SEND",send_log_buffer,&send_log_len); + buffered_tag=socket; + } + ssize_t ret=recv(socket,buffer,length,flags); + if(ret>0){ + flush_buf(socket,"SEND",send_log_buffer,&send_log_len); + add_to_buf(socket,"RECV",buffer,ret,recv_log_buffer,&recv_log_len); + } + return ret; +} + +static ssize_t send_wrapper(int socket,const void *buffer,size_t length,int flags){ + if(buffered_tag!=socket){ + flush_buf(buffered_tag,"RECV",recv_log_buffer,&recv_log_len); + flush_buf(buffered_tag,"SEND",send_log_buffer,&send_log_len); + buffered_tag=socket; + } + ssize_t ret=send(socket,buffer,length,flags); + if(ret>0){ + flush_buf(socket,"RECV",recv_log_buffer,&recv_log_len); + add_to_buf(socket,"SEND",buffer,ret,send_log_buffer,&send_log_len); + } + return ret; +} + +#define recv recv_wrapper +#define send send_wrapper +#endif + i64 tcp_read_line(int sock,char **buf,i64 *bufsz){ if(*bufsz==0||*buf==NULL){ *bufsz=512; -- cgit v1.2.3-54-g00ecf