Index: server/sock.c =================================================================== RCS file: /cvsroot/lcdproc/lcdproc/server/sock.c,v retrieving revision 1.31 diff -u -r1.31 sock.c --- server/sock.c 30 Nov 2008 22:31:20 -0000 1.31 +++ server/sock.c 1 Mar 2009 19:49:19 -0000 @@ -374,13 +374,11 @@ else { /* Data arriving on an already-connected socket. */ int err = 0; - do { - debug(RPT_DEBUG, "%s: reading...", __FUNCTION__); - err = sock_read_from_client(clientSocket); - debug(RPT_DEBUG, "%s: ...done", __FUNCTION__); - if (err < 0) - sock_destroy_socket(); - } while (err > 0); + debug(RPT_DEBUG, "%s: reading...", __FUNCTION__); + err = sock_read_from_client(clientSocket); + debug(RPT_DEBUG, "%s: ...done", __FUNCTION__); + if (err < 0) + sock_destroy_socket(); } } } @@ -396,44 +394,62 @@ sock_read_from_client(ClientSocketMap *clientSocketMap) { char buffer[MAXMSG]; - int nbytes, i; + char pushback[MAXMSG]; + int nbytes, i, j; + int c; debug(RPT_DEBUG, "%s()", __FUNCTION__); errno = 0; nbytes = sock_recv(clientSocketMap->socket, buffer, MAXMSG); - if (nbytes < 0) { - if (errno != EAGAIN) - report(RPT_DEBUG, "%s: Error on socket %d - %s", - __FUNCTION__, clientSocketMap->socket, sock_geterror()); - return 0; - } - else if (nbytes == 0) { /* EOF*/ - return -1; - } - else if (nbytes > (MAXMSG - (MAXMSG / 8))) { /* Very noisy client...*/ - sock_send_error(clientSocketMap->socket, "Too much data received... quiet down!\n"); - return -1; - } - else { /* Data Read */ - buffer[nbytes] = '\0'; - /* Now, replace zeros with linefeeds...*/ - for (i = 0; i < nbytes; i++) - if (buffer[i] == 0) - buffer[i] = '\n'; + i = 0; + while (nbytes > 0) { /* Data Read */ + debug(RPT_INFO, "%s: received %4d bytes", __FUNCTION__, nbytes); + + /* find last \n or \0 */ + for (c = nbytes - 1; + buffer[c] != '\n' && buffer[c] != '\0' && c > 0; c--) + ; + + /* copy message to pushback replacing zeros with linefeeds */ + for (j = 0; j < c; i++, j++) + if (buffer[j] == '\0') + pushback[i] = '\n'; + else + pushback[i] = buffer[j]; + pushback[i] = '\0'; + /* Enqueue a "client message" here...*/ if (clientSocketMap->client) { - client_add_message(clientSocketMap->client, buffer); + client_add_message(clientSocketMap->client, pushback); } else { report(RPT_DEBUG, "%s: Can't find client %d", __FUNCTION__, clientSocketMap->socket); } - report(RPT_DEBUG, "%s: got message from client %d: \"%s\"", - __FUNCTION__, clientSocketMap->socket, buffer); - return nbytes; + /* copy what's left to pushback */ + for (i = 0; j < nbytes; i++, j++) + if (buffer[j] == '\0') + pushback[i] = '\n'; + else + pushback[i] = buffer[j]; + + nbytes = sock_recv(clientSocketMap->socket, buffer, MAXMSG - i); } - return nbytes; + + if (nbytes < 0) { + if (errno == EAGAIN) /* No data is not an error */ + return 0; + + report(RPT_DEBUG, "%s: Error on socket %d - %s", + __FUNCTION__, clientSocketMap->socket, sock_geterror()); + return -1; + } + else if (nbytes == 0) { /* EOF */ + return -1; + } + + return 0; }