char *drawgraph( long argc, const char **args) { int i, xsize, ysize; double ymin, ymax; for (i = 0; i < argc; i++) if (strcmp(args[i], "--imginfo") == 0 || strcmp(args[i], "-g") == 0) break; if (i == argc) { args[argc++] = "--imginfo"; args[argc++] = "<IMG SRC=\"./%s\" WIDTH=\"%lu\" HEIGHT=\"%lu\">"; } calfree(); if (rrd_graph (argc + 1, (char **) args - 1, &calcpr, &xsize, &ysize, NULL, &ymin, &ymax) != -1) { return stralloc(calcpr[0]); } else { if (rrd_test_error()) { const size_t len = strlen(rrd_get_error()) + DS_NAM_SIZE; char *err = malloc(len); snprintf(err, len, "[ERROR: %s]", rrd_get_error()); rrd_clear_error(); return err; } } return NULL; }
char* drawgraph(long argc, char **args){ int i,xsize, ysize; for(i=0;i<argc;i++) if(strcmp(args[i],"--imginfo")==0 || strcmp(args[i],"-g")==0) break; if(i==argc) { args[argc++] = "--imginfo"; args[argc++] = "<IMG SRC=\"./%s\" WIDTH=\"%lu\" HEIGHT=\"%lu\">"; } optind=0; /* reset gnu getopt */ opterr=0; /* reset gnu getopt */ calfree(); if( rrd_graph(argc+1, args-1, &calcpr, &xsize, &ysize) != -1 ) { return stralloc(calcpr[0]); } else { if (rrd_test_error()) { char *err = malloc((strlen(rrd_get_error())+DS_NAM_SIZE)*sizeof(char)); sprintf(err, "[ERROR: %s]",rrd_get_error()); rrd_clear_error(); calfree(); return err; } } return NULL; }
int main(int argc, char *argv[]) { long length; char *buffer; char *server_url = NULL; long i; long filter=0; #ifdef MUST_DISABLE_SIGFPE signal(SIGFPE,SIG_IGN); #endif #ifdef MUST_DISABLE_FPMASK fpsetmask(0); #endif optind = 0; opterr = 0; /* initialize getopt */ /* what do we get for cmdline arguments? for (i=0;i<argc;i++) printf("%d-'%s'\n",i,argv[i]); */ while (1) { static struct option long_options[] = { { "filter", no_argument, 0, 'f' }, { 0, 0, 0, 0} }; int option_index = 0; int opt; opt = getopt_long(argc, argv, "f", long_options, &option_index); if (opt == EOF) { break; } switch(opt) { case 'f': filter=1; break; case '?': printf("unknown commandline option '%s'\n",argv[optind-1]); return -1; } } if (!filter) { rrdcgiDebug(0,0); rrdcgiArg = rrdcgiInit(); server_url = getenv("SERVER_URL"); } /* make sure we have one extra argument, if there are others, we do not care Apache gives several */ /* if ( (optind != argc-2 && strstr( getenv("SERVER_SOFTWARE"),"Apache/2") != NULL) && optind != argc-1) { */ if ( optind >= argc ) { fprintf(stderr, "ERROR: expected a filename\n"); exit(1); } else { length = readfile(argv[optind], &buffer, 1); } if(rrd_test_error()) { fprintf(stderr, "ERROR: %s\n",rrd_get_error()); exit(1); } /* initialize variable heap */ initvar(); #ifdef DEBUG_PARSER /* some fake header for testing */ printf ("Content-Type: text/html\nContent-Length: 10000000\n\n\n"); #endif /* expand rrd directives in buffer recursivly */ for (i=0; buffer[i]; i++) { if (buffer[i] != '<') continue; if (!filter) { parse(&buffer, i, "<RRD::CV", cgiget); parse(&buffer, i, "<RRD::CV::PATH", cgigetqp); parse(&buffer, i, "<RRD::CV::QUOTE", cgigetq); parse(&buffer, i, "<RRD::GETENV", rrdgetenv); } parse(&buffer, i, "<RRD::GETVAR", rrdgetvar); parse(&buffer, i, "<RRD::GOODFOR", rrdgoodfor); parse(&buffer, i, "<RRD::GRAPH", drawgraph); parse(&buffer, i, "<RRD::INCLUDE", includefile); parse(&buffer, i, "<RRD::PRINT", drawprint); parse(&buffer, i, "<RRD::SETCONSTVAR", rrdsetvarconst); parse(&buffer, i, "<RRD::SETENV", rrdsetenv); parse(&buffer, i, "<RRD::SETVAR", rrdsetvar); parse(&buffer, i, "<RRD::TIME::LAST", printtimelast); parse(&buffer, i, "<RRD::TIME::NOW", printtimenow); parse(&buffer, i, "<RRD::TIME::STRFTIME", printstrftime); parse(&buffer, i, "<RRD::INTERNAL", rrdgetinternal); } if (!filter) { printf ("Content-Type: text/html\n" "Content-Length: %d\n", strlen(buffer)); if (labs(goodfor) > 0) { time_t now; now = time(NULL); printf("Last-Modified: %s\n", http_time(&now)); now += labs(goodfor); printf("Expires: %s\n", http_time(&now)); if (goodfor < 0) { printf("Refresh: %ld\n", labs(goodfor)); } } printf("\n"); } /* output result */ printf("%s", buffer); /* cleanup */ calfree(); if (buffer){ free(buffer); } donevar(); exit(0); }