Merge ../paraslash.fml/paraslash
[paraslash.git] / net.c
diff --git a/net.c b/net.c
index 28bc777d4dde6f56be5414d4d8d92aeb0d47ab6e..0105ef6902114ae108da577186c1d58d8e52c0fb 100644 (file)
--- a/net.c
+++ b/net.c
 #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)
@@ -117,7 +135,7 @@ static int sendall(int fd, const char *buf, size_t *len)
  * @param buf the buffer to be encrypted and sent
  * @param len the length of \a buf
  *
- * Check if encrytion is available. If yes, encrypt the given buffer.  Send out
+ * Check if encrytpion is available. If yes, encrypt the given buffer.  Send out
  * the buffer, encrypted or not, and try to resend the remaing part in case of
  * short writes.
  *
@@ -183,7 +201,7 @@ __printf_2_3 int send_va_buffer(int fd, const char *fmt, ...)
  * @param buf the buffer to write the decrypted data to
  * @param size the size of @param buf
  *
- * Receive at most \a size bytes from filedescriptor fd. If encrytion is
+ * Receive at most \a size bytes from filedescriptor fd. If encryption is
  * available, decrypt the received buffer.
  *
  * @return the number of bytes received on success. On receive errors, -E_RECV
@@ -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)
@@ -371,9 +391,6 @@ int create_pf_socket(const char *name, struct sockaddr_un *unix_addr, int mode)
 }
 
 #ifndef HAVE_UCRED
-       struct ucred {
-       uid_t uid, pid, gid;
-};
 ssize_t send_cred_buffer(int sock, char *buf)
 {
        return send_buffer(sock, buf);
@@ -560,8 +577,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;
 }