summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--controller/main.c76
-rw-r--r--server/data_stream.c23
-rw-r--r--server/main.c7
-rw-r--r--util.c9
-rw-r--r--util.h6
5 files changed, 100 insertions, 21 deletions
diff --git a/controller/main.c b/controller/main.c
index d289ce9..be13773 100644
--- a/controller/main.c
+++ b/controller/main.c
@@ -172,16 +172,7 @@ static void frame_data_sink(u8 *newdata,i64 newdatalen,void *payload){
bufferlen-=cursor;
}
-int main(int argc,char **argv){
- if(argc<3||argc>4){
- fprintf(stderr,"Usage: %s <logfile> <ip addr> [port=57575]\n",argv[0]);
- return 1;
- }
-
- const char *logfname=argv[1];
- const char *ipaddr=argv[2];
- const char *port=argc==4?argv[4]:"57575";
-
+static int connect_server(const char *logfname,const char *ipaddr,const char *port){
logfile=fopen(logfname,"w");
if(logfile==NULL){
fprintf(stderr,"Cannot open log file '%s'\n",logfname);
@@ -284,3 +275,68 @@ cleanup:
if(haderror)return 1;
return 0;
}
+
+static int read_zz_file(const char *zzfname,const char *logfname){
+ logfile=fopen(logfname,"w");
+ if(logfile==NULL){
+ fprintf(stderr,"Cannot open log file '%s'\n",logfname);
+ return 1;
+ }
+
+ FILE *f=fopen(zzfname,"r");
+ if(f==NULL){
+ fprintf(stderr,"Cannot open zz file '%s'\n",zzfname);
+ return 1;
+ }
+
+ struct unzbuffer *z=unzbuffer_init(frame_data_sink,NULL);
+ u8 buf[4096];
+ while(true){
+ i64 nr=fread(buf,1,sizeof buf,f);
+ if(nr<=0){
+ if(ferror(f)){
+ fprintf(stderr,"An error occurred reading the zz file '%s'\n",zzfname);
+ return 1;
+ }
+ break;
+ }
+ if(!unzbuffer_write(z,buf,nr)){
+ return 1;
+ }
+ }
+ if(!unzbuffer_finish_destroy(z))return 1;
+ return 0;
+}
+
+int main(int argc,char **argv){
+ if(argc<=1){
+ fprintf(stderr,"Usage:\n");
+ fprintf(stderr," %s connect <logfile> <ip addr> [port=57575]\n",argv[0]);
+ fprintf(stderr," %s read <zzfile> <logfile>\n",argv[0]);
+ fprintf(stderr,"<logfile> will probably contain JSON.\n");
+ fprintf(stderr,"<zzfile> should contain zlib-compressed protocol data.\n");
+ return 1;
+ }
+
+ if(strcmp(argv[1],"connect")==0){
+ if(argc<4||argc>5){
+ fprintf(stderr,"Invalid number of arguments, run without arguments for usage\n");
+ return 1;
+ }
+ const char *logfname=argv[2];
+ const char *ipaddr=argv[3];
+ const char *port=argc==5?argv[4]:"57575";
+ return connect_server(logfname,ipaddr,port);
+ } else if(strcmp(argv[1],"read")==0){
+ if(argc!=4){
+ fprintf(stderr,"Invalid number of arguments, run without arguments for usage\n");
+ return 1;
+ }
+ const char *zzfname=argv[2];
+ const char *logfname=argv[3];
+ return read_zz_file(zzfname,logfname);
+ } else {
+ fprintf(stderr,"Invalid command '%s'; run without arguments for usage\n",argv[1]);
+ return 1;
+ }
+}
diff --git a/server/data_stream.c b/server/data_stream.c
index 3d25104..2719d2a 100644
--- a/server/data_stream.c
+++ b/server/data_stream.c
@@ -5,10 +5,13 @@
#include <sys/time.h>
#include <libproc.h>
#include "data_stream.h"
+#include "util.h"
struct data_stream {
int fd;
+ FILE *mirrorfile;
+
i64 pidbufsize;
pid_t *pids;
i64 namebufsize;
@@ -21,11 +24,11 @@ struct data_stream {
static bool callback_error=false;
-static void write_data_fd(u8 *data,i64 len,void *fdp){
- int fd=*(int*)fdp;
+static void write_data_callback(u8 *data,i64 len,void *streamp){
+ struct data_stream *s=(struct data_stream*)streamp;
i64 cursor=0;
while(cursor<len){
- i64 nwr=write(fd,data+cursor,len-cursor);
+ i64 nwr=write(s->fd,data+cursor,len-cursor);
if(nwr<0){
perror("write");
callback_error=true;
@@ -33,7 +36,8 @@ static void write_data_fd(u8 *data,i64 len,void *fdp){
}
cursor+=nwr;
}
- fprintf(stderr,"write_data_fd(len=%" PRIi64 ")\n",len);
+ fwrite(data,1,len,s->mirrorfile);
+ fprintf(stderr,"write_data_callback(len=%" PRIi64 ")\n",len);
}
static void bufappend(u8 **buf,i64 *cursor,i64 *cap,u8 *data,i64 datalen){
@@ -57,6 +61,14 @@ static void serialise4(u8 *buf,i32 value){
struct data_stream* data_stream_init(int fd){
struct data_stream *s=malloc(1,struct data_stream);
s->fd=fd;
+ char fnamebuf[128];
+ snprintf(fnamebuf,sizeof fnamebuf,"logmirror_%" PRIi64 ".zz",make_timestamp());
+ printf("Using log mirror file '%s'\n",fnamebuf);
+ s->mirrorfile=fopen(fnamebuf,"w");
+ if(s->mirrorfile==NULL){
+ fprintf(stderr,"Cannot open log mirror!\n");
+ exit(1);
+ }
s->pidbufsize=1024;
s->pids=malloc(s->pidbufsize,pid_t);
s->namebufsize=64;
@@ -64,7 +76,7 @@ struct data_stream* data_stream_init(int fd){
s->writebufsize=4096;
s->writebuf=malloc(s->writebufsize,u8);
s->cursor=0;
- s->z=zbuffer_init(write_data_fd,&s->fd);
+ s->z=zbuffer_init(write_data_callback,s);
callback_error=false;
@@ -74,6 +86,7 @@ struct data_stream* data_stream_init(int fd){
int data_stream_finish_destroy(struct data_stream *s){
callback_error=false;
zbuffer_finish_destroy(s->z);
+ fclose(s->mirrorfile);
free(s->pids);
free(s->namebuf);
free(s->writebuf);
diff --git a/server/main.c b/server/main.c
index ffa16cd..cb4e2b4 100644
--- a/server/main.c
+++ b/server/main.c
@@ -12,6 +12,7 @@
#include "data_stream.h"
#include "line_reader.h"
#include "zbuffer.h"
+#include "util.h"
#define PORT 57575
@@ -38,12 +39,6 @@
int32_t pti_priority; task priority
};*/
-static i64 make_timestamp(void){
- struct timeval tv;
- gettimeofday(&tv,NULL);
- return tv.tv_sec*(i64)1000000+tv.tv_usec;
-}
-
static void connection_handler(int sock){
struct data_stream *stream=data_stream_init(sock);
struct line_reader *reader=line_reader_init(sock);
diff --git a/util.c b/util.c
new file mode 100644
index 0000000..9fadd9f
--- /dev/null
+++ b/util.c
@@ -0,0 +1,9 @@
+#include <sys/time.h>
+#include "util.h"
+
+
+i64 make_timestamp(void){
+ struct timeval tv;
+ gettimeofday(&tv,NULL);
+ return tv.tv_sec*(i64)1000000+tv.tv_usec;
+}
diff --git a/util.h b/util.h
new file mode 100644
index 0000000..e161efe
--- /dev/null
+++ b/util.h
@@ -0,0 +1,6 @@
+#pragma once
+
+#include "global.h"
+
+
+i64 make_timestamp(void);