X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Frrd_client.c;h=e3790f6b24e2ab8177337cd00a998f16fd5708e2;hb=f6728e9f118acf468a33972792e3a851785bcb8a;hp=043a144ad455ab841d21bc9bcea4d0d325828a95;hpb=e5b05bec82bbff5db8add4e58dd6f0fcf2670291;p=rrdtool.git diff --git a/src/rrd_client.c b/src/rrd_client.c index 043a144..e3790f6 100644 --- a/src/rrd_client.c +++ b/src/rrd_client.c @@ -304,7 +304,7 @@ static int buffer_add_string (const char *str, /* {{{ */ static int buffer_add_value (const char *value, /* {{{ */ char **buffer_ret, size_t *buffer_size_ret) { - char temp[4096]; + char temp[RRD_CMD_MAX]; if (strncmp (value, "N:", 2) == 0) snprintf (temp, sizeof (temp), "%lu:%s", @@ -319,7 +319,7 @@ static int buffer_add_value (const char *value, /* {{{ */ static int buffer_add_ulong (const unsigned long value, /* {{{ */ char **buffer_ret, size_t *buffer_size_ret) { - char temp[4096]; + char temp[RRD_CMD_MAX]; snprintf (temp, sizeof (temp), "%lu", value); temp[sizeof (temp) - 1] = 0; @@ -369,37 +369,36 @@ static void response_free (rrdc_response_t *res) /* {{{ */ static int response_read (rrdc_response_t **ret_response) /* {{{ */ { - rrdc_response_t *ret; + rrdc_response_t *ret = NULL; + int status = 0; - char buffer[4096]; + char buffer[RRD_CMD_MAX]; char *buffer_ptr; size_t i; +#define DIE(code) do { status = code; goto err_out; } while(0) + if (sh == NULL) - return (-1); + DIE(-1); ret = (rrdc_response_t *) malloc (sizeof (rrdc_response_t)); if (ret == NULL) - return (-2); + DIE(-2); memset (ret, 0, sizeof (*ret)); ret->lines = NULL; ret->lines_num = 0; buffer_ptr = fgets (buffer, sizeof (buffer), sh); - if (buffer_ptr == NULL) { - close_connection(); - return (-3); - } + if (buffer_ptr == NULL) + DIE(-3); + chomp (buffer); ret->status = strtol (buffer, &ret->message, 0); if (buffer == ret->message) - { - response_free (ret); - close_connection(); - return (-4); - } + DIE(-4); + /* Skip leading whitespace of the status message */ ret->message += strspn (ret->message, " \t"); @@ -407,17 +406,13 @@ static int response_read (rrdc_response_t **ret_response) /* {{{ */ { if (ret->status < 0) rrd_set_error("rrdcached: %s", ret->message); - *ret_response = ret; - return (0); + goto out; } ret->lines = (char **) malloc (sizeof (char *) * ret->status); if (ret->lines == NULL) - { - response_free (ret); - close_connection(); - return (-5); - } + DIE(-5); + memset (ret->lines, 0, sizeof (char *) * ret->status); ret->lines_num = (size_t) ret->status; @@ -425,24 +420,27 @@ static int response_read (rrdc_response_t **ret_response) /* {{{ */ { buffer_ptr = fgets (buffer, sizeof (buffer), sh); if (buffer_ptr == NULL) - { - response_free (ret); - close_connection(); - return (-6); - } + DIE(-6); + chomp (buffer); ret->lines[i] = strdup (buffer); if (ret->lines[i] == NULL) - { - response_free (ret); - close_connection(); - return (-7); - } + DIE(-7); } +out: *ret_response = ret; - return (0); + fflush(sh); + return (status); + +err_out: + response_free(ret); + close_connection(); + return (status); + +#undef DIE + } /* }}} rrdc_response_t *response_read */ static int request (const char *buffer, size_t buffer_size, /* {{{ */ @@ -487,13 +485,14 @@ int rrdc_is_connected(const char *daemon_addr) /* {{{ */ return 0; else if (daemon_addr == NULL) { + char *addr = getenv(ENV_RRDCACHED_ADDRESS); /* 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) + if (addr != NULL && ! strcmp(addr,"")) return 1; else return 0; @@ -645,6 +644,8 @@ static int rrdc_connect_network (const char *addr_orig) /* {{{ */ break; } /* for (ai_ptr) */ + freeaddrinfo(ai_res); + return (status); } /* }}} int rrdc_connect_network */ @@ -655,7 +656,8 @@ int rrdc_connect (const char *addr) /* {{{ */ if (addr == NULL) addr = getenv (ENV_RRDCACHED_ADDRESS); - if (addr == NULL) + if (addr == NULL || ! strcmp(addr,"")) + addr = NULL; return 0; pthread_mutex_lock(&lock); @@ -713,7 +715,7 @@ int rrdc_disconnect (void) /* {{{ */ int rrdc_update (const char *filename, int values_num, /* {{{ */ const char * const *values) { - char buffer[4096]; + char buffer[RRD_CMD_MAX]; char *buffer_ptr; size_t buffer_free; size_t buffer_size; @@ -775,7 +777,7 @@ int rrdc_update (const char *filename, int values_num, /* {{{ */ int rrdc_flush (const char *filename) /* {{{ */ { - char buffer[4096]; + char buffer[RRD_CMD_MAX]; char *buffer_ptr; size_t buffer_free; size_t buffer_size; @@ -829,7 +831,7 @@ int rrdc_flush (const char *filename) /* {{{ */ rrd_info_t * rrdc_info (const char *filename) /* {{{ */ { - char buffer[4096]; + char buffer[RRD_CMD_MAX]; char *buffer_ptr; size_t buffer_free; size_t buffer_size; @@ -930,7 +932,7 @@ rrd_info_t * rrdc_info (const char *filename) /* {{{ */ time_t rrdc_last (const char *filename) /* {{{ */ { - char buffer[4096]; + char buffer[RRD_CMD_MAX]; char *buffer_ptr; size_t buffer_free; size_t buffer_size; @@ -991,7 +993,7 @@ time_t rrdc_last (const char *filename) /* {{{ */ time_t rrdc_first (const char *filename, int rraindex) /* {{{ */ { - char buffer[4096]; + char buffer[RRD_CMD_MAX]; char *buffer_ptr; size_t buffer_free; size_t buffer_size; @@ -1064,7 +1066,7 @@ int rrdc_create (const char *filename, /* {{{ */ int argc, const char **argv) { - char buffer[4096]; + char buffer[RRD_CMD_MAX]; char *buffer_ptr; size_t buffer_free; size_t buffer_size; @@ -1149,7 +1151,7 @@ int rrdc_fetch (const char *filename, /* {{{ */ char ***ret_ds_names, rrd_value_t **ret_data) { - char buffer[4096]; + char buffer[RRD_CMD_MAX]; char *buffer_ptr; size_t buffer_free; size_t buffer_size;