1 /*****************************************************************************
2 * RRDtool 1.3.0 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\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 /* break up very large strings (help_graph, help_tune) for ISO C89 compliance*/
122 const char *help_graph0 =
123 N_("* graph - generate a graph from one or several RRD\n\n"
124 "\trrdtool graph filename [-s|--start seconds] [-e|--end seconds]\n");
125 const char *help_graphv0 =
126 N_("* graphv - generate a graph from one or several RRD\n"
127 " with meta data printed before the graph\n\n"
128 "\trrdtool graphv filename [-s|--start seconds] [-e|--end seconds]\n");
129 const char *help_graph1 =
130 N_("\t\t[-x|--x-grid x-axis grid and label]\n"
131 "\t\t[-Y|--alt-y-grid]\n"
132 "\t\t[-y|--y-grid y-axis grid and label]\n"
133 "\t\t[-v|--vertical-label string] [-w|--width pixels]\n"
134 "\t\t[-h|--height pixels] [-o|--logarithmic]\n"
135 "\t\t[-u|--upper-limit value] [-z|--lazy]\n"
136 "\t\t[-l|--lower-limit value] [-r|--rigid]\n"
137 "\t\t[-g|--no-legend] [--daemon <address>]\n"
138 "\t\t[-F|--force-rules-legend]\n" "\t\t[-j|--only-graph]\n");
139 const char *help_graph2 =
140 N_("\t\t[-n|--font FONTTAG:size:font]\n"
141 "\t\t[-m|--zoom factor]\n"
142 "\t\t[-A|--alt-autoscale]\n"
143 "\t\t[-M|--alt-autoscale-max]\n"
144 "\t\t[-R|--font-render-mode {normal,light,mono}]\n"
145 "\t\t[-B|--font-smoothing-threshold size]\n"
146 "\t\t[-T|--tabwidth width]\n"
147 "\t\t[-E|--slope-mode]\n"
148 "\t\t[-N|--no-gridfit]\n"
149 "\t\t[-X|--units-exponent value]\n"
150 "\t\t[-L|--units-length value]\n"
151 "\t\t[-S|--step seconds]\n"
152 "\t\t[-f|--imginfo printfstr]\n"
153 "\t\t[-a|--imgformat PNG]\n"
154 "\t\t[-c|--color COLORTAG#rrggbb[aa]] [-t|--title string]\n"
155 "\t\t[-W|--watermark string]\n"
156 "\t\t[DEF:vname=rrd:ds-name:CF]\n");
157 const char *help_graph3 =
158 N_("\t\t[CDEF:vname=rpn-expression]\n"
159 "\t\t[VDEF:vdefname=rpn-expression]\n"
160 "\t\t[PRINT:vdefname:format]\n"
161 "\t\t[GPRINT:vdefname:format]\n" "\t\t[COMMENT:text]\n"
162 "\t\t[SHIFT:vname:offset]\n"
163 "\t\t[TICK:vname#rrggbb[aa][:[fraction][:legend]]]\n"
164 "\t\t[HRULE:value#rrggbb[aa][:legend]]\n"
165 "\t\t[VRULE:value#rrggbb[aa][:legend]]\n"
166 "\t\t[LINE[width]:vname[#rrggbb[aa][:[legend][:STACK]]]]\n"
167 "\t\t[AREA:vname[#rrggbb[aa][:[legend][:STACK]]]]\n"
168 "\t\t[PRINT:vname:CF:format] (deprecated)\n"
169 "\t\t[GPRINT:vname:CF:format] (deprecated)\n"
170 "\t\t[STACK:vname[#rrggbb[aa][:legend]]] (deprecated)\n\n");
171 const char *help_tune1 =
172 N_(" * tune - Modify some basic properties of an RRD\n\n"
173 "\trrdtool tune filename\n"
174 "\t\t[--heartbeat|-h ds-name:heartbeat]\n"
175 "\t\t[--data-source-type|-d ds-name:DST]\n"
176 "\t\t[--data-source-rename|-r old-name:new-name]\n"
177 "\t\t[--minimum|-i ds-name:min] [--maximum|-a ds-name:max]\n"
178 "\t\t[--deltapos scale-value] [--deltaneg scale-value]\n"
179 "\t\t[--failure-threshold integer]\n"
180 "\t\t[--window-length integer]\n"
181 "\t\t[--alpha adaptation-parameter]\n");
182 const char *help_tune2 =
183 N_(" * tune - Modify some basic properties of an RRD\n\n"
184 "\t\t[--beta adaptation-parameter]\n"
185 "\t\t[--gamma adaptation-parameter]\n"
186 "\t\t[--gamma-deviation adaptation-parameter]\n"
187 "\t\t[--aberrant-reset ds-name]\n\n");
188 const char *help_resize =
190 (" * resize - alter the length of one of the RRAs in an RRD\n\n"
191 "\trrdtool resize filename rranum GROW|SHRINK rows\n\n");
192 const char *help_xport =
193 N_("* xport - generate XML dump from one or several RRD\n\n"
194 "\trrdtool xport [-s|--start seconds] [-e|--end seconds]\n"
195 "\t\t[-m|--maxrows rows]\n" "\t\t[--step seconds]\n"
196 "\t\t[--enumds]\n" "\t\t[DEF:vname=rrd:ds-name:CF]\n"
197 "\t\t[CDEF:vname=rpn-expression]\n"
198 "\t\t[XPORT:vname:legend]\n\n");
199 const char *help_quit =
200 N_(" * quit - closing a session in remote mode\n\n"
201 "\trrdtool quit\n\n");
202 const char *help_ls =
203 N_(" * ls - lists all *.rrd files in current directory\n\n"
205 const char *help_cd =
206 N_(" * cd - changes the current directory\n\n"
207 "\trrdtool cd new directory\n\n");
208 const char *help_mkdir =
209 N_(" * mkdir - creates a new directory\n\n"
210 "\trrdtool mkdir newdirectoryname\n\n");
211 const char *help_pwd =
212 N_(" * pwd - returns the current working directory\n\n"
213 "\trrdtool pwd\n\n");
214 const char *help_lic =
215 N_("RRDtool is distributed under the Terms of the GNU General\n"
216 "Public License Version 2. (www.gnu.org/copyleft/gpl.html)\n\n"
217 "For more information read the RRD manpages\n\n");
218 enum { C_NONE, C_CREATE, C_DUMP, C_INFO, C_RESTORE, C_LAST,
219 C_LASTUPDATE, C_FIRST, C_UPDATE, C_FETCH, C_GRAPH, C_GRAPHV,
221 C_RESIZE, C_XPORT, C_QUIT, C_LS, C_CD, C_MKDIR, C_PWD,
224 int help_cmd = C_NONE;
227 if (!strcmp(cmd, "create"))
229 else if (!strcmp(cmd, "dump"))
231 else if (!strcmp(cmd, "info"))
233 else if (!strcmp(cmd, "restore"))
234 help_cmd = C_RESTORE;
235 else if (!strcmp(cmd, "last"))
237 else if (!strcmp(cmd, "lastupdate"))
238 help_cmd = C_LASTUPDATE;
239 else if (!strcmp(cmd, "first"))
241 else if (!strcmp(cmd, "update"))
243 else if (!strcmp(cmd, "updatev"))
244 help_cmd = C_UPDATEV;
245 else if (!strcmp(cmd, "fetch"))
247 else if (!strcmp(cmd, "graph"))
249 else if (!strcmp(cmd, "graphv"))
251 else if (!strcmp(cmd, "tune"))
253 else if (!strcmp(cmd, "resize"))
255 else if (!strcmp(cmd, "xport"))
257 else if (!strcmp(cmd, "quit"))
259 else if (!strcmp(cmd, "ls"))
261 else if (!strcmp(cmd, "cd"))
263 else if (!strcmp(cmd, "mkdir"))
265 else if (!strcmp(cmd, "pwd"))
268 fprintf(stdout, _(help_main), PACKAGE_VERSION, __DATE__, __TIME__);
272 fputs(_(help_list), stdout);
274 fputs(_(help_listremote), stdout);
278 fputs(_(help_create), stdout);
281 fputs(_(help_dump), stdout);
284 fputs(_(help_info), stdout);
287 fputs(_(help_restore), stdout);
290 fputs(_(help_last), stdout);
293 fputs(_(help_lastupdate), stdout);
296 fputs(_(help_first), stdout);
299 fputs(_(help_update), stdout);
302 fputs(_(help_updatev), stdout);
305 fputs(_(help_fetch), stdout);
308 fputs(_(help_graph0), stdout);
309 fputs(_(help_graph1), stdout);
310 fputs(_(help_graph2), stdout);
311 fputs(_(help_graph3), stdout);
314 fputs(_(help_graphv0), stdout);
315 fputs(_(help_graph1), stdout);
316 fputs(_(help_graph2), stdout);
317 fputs(_(help_graph3), stdout);
320 fputs(_(help_tune1), stdout);
321 fputs(_(help_tune2), stdout);
324 fputs(_(help_resize), stdout);
327 fputs(_(help_xport), stdout);
330 fputs(_(help_quit), stdout);
333 fputs(_(help_ls), stdout);
336 fputs(_(help_cd), stdout);
339 fputs(_(help_mkdir), stdout);
342 fputs(_(help_pwd), stdout);
345 fputs(_(help_lic), stdout);
348 static char *fgetslong(
353 size_t bufsize = MAX_LENGTH;
357 return *aLinePtr = 0;
358 if (!(linebuf = malloc(bufsize))) {
359 perror("fgetslong: malloc");
363 while (fgets(linebuf + eolpos, MAX_LENGTH, stream)) {
364 eolpos += strlen(linebuf + eolpos);
365 if (linebuf[eolpos - 1] == '\n')
366 return *aLinePtr = linebuf;
367 bufsize += MAX_LENGTH;
368 if (!(linebuf = realloc(linebuf, bufsize))) {
369 perror("fgetslong: realloc");
373 return *aLinePtr = linebuf[0] ? linebuf : 0;
384 #ifdef MUST_DISABLE_SIGFPE
385 signal(SIGFPE, SIG_IGN);
387 #ifdef MUST_DISABLE_FPMASK
391 setlocale(LC_ALL, "");
394 #if defined(HAVE_LIBINTL_H) && defined(BUILD_LIBINTL)
395 bindtextdomain(GETTEXT_PACKAGE, LOCALEDIR);
396 bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8");
397 textdomain(GETTEXT_PACKAGE);
404 if (((argc == 2) || (argc == 3)) && !strcmp("-", argv[1])) {
406 struct rusage myusage;
407 struct timeval starttime;
408 struct timeval currenttime;
410 gettimeofday(&starttime, NULL);
413 if ((argc == 3) && strcmp("", argv[2])) {
427 "ERROR: can't change root to '%s' errno=%d\n",
435 "ERROR: change root is not supported by your OS "
436 "or at least by this copy of rrdtool\n");
443 if (strcmp(firstdir, "")) {
446 fprintf(stderr, "ERROR: %s\n", rrd_strerror(errno));
451 while (fgetslong(&aLine, stdin)) {
452 if ((argc = CountArgs(aLine)) == 0) {
453 printf("ERROR: not enough arguments\n");
455 if ((myargv = (char **) malloc((argc + 1) *
456 sizeof(char *))) == NULL) {
460 if ((argc = CreateArgs(argv[0], aLine, argc, myargv)) < 0) {
461 printf("ERROR: creating arguments\n");
463 int ret = HandleInputLine(argc, myargv, stdout);
468 getrusage(RUSAGE_SELF, &myusage);
469 gettimeofday(¤ttime, NULL);
470 printf("OK u:%1.2f s:%1.2f r:%1.2f\n",
471 (double) myusage.ru_utime.tv_sec +
472 (double) myusage.ru_utime.tv_usec / 1000000.0,
473 (double) myusage.ru_stime.tv_sec +
474 (double) myusage.ru_stime.tv_usec / 1000000.0,
475 (double) (currenttime.tv_sec - starttime.tv_sec)
476 + (double) (currenttime.tv_usec -
484 fflush(stdout); /* this is important for pipes to work */
487 } else if (argc == 2) {
490 } else if (argc == 3 && !strcmp(argv[1], "help")) {
494 exit(HandleInputLine(argc, argv, stderr));
499 /* HandleInputLine is NOT thread safe - due to readdir issues,
500 resolving them portably is not really simple. */
506 #if defined(HAVE_OPENDIR) && defined (HAVE_READDIR)
507 DIR *curdir; /* to read current dir with ls */
510 #if defined(HAVE_SYS_STAT_H)
513 char *cwd; /* To hold current working dir on call to pwd */
515 /* Reset errno to 0 before we start.
519 if (argc > 1 && strcmp("quit", argv[1]) == 0) {
521 printf("ERROR: invalid parameter count for quit\n");
526 #if defined(HAVE_OPENDIR) && defined(HAVE_READDIR) && defined(HAVE_CHDIR)
527 if (argc > 1 && strcmp("cd", argv[1]) == 0) {
529 printf("ERROR: invalid parameter count for cd\n");
532 #if ! defined(HAVE_CHROOT) || ! defined(HAVE_GETUID)
533 if (getuid() == 0 && !ChangeRoot) {
535 ("ERROR: chdir security problem - rrdtool is running as "
536 "root but not chroot!\n");
542 printf("ERROR: %s\n", rrd_strerror(errno));
547 if (argc > 1 && strcmp("pwd", argv[1]) == 0) {
549 printf("ERROR: invalid parameter count for pwd\n");
552 cwd = getcwd(NULL, MAXPATH);
554 printf("ERROR: %s\n", rrd_strerror(errno));
561 if (argc > 1 && strcmp("mkdir", argv[1]) == 0) {
563 printf("ERROR: invalid parameter count for mkdir\n");
566 #if ! defined(HAVE_CHROOT) || ! defined(HAVE_GETUID)
567 if (getuid() == 0 && !ChangeRoot) {
569 ("ERROR: mkdir security problem - rrdtool is running as "
570 "root but not chroot!\n");
574 mkdir(argv[2], 0777);
576 printf("ERROR: %s\n", rrd_strerror(errno));
581 if (argc > 1 && strcmp("ls", argv[1]) == 0) {
583 printf("ERROR: invalid parameter count for ls\n");
586 if ((curdir = opendir(".")) != NULL) {
587 while ((dent = readdir(curdir)) != NULL) {
588 if (!stat(dent->d_name, &st)) {
589 if (S_ISDIR(st.st_mode)) {
590 printf("d %s\n", dent->d_name);
592 if (strlen(dent->d_name) > 4 && S_ISREG(st.st_mode)) {
594 (dent->d_name + NAMLEN(dent) - 4, ".rrd")
595 || !strcmp(dent->d_name + NAMLEN(dent) - 4,
597 printf("- %s\n", dent->d_name);
604 printf("ERROR: %s\n", rrd_strerror(errno));
609 #endif /* opendir and readdir */
613 || strcmp("help", argv[1]) == 0
614 || strcmp("--help", argv[1]) == 0
615 || strcmp("-help", argv[1]) == 0
616 || strcmp("-?", argv[1]) == 0 || strcmp("-h", argv[1]) == 0) {
621 if (strcmp("create", argv[1]) == 0)
622 rrd_create(argc - 1, &argv[1]);
623 else if (strcmp("dump", argv[1]) == 0)
624 rrd_dump(argc - 1, &argv[1]);
625 else if (strcmp("info", argv[1]) == 0 || strcmp("updatev", argv[1]) == 0) {
628 if (strcmp("info", argv[1]) == 0)
630 data = rrd_info(argc - 1, &argv[1]);
632 data = rrd_update_v(argc - 1, &argv[1]);
633 rrd_info_print(data);
637 else if (strcmp("--version", argv[1]) == 0 ||
638 strcmp("version", argv[1]) == 0 ||
639 strcmp("v", argv[1]) == 0 ||
640 strcmp("-v", argv[1]) == 0 || strcmp("-version", argv[1]) == 0)
641 printf("RRDtool " PACKAGE_VERSION
642 " Copyright by Tobi Oetiker, 1997-2008 (%f)\n",
644 else if (strcmp("restore", argv[1]) == 0)
645 rrd_restore(argc - 1, &argv[1]);
646 else if (strcmp("resize", argv[1]) == 0)
647 rrd_resize(argc - 1, &argv[1]);
648 else if (strcmp("last", argv[1]) == 0)
649 printf("%ld\n", rrd_last(argc - 1, &argv[1]));
650 else if (strcmp("lastupdate", argv[1]) == 0) {
654 unsigned long ds_cnt, i;
656 if (rrd_lastupdate(argc - 1, &argv[1], &last_update,
657 &ds_cnt, &ds_namv, &last_ds) == 0) {
658 for (i = 0; i < ds_cnt; i++)
659 printf(" %s", ds_namv[i]);
661 printf("%10lu:", last_update);
662 for (i = 0; i < ds_cnt; i++) {
663 printf(" %s", last_ds[i]);
671 } else if (strcmp("first", argv[1]) == 0)
672 printf("%ld\n", rrd_first(argc - 1, &argv[1]));
673 else if (strcmp("update", argv[1]) == 0)
674 rrd_update(argc - 1, &argv[1]);
675 else if (strcmp("fetch", argv[1]) == 0) {
676 time_t start, end, ti;
677 unsigned long step, ds_cnt, i, ii;
678 rrd_value_t *data, *datai;
682 (argc - 1, &argv[1], &start, &end, &step, &ds_cnt, &ds_namv,
686 for (i = 0; i < ds_cnt; i++)
687 printf("%20s", ds_namv[i]);
689 for (ti = start + step; ti <= end; ti += step) {
690 printf("%10lu:", ti);
691 for (ii = 0; ii < ds_cnt; ii++)
692 printf(" %0.10e", *(datai++));
695 for (i = 0; i < ds_cnt; i++)
700 } else if (strcmp("xport", argv[1]) == 0) {
702 unsigned long int j = 0;
703 time_t start, end, ti;
704 unsigned long step, col_cnt, row_cnt;
705 rrd_value_t *data, *ptr;
709 size_t vtag_s = strlen(COL_DATA_TAG) + 10;
710 char *vtag = malloc(vtag_s);
712 for (i = 2; i < argc; i++) {
713 if (strcmp("--enumds", argv[i]) == 0)
718 (argc - 1, &argv[1], &xxsize, &start, &end, &step, &col_cnt,
719 &legend_v, &data) != -1) {
720 row_cnt = (end - start) / step;
722 printf("<?xml version=\"1.0\" encoding=\"%s\"?>\n\n",
724 printf("<%s>\n", ROOT_TAG);
725 printf(" <%s>\n", META_TAG);
726 printf(" <%s>%lu</%s>\n", META_START_TAG,
727 (unsigned long) start + step, META_START_TAG);
728 printf(" <%s>%lu</%s>\n", META_STEP_TAG, step, META_STEP_TAG);
729 printf(" <%s>%lu</%s>\n", META_END_TAG, (unsigned long) end,
731 printf(" <%s>%lu</%s>\n", META_ROWS_TAG, row_cnt,
733 printf(" <%s>%lu</%s>\n", META_COLS_TAG, col_cnt,
735 printf(" <%s>\n", LEGEND_TAG);
736 for (j = 0; j < col_cnt; j++) {
740 printf(" <%s>%s</%s>\n", LEGEND_ENTRY_TAG, entry,
745 printf(" </%s>\n", LEGEND_TAG);
746 printf(" </%s>\n", META_TAG);
747 printf(" <%s>\n", DATA_TAG);
748 for (ti = start + step; ti <= end; ti += step) {
749 printf(" <%s>", DATA_ROW_TAG);
750 printf("<%s>%lu</%s>", COL_TIME_TAG, ti, COL_TIME_TAG);
751 for (j = 0; j < col_cnt; j++) {
752 rrd_value_t newval = DNAN;
756 snprintf(vtag, vtag_s, "%s%lu", COL_DATA_TAG, j);
758 snprintf(vtag, vtag_s, "%s", COL_DATA_TAG);
761 printf("<%s>NaN</%s>", vtag, vtag);
763 printf("<%s>%0.10e</%s>", vtag, newval, vtag);
767 printf("</%s>\n", DATA_ROW_TAG);
770 printf(" </%s>\n", DATA_TAG);
771 printf("</%s>\n", ROOT_TAG);
774 } else if (strcmp("graph", argv[1]) == 0) {
777 #ifdef notused /*XXX*/
778 const char *imgfile = argv[2]; /* rrd_graph changes argv pointer */
783 int tostdout = (strcmp(argv[2], "-") == 0);
786 for (i = 2; i < argc; i++) {
787 if (strcmp(argv[i], "--imginfo") == 0
788 || strcmp(argv[i], "-f") == 0) {
794 (argc - 1, &argv[1], &calcpr, &xsize, &ysize, NULL, &ymin,
796 if (!tostdout && !imginfo)
797 printf("%dx%d\n", xsize, ysize);
799 for (i = 0; calcpr[i]; i++) {
801 printf("%s\n", calcpr[i]);
808 } else if (strcmp("graphv", argv[1]) == 0) {
809 rrd_info_t *grinfo = NULL; /* 1 to distinguish it from the NULL that rrd_graph sends in */
811 grinfo = rrd_graph_v(argc - 1, &argv[1]);
813 rrd_info_print(grinfo);
814 rrd_info_free(grinfo);
817 } else if (strcmp("tune", argv[1]) == 0)
818 rrd_tune(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;