+ 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;
+
+ if (sh == NULL)
+ return (ENOTCONN);
+
+ status = (int) fwrite (buffer, buffer_size, /* nmemb = */ 1, sh);
+ if (status != 1)
+ {
+ close_connection ();
+ rrd_set_error("request: socket error (%d) while talking to rrdcached",
+ status);
+ return (-1);
+ }
+ fflush (sh);
+
+ res = NULL;
+ status = response_read (&res);
+
+ if (status != 0)
+ {
+ if (status < 0)
+ rrd_set_error("request: internal error while talking to rrdcached");
+ return (status);
+ }
+
+ *ret_response = res;
+ return (0);
+} /* }}} int request */
+
+/* determine whether we are connected to the specified daemon_addr if
+ * NULL, return whether we are connected at all
+ */
+int rrdc_is_connected(const char *daemon_addr) /* {{{ */
+{
+ if (sd < 0)
+ return 0;
+ else if (daemon_addr == NULL)
+ {
+ /* here we have to handle the case i.e.
+ * UPDATE --daemon ...; UPDATEV (no --daemon) ...
+ * In other words: we have a cached connection,
+ * but it is not specified in the current command.
+ * Daemon is only implied in this case if set in ENV
+ */
+ if (getenv(ENV_RRDCACHED_ADDRESS) != NULL)
+ return 1;
+ else
+ return 0;
+ }
+ else if (strcmp(daemon_addr, sd_path) == 0)
+ return 1;
+ else
+ return 0;
+
+} /* }}} int rrdc_is_connected */
+
+static int rrdc_connect_unix (const char *path) /* {{{ */
+{
+ struct sockaddr_un sa;
+ int status;
+
+ assert (path != NULL);
+ assert (sd == -1);
+