X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=net.c;h=66db86bc5f77ece9a628f705dee2198d921e3491;hp=28bc777d4dde6f56be5414d4d8d92aeb0d47ab6e;hb=b564291f5f15b5bd4a319ea59875023551a705cc;hpb=27638103f249ffbe9768603b9baff199950fd9f6 diff --git a/net.c b/net.c index 28bc777d..66db86bc 100644 --- a/net.c +++ b/net.c @@ -23,31 +23,49 @@ #include "string.h" #include "error.h" + +/** \cond holds information about one encrypted connection */ struct crypt_data { crypt_function *recv; crypt_function *send; void *private_data; }; - -static struct crypt_data *crypt_data_array; static unsigned cda_size = 0; +static struct crypt_data *crypt_data_array; +/** \endcond */ -void enable_crypt(int fd, crypt_function *recv, crypt_function *send, + +/** + * activate encryption for one file descriptor + * + * \param fd the file descriptor + * \param recv_f the function used for decrypting received data + * \param send_f the function used for encrypting before sending + * \param private_data user data supplied by the caller + */ +void enable_crypt(int fd, crypt_function *recv_f, crypt_function *send_f, void *private_data) { if (fd + 1 > cda_size) { crypt_data_array = para_realloc(crypt_data_array, (fd + 1) * sizeof(struct crypt_data)); - memset(crypt_data_array + cda_size * sizeof(struct crypt_data), 0, + memset(crypt_data_array + cda_size, 0, (fd + 1 - cda_size) * sizeof(struct crypt_data)); cda_size = fd + 1; } - crypt_data_array[fd].recv = recv; - crypt_data_array[fd].send = send; + crypt_data_array[fd].recv = recv_f; + crypt_data_array[fd].send = send_f; crypt_data_array[fd].private_data = private_data; PARA_INFO_LOG("rc4 encryption activated for fd %d\n", fd); } +/** + * deactivate encryption for a given fd + * + * \param fd the file descriptor + * + * This must be called if and only if \p fd was activated via enable_crypt(). + */ void disable_crypt(int fd) { if (cda_size < fd + 1) @@ -294,9 +312,9 @@ int para_connect(int fd, struct sockaddr_in *their_addr) /** * paraslash's wrapper around the accept system call * - * @param fd the listening socket - * @param addr structure which is filled in with the address of the peer socket - * @param size should contain the size of the structure pointed to by \a addr + * \param fd the listening socket + * \param addr structure which is filled in with the address of the peer socket + * \param size should contain the size of the structure pointed to by \a addr * * \sa accept(2). */ @@ -304,8 +322,10 @@ int para_accept(int fd, void *addr, socklen_t size) { int new_fd; - new_fd = accept(fd, (struct sockaddr *) addr, &size); - return new_fd == -1? -E_ACCEPT : new_fd; + do + new_fd = accept(fd, (struct sockaddr *) addr, &size); + while (new_fd < 0 && errno == EINTR); + return new_fd < 0? -E_ACCEPT : new_fd; } static int setserversockopts(int socket_fd) @@ -560,8 +580,11 @@ int recv_pattern(int fd, const char *pattern, size_t bufsize) goto out; ret = 1; out: - if (ret < 0) - PARA_NOTICE_LOG("did not receive pattern '%s'\n", pattern); + if (ret < 0) { + PARA_NOTICE_LOG("n = %d, did not receive pattern '%s'\n", n, pattern); + if (n > 0) + PARA_NOTICE_LOG("recvd: %s\n", buf); + } free(buf); return ret; }