11 static int parse_opts(const char *str, char *ow_path, size_t pathlen, double *offset)
14 const char *start_str = str;
15 const char offset_str[] = "offset=";
21 * Skip the onewire path entry. Options begin after the first
28 /* Copy the onewire path without options */
29 strncpy(ow_path, start_str, pathlen);
30 ow_path[str - start_str] = '\0';
32 /* Get the next non-space, which is where the argument begins */
37 if (strncmp(str, offset_str, sizeof(offset_str) - 1))
39 str += sizeof(offset_str) - 1;
41 *offset = strtod(str, &endptr);
49 static int onewire_parser(char *rrd_data, const char **parser_data)
52 const char *server_addr;
55 int max_str = RRD_DATA_MAX_LEN;
58 pr_err("No parser data available\n");
62 server_addr = parser_data[0];
65 pr_err("Server address not specified\n");
69 h = OWNET_init(server_addr);
71 pr_err("Failed to connect to server %s\n", server_addr);
75 while (parser_data[i]) {
76 double offset = 0, data;
80 if (!strcmp("U", parser_data[i])) {
82 ret = snprintf(rrd_data, max_str, "U");
88 parse_opts(parser_data[i], ow_path, sizeof(ow_path), &offset);
90 pr_info("Reading data for entry %s with offset of %.2f\n",
92 ret = OWNET_read(h, ow_path, &tmp);
94 pr_err("Failed to read entry %s\n", parser_data[i]);
98 /* The data from OWNET_read appears to not be NULL terminated */
99 memcpy(buf, tmp, MIN(ret, sizeof(buf) -1));
103 data = strtod(buf, &endptr);
106 pr_err("Failed to parse data %s\n", buf);
112 ret = snprintf(rrd_data, max_str, "%f", data);
121 ret = snprintf(rrd_data, max_str, ":");
131 static struct parser_info onewire_parser_info = {
133 .parse = onewire_parser,
136 static int init_onewire_parser(void)
138 return register_parser(&onewire_parser_info);
141 struct plugin_info plugin_info = {
142 .name = "onewire_parser",
143 .init = init_onewire_parser,
144 .version = RRDD_VERSION,