1 /*****************************************************************************
2 * RRDtool 1.3.2 Copyright by Tobi Oetiker, 1997-2008
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"
11 #include "../rrd_config.h"
16 #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, flush\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_flush =
121 N_("* flush - flush cached data out to an RRD file\n\n"
122 "\trrdtool flush 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[-h|--height pixels] [-o|--logarithmic]\n"
140 "\t\t[-u|--upper-limit value] [-z|--lazy]\n"
141 "\t\t[-l|--lower-limit value] [-r|--rigid]\n"
142 "\t\t[-g|--no-legend] [--daemon <address>]\n"
143 "\t\t[-F|--force-rules-legend]\n" "\t\t[-j|--only-graph]\n");
144 const char *help_graph2 =
145 N_("\t\t[-n|--font FONTTAG:size:font]\n"
146 "\t\t[-m|--zoom factor]\n"
147 "\t\t[-A|--alt-autoscale]\n"
148 "\t\t[-M|--alt-autoscale-max]\n"
149 "\t\t[-R|--font-render-mode {normal,light,mono}]\n"
150 "\t\t[-B|--font-smoothing-threshold size]\n"
151 "\t\t[-T|--tabwidth width]\n"
152 "\t\t[-E|--slope-mode]\n"
153 "\t\t[-N|--no-gridfit]\n"
154 "\t\t[-X|--units-exponent value]\n"
155 "\t\t[-L|--units-length value]\n"
156 "\t\t[-S|--step seconds]\n"
157 "\t\t[-f|--imginfo printfstr]\n"
158 "\t\t[-a|--imgformat PNG]\n"
159 "\t\t[-c|--color COLORTAG#rrggbb[aa]] [-t|--title string]\n"
160 "\t\t[-W|--watermark string]\n"
161 "\t\t[DEF:vname=rrd:ds-name:CF]\n");
162 const char *help_graph3 =
163 N_("\t\t[CDEF:vname=rpn-expression]\n"
164 "\t\t[VDEF:vdefname=rpn-expression]\n"
165 "\t\t[PRINT:vdefname:format]\n"
166 "\t\t[GPRINT:vdefname:format]\n" "\t\t[COMMENT:text]\n"
167 "\t\t[SHIFT:vname:offset]\n"
168 "\t\t[TICK:vname#rrggbb[aa][:[fraction][:legend]]]\n"
169 "\t\t[HRULE:value#rrggbb[aa][:legend]]\n"
170 "\t\t[VRULE:value#rrggbb[aa][:legend]]\n"
171 "\t\t[LINE[width]:vname[#rrggbb[aa][:[legend][:STACK]]]]\n"
172 "\t\t[AREA:vname[#rrggbb[aa][:[legend][:STACK]]]]\n"
173 "\t\t[PRINT:vname:CF:format] (deprecated)\n"
174 "\t\t[GPRINT:vname:CF:format] (deprecated)\n"
175 "\t\t[STACK:vname[#rrggbb[aa][:legend]]] (deprecated)\n\n");
176 const char *help_tune1 =
177 N_(" * tune - Modify some basic properties of an RRD\n\n"
178 "\trrdtool tune filename\n"
179 "\t\t[--heartbeat|-h ds-name:heartbeat]\n"
180 "\t\t[--data-source-type|-d ds-name:DST]\n"
181 "\t\t[--data-source-rename|-r old-name:new-name]\n"
182 "\t\t[--minimum|-i ds-name:min] [--maximum|-a ds-name:max]\n"
183 "\t\t[--deltapos scale-value] [--deltaneg scale-value]\n"
184 "\t\t[--failure-threshold integer]\n"
185 "\t\t[--window-length integer]\n"
186 "\t\t[--alpha adaptation-parameter]\n");
187 const char *help_tune2 =
188 N_(" * tune - Modify some basic properties of an RRD\n\n"
189 "\t\t[--beta adaptation-parameter]\n"
190 "\t\t[--gamma adaptation-parameter]\n"
191 "\t\t[--gamma-deviation adaptation-parameter]\n"
192 "\t\t[--aberrant-reset ds-name]\n\n");
193 const char *help_resize =
195 (" * resize - alter the length of one of the RRAs in an RRD\n\n"
196 "\trrdtool resize filename rranum GROW|SHRINK rows\n\n");
197 const char *help_xport =
198 N_("* xport - generate XML dump from one or several RRD\n\n"
199 "\trrdtool xport [-s|--start seconds] [-e|--end seconds]\n"
200 "\t\t[-m|--maxrows rows]\n" "\t\t[--step seconds]\n"
201 "\t\t[--enumds]\n" "\t\t[DEF:vname=rrd:ds-name:CF]\n"
202 "\t\t[CDEF:vname=rpn-expression]\n"
203 "\t\t[XPORT:vname:legend]\n\n");
204 const char *help_quit =
205 N_(" * quit - closing a session in remote mode\n\n"
206 "\trrdtool quit\n\n");
207 const char *help_ls =
208 N_(" * ls - lists all *.rrd files in current directory\n\n"
210 const char *help_cd =
211 N_(" * cd - changes the current directory\n\n"
212 "\trrdtool cd new directory\n\n");
213 const char *help_mkdir =
214 N_(" * mkdir - creates a new directory\n\n"
215 "\trrdtool mkdir newdirectoryname\n\n");
216 const char *help_pwd =
217 N_(" * pwd - returns the current working directory\n\n"
218 "\trrdtool pwd\n\n");
219 const char *help_lic =
220 N_("RRDtool is distributed under the Terms of the GNU General\n"
221 "Public License Version 2. (www.gnu.org/copyleft/gpl.html)\n\n"
222 "For more information read the RRD manpages\n\n");
223 enum { C_NONE, C_CREATE, C_DUMP, C_INFO, C_RESTORE, C_LAST,
224 C_LASTUPDATE, C_FIRST, C_UPDATE, C_FETCH, C_GRAPH, C_GRAPHV,
226 C_RESIZE, C_XPORT, C_QUIT, C_LS, C_CD, C_MKDIR, C_PWD,
229 int help_cmd = C_NONE;
232 if (!strcmp(cmd, "create"))
234 else if (!strcmp(cmd, "dump"))
236 else if (!strcmp(cmd, "info"))
238 else if (!strcmp(cmd, "restore"))
239 help_cmd = C_RESTORE;
240 else if (!strcmp(cmd, "last"))
242 else if (!strcmp(cmd, "lastupdate"))
243 help_cmd = C_LASTUPDATE;
244 else if (!strcmp(cmd, "first"))
246 else if (!strcmp(cmd, "update"))
248 else if (!strcmp(cmd, "updatev"))
249 help_cmd = C_UPDATEV;
250 else if (!strcmp(cmd, "fetch"))
252 else if (!strcmp(cmd, "flush"))
254 else if (!strcmp(cmd, "graph"))
256 else if (!strcmp(cmd, "graphv"))
258 else if (!strcmp(cmd, "tune"))
260 else if (!strcmp(cmd, "resize"))
262 else if (!strcmp(cmd, "xport"))
264 else if (!strcmp(cmd, "quit"))
266 else if (!strcmp(cmd, "ls"))
268 else if (!strcmp(cmd, "cd"))
270 else if (!strcmp(cmd, "mkdir"))
272 else if (!strcmp(cmd, "pwd"))
275 fprintf(stdout, _(help_main), PACKAGE_VERSION, __DATE__, __TIME__);
279 fputs(_(help_list), stdout);
281 fputs(_(help_listremote), stdout);
285 fputs(_(help_create), stdout);
288 fputs(_(help_dump), stdout);
291 fputs(_(help_info), stdout);
294 fputs(_(help_restore), stdout);
297 fputs(_(help_last), stdout);
300 fputs(_(help_lastupdate), stdout);
303 fputs(_(help_first), stdout);
306 fputs(_(help_update), stdout);
309 fputs(_(help_updatev), stdout);
312 fputs(_(help_fetch), stdout);
315 fputs(_(help_flush), stdout);
318 fputs(_(help_graph0), stdout);
319 fputs(_(help_graph1), stdout);
320 fputs(_(help_graph2), stdout);
321 fputs(_(help_graph3), stdout);
324 fputs(_(help_graphv0), stdout);
325 fputs(_(help_graph1), stdout);
326 fputs(_(help_graph2), stdout);
327 fputs(_(help_graph3), stdout);
330 fputs(_(help_tune1), stdout);
331 fputs(_(help_tune2), stdout);
334 fputs(_(help_resize), stdout);
337 fputs(_(help_xport), stdout);
340 fputs(_(help_quit), stdout);
343 fputs(_(help_ls), stdout);
346 fputs(_(help_cd), stdout);
349 fputs(_(help_mkdir), stdout);
352 fputs(_(help_pwd), stdout);
355 fputs(_(help_lic), stdout);
358 static char *fgetslong(
363 size_t bufsize = MAX_LENGTH;
367 return *aLinePtr = 0;
368 if (!(linebuf = malloc(bufsize))) {
369 perror("fgetslong: malloc");
373 while (fgets(linebuf + eolpos, MAX_LENGTH, stream)) {
374 eolpos += strlen(linebuf + eolpos);
375 if (linebuf[eolpos - 1] == '\n')
376 return *aLinePtr = linebuf;
377 bufsize += MAX_LENGTH;
378 if (!(linebuf = realloc(linebuf, bufsize))) {
380 perror("fgetslong: realloc");
385 return *aLinePtr = linebuf;
388 return *aLinePtr = 0;
399 #ifdef MUST_DISABLE_SIGFPE
400 signal(SIGFPE, SIG_IGN);
402 #ifdef MUST_DISABLE_FPMASK
406 setlocale(LC_ALL, "");
409 #if defined(HAVE_LIBINTL_H) && defined(BUILD_LIBINTL)
410 bindtextdomain(GETTEXT_PACKAGE, LOCALEDIR);
411 bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8");
412 textdomain(GETTEXT_PACKAGE);
419 if (((argc == 2) || (argc == 3)) && !strcmp("-", argv[1])) {
421 struct rusage myusage;
422 struct timeval starttime;
423 struct timeval currenttime;
425 gettimeofday(&starttime, NULL);
428 if ((argc == 3) && strcmp("", argv[2])) {
439 if (chroot(argv[2]) != 0){
440 fprintf(stderr, "ERROR: chroot %s: %s\n", argv[2],rrd_strerror(errno));
447 "ERROR: change root is not supported by your OS "
448 "or at least by this copy of rrdtool\n");
455 if (strcmp(firstdir, "")) {
456 if (chdir(firstdir) != 0){
457 fprintf(stderr, "ERROR: chdir %s %s\n", firstdir,rrd_strerror(errno));
462 while (fgetslong(&aLine, stdin)) {
463 if ((argc = CountArgs(aLine)) == 0) {
465 printf("ERROR: not enough arguments\n");
467 if ((myargv = (char **) malloc((argc + 1) *
468 sizeof(char *))) == NULL) {
472 if ((argc = CreateArgs(argv[0], aLine, argc, myargv)) < 0) {
475 printf("ERROR: creating arguments\n");
477 int ret = HandleInputLine(argc, myargv, stdout);
482 getrusage(RUSAGE_SELF, &myusage);
483 gettimeofday(¤ttime, NULL);
484 printf("OK u:%1.2f s:%1.2f r:%1.2f\n",
485 (double) myusage.ru_utime.tv_sec +
486 (double) myusage.ru_utime.tv_usec / 1000000.0,
487 (double) myusage.ru_stime.tv_sec +
488 (double) myusage.ru_stime.tv_usec / 1000000.0,
489 (double) (currenttime.tv_sec - starttime.tv_sec)
490 + (double) (currenttime.tv_usec -
498 fflush(stdout); /* this is important for pipes to work */
501 } else if (argc == 2) {
504 } else if (argc == 3 && !strcmp(argv[1], "help")) {
508 exit(HandleInputLine(argc, argv, stderr));
513 /* HandleInputLine is NOT thread safe - due to readdir issues,
514 resolving them portably is not really simple. */
520 #if defined(HAVE_OPENDIR) && defined (HAVE_READDIR)
521 DIR *curdir; /* to read current dir with ls */
524 #if defined(HAVE_SYS_STAT_H)
527 char *cwd; /* To hold current working dir on call to pwd */
529 /* Reset errno to 0 before we start.
532 if (argc > 1 && strcmp("quit", argv[1]) == 0) {
534 printf("ERROR: invalid parameter count for quit\n");
539 #if defined(HAVE_OPENDIR) && defined(HAVE_READDIR) && defined(HAVE_CHDIR)
540 if (argc > 1 && strcmp("cd", argv[1]) == 0) {
542 printf("ERROR: invalid parameter count for cd\n");
545 #if ! defined(HAVE_CHROOT) || ! defined(HAVE_GETUID)
546 if (getuid() == 0 && !ChangeRoot) {
548 ("ERROR: chdir security problem - rrdtool is running as "
549 "root but not chroot!\n");
553 if (chdir(argv[2]) != 0){
554 printf("ERROR: chdir %s %s\n", argv[2], rrd_strerror(errno));
559 if (argc > 1 && strcmp("pwd", argv[1]) == 0) {
561 printf("ERROR: invalid parameter count for pwd\n");
564 cwd = getcwd(NULL, MAXPATH);
566 printf("ERROR: getcwd %s\n", rrd_strerror(errno));
573 if (argc > 1 && strcmp("mkdir", argv[1]) == 0) {
575 printf("ERROR: invalid parameter count for mkdir\n");
578 #if ! defined(HAVE_CHROOT) || ! defined(HAVE_GETUID)
579 if (getuid() == 0 && !ChangeRoot) {
581 ("ERROR: mkdir security problem - rrdtool is running as "
582 "root but not chroot!\n");
586 if(mkdir(argv[2], 0777)!=0){
587 printf("ERROR: mkdir %s: %s\n", argv[2],rrd_strerror(errno));
592 if (argc > 1 && strcmp("ls", argv[1]) == 0) {
594 printf("ERROR: invalid parameter count for ls\n");
597 if ((curdir = opendir(".")) != NULL) {
598 while ((dent = readdir(curdir)) != NULL) {
599 if (!stat(dent->d_name, &st)) {
600 if (S_ISDIR(st.st_mode)) {
601 printf("d %s\n", dent->d_name);
603 if (strlen(dent->d_name) > 4 && S_ISREG(st.st_mode)) {
605 (dent->d_name + NAMLEN(dent) - 4, ".rrd")
606 || !strcmp(dent->d_name + NAMLEN(dent) - 4,
608 printf("- %s\n", dent->d_name);
615 printf("ERROR: opendir .: %s\n", rrd_strerror(errno));
620 #endif /* opendir and readdir */
624 || strcmp("help", argv[1]) == 0
625 || strcmp("--help", argv[1]) == 0
626 || strcmp("-help", argv[1]) == 0
627 || strcmp("-?", argv[1]) == 0 || strcmp("-h", argv[1]) == 0) {
632 if (strcmp("create", argv[1]) == 0)
633 rrd_create(argc - 1, &argv[1]);
634 else if (strcmp("dump", argv[1]) == 0)
635 rrd_dump(argc - 1, &argv[1]);
636 else if (strcmp("info", argv[1]) == 0 || strcmp("updatev", argv[1]) == 0) {
639 if (strcmp("info", argv[1]) == 0)
641 data = rrd_info(argc - 1, &argv[1]);
643 data = rrd_update_v(argc - 1, &argv[1]);
644 rrd_info_print(data);
648 else if (strcmp("--version", argv[1]) == 0 ||
649 strcmp("version", argv[1]) == 0 ||
650 strcmp("v", argv[1]) == 0 ||
651 strcmp("-v", argv[1]) == 0 || strcmp("-version", argv[1]) == 0)
652 printf("RRDtool " PACKAGE_VERSION
653 " Copyright by Tobi Oetiker, 1997-2008 (%f)\n",
655 else if (strcmp("restore", argv[1]) == 0)
656 rrd_restore(argc - 1, &argv[1]);
657 else if (strcmp("resize", argv[1]) == 0)
658 rrd_resize(argc - 1, &argv[1]);
659 else if (strcmp("last", argv[1]) == 0)
660 printf("%ld\n", rrd_last(argc - 1, &argv[1]));
661 else if (strcmp("lastupdate", argv[1]) == 0) {
662 rrd_lastupdate(argc - 1, &argv[1]);
663 } else if (strcmp("first", argv[1]) == 0)
664 printf("%ld\n", rrd_first(argc - 1, &argv[1]));
665 else if (strcmp("update", argv[1]) == 0)
666 rrd_update(argc - 1, &argv[1]);
667 else if (strcmp("fetch", argv[1]) == 0) {
668 time_t start, end, ti;
669 unsigned long step, ds_cnt, i, ii;
670 rrd_value_t *data, *datai;
674 (argc - 1, &argv[1], &start, &end, &step, &ds_cnt, &ds_namv,
678 for (i = 0; i < ds_cnt; i++)
679 printf("%20s", ds_namv[i]);
681 for (ti = start + step; ti <= end; ti += step) {
682 printf("%10lu:", ti);
683 for (ii = 0; ii < ds_cnt; ii++)
684 printf(" %0.10e", *(datai++));
687 for (i = 0; i < ds_cnt; i++)
692 } else if (strcmp("xport", argv[1]) == 0) {
694 unsigned long int j = 0;
695 time_t start, end, ti;
696 unsigned long step, col_cnt, row_cnt;
697 rrd_value_t *data, *ptr;
701 size_t vtag_s = strlen(COL_DATA_TAG) + 10;
702 char *vtag = malloc(vtag_s);
704 for (i = 2; i < argc; i++) {
705 if (strcmp("--enumds", argv[i]) == 0)
710 (argc - 1, &argv[1], &xxsize, &start, &end, &step, &col_cnt,
711 &legend_v, &data) != -1) {
712 row_cnt = (end - start) / step;
714 printf("<?xml version=\"1.0\" encoding=\"%s\"?>\n\n",
716 printf("<%s>\n", ROOT_TAG);
717 printf(" <%s>\n", META_TAG);
718 printf(" <%s>%lu</%s>\n", META_START_TAG,
719 (unsigned long) start + step, META_START_TAG);
720 printf(" <%s>%lu</%s>\n", META_STEP_TAG, step, META_STEP_TAG);
721 printf(" <%s>%lu</%s>\n", META_END_TAG, (unsigned long) end,
723 printf(" <%s>%lu</%s>\n", META_ROWS_TAG, row_cnt,
725 printf(" <%s>%lu</%s>\n", META_COLS_TAG, col_cnt,
727 printf(" <%s>\n", LEGEND_TAG);
728 for (j = 0; j < col_cnt; j++) {
732 printf(" <%s>%s</%s>\n", LEGEND_ENTRY_TAG, entry,
737 printf(" </%s>\n", LEGEND_TAG);
738 printf(" </%s>\n", META_TAG);
739 printf(" <%s>\n", DATA_TAG);
740 for (ti = start + step; ti <= end; ti += step) {
741 printf(" <%s>", DATA_ROW_TAG);
742 printf("<%s>%lu</%s>", COL_TIME_TAG, ti, COL_TIME_TAG);
743 for (j = 0; j < col_cnt; j++) {
744 rrd_value_t newval = DNAN;
748 snprintf(vtag, vtag_s, "%s%lu", COL_DATA_TAG, j);
750 snprintf(vtag, vtag_s, "%s", COL_DATA_TAG);
753 printf("<%s>NaN</%s>", vtag, vtag);
755 printf("<%s>%0.10e</%s>", vtag, newval, vtag);
759 printf("</%s>\n", DATA_ROW_TAG);
762 printf(" </%s>\n", DATA_TAG);
763 printf("</%s>\n", ROOT_TAG);
766 } else if (strcmp("graph", argv[1]) == 0) {
769 #ifdef notused /*XXX*/
770 const char *imgfile = argv[2]; /* rrd_graph changes argv pointer */
775 int tostdout = (strcmp(argv[2], "-") == 0);
778 for (i = 2; i < argc; i++) {
779 if (strcmp(argv[i], "--imginfo") == 0
780 || strcmp(argv[i], "-f") == 0) {
786 (argc - 1, &argv[1], &calcpr, &xsize, &ysize, NULL, &ymin,
788 if (!tostdout && !imginfo)
789 printf("%dx%d\n", xsize, ysize);
791 for (i = 0; calcpr[i]; i++) {
793 printf("%s\n", calcpr[i]);
800 } else if (strcmp("graphv", argv[1]) == 0) {
801 rrd_info_t *grinfo = NULL; /* 1 to distinguish it from the NULL that rrd_graph sends in */
803 grinfo = rrd_graph_v(argc - 1, &argv[1]);
805 rrd_info_print(grinfo);
806 rrd_info_free(grinfo);
809 } else if (strcmp("tune", argv[1]) == 0)
810 rrd_tune(argc - 1, &argv[1]);
811 else if (strcmp("flush", argv[1]) == 0)
812 rrd_cmd_flush(argc - 1, &argv[1]);
814 rrd_set_error("unknown function '%s'", argv[1]);
816 if (rrd_test_error()) {
817 fprintf(out, "ERROR: %s\n", rrd_get_error());
831 while (aLine[i] == ' ')
833 while (aLine[i] != 0) {
834 if ((aLine[i] == ' ') && inarg) {
837 if ((aLine[i] != ' ') && !inarg) {
847 * CreateArgs - take a string (aLine) and tokenize
862 /* remove trailing space and newlines */
863 while (len && aLine[len] <= ' ') {
867 /* sikp leading blanks */
868 while (*aLine && *aLine <= ' ')
894 pargv[argc++] = putP;
902 pargv[argc++] = putP;