X-Git-Url: https://tinc-vpn.org/git/browse?p=tinc;a=blobdiff_plain;f=src%2Fmeta.c;h=ecf875c7107338827a870810f505cbe142d465e5;hp=289d0b873bc032a3b21e6279c372a07e8e14e2a6;hb=f1a082823c48d00171b814f7e14e07e6dd4632fb;hpb=408ca91766088b6c2d38e198b0692bf394b41248 diff --git a/src/meta.c b/src/meta.c index 289d0b87..ecf875c7 100644 --- a/src/meta.c +++ b/src/meta.c @@ -1,7 +1,7 @@ /* meta.c -- handle the meta communication - Copyright (C) 2000 Guus Sliepen , - 2000 Ivo Timmermans + Copyright (C) 2000,2001 Guus Sliepen , + 2000,2001 Ivo Timmermans This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -17,11 +17,12 @@ along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - $Id: meta.c,v 1.1.2.12 2000/11/20 19:12:12 guus Exp $ + $Id: meta.c,v 1.1.2.16 2001/03/12 23:58:19 guus Exp $ */ #include "config.h" #include +#include #include #include @@ -74,12 +75,12 @@ cp void broadcast_meta(connection_t *cl, char *buffer, int length) { - rbl_t *rbl; + avl_node_t *node; connection_t *p; cp - RBL_FOREACH(connection_tree, rbl) + for(node = connection_tree->head; node; node = node->next) { - p = (connection_t *)rbl->data; + p = (connection_t *)node->data; if(p != cl && p->status.meta && p->status.active) send_meta(p, buffer, length); } @@ -93,6 +94,7 @@ int receive_meta(connection_t *cl) int lenin = 0; char inbuf[MAXBUFSIZE]; char *bufp; + int decrypted = 0; cp if(getsockopt(cl->meta_socket, SOL_SOCKET, SO_ERROR, &x, &l) < 0) { @@ -107,39 +109,38 @@ cp return -1; } - if(cl->status.decryptin) - bufp = inbuf; - else - bufp = cl->buffer + cl->buflen; - - lenin = read(cl->meta_socket, bufp, MAXBUFSIZE - cl->buflen); + lenin = read(cl->meta_socket, cl->buffer + cl->buflen, MAXBUFSIZE - cl->buflen); if(lenin<=0) { - if(errno==EINTR) - return 0; - if(errno==0) + if(lenin==0) { if(debug_lvl >= DEBUG_CONNECTIONS) syslog(LOG_NOTICE, _("Connection closed by %s (%s)"), cl->name, cl->hostname); } else - syslog(LOG_ERR, _("Metadata socket read error for %s (%s): %m"), - cl->name, cl->hostname); - return -1; - } + if(errno==EINTR) + return 0; + else + syslog(LOG_ERR, _("Metadata socket read error for %s (%s): %m"), + cl->name, cl->hostname); - if(cl->status.decryptin) - { - EVP_DecryptUpdate(cl->cipher_inctx, cl->buffer + cl->buflen, &lenin, inbuf, lenin); + return -1; } oldlen = cl->buflen; cl->buflen += lenin; - for(;;) + while(lenin) { + if(cl->status.decryptin && !decrypted) + { + EVP_DecryptUpdate(cl->cipher_inctx, inbuf, &lenin, cl->buffer + oldlen, lenin); + memcpy(cl->buffer + oldlen, inbuf, lenin); + decrypted = 1; + } + cl->reqlen = 0; for(i = oldlen; i < cl->buflen; i++) @@ -162,6 +163,7 @@ cp return -1; cl->buflen -= cl->reqlen; + lenin -= cl->reqlen; memmove(cl->buffer, cl->buffer + cl->reqlen, cl->buflen); oldlen = 0; }