Make crypo a per fd feature
[paraslash.git] / net.c
diff --git a/net.c b/net.c
index 582fa04..74b8e1f 100644 (file)
--- a/net.c
+++ b/net.c
 #include "string.h"
 #include "error.h"
 
-extern void (*crypt_function_recv)(unsigned long len, const unsigned char *indata, unsigned char *outdata);
-extern void (*crypt_function_send)(unsigned long len, const unsigned char *indata, unsigned char *outdata);
+static crypt_function **crypt_functions;
+static unsigned max_crypt_fd;
+
+void enable_crypt(int fd, crypt_function *recv, crypt_function *send)
+{
+       if (max_crypt_fd < fd) {
+               crypt_functions = para_realloc(crypt_functions,
+                       2 * (fd + 1) * sizeof(crypt_function*));
+               max_crypt_fd = fd;
+       }
+       crypt_functions[2 * fd] = recv;
+       crypt_functions[2 * fd + 1] = send;
+       PARA_INFO_LOG("rc4 encryption activated for fd %d\n", fd);
+}
+
+void disable_crypt(int fd)
+{
+       crypt_functions[2 * fd] = NULL;
+       crypt_functions[2 * fd + 1] = NULL;
+}
 
 
 /**
@@ -95,12 +113,16 @@ static int sendall(int fd, const char *buf, size_t *len)
 int send_bin_buffer(int fd, const char *buf, size_t len)
 {
        int ret;
+       crypt_function *cf = NULL;
+
+       if (fd <= max_crypt_fd)
+               cf = crypt_functions[2 * fd + 1];
 
        if (!len)
                PARA_CRIT_LOG("%s", "len == 0\n");
-       if (crypt_function_send) {
+       if (cf) {
                unsigned char *outbuf = para_malloc(len);
-               crypt_function_send(len, (unsigned char *)buf, outbuf);
+               (*cf)(len, (unsigned char *)buf, outbuf);
                ret = sendall(fd, (char *)outbuf, &len);
                free(outbuf);
        } else
@@ -159,12 +181,15 @@ __printf_2_3 int send_va_buffer(int fd, const char *fmt, ...)
 __must_check int recv_bin_buffer(int fd, char *buf, ssize_t size)
 {
        int n;
+       crypt_function *cf = NULL;
 
-       if (crypt_function_recv) {
+       if (fd <= max_crypt_fd)
+               cf = crypt_functions[2 * fd];
+       if (cf) {
                unsigned char *tmp = para_malloc(size);
                n = recv(fd, tmp, size, 0);
                if (n > 0)
-                       crypt_function_recv(n, tmp, (unsigned char *)buf);
+                       (*cf)(n, tmp, (unsigned char *)buf);
                free(tmp);
        } else
                n = recv(fd, buf, size, 0);