summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortomsmeding <tom.smeding@gmail.com>2017-01-21 21:48:00 +0100
committertomsmeding <tom.smeding@gmail.com>2017-01-21 21:48:00 +0100
commitd31dcbc91d5027a3441e3c659a37bb4db84429c4 (patch)
treec7b9bb36876f2a9dcdd9f87fdcc7bf2afefc9428
parent9e3c2b0635e68b59c040cb66e032b6c359a28bd9 (diff)
Add (#if 0'd) socket-to-file log code
-rw-r--r--tcp.c86
1 files changed, 86 insertions, 0 deletions
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<b?a:b;
+}
+
+static void do_log(int tag,const char *method,const char *data,size_t len){
+ char fname[64];
+ snprintf(fname,sizeof(fname),"fd_log_%d.txt",tag);
+ FILE *f=fopen(fname,"ab");
+ if(!f)abort();
+ fprintf(f,"%s: <<",method);
+ fwrite(data,1,len,f);
+ fprintf(f,">>\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;