1 /*****************************************************************************
2 * RRDtool 1.4.2 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-2009 by Tobias Oetiker <tobi@oetiker.ch>\n"
52 "Usage: rrdtool [options] command command_options\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");
60 const char *help_listremote =
61 N_("Valid remote commands: quit, ls, cd, mkdir, pwd\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");
71 const char *help_dump =
72 N_("* dump - dump an RRD to XML\n\n"
73 "\trrdtool dump filename.rrd >filename.xml\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");
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");
83 const char *help_last =
84 N_("* last - show last update time for RRD\n\n"
85 "\trrdtool last filename.rrd\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");
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");
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");
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");
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");
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");
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[-P|--pango-markup]\n"
157 "\t\t[-N|--no-gridfit]\n"
158 "\t\t[-X|--units-exponent value]\n"
159 "\t\t[-L|--units-length value]\n"
160 "\t\t[-S|--step seconds]\n"
161 "\t\t[-f|--imginfo printfstr]\n"
162 "\t\t[-a|--imgformat PNG]\n"
163 "\t\t[-c|--color COLORTAG#rrggbb[aa]]\n"
164 "\t\t[--border width\n"
165 "\t\t[-t|--title string]\n"
166 "\t\t[-W|--watermark string]\n"
167 "\t\t[DEF:vname=rrd:ds-name:CF]\n");
168 const char *help_graph3 =
169 N_("\t\t[CDEF:vname=rpn-expression]\n"
170 "\t\t[VDEF:vdefname=rpn-expression]\n"
171 "\t\t[PRINT:vdefname:format]\n"
172 "\t\t[GPRINT:vdefname:format]\n" "\t\t[COMMENT:text]\n"
173 "\t\t[SHIFT:vname:offset]\n"
174 "\t\t[TEXTALIGN:{left|right|justified|center}]\n"
175 "\t\t[TICK:vname#rrggbb[aa][:[fraction][:legend]]]\n"
176 "\t\t[HRULE:value#rrggbb[aa][:legend]]\n"
177 "\t\t[VRULE:value#rrggbb[aa][:legend]]\n"
178 "\t\t[LINE[width]:vname[#rrggbb[aa][:[legend][:STACK]]]]\n"
179 "\t\t[AREA:vname[#rrggbb[aa][:[legend][:STACK]]]]\n"
180 "\t\t[PRINT:vname:CF:format] (deprecated)\n"
181 "\t\t[GPRINT:vname:CF:format] (deprecated)\n"
182 "\t\t[STACK:vname[#rrggbb[aa][:legend]]] (deprecated)\n");
183 const char *help_tune1 =
184 N_(" * tune - Modify some basic properties of an RRD\n\n"
185 "\trrdtool tune filename\n"
186 "\t\t[--heartbeat|-h ds-name:heartbeat]\n"
187 "\t\t[--data-source-type|-d ds-name:DST]\n"
188 "\t\t[--data-source-rename|-r old-name:new-name]\n"
189 "\t\t[--minimum|-i ds-name:min] [--maximum|-a ds-name:max]\n"
190 "\t\t[--deltapos scale-value] [--deltaneg scale-value]\n"
191 "\t\t[--failure-threshold integer]\n"
192 "\t\t[--window-length integer]\n"
193 "\t\t[--alpha adaptation-parameter]\n");
194 const char *help_tune2 =
195 N_("\t\t[--beta adaptation-parameter]\n"
196 "\t\t[--gamma adaptation-parameter]\n"
197 "\t\t[--gamma-deviation adaptation-parameter]\n"
198 "\t\t[--aberrant-reset ds-name]\n");
199 const char *help_resize =
201 (" * resize - alter the length of one of the RRAs in an RRD\n\n"
202 "\trrdtool resize filename rranum GROW|SHRINK rows\n");
203 const char *help_xport =
204 N_("* xport - generate XML dump from one or several RRD\n\n"
205 "\trrdtool xport [-s|--start seconds] [-e|--end seconds]\n"
206 "\t\t[-m|--maxrows rows]\n" "\t\t[--step seconds]\n"
207 "\t\t[--enumds]\n" "\t\t[DEF:vname=rrd:ds-name:CF]\n"
208 "\t\t[CDEF:vname=rpn-expression]\n"
209 "\t\t[XPORT:vname:legend]\n");
210 const char *help_quit =
211 N_(" * quit - closing a session in remote mode\n\n"
213 const char *help_ls =
214 N_(" * ls - lists all *.rrd files in current directory\n\n"
216 const char *help_cd =
217 N_(" * cd - changes the current directory\n\n"
218 "\trrdtool cd new directory\n");
219 const char *help_mkdir =
220 N_(" * mkdir - creates a new directory\n\n"
221 "\trrdtool mkdir newdirectoryname\n");
222 const char *help_pwd =
223 N_(" * pwd - returns the current working directory\n\n"
225 const char *help_lic =
226 N_("RRDtool is distributed under the Terms of the GNU General\n"
227 "Public License Version 2. (www.gnu.org/copyleft/gpl.html)\n\n"
228 "For more information read the RRD manpages\n");
229 enum { C_NONE, C_CREATE, C_DUMP, C_INFO, C_RESTORE, C_LAST,
230 C_LASTUPDATE, C_FIRST, C_UPDATE, C_FETCH, C_GRAPH, C_GRAPHV,
232 C_RESIZE, C_XPORT, C_QUIT, C_LS, C_CD, C_MKDIR, C_PWD,
233 C_UPDATEV, C_FLUSHCACHED
235 int help_cmd = C_NONE;
238 if (!strcmp(cmd, "create"))
240 else if (!strcmp(cmd, "dump"))
242 else if (!strcmp(cmd, "info"))
244 else if (!strcmp(cmd, "restore"))
245 help_cmd = C_RESTORE;
246 else if (!strcmp(cmd, "last"))
248 else if (!strcmp(cmd, "lastupdate"))
249 help_cmd = C_LASTUPDATE;
250 else if (!strcmp(cmd, "first"))
252 else if (!strcmp(cmd, "update"))
254 else if (!strcmp(cmd, "updatev"))
255 help_cmd = C_UPDATEV;
256 else if (!strcmp(cmd, "fetch"))
258 else if (!strcmp(cmd, "flushcached"))
259 help_cmd = C_FLUSHCACHED;
260 else if (!strcmp(cmd, "graph"))
262 else if (!strcmp(cmd, "graphv"))
264 else if (!strcmp(cmd, "tune"))
266 else if (!strcmp(cmd, "resize"))
268 else if (!strcmp(cmd, "xport"))
270 else if (!strcmp(cmd, "quit"))
272 else if (!strcmp(cmd, "ls"))
274 else if (!strcmp(cmd, "cd"))
276 else if (!strcmp(cmd, "mkdir"))
278 else if (!strcmp(cmd, "pwd"))
281 fprintf(stdout, _(help_main), PACKAGE_VERSION, __DATE__, __TIME__);
287 puts(_(help_listremote));
291 puts(_(help_create));
300 puts(_(help_restore));
306 puts(_(help_lastupdate));
312 puts(_(help_update));
315 puts(_(help_updatev));
321 puts(_(help_flushcached));
324 puts(_(help_graph0));
325 puts(_(help_graph1));
326 puts(_(help_graph2));
327 puts(_(help_graph3));
330 puts(_(help_graphv0));
331 puts(_(help_graph1));
332 puts(_(help_graph2));
333 puts(_(help_graph3));
340 puts(_(help_resize));
364 static char *fgetslong(
369 size_t bufsize = MAX_LENGTH;
373 return *aLinePtr = 0;
374 if (!(linebuf = malloc(bufsize))) {
375 perror("fgetslong: malloc");
379 while (fgets(linebuf + eolpos, MAX_LENGTH, stream)) {
380 eolpos += strlen(linebuf + eolpos);
381 if (linebuf[eolpos - 1] == '\n')
382 return *aLinePtr = linebuf;
383 bufsize += MAX_LENGTH;
384 if (!(linebuf = realloc(linebuf, bufsize))) {
386 perror("fgetslong: realloc");
391 return *aLinePtr = linebuf;
394 return *aLinePtr = 0;
405 #ifdef MUST_DISABLE_SIGFPE
406 signal(SIGFPE, SIG_IGN);
408 #ifdef MUST_DISABLE_FPMASK
412 /* initialize locale settings
413 according to localeconv(3) */
414 setlocale(LC_ALL, "");
416 #if defined(HAVE_LIBINTL_H) && defined(BUILD_LIBINTL)
417 bindtextdomain(GETTEXT_PACKAGE, LOCALEDIR);
418 textdomain(GETTEXT_PACKAGE);
425 if (((argc == 2) || (argc == 3)) && !strcmp("-", argv[1])) {
427 struct rusage myusage;
428 struct timeval starttime;
429 struct timeval currenttime;
431 gettimeofday(&starttime, NULL);
434 if ((argc == 3) && strcmp("", argv[2])) {
445 if (chroot(argv[2]) != 0){
446 fprintf(stderr, "ERROR: chroot %s: %s\n", argv[2],rrd_strerror(errno));
453 "ERROR: change root is not supported by your OS "
454 "or at least by this copy of rrdtool\n");
461 if (strcmp(firstdir, "")) {
462 if (chdir(firstdir) != 0){
463 fprintf(stderr, "ERROR: chdir %s %s\n", firstdir,rrd_strerror(errno));
468 while (fgetslong(&aLine, stdin)) {
469 char *aLineOrig = aLine;
470 if ((argc = CountArgs(aLine)) == 0) {
472 printf("ERROR: not enough arguments\n");
475 if ((myargv = (char **) malloc((argc + 1) *
476 sizeof(char *))) == NULL) {
480 if ((argc = CreateArgs(argv[0], aLine, myargv)) < 0) {
481 printf("ERROR: creating arguments\n");
483 if ( HandleInputLine(argc, myargv, stdout) == 0 ){
485 getrusage(RUSAGE_SELF, &myusage);
486 gettimeofday(¤ttime, NULL);
487 printf("OK u:%1.2f s:%1.2f r:%1.2f\n",
488 (double) myusage.ru_utime.tv_sec +
489 (double) myusage.ru_utime.tv_usec / 1000000.0,
490 (double) myusage.ru_stime.tv_sec +
491 (double) myusage.ru_stime.tv_usec / 1000000.0,
492 (double) (currenttime.tv_sec - starttime.tv_sec)
493 + (double) (currenttime.tv_usec -
501 fflush(stdout); /* this is important for pipes to work */
505 } else if (argc == 2) {
508 } else if (argc == 3 && !strcmp(argv[1], "help")) {
512 exit(HandleInputLine(argc, argv, stderr));
517 /* HandleInputLine is NOT thread safe - due to readdir issues,
518 resolving them portably is not really simple. */
524 #if defined(HAVE_OPENDIR) && defined (HAVE_READDIR)
525 DIR *curdir; /* to read current dir with ls */
528 #if defined(HAVE_SYS_STAT_H)
532 /* Reset errno to 0 before we start.
535 if (argc > 1 && strcmp("quit", argv[1]) == 0) {
537 printf("ERROR: invalid parameter count for quit\n");
542 #if defined(HAVE_OPENDIR) && defined(HAVE_READDIR) && defined(HAVE_CHDIR)
543 if (argc > 1 && strcmp("cd", argv[1]) == 0) {
545 printf("ERROR: invalid parameter count for cd\n");
548 #if ! defined(HAVE_CHROOT) || ! defined(HAVE_GETUID)
549 if (getuid() == 0 && !ChangeRoot) {
551 ("ERROR: chdir security problem - rrdtool is running as "
552 "root but not chroot!\n");
556 if (chdir(argv[2]) != 0){
557 printf("ERROR: chdir %s %s\n", argv[2], rrd_strerror(errno));
562 if (argc > 1 && strcmp("pwd", argv[1]) == 0) {
563 char *cwd; /* To hold current working dir on call to pwd */
565 printf("ERROR: invalid parameter count for pwd\n");
568 cwd = getcwd(NULL, MAXPATH);
570 printf("ERROR: getcwd %s\n", rrd_strerror(errno));
577 if (argc > 1 && strcmp("mkdir", argv[1]) == 0) {
579 printf("ERROR: invalid parameter count for mkdir\n");
582 #if ! defined(HAVE_CHROOT) || ! defined(HAVE_GETUID)
583 if (getuid() == 0 && !ChangeRoot) {
585 ("ERROR: mkdir security problem - rrdtool is running as "
586 "root but not chroot!\n");
590 if(mkdir(argv[2], 0777)!=0){
591 printf("ERROR: mkdir %s: %s\n", argv[2],rrd_strerror(errno));
596 if (argc > 1 && strcmp("ls", argv[1]) == 0) {
598 printf("ERROR: invalid parameter count for ls\n");
601 if ((curdir = opendir(".")) != NULL) {
602 while ((dent = readdir(curdir)) != NULL) {
603 if (!stat(dent->d_name, &st)) {
604 if (S_ISDIR(st.st_mode)) {
605 printf("d %s\n", dent->d_name);
607 if (strlen(dent->d_name) > 4 && S_ISREG(st.st_mode)) {
609 (dent->d_name + NAMLEN(dent) - 4, ".rrd")
610 || !strcmp(dent->d_name + NAMLEN(dent) - 4,
612 printf("- %s\n", dent->d_name);
619 printf("ERROR: opendir .: %s\n", rrd_strerror(errno));
624 #endif /* opendir and readdir */
628 || strcmp("help", argv[1]) == 0
629 || strcmp("--help", argv[1]) == 0
630 || strcmp("-help", argv[1]) == 0
631 || strcmp("-?", argv[1]) == 0 || strcmp("-h", argv[1]) == 0) {
636 if (strcmp("create", argv[1]) == 0)
637 rrd_create(argc - 1, &argv[1]);
638 else if (strcmp("dump", argv[1]) == 0)
639 rrd_dump(argc - 1, &argv[1]);
640 else if (strcmp("info", argv[1]) == 0 || strcmp("updatev", argv[1]) == 0) {
643 if (strcmp("info", argv[1]) == 0)
645 data = rrd_info(argc - 1, &argv[1]);
647 data = rrd_update_v(argc - 1, &argv[1]);
648 rrd_info_print(data);
652 else if (strcmp("--version", argv[1]) == 0 ||
653 strcmp("version", argv[1]) == 0 ||
654 strcmp("v", argv[1]) == 0 ||
655 strcmp("-v", argv[1]) == 0 || strcmp("-version", argv[1]) == 0)
656 printf("RRDtool " PACKAGE_VERSION
657 " Copyright by Tobi Oetiker, 1997-2008 (%f)\n",
659 else if (strcmp("restore", argv[1]) == 0)
660 rrd_restore(argc - 1, &argv[1]);
661 else if (strcmp("resize", argv[1]) == 0)
662 rrd_resize(argc - 1, &argv[1]);
663 else if (strcmp("last", argv[1]) == 0)
664 printf("%ld\n", rrd_last(argc - 1, &argv[1]));
665 else if (strcmp("lastupdate", argv[1]) == 0) {
666 rrd_lastupdate(argc - 1, &argv[1]);
667 } else if (strcmp("first", argv[1]) == 0)
668 printf("%ld\n", rrd_first(argc - 1, &argv[1]));
669 else if (strcmp("update", argv[1]) == 0)
670 rrd_update(argc - 1, &argv[1]);
671 else if (strcmp("fetch", argv[1]) == 0) {
672 time_t start, end, ti;
673 unsigned long step, ds_cnt, i, ii;
674 rrd_value_t *data, *datai;
678 (argc - 1, &argv[1], &start, &end, &step, &ds_cnt, &ds_namv,
682 for (i = 0; i < ds_cnt; i++)
683 printf("%20s", ds_namv[i]);
685 for (ti = start + step; ti <= end; ti += step) {
686 printf("%10lu:", ti);
687 for (ii = 0; ii < ds_cnt; ii++)
688 printf(" %0.10e", *(datai++));
691 for (i = 0; i < ds_cnt; i++)
696 } else if (strcmp("xport", argv[1]) == 0) {
698 unsigned long int j = 0;
699 time_t start, end, ti;
700 unsigned long step, col_cnt, row_cnt;
701 rrd_value_t *data, *ptr;
705 size_t vtag_s = strlen(COL_DATA_TAG) + 10;
706 char *vtag = malloc(vtag_s);
708 for (i = 2; i < argc; i++) {
709 if (strcmp("--enumds", argv[i]) == 0)
714 (argc - 1, &argv[1], &xxsize, &start, &end, &step, &col_cnt,
715 &legend_v, &data) != -1) {
716 char *old_locale = setlocale(LC_NUMERIC, "C");
717 row_cnt = (end - start) / step;
719 printf("<?xml version=\"1.0\" encoding=\"%s\"?>\n\n",
721 printf("<%s>\n", ROOT_TAG);
722 printf(" <%s>\n", META_TAG);
723 printf(" <%s>%lu</%s>\n", META_START_TAG,
724 (unsigned long) start + step, META_START_TAG);
725 printf(" <%s>%lu</%s>\n", META_STEP_TAG, step, META_STEP_TAG);
726 printf(" <%s>%lu</%s>\n", META_END_TAG, (unsigned long) end,
728 printf(" <%s>%lu</%s>\n", META_ROWS_TAG, row_cnt,
730 printf(" <%s>%lu</%s>\n", META_COLS_TAG, col_cnt,
732 printf(" <%s>\n", LEGEND_TAG);
733 for (j = 0; j < col_cnt; j++) {
737 printf(" <%s>%s</%s>\n", LEGEND_ENTRY_TAG, entry,
742 printf(" </%s>\n", LEGEND_TAG);
743 printf(" </%s>\n", META_TAG);
744 printf(" <%s>\n", DATA_TAG);
745 for (ti = start + step; ti <= end; ti += step) {
746 printf(" <%s>", DATA_ROW_TAG);
747 printf("<%s>%lu</%s>", COL_TIME_TAG, ti, COL_TIME_TAG);
748 for (j = 0; j < col_cnt; j++) {
749 rrd_value_t newval = DNAN;
753 snprintf(vtag, vtag_s, "%s%lu", COL_DATA_TAG, j);
755 snprintf(vtag, vtag_s, "%s", COL_DATA_TAG);
758 printf("<%s>NaN</%s>", vtag, vtag);
760 printf("<%s>%0.10e</%s>", vtag, newval, vtag);
764 printf("</%s>\n", DATA_ROW_TAG);
767 printf(" </%s>\n", DATA_TAG);
768 printf("</%s>\n", ROOT_TAG);
769 setlocale(LC_NUMERIC, old_locale);
772 } else if (strcmp("graph", argv[1]) == 0) {
775 #ifdef notused /*XXX*/
776 const char *imgfile = argv[2]; /* rrd_graph changes argv pointer */
781 int tostdout = (strcmp(argv[2], "-") == 0);
784 for (i = 2; i < argc; i++) {
785 if (strcmp(argv[i], "--imginfo") == 0
786 || strcmp(argv[i], "-f") == 0) {
792 (argc - 1, &argv[1], &calcpr, &xsize, &ysize, NULL, &ymin,
794 if (!tostdout && !imginfo)
795 printf("%dx%d\n", xsize, ysize);
797 for (i = 0; calcpr[i]; i++) {
799 printf("%s\n", calcpr[i]);
806 } else if (strcmp("graphv", argv[1]) == 0) {
807 rrd_info_t *grinfo = NULL; /* 1 to distinguish it from the NULL that rrd_graph sends in */
809 grinfo = rrd_graph_v(argc - 1, &argv[1]);
811 rrd_info_print(grinfo);
812 rrd_info_free(grinfo);
815 } else if (strcmp("tune", argv[1]) == 0)
816 rrd_tune(argc - 1, &argv[1]);
817 else if (strcmp("flushcached", argv[1]) == 0)
818 rrd_flushcached(argc - 1, &argv[1]);
820 rrd_set_error("unknown function '%s'", argv[1]);
822 if (rrd_test_error()) {
823 fprintf(out, "ERROR: %s\n", rrd_get_error());
837 while (aLine[i] == ' ')
839 while (aLine[i] != 0) {
840 if ((aLine[i] == ' ') && inarg) {
843 if ((aLine[i] != ' ') && !inarg) {
853 * CreateArgs - take a string (aLine) and tokenize
868 /* remove trailing space and newlines */
869 while (len && aLine[len] <= ' ') {
873 /* sikp leading blanks */
874 while (*aLine && *aLine <= ' ')
900 pargv[argc++] = putP;
908 pargv[argc++] = putP;