1 /*****************************************************************************
2 * RRDtool 1.4.0 Copyright by Tobi Oetiker, 1997-2009
3 *****************************************************************************
4 * rrd_tool.c Startup wrapper
5 *****************************************************************************/
7 #if defined(_WIN32) && !defined(__CYGWIN__) && !defined(__CYGWIN32__) && !defined(HAVE_CONFIG_H)
8 #include "../win32/config.h"
13 #include "../rrd_config.h"
18 #include "rrd_xport.h"
41 #define MAX_LENGTH 10000
48 const char *help_main =
50 " Copyright 1997-2008 by Tobias Oetiker <tobi@oetiker.ch>\n"
52 "Usage: rrdtool [options] command command_options\n\n");
54 const char *help_list =
56 ("Valid commands: create, update, updatev, graph, graphv, dump, restore,\n"
57 "\t\tlast, lastupdate, first, info, fetch, tune,\n"
58 "\t\tresize, xport, flushcached\n\n");
60 const char *help_listremote =
61 N_("Valid remote commands: quit, ls, cd, mkdir, pwd\n\n");
64 const char *help_create =
65 N_("* create - create a new RRD\n\n"
66 "\trrdtool create filename [--start|-b start time]\n"
67 "\t\t[--step|-s step]\n"
68 "\t\t[DS:ds-name:DST:dst arguments]\n"
69 "\t\t[RRA:CF:cf arguments]\n\n");
71 const char *help_dump =
72 N_("* dump - dump an RRD to XML\n\n"
73 "\trrdtool dump filename.rrd >filename.xml\n\n");
75 const char *help_info =
76 N_("* info - returns the configuration and status of the RRD\n\n"
77 "\trrdtool info filename.rrd\n\n");
79 const char *help_restore =
80 N_("* restore - restore an RRD file from its XML form\n\n"
81 "\trrdtool restore [--range-check|-r] [--force-overwrite|-f] filename.xml filename.rrd\n\n");
83 const char *help_last =
84 N_("* last - show last update time for RRD\n\n"
85 "\trrdtool last filename.rrd\n\n");
87 const char *help_lastupdate =
88 N_("* lastupdate - returns the most recent datum stored for\n"
89 " each DS in an RRD\n\n" "\trrdtool lastupdate filename.rrd\n\n");
91 const char *help_first =
92 N_("* first - show first update time for RRA within an RRD\n\n"
93 "\trrdtool first filename.rrd [--rraindex number]\n\n");
95 const char *help_update =
96 N_("* update - update an RRD\n\n"
97 "\trrdtool update filename\n"
98 "\t\t[--template|-t ds-name:ds-name:...]\n"
99 "\t\t[--daemon <address>]\n"
100 "\t\ttime|N:value[:value...]\n\n"
101 "\t\tat-time@value[:value...]\n\n"
102 "\t\t[ time:value[:value...] ..]\n\n");
104 const char *help_updatev =
105 N_("* updatev - a verbose version of update\n"
106 "\treturns information about values, RRAs, and datasources updated\n\n"
107 "\trrdtool updatev filename\n"
108 "\t\t[--template|-t ds-name:ds-name:...]\n"
109 "\t\ttime|N:value[:value...]\n\n"
110 "\t\tat-time@value[:value...]\n\n"
111 "\t\t[ time:value[:value...] ..]\n\n");
113 const char *help_fetch =
114 N_("* fetch - fetch data out of an RRD\n\n"
115 "\trrdtool fetch filename.rrd CF\n"
116 "\t\t[-r|--resolution resolution]\n"
117 "\t\t[-s|--start start] [-e|--end end]\n"
118 "\t\t[--daemon <address>]\n\n");
120 const char *help_flushcached =
121 N_("* flushcached - flush cached data out to an RRD file\n\n"
122 "\trrdtool flushcached filename.rrd\n"
123 "\t\t[--daemon <address>]\n\n");
125 /* break up very large strings (help_graph, help_tune) for ISO C89 compliance*/
127 const char *help_graph0 =
128 N_("* graph - generate a graph from one or several RRD\n\n"
129 "\trrdtool graph filename [-s|--start seconds] [-e|--end seconds]\n");
130 const char *help_graphv0 =
131 N_("* graphv - generate a graph from one or several RRD\n"
132 " with meta data printed before the graph\n\n"
133 "\trrdtool graphv filename [-s|--start seconds] [-e|--end seconds]\n");
134 const char *help_graph1 =
135 N_("\t\t[-x|--x-grid x-axis grid and label]\n"
136 "\t\t[-Y|--alt-y-grid] [--full-size-mode]\n"
137 "\t\t[-y|--y-grid y-axis grid and label]\n"
138 "\t\t[-v|--vertical-label string] [-w|--width pixels]\n"
139 "\t\t[--right-axis scale:shift] [--right-axis-label label]\n"
140 "\t\t[--right-axis-format format]\n"
141 "\t\t[-h|--height pixels] [-o|--logarithmic]\n"
142 "\t\t[-u|--upper-limit value] [-z|--lazy]\n"
143 "\t\t[-l|--lower-limit value] [-r|--rigid]\n"
144 "\t\t[-g|--no-legend] [--daemon <address>]\n"
145 "\t\t[-F|--force-rules-legend]\n" "\t\t[-j|--only-graph]\n");
146 const char *help_graph2 =
147 N_("\t\t[-n|--font FONTTAG:size:font]\n"
148 "\t\t[-m|--zoom factor]\n"
149 "\t\t[-A|--alt-autoscale]\n"
150 "\t\t[-M|--alt-autoscale-max]\n"
151 "\t\t[-G|--graph-render-mode {normal,mono}]\n"
152 "\t\t[-R|--font-render-mode {normal,light,mono}]\n"
153 "\t\t[-B|--font-smoothing-threshold size]\n"
154 "\t\t[-T|--tabwidth width]\n"
155 "\t\t[-E|--slope-mode]\n"
156 "\t\t[-N|--no-gridfit]\n"
157 "\t\t[-X|--units-exponent value]\n"
158 "\t\t[-L|--units-length value]\n"
159 "\t\t[-S|--step seconds]\n"
160 "\t\t[-f|--imginfo printfstr]\n"
161 "\t\t[-a|--imgformat PNG]\n"
162 "\t\t[-c|--color COLORTAG#rrggbb[aa]]\n"
163 "\t\t[--border width\n"
164 "\t\t[-t|--title string]\n"
165 "\t\t[-W|--watermark string]\n"
166 "\t\t[DEF:vname=rrd:ds-name:CF]\n");
167 const char *help_graph3 =
168 N_("\t\t[CDEF:vname=rpn-expression]\n"
169 "\t\t[VDEF:vdefname=rpn-expression]\n"
170 "\t\t[PRINT:vdefname:format]\n"
171 "\t\t[GPRINT:vdefname:format]\n" "\t\t[COMMENT:text]\n"
172 "\t\t[SHIFT:vname:offset]\n"
173 "\t\t[TICK:vname#rrggbb[aa][:[fraction][:legend]]]\n"
174 "\t\t[HRULE:value#rrggbb[aa][:legend]]\n"
175 "\t\t[VRULE:value#rrggbb[aa][:legend]]\n"
176 "\t\t[LINE[width]:vname[#rrggbb[aa][:[legend][:STACK]]]]\n"
177 "\t\t[AREA:vname[#rrggbb[aa][:[legend][:STACK]]]]\n"
178 "\t\t[PRINT:vname:CF:format] (deprecated)\n"
179 "\t\t[GPRINT:vname:CF:format] (deprecated)\n"
180 "\t\t[STACK:vname[#rrggbb[aa][:legend]]] (deprecated)\n\n");
181 const char *help_tune1 =
182 N_(" * tune - Modify some basic properties of an RRD\n\n"
183 "\trrdtool tune filename\n"
184 "\t\t[--heartbeat|-h ds-name:heartbeat]\n"
185 "\t\t[--data-source-type|-d ds-name:DST]\n"
186 "\t\t[--data-source-rename|-r old-name:new-name]\n"
187 "\t\t[--minimum|-i ds-name:min] [--maximum|-a ds-name:max]\n"
188 "\t\t[--deltapos scale-value] [--deltaneg scale-value]\n"
189 "\t\t[--failure-threshold integer]\n"
190 "\t\t[--window-length integer]\n"
191 "\t\t[--alpha adaptation-parameter]\n");
192 const char *help_tune2 =
193 N_(" * tune - Modify some basic properties of an RRD\n\n"
194 "\t\t[--beta adaptation-parameter]\n"
195 "\t\t[--gamma adaptation-parameter]\n"
196 "\t\t[--gamma-deviation adaptation-parameter]\n"
197 "\t\t[--aberrant-reset ds-name]\n\n");
198 const char *help_resize =
200 (" * resize - alter the length of one of the RRAs in an RRD\n\n"
201 "\trrdtool resize filename rranum GROW|SHRINK rows\n\n");
202 const char *help_xport =
203 N_("* xport - generate XML dump from one or several RRD\n\n"
204 "\trrdtool xport [-s|--start seconds] [-e|--end seconds]\n"
205 "\t\t[-m|--maxrows rows]\n" "\t\t[--step seconds]\n"
206 "\t\t[--enumds]\n" "\t\t[DEF:vname=rrd:ds-name:CF]\n"
207 "\t\t[CDEF:vname=rpn-expression]\n"
208 "\t\t[XPORT:vname:legend]\n\n");
209 const char *help_quit =
210 N_(" * quit - closing a session in remote mode\n\n"
211 "\trrdtool quit\n\n");
212 const char *help_ls =
213 N_(" * ls - lists all *.rrd files in current directory\n\n"
215 const char *help_cd =
216 N_(" * cd - changes the current directory\n\n"
217 "\trrdtool cd new directory\n\n");
218 const char *help_mkdir =
219 N_(" * mkdir - creates a new directory\n\n"
220 "\trrdtool mkdir newdirectoryname\n\n");
221 const char *help_pwd =
222 N_(" * pwd - returns the current working directory\n\n"
223 "\trrdtool pwd\n\n");
224 const char *help_lic =
225 N_("RRDtool is distributed under the Terms of the GNU General\n"
226 "Public License Version 2. (www.gnu.org/copyleft/gpl.html)\n\n"
227 "For more information read the RRD manpages\n\n");
228 enum { C_NONE, C_CREATE, C_DUMP, C_INFO, C_RESTORE, C_LAST,
229 C_LASTUPDATE, C_FIRST, C_UPDATE, C_FETCH, C_GRAPH, C_GRAPHV,
231 C_RESIZE, C_XPORT, C_QUIT, C_LS, C_CD, C_MKDIR, C_PWD,
232 C_UPDATEV, C_FLUSHCACHED
234 int help_cmd = C_NONE;
237 if (!strcmp(cmd, "create"))
239 else if (!strcmp(cmd, "dump"))
241 else if (!strcmp(cmd, "info"))
243 else if (!strcmp(cmd, "restore"))
244 help_cmd = C_RESTORE;
245 else if (!strcmp(cmd, "last"))
247 else if (!strcmp(cmd, "lastupdate"))
248 help_cmd = C_LASTUPDATE;
249 else if (!strcmp(cmd, "first"))
251 else if (!strcmp(cmd, "update"))
253 else if (!strcmp(cmd, "updatev"))
254 help_cmd = C_UPDATEV;
255 else if (!strcmp(cmd, "fetch"))
257 else if (!strcmp(cmd, "flushcached"))
258 help_cmd = C_FLUSHCACHED;
259 else if (!strcmp(cmd, "graph"))
261 else if (!strcmp(cmd, "graphv"))
263 else if (!strcmp(cmd, "tune"))
265 else if (!strcmp(cmd, "resize"))
267 else if (!strcmp(cmd, "xport"))
269 else if (!strcmp(cmd, "quit"))
271 else if (!strcmp(cmd, "ls"))
273 else if (!strcmp(cmd, "cd"))
275 else if (!strcmp(cmd, "mkdir"))
277 else if (!strcmp(cmd, "pwd"))
280 fprintf(stdout, _(help_main), PACKAGE_VERSION, __DATE__, __TIME__);
284 fputs(_(help_list), stdout);
286 fputs(_(help_listremote), stdout);
290 fputs(_(help_create), stdout);
293 fputs(_(help_dump), stdout);
296 fputs(_(help_info), stdout);
299 fputs(_(help_restore), stdout);
302 fputs(_(help_last), stdout);
305 fputs(_(help_lastupdate), stdout);
308 fputs(_(help_first), stdout);
311 fputs(_(help_update), stdout);
314 fputs(_(help_updatev), stdout);
317 fputs(_(help_fetch), stdout);
320 fputs(_(help_flushcached), stdout);
323 fputs(_(help_graph0), stdout);
324 fputs(_(help_graph1), stdout);
325 fputs(_(help_graph2), stdout);
326 fputs(_(help_graph3), stdout);
329 fputs(_(help_graphv0), stdout);
330 fputs(_(help_graph1), stdout);
331 fputs(_(help_graph2), stdout);
332 fputs(_(help_graph3), stdout);
335 fputs(_(help_tune1), stdout);
336 fputs(_(help_tune2), stdout);
339 fputs(_(help_resize), stdout);
342 fputs(_(help_xport), stdout);
345 fputs(_(help_quit), stdout);
348 fputs(_(help_ls), stdout);
351 fputs(_(help_cd), stdout);
354 fputs(_(help_mkdir), stdout);
357 fputs(_(help_pwd), stdout);
360 fputs(_(help_lic), stdout);
363 static char *fgetslong(
368 size_t bufsize = MAX_LENGTH;
372 return *aLinePtr = 0;
373 if (!(linebuf = malloc(bufsize))) {
374 perror("fgetslong: malloc");
378 while (fgets(linebuf + eolpos, MAX_LENGTH, stream)) {
379 eolpos += strlen(linebuf + eolpos);
380 if (linebuf[eolpos - 1] == '\n')
381 return *aLinePtr = linebuf;
382 bufsize += MAX_LENGTH;
383 if (!(linebuf = realloc(linebuf, bufsize))) {
385 perror("fgetslong: realloc");
390 return *aLinePtr = linebuf;
393 return *aLinePtr = 0;
404 #ifdef MUST_DISABLE_SIGFPE
405 signal(SIGFPE, SIG_IGN);
407 #ifdef MUST_DISABLE_FPMASK
411 /* initialize locale settings
412 according to localeconv(3) */
413 setlocale(LC_ALL, "");
415 #if defined(HAVE_LIBINTL_H) && defined(BUILD_LIBINTL)
416 bindtextdomain(GETTEXT_PACKAGE, LOCALEDIR);
417 textdomain(GETTEXT_PACKAGE);
424 if (((argc == 2) || (argc == 3)) && !strcmp("-", argv[1])) {
426 struct rusage myusage;
427 struct timeval starttime;
428 struct timeval currenttime;
430 gettimeofday(&starttime, NULL);
433 if ((argc == 3) && strcmp("", argv[2])) {
444 if (chroot(argv[2]) != 0){
445 fprintf(stderr, "ERROR: chroot %s: %s\n", argv[2],rrd_strerror(errno));
452 "ERROR: change root is not supported by your OS "
453 "or at least by this copy of rrdtool\n");
460 if (strcmp(firstdir, "")) {
461 if (chdir(firstdir) != 0){
462 fprintf(stderr, "ERROR: chdir %s %s\n", firstdir,rrd_strerror(errno));
467 while (fgetslong(&aLine, stdin)) {
468 char *aLineOrig = aLine;
469 if ((argc = CountArgs(aLine)) == 0) {
471 printf("ERROR: not enough arguments\n");
474 if ((myargv = (char **) malloc((argc + 1) *
475 sizeof(char *))) == NULL) {
479 if ((argc = CreateArgs(argv[0], aLine, myargv)) < 0) {
480 printf("ERROR: creating arguments\n");
482 if ( HandleInputLine(argc, myargv, stdout) == 0 ){
484 getrusage(RUSAGE_SELF, &myusage);
485 gettimeofday(¤ttime, NULL);
486 printf("OK u:%1.2f s:%1.2f r:%1.2f\n",
487 (double) myusage.ru_utime.tv_sec +
488 (double) myusage.ru_utime.tv_usec / 1000000.0,
489 (double) myusage.ru_stime.tv_sec +
490 (double) myusage.ru_stime.tv_usec / 1000000.0,
491 (double) (currenttime.tv_sec - starttime.tv_sec)
492 + (double) (currenttime.tv_usec -
500 fflush(stdout); /* this is important for pipes to work */
504 } else if (argc == 2) {
507 } else if (argc == 3 && !strcmp(argv[1], "help")) {
511 exit(HandleInputLine(argc, argv, stderr));
516 /* HandleInputLine is NOT thread safe - due to readdir issues,
517 resolving them portably is not really simple. */
523 #if defined(HAVE_OPENDIR) && defined (HAVE_READDIR)
524 DIR *curdir; /* to read current dir with ls */
527 #if defined(HAVE_SYS_STAT_H)
531 /* Reset errno to 0 before we start.
534 if (argc > 1 && strcmp("quit", argv[1]) == 0) {
536 printf("ERROR: invalid parameter count for quit\n");
541 #if defined(HAVE_OPENDIR) && defined(HAVE_READDIR) && defined(HAVE_CHDIR)
542 if (argc > 1 && strcmp("cd", argv[1]) == 0) {
544 printf("ERROR: invalid parameter count for cd\n");
547 #if ! defined(HAVE_CHROOT) || ! defined(HAVE_GETUID)
548 if (getuid() == 0 && !ChangeRoot) {
550 ("ERROR: chdir security problem - rrdtool is running as "
551 "root but not chroot!\n");
555 if (chdir(argv[2]) != 0){
556 printf("ERROR: chdir %s %s\n", argv[2], rrd_strerror(errno));
561 if (argc > 1 && strcmp("pwd", argv[1]) == 0) {
562 char *cwd; /* To hold current working dir on call to pwd */
564 printf("ERROR: invalid parameter count for pwd\n");
567 cwd = getcwd(NULL, MAXPATH);
569 printf("ERROR: getcwd %s\n", rrd_strerror(errno));
576 if (argc > 1 && strcmp("mkdir", argv[1]) == 0) {
578 printf("ERROR: invalid parameter count for mkdir\n");
581 #if ! defined(HAVE_CHROOT) || ! defined(HAVE_GETUID)
582 if (getuid() == 0 && !ChangeRoot) {
584 ("ERROR: mkdir security problem - rrdtool is running as "
585 "root but not chroot!\n");
589 if(mkdir(argv[2], 0777)!=0){
590 printf("ERROR: mkdir %s: %s\n", argv[2],rrd_strerror(errno));
595 if (argc > 1 && strcmp("ls", argv[1]) == 0) {
597 printf("ERROR: invalid parameter count for ls\n");
600 if ((curdir = opendir(".")) != NULL) {
601 while ((dent = readdir(curdir)) != NULL) {
602 if (!stat(dent->d_name, &st)) {
603 if (S_ISDIR(st.st_mode)) {
604 printf("d %s\n", dent->d_name);
606 if (strlen(dent->d_name) > 4 && S_ISREG(st.st_mode)) {
608 (dent->d_name + NAMLEN(dent) - 4, ".rrd")
609 || !strcmp(dent->d_name + NAMLEN(dent) - 4,
611 printf("- %s\n", dent->d_name);
618 printf("ERROR: opendir .: %s\n", rrd_strerror(errno));
623 #endif /* opendir and readdir */
627 || strcmp("help", argv[1]) == 0
628 || strcmp("--help", argv[1]) == 0
629 || strcmp("-help", argv[1]) == 0
630 || strcmp("-?", argv[1]) == 0 || strcmp("-h", argv[1]) == 0) {
635 if (strcmp("create", argv[1]) == 0)
636 rrd_create(argc - 1, &argv[1]);
637 else if (strcmp("dump", argv[1]) == 0)
638 rrd_dump(argc - 1, &argv[1]);
639 else if (strcmp("info", argv[1]) == 0 || strcmp("updatev", argv[1]) == 0) {
642 if (strcmp("info", argv[1]) == 0)
644 data = rrd_info(argc - 1, &argv[1]);
646 data = rrd_update_v(argc - 1, &argv[1]);
647 rrd_info_print(data);
651 else if (strcmp("--version", argv[1]) == 0 ||
652 strcmp("version", argv[1]) == 0 ||
653 strcmp("v", argv[1]) == 0 ||
654 strcmp("-v", argv[1]) == 0 || strcmp("-version", argv[1]) == 0)
655 printf("RRDtool " PACKAGE_VERSION
656 " Copyright by Tobi Oetiker, 1997-2008 (%f)\n",
658 else if (strcmp("restore", argv[1]) == 0)
659 rrd_restore(argc - 1, &argv[1]);
660 else if (strcmp("resize", argv[1]) == 0)
661 rrd_resize(argc - 1, &argv[1]);
662 else if (strcmp("last", argv[1]) == 0)
663 printf("%ld\n", rrd_last(argc - 1, &argv[1]));
664 else if (strcmp("lastupdate", argv[1]) == 0) {
665 rrd_lastupdate(argc - 1, &argv[1]);
666 } else if (strcmp("first", argv[1]) == 0)
667 printf("%ld\n", rrd_first(argc - 1, &argv[1]));
668 else if (strcmp("update", argv[1]) == 0)
669 rrd_update(argc - 1, &argv[1]);
670 else if (strcmp("fetch", argv[1]) == 0) {
671 time_t start, end, ti;
672 unsigned long step, ds_cnt, i, ii;
673 rrd_value_t *data, *datai;
677 (argc - 1, &argv[1], &start, &end, &step, &ds_cnt, &ds_namv,
681 for (i = 0; i < ds_cnt; i++)
682 printf("%20s", ds_namv[i]);
684 for (ti = start + step; ti <= end; ti += step) {
685 printf("%10lu:", ti);
686 for (ii = 0; ii < ds_cnt; ii++)
687 printf(" %0.10e", *(datai++));
690 for (i = 0; i < ds_cnt; i++)
695 } else if (strcmp("xport", argv[1]) == 0) {
697 unsigned long int j = 0;
698 time_t start, end, ti;
699 unsigned long step, col_cnt, row_cnt;
700 rrd_value_t *data, *ptr;
704 size_t vtag_s = strlen(COL_DATA_TAG) + 10;
705 char *vtag = malloc(vtag_s);
707 for (i = 2; i < argc; i++) {
708 if (strcmp("--enumds", argv[i]) == 0)
713 (argc - 1, &argv[1], &xxsize, &start, &end, &step, &col_cnt,
714 &legend_v, &data) != -1) {
715 row_cnt = (end - start) / step;
717 printf("<?xml version=\"1.0\" encoding=\"%s\"?>\n\n",
719 printf("<%s>\n", ROOT_TAG);
720 printf(" <%s>\n", META_TAG);
721 printf(" <%s>%lu</%s>\n", META_START_TAG,
722 (unsigned long) start + step, META_START_TAG);
723 printf(" <%s>%lu</%s>\n", META_STEP_TAG, step, META_STEP_TAG);
724 printf(" <%s>%lu</%s>\n", META_END_TAG, (unsigned long) end,
726 printf(" <%s>%lu</%s>\n", META_ROWS_TAG, row_cnt,
728 printf(" <%s>%lu</%s>\n", META_COLS_TAG, col_cnt,
730 printf(" <%s>\n", LEGEND_TAG);
731 for (j = 0; j < col_cnt; j++) {
735 printf(" <%s>%s</%s>\n", LEGEND_ENTRY_TAG, entry,
740 printf(" </%s>\n", LEGEND_TAG);
741 printf(" </%s>\n", META_TAG);
742 printf(" <%s>\n", DATA_TAG);
743 for (ti = start + step; ti <= end; ti += step) {
744 printf(" <%s>", DATA_ROW_TAG);
745 printf("<%s>%lu</%s>", COL_TIME_TAG, ti, COL_TIME_TAG);
746 for (j = 0; j < col_cnt; j++) {
747 rrd_value_t newval = DNAN;
751 snprintf(vtag, vtag_s, "%s%lu", COL_DATA_TAG, j);
753 snprintf(vtag, vtag_s, "%s", COL_DATA_TAG);
756 printf("<%s>NaN</%s>", vtag, vtag);
758 printf("<%s>%0.10e</%s>", vtag, newval, vtag);
762 printf("</%s>\n", DATA_ROW_TAG);
765 printf(" </%s>\n", DATA_TAG);
766 printf("</%s>\n", ROOT_TAG);
769 } else if (strcmp("graph", argv[1]) == 0) {
772 #ifdef notused /*XXX*/
773 const char *imgfile = argv[2]; /* rrd_graph changes argv pointer */
778 int tostdout = (strcmp(argv[2], "-") == 0);
781 for (i = 2; i < argc; i++) {
782 if (strcmp(argv[i], "--imginfo") == 0
783 || strcmp(argv[i], "-f") == 0) {
789 (argc - 1, &argv[1], &calcpr, &xsize, &ysize, NULL, &ymin,
791 if (!tostdout && !imginfo)
792 printf("%dx%d\n", xsize, ysize);
794 for (i = 0; calcpr[i]; i++) {
796 printf("%s\n", calcpr[i]);
803 } else if (strcmp("graphv", argv[1]) == 0) {
804 rrd_info_t *grinfo = NULL; /* 1 to distinguish it from the NULL that rrd_graph sends in */
806 grinfo = rrd_graph_v(argc - 1, &argv[1]);
808 rrd_info_print(grinfo);
809 rrd_info_free(grinfo);
812 } else if (strcmp("tune", argv[1]) == 0)
813 rrd_tune(argc - 1, &argv[1]);
814 else if (strcmp("flushcached", argv[1]) == 0)
815 rrd_flushcached(argc - 1, &argv[1]);
817 rrd_set_error("unknown function '%s'", argv[1]);
819 if (rrd_test_error()) {
820 fprintf(out, "ERROR: %s\n", rrd_get_error());
834 while (aLine[i] == ' ')
836 while (aLine[i] != 0) {
837 if ((aLine[i] == ' ') && inarg) {
840 if ((aLine[i] != ' ') && !inarg) {
850 * CreateArgs - take a string (aLine) and tokenize
865 /* remove trailing space and newlines */
866 while (len && aLine[len] <= ' ') {
870 /* sikp leading blanks */
871 while (*aLine && *aLine <= ' ')
897 pargv[argc++] = putP;
905 pargv[argc++] = putP;