]> git.itanic.dy.fi Git - rrdd/blob - rrdtool.c
rrdtool: Replace repeating strings with a definition
[rrdd] / rrdtool.c
1 #include <time.h>
2
3 #include "rrdtool.h"
4 #include "process.h"
5
6 #define MAX_ARGS        512
7 #define ARGSTR_LEN      32768
8
9 #define RRDTOOL_CMD "/usr/bin/rrdtool"
10
11 #define print(fmt, arg...) \
12         args[argcnt] = argstr + idx;                    \
13         idx += sprintf(argstr + idx, fmt, ##arg);       \
14         argcnt++;                                       \
15         argstr[++idx] = 0
16
17 int rrdtool_draw_image(struct rrd_image *image)
18 {
19         char cmd[] = RRDTOOL_CMD;
20 //      char cmd[] = "echo";
21         char *args[512], argstr[ARGSTR_LEN];
22         int idx = 0, argcnt = 0, i,j;
23         char timestamp[256];
24         char tmp[256];
25         time_t t = time(0);
26
27         strftime(tmp, 256, "%d.%m.%Y %T (%Z) ", localtime(&t));
28         for (i = 0, j = 0; j < 256;) {
29                 if (tmp[i] == ':') {
30                         timestamp[j++] = '\\';
31                 }
32                 timestamp[j++] = tmp[i++];
33                 if (!tmp[i])
34                         break;
35         }
36         timestamp[j] = 0;
37
38
39         print(" ");
40         print("graph");
41         print("%s", image->image_filename);
42
43         print("--start");
44         print("%s", image->timestart);
45         print("--end");
46         print("%s", image->timeend);
47         print("--width");
48         print("%d", image->width);
49         print("--height");
50         print("%d", image->height);
51         print("--imgformat");
52         print("%s", image->imageformat);
53
54         for (i = 0; image->options[i]; i++) {
55                 print("%s", image->options[i]);
56         }
57
58         for (i = 0; image->text[i]; i++) {
59                 args[argcnt++] = image->text[i];
60         }
61
62         print("COMMENT:Last update %s\\c", timestamp);
63
64         args[argcnt] = 0;
65
66         run(cmd, args);
67
68         return 0;
69 }
70
71 int rrdtool_draw_images(struct rrd_image **image)
72 {
73         int i;
74         for (i = 0; image[i]; i++)
75                 rrdtool_draw_image(image[i]);
76
77         return 0;
78 }
79
80 int rrdtool_update_data(struct rrd_database *rrd)
81 {
82         char data[1024];
83         char cmd[] = RRDTOOL_CMD;
84 //      char cmd[] = "echo";
85         char *cmdline[] = {
86                 "",
87                 "update",
88                 rrd->filename,
89                 data,
90                 0
91         };
92         int l;
93
94         rrd->last_update = time(0);
95         if (do_fork())
96                 return 0;
97
98         l = sprintf(data, "N:");
99
100         if (rrd->parse) {
101                 rrd->parse(data + l);
102                 run(cmd, cmdline);
103         }
104
105         if (rrd->images)
106                 rrdtool_draw_images(rrd->images);
107
108         while (harvest_zombies(0));
109         exit(0);
110 }