X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Femail.c;h=6a0c0a45718e7b167a5e179f028b40a6eb1cce06;hb=e9ab5139a3bf01f70fe0a0f01d85d027a551efb3;hp=c2eab2133f19031234eac618cf7af974f396e1c7;hpb=d6491cfcf52a74498e1becd7ef94fc8e0a5938b9;p=collectd.git diff --git a/src/email.c b/src/email.c index c2eab213..6a0c0a45 100644 --- a/src/email.c +++ b/src/email.c @@ -256,8 +256,6 @@ static void *collect (void *arg) collector_t *this = (collector_t *)arg; while (1) { - int loop = 1; - conn_t *connection; pthread_mutex_lock (&conns_mutex); @@ -282,15 +280,13 @@ static void *collect (void *arg) log_debug ("collect: handling connection on fd #%i", fileno (this->socket)); - while (loop) { + while (42) { /* 256 bytes ought to be enough for anybody ;-) */ char line[256 + 1]; /* line + '\0' */ int len = 0; errno = 0; if (NULL == fgets (line, sizeof (line), this->socket)) { - loop = 0; - if (0 != errno) { char errbuf[1024]; log_err ("collect: reading from socket (fd #%i) " @@ -310,8 +306,11 @@ static void *collect (void *arg) break; continue; } + if (len < 3) { /* [a-z] ':' '\n' */ + continue; + } - line[len - 1] = '\0'; + line[len - 1] = 0; log_debug ("collect: line = '%s'", line); @@ -334,12 +333,12 @@ static void *collect (void *arg) bytes = atoi (tmp); pthread_mutex_lock (&count_mutex); - type_list_incr (&list_count, type, 1); + type_list_incr (&list_count, type, /* increment = */ 1); pthread_mutex_unlock (&count_mutex); if (bytes > 0) { pthread_mutex_lock (&size_mutex); - type_list_incr (&list_size, type, bytes); + type_list_incr (&list_size, type, /* increment = */ bytes); pthread_mutex_unlock (&size_mutex); } } @@ -351,19 +350,22 @@ static void *collect (void *arg) pthread_mutex_unlock (&score_mutex); } else if ('c' == line[0]) { /* c:[,,...] */ - char *ptr = NULL; - char *type = strtok_r (line + 2, ",", &ptr); - - do { - pthread_mutex_lock (&check_mutex); - type_list_incr (&list_check, type, 1); - pthread_mutex_unlock (&check_mutex); - } while (NULL != (type = strtok_r (NULL, ",", &ptr))); + char *dummy = line + 2; + char *endptr = NULL; + char *type; + + pthread_mutex_lock (&check_mutex); + while ((type = strtok_r (dummy, ",", &endptr)) != NULL) + { + dummy = NULL; + type_list_incr (&list_check, type, /* increment = */ 1); + } + pthread_mutex_unlock (&check_mutex); } else { log_err ("collect: unknown type '%c'", line[0]); } - } /* while (loop) */ + } /* while (42) */ log_debug ("Shutting down connection on fd #%i", fileno (this->socket)); @@ -514,28 +516,42 @@ static void *open_connection (void __attribute__((unused)) *arg) pthread_mutex_unlock (&available_mutex); - do { + while (42) { errno = 0; - if (-1 == (remote = accept (connector_socket, NULL, NULL))) { - if (EINTR != errno) { - char errbuf[1024]; - disabled = 1; - close (connector_socket); - connector_socket = -1; - log_err ("accept() failed: %s", - sstrerror (errno, errbuf, sizeof (errbuf))); - pthread_exit ((void *)1); - } + + remote = accept (connector_socket, NULL, NULL); + if (remote == -1) { + char errbuf[1024]; + + if (errno == EINTR) + continue; + + disabled = 1; + close (connector_socket); + connector_socket = -1; + log_err ("accept() failed: %s", + sstrerror (errno, errbuf, sizeof (errbuf))); + pthread_exit ((void *)1); } - } while (EINTR == errno); - connection = (conn_t *)smalloc (sizeof (conn_t)); + /* access() succeeded. */ + break; + } + + connection = malloc (sizeof (*connection)); + if (connection == NULL) + { + close (remote); + continue; + } + memset (connection, 0, sizeof (*connection)); connection->socket = fdopen (remote, "r"); connection->next = NULL; if (NULL == connection->socket) { close (remote); + sfree (connection); continue; }