diff --git a/ping-report/src/stats.c b/ping-report/src/stats.c index 5b343e8..6dc2042 100644 --- a/ping-report/src/stats.c +++ b/ping-report/src/stats.c @@ -22,104 +22,70 @@ Return value : Ping value as a string or NULL if an error occured */ -/*@null@*/char* get_ping_from_temp_log(){ - - /* Variables */ +/*@null@*/char* get_ping_from_temp_log() { FILE* fd = NULL; char* read_line = NULL; size_t n = 0; size_t nmatch = 2; - regex_t *p_reg; - regmatch_t* pmatch; + regex_t* p_reg = malloc(sizeof(*p_reg)); + regmatch_t* pmatch = NULL; char* ping = NULL; - int start; - int end; - size_t size_ping; - /* regex struct memory allocation */ - p_reg = (regex_t *) malloc(sizeof(*p_reg)); - if(p_reg == NULL){ - return ping; /* NULL */ - } + if (!p_reg) return NULL; - /* Open ping log file */ - fd = fopen("/var/log/ping-report/last-ping.log","r"); - if(fd == NULL){ + fd = fopen("/var/log/ping-report/last-ping.log", "r"); + if (!fd) { free(p_reg); - return ping; /* NULL */ + return NULL; } - /* Construct regex to get ping from log file */ - if(regcomp(p_reg,"time=(.*) ms",REG_EXTENDED) != 0){ - if(p_reg != NULL){ - free(p_reg); - } - (void) fclose(fd); - return ping; /* NULL */ + if (regcomp(p_reg, "time=(.*) ms", REG_EXTENDED) != 0) { + cleanup(fd, p_reg, NULL, NULL); + return NULL; } - /* match info memory allocation */ pmatch = malloc(sizeof(*pmatch) * nmatch); - if(pmatch == NULL){ - (void) fclose(fd); - regfree(p_reg); - free(p_reg); - return ping; /* NULL */ + if (!pmatch) { + cleanup(fd, p_reg, NULL, NULL); + return NULL; } - /* Read file */ - while(getline(&read_line,&n,fd) != -1){ - - if(read_line == NULL){ - break; - } - - /* Exec regex to find ping */ - - if(regexec(p_reg,read_line,nmatch,pmatch,0) == 0){ - - /* Extract ping position from read line */ - start = (int) pmatch[1].rm_so; - end = (int) pmatch[1].rm_eo; - size_ping = (size_t) (end - start); - - /* ping string memory allocation */ - ping = malloc(sizeof(char) * (size_ping+2)); - if(ping == NULL){ - free(read_line); - read_line = NULL; - n = 0; - break; - } - - /* Create ping string */ - (void) strncpy(ping, &read_line[start], size_ping); - ping[size_ping]='\n'; - ping[size_ping+1]='\0'; - - /* Free memory */ + while (getline(&read_line, &n, fd) != -1) { + if (regexec(p_reg, read_line, nmatch, pmatch, 0) == 0) { + ping = extract_ping(read_line, pmatch); free(read_line); - read_line = NULL; - n = 0; break; } - free(read_line); read_line = NULL; - n = 0; } - /* free allocated memory */ - regfree(p_reg); - free(p_reg); - free(pmatch); - if(read_line != NULL){ - free(read_line); + cleanup(fd, p_reg, pmatch, read_line); + return ping; +} + +void cleanup(FILE* fd, regex_t* p_reg, regmatch_t* pmatch, char* read_line) { + if (fd) fclose(fd); + if (p_reg) { + regfree(p_reg); + free(p_reg); + } + if (pmatch) free(pmatch); + if (read_line) free(read_line); +} + +char* extract_ping(char* read_line, regmatch_t* pmatch) { + int start = (int)pmatch[1].rm_so; + int end = (int)pmatch[1].rm_eo; + size_t size_ping = (size_t)(end - start); + char* ping = malloc(sizeof(char) * (size_ping + 2)); + + if (ping) { + strncpy(ping, &read_line[start], size_ping); + ping[size_ping] = '\n'; + ping[size_ping + 1] = '\0'; } - (void) fclose(fd); - - /* ping may be null, then it must mean that the ping request was lost */ return ping; }