From 30ca746887a0f7e089ee515e68e80caae1237cd5 Mon Sep 17 00:00:00 2001 From: tomsmeding Date: Mon, 25 May 2015 14:26:40 +0200 Subject: Initial --- .gitignore | 5 ++ timerserver.cpp | 273 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 278 insertions(+) create mode 100644 .gitignore create mode 100644 timerserver.cpp diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..791cf3d --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +timerserver +timerwp +timerwaypoint +timerstatus +timerstop diff --git a/timerserver.cpp b/timerserver.cpp new file mode 100644 index 0000000..df5389a --- /dev/null +++ b/timerserver.cpp @@ -0,0 +1,273 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define SOCKET_PATH "/tmp/._timer_sock.socket" + +using namespace std; + +enum MessageType { + MT_STOP, + MT_STATUS, + MT_WAYPOINT +}; + +void recvall(unsigned int sock,char *buf,int num){ + int ret,acc=0; + do { + ret=recv(sock,buf+acc,num-acc,0); + if(ret==-1){ + perror("recv"); + exit(1); + } + if(ret==0){ //peer closed its side + close(sock); + exit(1); + } + acc+=ret; + } while(acc> &waypoints,string desc){ + time_t tim=time(NULL); + waypoints.push_back({tim,desc}); + char *buf=ctime(&tim); + buf[strlen(buf)-1]='\0'; + cout<<"Added waypoint on "<len1?false:strcmp(str+len1-len2,suffix)==0; +} + +void unlink_socketpath(void){ + unlink(SOCKET_PATH); +} + +void sendwaypoints(unsigned int sock,vector> &waypoints){ + stringstream ss; + for(pair &p : waypoints){ + char *buf=ctime(&p.first); + buf[strlen(buf)-1]='\0'; + ss<>24); + buf[1]=0xff&(len>>16); + buf[2]=0xff&(len>>8); + buf[3]=0xff&len; + sendall(sock,buf,4); + sendall(sock,s.c_str(),len); +} + +void act_server(void){ + vector> waypoints; + addwaypoint(waypoints,"Start"); + pid_t pid=fork(); + if(pid==-1){ + perror("fork"); + exit(1); + } + if(pid!=0){ //parent + cerr<<"Forking into background."<256){ + close(s2); + continue; + } + recvall(s2,buf,msglen); + switch(buf[0]){ + case MT_STOP: + addwaypoint(waypoints,"Stop"); + buf[0]=1; + sendall(s2,buf,1); + sendwaypoints(s2,waypoints); + close(s2); + close(s); + exit(0); + case MT_STATUS: + buf[0]=1; + sendall(s2,buf,1); + sendwaypoints(s2,waypoints); + break; + case MT_WAYPOINT: + addwaypoint(waypoints,string(buf+1,msglen-1)); + buf[0]=1; + sendall(s2,buf,1); + break; + default: + buf[0]=0; + sendall(s2,buf,1); + break; + } + } +} + +unsigned int getclientsock(void){ + unsigned int s; + struct sockaddr_un remote; + s=socket(AF_UNIX,SOCK_STREAM,0); + if(s==-1){ + perror("socket"); + exit(1); + } + remote.sun_family=AF_UNIX; + strcpy(remote.sun_path,SOCKET_PATH); + if(connect(s,(struct sockaddr*)&remote,strlen(SOCKET_PATH)+1+sizeof(remote.sun_family))==-1){ + perror("connect"); + exit(1); + } + return s; +} + +void act_client_timerstop(void){ + unsigned int s=getclientsock(); + char buf[5]; + buf[0]=0; + buf[1]=0; + buf[2]=0; + buf[3]=1; + buf[4]=MT_STOP; + sendall(s,buf,5); + recvall(s,buf,1); + if(buf[0]!=1){ + cerr<<"Didn't receive acknowledgement from server!"<