X-Git-Url: http://git.tuebingen.mpg.de/?a=blobdiff_plain;f=net.c;h=74b8e1f7eddbc6c76bbf0e717bb05df5311b3bb5;hb=b844e3fbfb8a4fc03c83df84626b57fc8dc30ad2;hp=d4472c0e2805ecb898ef4caae85a96980fe6d447;hpb=12b81c91b25b9d0d4bce43c4f87220c3c7f991da;p=paraslash.git diff --git a/net.c b/net.c index d4472c0e..74b8e1f7 100644 --- a/net.c +++ b/net.c @@ -21,11 +21,28 @@ #include "para.h" #include "net.h" #include "string.h" -#include #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; +} /** @@ -96,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 @@ -160,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); @@ -204,11 +228,12 @@ int recv_buffer(int fd, char *buf, ssize_t size) * \return The hostent structure or a NULL pointer if an error occurs * \sa gethostbyname(2) */ -struct hostent *get_host_info(char *host) +int get_host_info(char *host, struct hostent **ret) { PARA_INFO_LOG("getting host info of %s\n", host); /* FIXME: gethostbyname() is obsolete */ - return gethostbyname(host); + *ret = gethostbyname(host); + return *ret? 1 : -E_HOST_INFO; } /**