#include "pstatsd.h" char magic[] = "PSTS"; int client(int c) { time_t time, firsthit, lasthit; char header[4], *query = NULL, *session = NULL, *ip = NULL, *useragent = NULL; int session_len, query_len, ip_len, useragent_len; int i = 0; while(1) { /* Check for magic header */ i = 0; memset(&header, 0, sizeof(header)); while(memcmp(header, magic, 4) != 0) { if(read(c, &header[i], 1) < 1) break; if(header[i] == magic[i]) i++; else i = 0; } if(memcmp(header, magic, 4) != 0) break; /* Allocate memory and recieve data */ if(read(c, (char *)&time, sizeof(time)) < 1) break; if(read(c, (char *)&firsthit, sizeof(firsthit)) < 1) break; if(read(c, (char *)&lasthit, sizeof(lasthit)) < 1) break; if(read(c, (char *)&ip_len, sizeof(ip_len)) < 1) break; ip = (char *)realloc(ip, ip_len+1); if(!ip) break; memset(ip, 0, ip_len+1); if(ip_len > 0 && read(c, (char *)ip, ip_len) < 1) break; if(read(c, (char *)&useragent_len, sizeof(useragent_len)) < 1) break; useragent = (char *)realloc(useragent, useragent_len+1); if(!useragent) break; memset(useragent, 0, useragent_len+1); if(useragent_len > 0 && read(c, (char *)useragent, useragent_len) < 1) break; if(read(c, (char *)&session_len, sizeof(session_len)) < 1) break; session = (char *)realloc(session, session_len+1); if(!session) break; memset(session, 0, session_len+1); if(session_len > 0 && read(c, (char *)session, session_len) < 1) break; if(read(c, (char *)&query_len, sizeof(query_len)) < 1) break; query = (char *)realloc(query, query_len+1); if(!query) break; memset(query, 0, query_len+1); if(query_len > 0 && read(c, (char *)query, query_len) < 1) break; /* Parse the hit */ parse(time, firsthit, lasthit, ip, ip_len, useragent, useragent_len, session, session_len, query, query_len); } /* Clean up */ close(c); free(ip); free(useragent); free(session); free(query); /* exit */ pthread_detach(pthread_self()); pthread_exit(NULL); return 0; }