Jon Brassow noted that this wasn't necessary. He's right; it isn't anymore. ;) -- Lon Index: lib/Makefile =================================================================== RCS file: /cvs/cluster/cluster/magma/lib/Makefile,v retrieving revision 1.2 diff -u -r1.2 Makefile --- lib/Makefile 1 Jul 2004 13:35:46 -0000 1.2 +++ lib/Makefile 26 Jul 2004 15:22:31 -0000 @@ -72,7 +72,7 @@ memberlist.o clist.o ${AR} cr $@ $^ -libmagmamsg.a: message.o crc32.o fdops.o +libmagmamsg.a: message.o fdops.o ${AR} cr $@ $^ %.o: %.c Index: lib/message.c =================================================================== RCS file: /cvs/cluster/cluster/magma/lib/message.c,v retrieving revision 1.3 diff -u -r1.3 message.c --- lib/message.c 1 Jul 2004 13:35:46 -0000 1.3 +++ lib/message.c 26 Jul 2004 15:22:31 -0000 @@ -49,8 +49,6 @@ #define IPV6_PORT_OFFSET 1 -int clu_crc32(void *, int); - /* From fdops.c */ @@ -80,62 +78,6 @@ static pthread_mutex_t fill_mutex = PTHREAD_MUTEX_INITIALIZER; -struct __attribute__ ((packed)) msg_struct { - uint32_t ms_count; /* number of bytes in payload */ - uint32_t ms_crc32; /* CRC32 of data */ -}; - - -/** - Create a message buffer with a header including length and data CRC. - - @param payload data to send - @param len length of message to add header to - @param msg allocated within: message + header - @return Total size of allocated buffer. - */ -static unsigned long -msg_create(void *payload, ssize_t len, void **msg) -{ - unsigned long ret; - struct msg_struct msg_hdr; - - memset(&msg_hdr, 0, sizeof (msg_hdr)); - msg_hdr.ms_count = len; - msg_hdr.ms_crc32 = clu_crc32(payload, len); -#if __BYTE_ORDER == __BIG_ENDIAN - msg_hdr.ms_count = bswap_32(msg_hdr.ms_count); - msg_hdr.ms_crc32 = bswap_32(msg_hdr.ms_crc32); -#endif - - if (!len || !payload) - return sizeof (msg_hdr); - - *msg = (void *) malloc(sizeof (msg_hdr) + len); - if (*msg == NULL) { - errno = ENOMEM; - return -1; - } - memcpy(*msg, &msg_hdr, sizeof (msg_hdr)); - memcpy(*msg + sizeof (msg_hdr), payload, len); - - ret = sizeof (msg_hdr) + len; - return ret; -} - - -/** - Free a message buffer. - - @param msg Buffer to free. - */ -static inline void -msg_destroy(void *msg) -{ - if (msg != NULL) - free(msg); -} - /** Update our internal membership list with the provided list. Does NOT copy over resolved addresses; the caller may want to @@ -177,11 +119,6 @@ _msg_receive(int fd, void *buf, ssize_t count, struct timeval *tv) { - uint32_t crc; - int err; - struct msg_struct msg_hdr; - ssize_t retval = 0; - if (fd < 0) { errno = EBADF; return -1; @@ -197,36 +134,7 @@ return -1; } - if ((retval = _read_retry(fd, &msg_hdr, sizeof (msg_hdr), tv)) < - (ssize_t) sizeof (msg_hdr)) { - return -1; - } - -#if __BYTE_ORDER == __BIG_ENDIAN - msg_hdr.ms_count = bswap_32(msg_hdr.ms_count); - msg_hdr.ms_crc32 = bswap_32(msg_hdr.ms_crc32); -#endif - - if (!msg_hdr.ms_count) - return 0; - - err = errno; - retval = _read_retry(fd, buf, count, tv); - - if ((count == msg_hdr.ms_count) && (retval == count)) { - crc = clu_crc32(buf, retval); - - if (crc != msg_hdr.ms_crc32) { - /* Mangled message */ - fprintf(stderr, "CRC32 mismatch: 0x%08x vs. 0x%08x\n", - crc, msg_hdr.ms_crc32); - err = EIO; - retval = -1; - } - } - - errno = err; - return retval; + return _read_retry(fd, buf, count, tv); } @@ -234,7 +142,7 @@ Receive a message from a file descriptor w/o a timeout value. @param fd File descriptor to receive from - @param buf Pre-allocated bufffer \ + @param buf Pre-allocated bufffer @param count Size of expected message; must be <= size of preallocated buffer. @return -1 on failure or size of read data @@ -282,9 +190,6 @@ ssize_t msg_send(int fd, void *buf, ssize_t count) { - void *msg; - int msg_len = -1, bytes_written = 0; - if (fd == -1) { errno = EBADF; return -1; @@ -300,13 +205,7 @@ return -1; } - msg_len = msg_create(buf, count, &msg); - if ((bytes_written = write(fd, msg, msg_len)) < msg_len) { - msg_destroy(msg); - return -1; - } - msg_destroy(msg); - return (bytes_written - sizeof (struct msg_struct)); + return write(fd, buf, count); } @@ -914,50 +813,11 @@ ssize_t -_msg_peek(int sockfd, void *buf, ssize_t count) -{ - char *bigbuf; - ssize_t ret; - int bigbuf_sz; - int hdrsz = sizeof (struct msg_struct); - - bigbuf_sz = count + hdrsz; - bigbuf = (char *) malloc(bigbuf_sz); - if (bigbuf == NULL) - return -1; - - /* - * We need to account for the msg header. So we skip past it - * and decrement the return value by the number of bytes eaten - * up by the header. - */ - ret = recv(sockfd, bigbuf, bigbuf_sz, MSG_PEEK); - if (ret < 0) { - ret = errno; - free(bigbuf); - errno = ret; - return -1; - } - if (ret - hdrsz > 0) { - ret -= hdrsz; - if (ret > count) - ret = count; - memcpy(buf, bigbuf + hdrsz, ret); - } else { - ret = 0; - } - free(bigbuf); - - return ret; -} - - -ssize_t msg_peek(int sockfd, void *buf, ssize_t count) { if (sockfd < 0 || count > MSG_MAX_SIZE) { return -1; } - return (_msg_peek(sockfd, buf, count)); + return recv(sockfd, buf, count, MSG_PEEK); }