]> git.itanic.dy.fi Git - rrdd/blob - onewire_parser.c
Add onewire parser
[rrdd] / onewire_parser.c
1 #include <ownetapi.h>
2
3 #include "parser.h"
4 #include "debug.h"
5 #include "string.h"
6
7 int onewire_parser(char *rrd_data, const char **parser_data)
8 {
9         OWNET_HANDLE h;
10         const char *server_addr;
11         char buf[24], *tmp;
12         int i = 1, ret;
13         int max_str = RRD_DATA_MAX_LEN;
14
15         if (!parser_data) {
16                 pr_err("No parser data available\n");
17                 return -1;
18         }
19
20         server_addr = parser_data[0];
21
22         if (!server_addr) {
23                 pr_err("Server address not specified\n");
24                 return -1;
25         }
26
27         h = OWNET_init(server_addr);
28         if (h < 0) {
29                 pr_err("Failed to connect to server %s\n", server_addr);
30                 return -1;
31         }
32
33         while (parser_data[i]) {
34                 if (!strcmp("U", parser_data[i])) {
35 undefined:
36                         ret = snprintf(rrd_data, max_str, "U");
37                         max_str -= ret;
38                         rrd_data += ret;
39                         goto next;
40                 }
41
42                 pr_info("Reading data for entry %s\n", parser_data[i]);
43                 ret = OWNET_read(h, parser_data[i], &tmp);
44                 if (ret < 0) {
45                         pr_err("Failed to read entry %s\n", parser_data[i]);
46                         goto undefined;
47                 }
48
49                 /* The data from OWNET_read appears to not be NULL terminated */
50                 memcpy(buf, tmp, MIN(ret, sizeof(buf) -1));
51                 free(tmp);
52                 buf[ret] = 0;
53
54                 ret = snprintf(rrd_data, max_str, "%s", buf);
55                 max_str -= ret;
56                 rrd_data += ret;
57
58 next:
59                 i++;
60                 if (!parser_data[i])
61                         break;
62
63                 ret = snprintf(rrd_data, max_str, ":");
64                 max_str -= ret;
65                 rrd_data += ret;
66         }
67         rrd_data = 0;
68
69         OWNET_finish();
70         return 0;
71 }