From 556652418a72ee3debc26fa95e7bffec4665dd6b Mon Sep 17 00:00:00 2001 From: Karchnu Date: Tue, 1 Sep 2020 00:16:43 +0200 Subject: [PATCH] Version 0.7.1. Small fix in usock_recv function. --- Makefile | 24 ++++++++++++------------ project.zsh | 2 +- src/usocket.c | 40 ++++++++++++++++++++++++++++++---------- 3 files changed, 43 insertions(+), 23 deletions(-) diff --git a/Makefile b/Makefile index 9745a5e..bc90896 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ PACKAGE = 'libipc' -VERSION = '0.6.0' +VERSION = '0.7.1' PREFIX := /usr/local BINDIR := $(PREFIX)/bin @@ -50,25 +50,25 @@ libipc.so: src/communication.o src/context.o src/error.o src/fs.o src/message.o $(Q)$(CC) -o libipc.so -shared $(LDFLAGS) src/communication.o src/context.o src/error.o src/fs.o src/message.o src/network.o src/print.o src/service_path.o src/usocket.o src/utils.o libipc.so.install: libipc.so - @echo ' IN > $(LIBDIR)/libipc.so.0.6.0' + @echo ' IN > $(LIBDIR)/libipc.so.0.7.1' $(Q)mkdir -p '$(DESTDIR)$(LIBDIR)' - $(Q)install -m0755 libipc.so $(DESTDIR)$(LIBDIR)/libipc.so.0.6.0 - @echo ' LN > $(LIBDIR)/libipc.so.0.6' - $(Q)ln -sf '$(LIBDIR)/libipc.so.0.6.0' '$(DESTDIR)/$(LIBDIR)/libipc.so.0.6' + $(Q)install -m0755 libipc.so $(DESTDIR)$(LIBDIR)/libipc.so.0.7.1 + @echo ' LN > $(LIBDIR)/libipc.so.0.7' + $(Q)ln -sf '$(LIBDIR)/libipc.so.0.7.1' '$(DESTDIR)/$(LIBDIR)/libipc.so.0.7' @echo ' LN > $(LIBDIR)/libipc.so.0' - $(Q)ln -sf '$(LIBDIR)/libipc.so.0.6.0' '$(DESTDIR)/$(LIBDIR)/libipc.so.0' + $(Q)ln -sf '$(LIBDIR)/libipc.so.0.7.1' '$(DESTDIR)/$(LIBDIR)/libipc.so.0' @echo ' LN > $(LIBDIR)/libipc.so' - $(Q)ln -sf '$(LIBDIR)/libipc.so.0.6.0' '$(DESTDIR)/$(LIBDIR)/libipc.so' + $(Q)ln -sf '$(LIBDIR)/libipc.so.0.7.1' '$(DESTDIR)/$(LIBDIR)/libipc.so' libipc.so.clean: @echo ' RM > libipc.so' $(Q)rm -f libipc.so libipc.so.uninstall: - @echo ' RM > $(LIBDIR)/libipc.so.0.6.0' - $(Q)rm -f '$(DESTDIR)$(LIBDIR)/libipc.so.0.6.0' - @echo ' RM > $(LIBDIR)/libipc.so.0.6' - $(Q)rm -f '$(DESTDIR)$(LIBDIR)/libipc.so.0.6' + @echo ' RM > $(LIBDIR)/libipc.so.0.7.1' + $(Q)rm -f '$(DESTDIR)$(LIBDIR)/libipc.so.0.7.1' + @echo ' RM > $(LIBDIR)/libipc.so.0.7' + $(Q)rm -f '$(DESTDIR)$(LIBDIR)/libipc.so.0.7' @echo ' RM > $(LIBDIR)/libipc.so.0' $(Q)rm -f '$(DESTDIR)$(LIBDIR)/libipc.so.0' @echo ' RM > $(LIBDIR)/libipc.so' @@ -327,7 +327,7 @@ $(PACKAGE)-$(VERSION).tar.bz2: distdir $(PACKAGE)-$(VERSION)/src/utils.h help: - @echo ' :: libipc-0.6.0' + @echo ' :: libipc-0.7.1' @echo '' @echo 'Generic targets:' @echo ' - help  Prints this help message.' diff --git a/project.zsh b/project.zsh index b13c8d1..2b99d0a 100644 --- a/project.zsh +++ b/project.zsh @@ -1,6 +1,6 @@ package=libipc # Package name. -version=0.7.0 # Package version. +version=0.7.1 # Package version. # Our targets are the library and its documentation. targets=(libipc man/libipc.7) diff --git a/src/usocket.c b/src/usocket.c index 51e39fe..2bafc06 100644 --- a/src/usocket.c +++ b/src/usocket.c @@ -35,37 +35,51 @@ struct ipc_error usock_recv (const int32_t fd, char **buf, size_t * len) T_R ((buf == NULL), IPC_ERROR_USOCK_RECV__NO_BUFFER); T_R ((len == NULL), IPC_ERROR_USOCK_RECV__NO_LENGTH); + // printf("USOCKET: listen to %d (up to %lu bytes)\n", fd, *len); int32_t ret_recv = 0; if (*len == 0) *len = IPC_MAX_MESSAGE_SIZE; + // msize_read: size of the message (without the header). uint32_t msize = 0; + + // msize_read: size sum of the packets received. uint32_t msize_read = 0; do { + /** + * recv: + * ret > 0: message receveid + * ret == 0: fd is closing + * ret < 0: error + */ ret_recv = recv (fd, *buf, *len, 0); -#ifdef IPC_DEBUG + if (ret_recv > 0) { +#ifdef IPC_DEBUG print_hexa ("msg recv", (uint8_t *) * buf, ret_recv); fflush (stdout); - } #endif - - if (ret_recv > 0) { if (msize == 0) { memcpy (&msize, *buf + 1, sizeof msize); + msize = ntohl (msize); } - msize = ntohl (msize); + // else { + // printf ("USOCKET: We received a message in (at least) two packets (receveid %u bytes).\n", msize_read); + // } - if (msize >= IPC_MAX_MESSAGE_SIZE) { + if (msize > IPC_MAX_MESSAGE_SIZE) { #ifdef IPC_DEBUG print_hexa ("msg recv", (uint8_t *) * buf, ret_recv); fflush (stdout); #endif } + + // Do not allow messages with a longer size than expected. T_R ((msize > IPC_MAX_MESSAGE_SIZE), IPC_ERROR_USOCK_RECV__MESSAGE_SIZE); - msize_read += ret_recv - IPC_HEADER_SIZE; + + msize_read += ret_recv; } else if (ret_recv < 0) { *len = 0; @@ -111,11 +125,17 @@ struct ipc_error usock_recv (const int32_t fd, char **buf, size_t * len) , "usock_recv: recv < 0, is the message size malformed?"); } - } while (msize > msize_read); + // if (msize > msize_read) { + // printf ("USOCKET: loop again for %d (read %u/%u)\n", fd, msize_read, msize); + // } - *len = msize + IPC_HEADER_SIZE; + // In case msize still is 0, recv didn't worked as expected. + } while (msize > 0 && msize > msize_read - IPC_HEADER_SIZE); - // 1 on none byte received, indicates a closed recipient + // printf("USOCKET: end of the loop for client %d -- %u bytes read\n", fd, msize_read); + *len = msize_read; + + // none bytes received, indicates a closed recipient if (ret_recv == 0) { *len = 0; IPC_RETURN_ERROR (IPC_ERROR_CLOSED_RECIPIENT);