+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, 0,
+ (fd + 1 - cda_size) * sizeof(struct crypt_data));
+ cda_size = fd + 1;
+ }
+ 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)
+ return;
+ crypt_data_array[fd].recv = NULL;
+ crypt_data_array[fd].send = NULL;
+ crypt_data_array[fd].private_data = NULL;
+}
+
+
+/**
+ * Initialize a struct sockaddr_in.
+ *
+ * \param addr A pointer to the struct to be initialized.
+ * \param port The port number to use.
+ * \param he The address to use.
+ *
+ * If \a he is null (server mode), \a addr->sin_addr is initialized with \p
+ * INADDR_ANY. Otherwise, the address given by \a he is copied to addr.
+ */
+static void init_sockaddr(struct sockaddr_in *addr, int port, const struct hostent *he)