static unsigned int __recv (SOCKET *self) { /* Initialize */ BUFFER *ff = NULL; int rcvd = 0; int rd = 0; socket_t *sock = self->data; char msg[(const int)sock->bufsz]; unsigned int ws = sock->bufsz - 1; #if 1 #define CC "child" #define SS "server" #define CL "client" char c = sock->_class; fprintf(stderr, "tcp socket buffer: %p (%s)\n", \ ff, (c=='c') ? CL : (c=='d') ? CC : SS); #endif /* Create a new fresh buffer (clean this up...) */ if (!(ff = NEW(buffer)(binary, 0))) return errstat(0, "Failed to create buffer for socket data."); #if 1 fprintf(stderr, "Current size: %d\n", ff->size(ff)); fprintf(stderr, "tcp socket buffer is now: %p (%s)\n", \ ff, (c=='c') ? CL : (c=='d') ? CC : SS); #endif sock->buffer = ff; /* Use a buffer and connection here */ switch (sock->connection_type) { case SOCK_STREAM: /* If it's -1, die. If it's less than buffer, die */ while (1) { rcvd = recv(sock->fd, &msg, ws, 0); rd += rcvd; vvprintf("rcvd %d bytes so far\n", rd); #if 0 int c = 0; for (c=0;c<(ws > rcvd ? rcvd : ws); c++) fprintf(stderr, "'%c' ", msg[c]); #endif /* Error occurred, free or reset the buffer and die */ if (rcvd == -1) return errsys("recv() error occurred"); /* End of message reached before end of buffer */ else if (rcvd < ws) { ff->append(ff, msg, rcvd); vvprintf("Finally rcvd %d bytes.", rd); vvprintf("Current buffer size: %d\n", ff->contents(ff)->size); return SUCCESS; } /* Write the entire buffer otherwise */ ff->append(ff, msg, ws); } #if 0 case SOCK_DGRAM: rcvd = recvfrom(sock->fd, msg, ws, 0, NULL, NULL); //sock->cliaddr, &sock->cliaddrlen); if (rcvd == -1) return 0; msg[rcvd] = 0; fprintf(stderr, "udp recv'd bytes: %d\n", rcvd); fprintf(stderr, "%s\n", msg); while (1) { rcvd = recvfrom(sock->fd, msg, ws, 0, NULL, NULL); fprintf(stderr, "udp recv'd bytes: %d\n", rcvd); fprintf(stderr, "%s\n", msg); if (rcvd == -1) return 0; // return false and sock->error = errno; if (rcvd < ws) break; } return 1; #endif default: fprintf(stderr, "%s\n", "Got unknown socket option."); return 0; } return SUCCESS; }