10 static int parse_opts(const char *str, char *ow_path, size_t pathlen, double *offset)
13 const char *start_str = str;
14 const char offset_str[] = "offset=";
20 * Skip the onewire path entry. Options begin after the first
27 /* Copy the onewire path without options */
28 strncpy(ow_path, start_str, pathlen);
29 ow_path[str - start_str] = '\0';
31 /* Get the next non-space, which is where the argument begins */
36 if (strncmp(str, offset_str, sizeof(offset_str) - 1))
38 str += sizeof(offset_str) - 1;
40 *offset = strtod(str, &endptr);
48 static int onewire_parser(char *rrd_data, const char **parser_data)
51 const char *server_addr;
54 int max_str = RRD_DATA_MAX_LEN;
57 pr_err("No parser data available\n");
61 server_addr = parser_data[0];
64 pr_err("Server address not specified\n");
68 h = OWNET_init(server_addr);
70 pr_err("Failed to connect to server %s\n", server_addr);
74 while (parser_data[i]) {
75 double offset = 0, data;
79 if (!strcmp("U", parser_data[i])) {
81 ret = snprintf(rrd_data, max_str, "U");
87 parse_opts(parser_data[i], ow_path, sizeof(ow_path), &offset);
89 pr_info("Reading data for entry %s with offset of %.2f\n",
91 ret = OWNET_read(h, ow_path, &tmp);
93 pr_err("Failed to read entry %s\n", parser_data[i]);
97 /* The data from OWNET_read appears to not be NULL terminated */
98 memcpy(buf, tmp, MIN(ret, sizeof(buf) -1));
102 data = strtod(buf, &endptr);
105 pr_err("Failed to parse data %s\n", buf);
111 ret = snprintf(rrd_data, max_str, "%f", data);
120 ret = snprintf(rrd_data, max_str, ":");
130 static struct parser_info onewire_parser_info = {
132 .parse = onewire_parser,
135 static int init_onewire_parser(void)
137 return register_parser(&onewire_parser_info);
140 struct plugin_info plugin_info = {
141 .name = "onewire_parser",
142 .init = init_onewire_parser,