+ if (str == NULL)
+ return (-1);
+
+ len = strlen (str);
+ removed = 0;
+ while ((len > 0) && ((str[len - 1] == '\n') || (str[len - 1] == '\r')))
+ {
+ str[len - 1] = 0;
+ len--;
+ removed++;
+ }
+
+ return (removed);
+} /* }}} int chomp */
+
+static void response_free (rrdc_response_t *res) /* {{{ */
+{
+ if (res == NULL)
+ return;
+
+ if (res->lines != NULL)
+ {
+ size_t i;
+
+ for (i = 0; i < res->lines_num; i++)
+ if (res->lines[i] != NULL)
+ free (res->lines[i]);
+ free (res->lines);
+ }
+
+ free (res);
+} /* }}} void response_free */
+
+static int response_read (rrdc_response_t **ret_response) /* {{{ */
+{
+ rrdc_response_t *ret;
+
+ char buffer[4096];
+ char *buffer_ptr;
+
+ size_t i;
+
+ if (sh == NULL)
+ return (-1);
+
+ ret = (rrdc_response_t *) malloc (sizeof (rrdc_response_t));
+ if (ret == NULL)
+ return (-2);
+ memset (ret, 0, sizeof (*ret));
+ ret->lines = NULL;
+ ret->lines_num = 0;
+
+ buffer_ptr = fgets (buffer, sizeof (buffer), sh);
+ if (buffer_ptr == NULL)
+ return (-3);
+ chomp (buffer);
+
+ ret->status = strtol (buffer, &ret->message, 0);
+ if (buffer == ret->message)
+ {
+ response_free (ret);
+ return (-4);
+ }
+ /* Skip leading whitespace of the status message */
+ ret->message += strspn (ret->message, " \t");
+
+ if (ret->status <= 0)
+ {
+ if (ret->status < 0)
+ rrd_set_error("rrdcached: %s", ret->message);
+ *ret_response = ret;
+ return (0);
+ }
+
+ ret->lines = (char **) malloc (sizeof (char *) * ret->status);
+ if (ret->lines == NULL)
+ {
+ response_free (ret);
+ return (-5);
+ }
+ memset (ret->lines, 0, sizeof (char *) * ret->status);
+ ret->lines_num = (size_t) ret->status;
+
+ for (i = 0; i < ret->lines_num; i++)
+ {
+ buffer_ptr = fgets (buffer, sizeof (buffer), sh);
+ if (buffer_ptr == NULL)
+ {
+ response_free (ret);
+ return (-6);
+ }
+ chomp (buffer);
+
+ ret->lines[i] = strdup (buffer);
+ if (ret->lines[i] == NULL)
+ {
+ response_free (ret);
+ return (-7);
+ }
+ }
+
+ *ret_response = ret;
+ return (0);
+} /* }}} rrdc_response_t *response_read */
+
+static int request (const char *buffer, size_t buffer_size, /* {{{ */
+ rrdc_response_t **ret_response)
+{
+ int status;
+ rrdc_response_t *res;