X-Git-Url: https://git.octo.it/?p=rrdtool.git;a=blobdiff_plain;f=src%2Frrd_cgi.c;h=b5355410e364aef0c5de1582a210ad1100a618c1;hp=846397f6089465c01dede1510f3735fb4c6ba2eb;hb=2ba0dac41cd82d69b612b5b4526f6e6f85c8abdc;hpb=7d0d6b07c9f5bd5dfd99aa7fe9826eebf2181f1f diff --git a/src/rrd_cgi.c b/src/rrd_cgi.c index 846397f..b535541 100644 --- a/src/rrd_cgi.c +++ b/src/rrd_cgi.c @@ -1,11 +1,13 @@ /***************************************************************************** - * RRDtool 1.2.23 Copyright by Tobi Oetiker, 1997-2007 + * RRDtool 1.3.2 Copyright by Tobi Oetiker, 1997-2008 ***************************************************************************** * rrd_cgi.c RRD Web Page Generator *****************************************************************************/ #include "rrd_tool.h" - +#ifdef HAVE_STDLIB_H +#include +#endif #define MEMBLK 1024 /*#define DEBUG_PARSER @@ -220,7 +222,8 @@ static vardata *varheap = NULL; static size_t varheap_size = 0; /* allocate and initialize variable heap */ -static int initvar(void) +static int initvar( + void) { varheap = (vardata *) malloc(sizeof(vardata) * INIT_VARSTORE_SIZE); if (varheap == NULL) { @@ -233,7 +236,8 @@ static int initvar(void) } /* cleanup: free allocated memory */ -static void donevar(void) +static void donevar( + void) { int i; @@ -387,6 +391,63 @@ char *stralloc( return (nstr); } +static int readfile( + const char *file_name, + char **buffer, + int skipfirst) +{ + long writecnt = 0, totalcnt = MEMBLK; + long offset = 0; + FILE *input = NULL; + char c; + + if ((strcmp("-", file_name) == 0)) { + input = stdin; + } else { + if ((input = fopen(file_name, "rb")) == NULL) { + rrd_set_error("opening '%s': %s", file_name, rrd_strerror(errno)); + return (-1); + } + } + if (skipfirst) { + do { + c = getc(input); + offset++; + } while (c != '\n' && !feof(input)); + } + if (strcmp("-", file_name)) { + fseek(input, 0, SEEK_END); + /* have extra space for detecting EOF without realloc */ + totalcnt = (ftell(input) + 1) / sizeof(char) - offset; + if (totalcnt < MEMBLK) + totalcnt = MEMBLK; /* sanitize */ + fseek(input, offset * sizeof(char), SEEK_SET); + } + if (((*buffer) = (char *) malloc((totalcnt + 4) * sizeof(char))) == NULL) { + perror("Allocate Buffer:"); + exit(1); + }; + do { + writecnt += + fread((*buffer) + writecnt, 1, + (totalcnt - writecnt) * sizeof(char), input); + if (writecnt >= totalcnt) { + totalcnt += MEMBLK; + if (((*buffer) = + rrd_realloc((*buffer), + (totalcnt + 4) * sizeof(char))) == NULL) { + perror("Realloc Buffer:"); + exit(1); + }; + } + } while (!feof(input)); + (*buffer)[writecnt] = '\0'; + if (strcmp("-", file_name) != 0) { + fclose(input); + }; + return writecnt; +} + int main( int argc, char *argv[]) @@ -662,7 +723,7 @@ char *printstrftime( long argc, const char **args) { - struct rrd_time_value start_tv, end_tv; + rrd_time_value_t start_tv, end_tv; char *parsetime_error = NULL; char formatted[MAX_STRFTIME_SIZE]; struct tm *the_tm; @@ -675,19 +736,19 @@ char *printstrftime( } /* Init start and end time */ - parsetime("end-24h", &start_tv); - parsetime("now", &end_tv); + rrd_parsetime("end-24h", &start_tv); + rrd_parsetime("now", &end_tv); /* Parse the start and end times we were given */ - if ((parsetime_error = parsetime(args[1], &start_tv))) { + if ((parsetime_error = rrd_parsetime(args[1], &start_tv))) { rrd_set_error("start time: %s", parsetime_error); return stralloc(""); } - if ((parsetime_error = parsetime(args[2], &end_tv))) { + if ((parsetime_error = rrd_parsetime(args[2], &end_tv))) { rrd_set_error("end time: %s", parsetime_error); return stralloc(""); } - if (proc_start_end(&start_tv, &end_tv, &start_tmp, &end_tmp) == -1) { + if (rrd_proc_start_end(&start_tv, &end_tv, &start_tmp, &end_tmp) == -1) { return stralloc(""); } @@ -1426,8 +1487,8 @@ s_var **rrdcgiReadVariables( /* try to find out if there's already such a variable */ for (k = 0; k < i && (strncmp(result[k]->name, cp, esp - cp) - || !(strlen(result[k]->name) == esp - cp)); - k++); + || !(strlen(result[k]->name) == + (size_t) (esp - cp))); k++); if (k == i) { /* No such variable yet */ if ((result[i] = (s_var *) malloc(sizeof(s_var))) == NULL)