Cleanups:
[tinc] / src / protocol.c
index 1460fbf..2f27b55 100644 (file)
@@ -23,6 +23,7 @@
 #include <string.h>
 #include <syslog.h>
 #include <sys/socket.h>
 #include <string.h>
 #include <syslog.h>
 #include <sys/socket.h>
+#include <unistd.h>
 
 #include <utils.h>
 #include <xalloc.h>
 
 #include <utils.h>
 #include <xalloc.h>
 int send_ack(conn_list_t *cl)
 {
   unsigned char tmp = ACK;
 int send_ack(conn_list_t *cl)
 {
   unsigned char tmp = ACK;
-
+cp
   if(debug_lvl > 2)
     syslog(LOG_DEBUG, "Send ACK to %s", cl->hostname);
 
   syslog(LOG_NOTICE, "Connection with %s activated.", cl->hostname);
   if(debug_lvl > 2)
     syslog(LOG_DEBUG, "Send ACK to %s", cl->hostname);
 
   syslog(LOG_NOTICE, "Connection with %s activated.", cl->hostname);
-  if((send(cl->meta_socket, &tmp, sizeof(tmp), 0)) < 0)
+  if((write(cl->meta_socket, &tmp, sizeof(tmp))) < 0)
     {
       syslog(LOG_ERR, "send failed: %d:%d: %m", __FILE__, __LINE__);
       return -1;
     }
     {
       syslog(LOG_ERR, "send failed: %d:%d: %m", __FILE__, __LINE__);
       return -1;
     }
-
+cp
   return 0;
 }
 
 int send_termreq(conn_list_t *cl)
 {
   termreq_t tmp;
   return 0;
 }
 
 int send_termreq(conn_list_t *cl)
 {
   termreq_t tmp;
-
+cp
   tmp.type = TERMREQ;
   tmp.vpn_ip = myself->vpn_ip;
 
   tmp.type = TERMREQ;
   tmp.vpn_ip = myself->vpn_ip;
 
@@ -61,19 +62,19 @@ int send_termreq(conn_list_t *cl)
     syslog(LOG_DEBUG, "Send TERMREQ(" IP_ADDR_S ") to " IP_ADDR_S, IP_ADDR_V(tmp.vpn_ip),
           IP_ADDR_V(cl->vpn_ip));
 
     syslog(LOG_DEBUG, "Send TERMREQ(" IP_ADDR_S ") to " IP_ADDR_S, IP_ADDR_V(tmp.vpn_ip),
           IP_ADDR_V(cl->vpn_ip));
 
-  if((send(cl->meta_socket, &tmp, sizeof(tmp), 0)) < 0)
+  if((write(cl->meta_socket, &tmp, sizeof(tmp))) < 0)
     {
       syslog(LOG_ERR, "send failed: %s:%d: %m", __FILE__, __LINE__);
       return -1;
     }
     {
       syslog(LOG_ERR, "send failed: %s:%d: %m", __FILE__, __LINE__);
       return -1;
     }
-
+cp
   return 0;
 }
 
 int send_timeout(conn_list_t *cl)
 {
   termreq_t tmp;
   return 0;
 }
 
 int send_timeout(conn_list_t *cl)
 {
   termreq_t tmp;
-
+cp
   tmp.type = PINGTIMEOUT;
   tmp.vpn_ip = myself->vpn_ip;
 
   tmp.type = PINGTIMEOUT;
   tmp.vpn_ip = myself->vpn_ip;
 
@@ -81,19 +82,19 @@ int send_timeout(conn_list_t *cl)
     syslog(LOG_DEBUG, "Send TIMEOUT(" IP_ADDR_S ") to " IP_ADDR_S, IP_ADDR_V(tmp.vpn_ip),
           IP_ADDR_V(cl->vpn_ip));
 
     syslog(LOG_DEBUG, "Send TIMEOUT(" IP_ADDR_S ") to " IP_ADDR_S, IP_ADDR_V(tmp.vpn_ip),
           IP_ADDR_V(cl->vpn_ip));
 
-  if((send(cl->meta_socket, &tmp, sizeof(tmp), 0)) < 0)
+  if((write(cl->meta_socket, &tmp, sizeof(tmp))) < 0)
     {
       syslog(LOG_ERR, "send failed: %s:%d: %m", __FILE__, __LINE__);
       return -1;
     }
     {
       syslog(LOG_ERR, "send failed: %s:%d: %m", __FILE__, __LINE__);
       return -1;
     }
-
+cp
   return 0;
 }
 
 int send_del_host(conn_list_t *cl, conn_list_t *new_host)
 {
   del_host_t tmp;
   return 0;
 }
 
 int send_del_host(conn_list_t *cl, conn_list_t *new_host)
 {
   del_host_t tmp;
-
+cp
   tmp.type = DEL_HOST;
   tmp.vpn_ip = new_host->vpn_ip;
 
   tmp.type = DEL_HOST;
   tmp.vpn_ip = new_host->vpn_ip;
 
@@ -101,48 +102,48 @@ int send_del_host(conn_list_t *cl, conn_list_t *new_host)
     syslog(LOG_DEBUG, "Sending delete host %lx to " IP_ADDR_S,
           tmp.vpn_ip, IP_ADDR_V(cl->vpn_ip));
 
     syslog(LOG_DEBUG, "Sending delete host %lx to " IP_ADDR_S,
           tmp.vpn_ip, IP_ADDR_V(cl->vpn_ip));
 
-  if((send(cl->meta_socket, (unsigned char*)&tmp, sizeof(del_host_t), 0)) < 0)
+  if((write(cl->meta_socket, &tmp, sizeof(tmp))) < 0)
     {
       syslog(LOG_ERR, "send failed: %s:%d: %m", __FILE__, __LINE__);
       return -1;
     }
     {
       syslog(LOG_ERR, "send failed: %s:%d: %m", __FILE__, __LINE__);
       return -1;
     }
-
+cp
   return 0;
 }
 
 int send_ping(conn_list_t *cl)
 {
   unsigned char tmp = PING;
   return 0;
 }
 
 int send_ping(conn_list_t *cl)
 {
   unsigned char tmp = PING;
-
+cp
   if(debug_lvl > 3)
     syslog(LOG_DEBUG, "pinging " IP_ADDR_S, IP_ADDR_V(cl->vpn_ip));
 
   if(debug_lvl > 3)
     syslog(LOG_DEBUG, "pinging " IP_ADDR_S, IP_ADDR_V(cl->vpn_ip));
 
-  if((send(cl->meta_socket, &tmp, sizeof(tmp), 0)) < 0)
+  if((write(cl->meta_socket, &tmp, sizeof(tmp))) < 0)
     {
       syslog(LOG_ERR, "send failed: %s:%d: %m", __FILE__, __LINE__);
       return -1;
     }
     {
       syslog(LOG_ERR, "send failed: %s:%d: %m", __FILE__, __LINE__);
       return -1;
     }
-
+cp
   return 0;
 }
 
 int send_pong(conn_list_t *cl)
 {
   unsigned char tmp = PONG;
   return 0;
 }
 
 int send_pong(conn_list_t *cl)
 {
   unsigned char tmp = PONG;
-
-  if((send(cl->meta_socket, &tmp, sizeof(tmp), 0)) < 0)
+cp
+  if((write(cl->meta_socket, &tmp, sizeof(tmp))) < 0)
     {
       syslog(LOG_ERR, "send failed: %s:%d: %m", __FILE__, __LINE__);
       return -1;
     }
     {
       syslog(LOG_ERR, "send failed: %s:%d: %m", __FILE__, __LINE__);
       return -1;
     }
-
+cp
   return 0;
 }
 
 int send_add_host(conn_list_t *cl, conn_list_t *new_host)
 {
   add_host_t tmp;
   return 0;
 }
 
 int send_add_host(conn_list_t *cl, conn_list_t *new_host)
 {
   add_host_t tmp;
-
+cp
   tmp.type = ADD_HOST;
   tmp.real_ip = new_host->real_ip;
   tmp.vpn_ip = new_host->vpn_ip;
   tmp.type = ADD_HOST;
   tmp.real_ip = new_host->real_ip;
   tmp.vpn_ip = new_host->vpn_ip;
@@ -154,19 +155,19 @@ int send_add_host(conn_list_t *cl, conn_list_t *new_host)
           tmp.vpn_ip, tmp.vpn_mask, tmp.real_ip, tmp.portnr,
           IP_ADDR_V(cl->vpn_ip));
 
           tmp.vpn_ip, tmp.vpn_mask, tmp.real_ip, tmp.portnr,
           IP_ADDR_V(cl->vpn_ip));
 
-  if((send(cl->meta_socket, (unsigned char*)&tmp, sizeof(add_host_t), 0)) < 0)
+  if((write(cl->meta_socket, &tmp, sizeof(tmp))) < 0)
     {
       syslog(LOG_ERR, "send failed: %s:%d: %m", __FILE__, __LINE__);
       return -1;
     }
     {
       syslog(LOG_ERR, "send failed: %s:%d: %m", __FILE__, __LINE__);
       return -1;
     }
-
+cp
   return 0;
 }
 
 int send_key_changed(conn_list_t *cl, conn_list_t *src)
 {
   key_changed_t tmp;
   return 0;
 }
 
 int send_key_changed(conn_list_t *cl, conn_list_t *src)
 {
   key_changed_t tmp;
-
+cp
   tmp.type = KEY_CHANGED;
   tmp.from = src->vpn_ip;
 
   tmp.type = KEY_CHANGED;
   tmp.from = src->vpn_ip;
 
@@ -174,28 +175,29 @@ int send_key_changed(conn_list_t *cl, conn_list_t *src)
     syslog(LOG_DEBUG, "Sending KEY_CHANGED (%lx) to " IP_ADDR_S,
           tmp.from, IP_ADDR_V(cl->vpn_ip));
 
     syslog(LOG_DEBUG, "Sending KEY_CHANGED (%lx) to " IP_ADDR_S,
           tmp.from, IP_ADDR_V(cl->vpn_ip));
 
-  if((send(cl->meta_socket, (unsigned char*)&tmp, sizeof(key_changed_t), 0)) < 0)
+  if((write(cl->meta_socket, &tmp, sizeof(tmp))) < 0)
     {
       syslog(LOG_ERR, "send failed: %s:%d: %m", __FILE__, __LINE__);
       return -1;
     }
     {
       syslog(LOG_ERR, "send failed: %s:%d: %m", __FILE__, __LINE__);
       return -1;
     }
-
+cp
   return 0;
 }
 
 void send_key_changed2(void)
 {
   conn_list_t *p;
   return 0;
 }
 
 void send_key_changed2(void)
 {
   conn_list_t *p;
-
+cp
   for(p = conn_list; p != NULL; p = p->next)
     if(p->status.meta && p->protocol_version > PROT_3)
       send_key_changed(p, myself);
   for(p = conn_list; p != NULL; p = p->next)
     if(p->status.meta && p->protocol_version > PROT_3)
       send_key_changed(p, myself);
+cp
 }
 
 int send_basic_info(conn_list_t *cl)
 {
   basic_info_t tmp;
 }
 
 int send_basic_info(conn_list_t *cl)
 {
   basic_info_t tmp;
-
+cp
   tmp.type = BASIC_INFO;
   tmp.protocol = PROT_CURRENT;
 
   tmp.type = BASIC_INFO;
   tmp.protocol = PROT_CURRENT;
 
@@ -208,19 +210,19 @@ int send_basic_info(conn_list_t *cl)
           tmp.protocol, tmp.portnr, IP_ADDR_V(tmp.vpn_ip), IP_ADDR_V(tmp.vpn_mask),
           IP_ADDR_V(cl->real_ip));
 
           tmp.protocol, tmp.portnr, IP_ADDR_V(tmp.vpn_ip), IP_ADDR_V(tmp.vpn_mask),
           IP_ADDR_V(cl->real_ip));
 
-  if((send(cl->meta_socket, &tmp, sizeof(tmp), 0)) < 0)
+  if((write(cl->meta_socket, &tmp, sizeof(tmp))) < 0)
     {
       syslog(LOG_ERR, "send failed: %s:%d: %m", __FILE__, __LINE__);
       return -1;
     }
     {
       syslog(LOG_ERR, "send failed: %s:%d: %m", __FILE__, __LINE__);
       return -1;
     }
-
+cp
   return 0;
 }
 
 int send_passphrase(conn_list_t *cl)
 {
   passphrase_t tmp;
   return 0;
 }
 
 int send_passphrase(conn_list_t *cl)
 {
   passphrase_t tmp;
-
+cp
   tmp.type = PASSPHRASE;
   encrypt_passphrase(&tmp);
 
   tmp.type = PASSPHRASE;
   encrypt_passphrase(&tmp);
 
@@ -228,20 +230,20 @@ int send_passphrase(conn_list_t *cl)
     syslog(LOG_DEBUG, "Send PASSPHRASE(%hd,...) to " IP_ADDR_S, tmp.len,
           IP_ADDR_V(cl->vpn_ip));
 
     syslog(LOG_DEBUG, "Send PASSPHRASE(%hd,...) to " IP_ADDR_S, tmp.len,
           IP_ADDR_V(cl->vpn_ip));
 
-  if((send(cl->meta_socket, &tmp, tmp.len+3, 0)) < 0)
+  if((write(cl->meta_socket, &tmp, tmp.len+3)) < 0)
     {
       syslog(LOG_ERR, "send failed: %s:%d: %m", __FILE__, __LINE__);
       return -1;
     }
     {
       syslog(LOG_ERR, "send failed: %s:%d: %m", __FILE__, __LINE__);
       return -1;
     }
-
+cp
   return 0;
 }
 
 int send_public_key(conn_list_t *cl)
 {
   public_key_t *tmp;
   return 0;
 }
 
 int send_public_key(conn_list_t *cl)
 {
   public_key_t *tmp;
-
-  tmp = (public_key_t*)xmalloc(strlen(my_public_key_base36)+sizeof(public_key_t));
+cp
+  tmp = (public_key_t*)xmalloc(strlen(my_public_key_base36)+sizeof(*tmp));
   tmp->type = PUBLIC_KEY;
   tmp->len = strlen(my_public_key_base36);
   strcpy(&tmp->key, my_public_key_base36);
   tmp->type = PUBLIC_KEY;
   tmp->len = strlen(my_public_key_base36);
   strcpy(&tmp->key, my_public_key_base36);
@@ -250,30 +252,30 @@ int send_public_key(conn_list_t *cl)
     syslog(LOG_DEBUG, "Send PUBLIC_KEY(%hd,%s) to " IP_ADDR_S, tmp->len, &tmp->key,
           IP_ADDR_V(cl->vpn_ip));
 
     syslog(LOG_DEBUG, "Send PUBLIC_KEY(%hd,%s) to " IP_ADDR_S, tmp->len, &tmp->key,
           IP_ADDR_V(cl->vpn_ip));
 
-  if((send(cl->meta_socket, tmp, tmp->len+sizeof(public_key_t), 0)) < 0)
+  if((write(cl->meta_socket, tmp, tmp->len+sizeof(*tmp))) < 0)
     {
       syslog(LOG_ERR, "send failed: %s:%d: %m", __FILE__, __LINE__);
       return -1;
     }
     {
       syslog(LOG_ERR, "send failed: %s:%d: %m", __FILE__, __LINE__);
       return -1;
     }
-
+cp
   return 0;
 }
 
 int send_calculate(conn_list_t *cl, char *k)
 {
   calculate_t *tmp;
   return 0;
 }
 
 int send_calculate(conn_list_t *cl, char *k)
 {
   calculate_t *tmp;
-
-  tmp = xmalloc(strlen(k)+sizeof(calculate_t));
+cp
+  tmp = xmalloc(strlen(k)+sizeof(*tmp));
   tmp->type = CALCULATE;
   tmp->len = strlen(k);
   strcpy(&tmp->key, k);
 
   tmp->type = CALCULATE;
   tmp->len = strlen(k);
   strcpy(&tmp->key, k);
 
-  if(send(cl->meta_socket, tmp, tmp->len+4, 0) < 0)
+  if((write(cl->meta_socket, tmp, tmp->len+sizeof(*tmp))) < 0)
     {
       syslog(LOG_ERR, "send failed: %s:%d: %m", __FILE__, __LINE__);
       return -1;
     }
     {
       syslog(LOG_ERR, "send failed: %s:%d: %m", __FILE__, __LINE__);
       return -1;
     }
-
+cp
   return 0;
 }
 
   return 0;
 }
 
@@ -281,8 +283,8 @@ int send_key_request(ip_t to)
 {
   key_req_t *tmp;
   conn_list_t *fw;
 {
   key_req_t *tmp;
   conn_list_t *fw;
-
-  tmp = xmalloc(sizeof(key_req_t));
+cp
+  tmp = xmalloc(sizeof(*tmp));
   tmp->type = REQ_KEY;
   tmp->to = to;
   tmp->from = myself->vpn_ip;
   tmp->type = REQ_KEY;
   tmp->to = to;
   tmp->from = myself->vpn_ip;
@@ -299,13 +301,13 @@ int send_key_request(ip_t to)
   if(debug_lvl > 2)
     syslog(LOG_DEBUG, "Sending out request for public key to " IP_ADDR_S,
           IP_ADDR_V(fw->nexthop->vpn_ip));
   if(debug_lvl > 2)
     syslog(LOG_DEBUG, "Sending out request for public key to " IP_ADDR_S,
           IP_ADDR_V(fw->nexthop->vpn_ip));
-  if(send(fw->nexthop->meta_socket, tmp, sizeof(key_req_t), 0) < 0)
+  if(write(fw->nexthop->meta_socket, tmp, sizeof(*tmp)) < 0)
     {
       syslog(LOG_ERR, "send failed: %s:%d: %m", __FILE__, __LINE__);
       return -1;
     }
   fw->status.waitingforkey = 1;
     {
       syslog(LOG_ERR, "send failed: %s:%d: %m", __FILE__, __LINE__);
       return -1;
     }
   fw->status.waitingforkey = 1;
-
+cp
   return 0;
 }
 
   return 0;
 }
 
@@ -313,8 +315,8 @@ int send_key_answer(conn_list_t *cl, ip_t to)
 {
   key_req_t *tmp;
   conn_list_t *fw;
 {
   key_req_t *tmp;
   conn_list_t *fw;
-
-  tmp = xmalloc(sizeof(key_req_t)+strlen(my_public_key_base36));
+cp
+  tmp = xmalloc(sizeof(*tmp)+strlen(my_public_key_base36));
   tmp->type = ANS_KEY;
   tmp->to = to;
   tmp->from = myself->vpn_ip;
   tmp->type = ANS_KEY;
   tmp->to = to;
   tmp->from = myself->vpn_ip;
@@ -323,15 +325,23 @@ int send_key_answer(conn_list_t *cl, ip_t to)
   strcpy(&tmp->key, my_public_key_base36);
 
   fw = lookup_conn(to);
   strcpy(&tmp->key, my_public_key_base36);
 
   fw = lookup_conn(to);
+  
+  if(!fw)
+  {
+    syslog(LOG_ERR, "Attempting to send key answer to " IP_ADDR_S ", which does not exist?",
+          IP_ADDR_V(to));
+    return -1;
+  }
+  
   if(debug_lvl > 2)
     syslog(LOG_DEBUG, "Sending public key to " IP_ADDR_S,
           IP_ADDR_V(fw->nexthop->vpn_ip));
   if(debug_lvl > 2)
     syslog(LOG_DEBUG, "Sending public key to " IP_ADDR_S,
           IP_ADDR_V(fw->nexthop->vpn_ip));
-  if(send(fw->nexthop->meta_socket, tmp, sizeof(key_req_t)+tmp->len, 0) < 0)
+  if(write(fw->nexthop->meta_socket, tmp, sizeof(*tmp)+tmp->len) < 0)
     {
       syslog(LOG_ERR, "send failed: %s:%d: %m", __FILE__, __LINE__);
       return -1;
     }
     {
       syslog(LOG_ERR, "send failed: %s:%d: %m", __FILE__, __LINE__);
       return -1;
     }
-
+cp
   return 0;
 }
 
   return 0;
 }
 
@@ -344,11 +354,11 @@ int notify_others(conn_list_t *new, conn_list_t *source,
                  int (*function)(conn_list_t*, conn_list_t*))
 {
   conn_list_t *p;
                  int (*function)(conn_list_t*, conn_list_t*))
 {
   conn_list_t *p;
-
+cp
   for(p = conn_list; p != NULL; p = p->next)
     if(p != new && p != source && p->status.meta && p->protocol_version > PROT_3)
       function(p, new);
   for(p = conn_list; p != NULL; p = p->next)
     if(p != new && p != source && p->status.meta && p->protocol_version > PROT_3)
       function(p, new);
-
+cp
   return 0;
 }
 
   return 0;
 }
 
@@ -359,11 +369,11 @@ int notify_others(conn_list_t *new, conn_list_t *source,
 int notify_one(conn_list_t *new)
 {
   conn_list_t *p;
 int notify_one(conn_list_t *new)
 {
   conn_list_t *p;
-
+cp
   for(p = conn_list; p != NULL; p = p->next)
     if(p != new && p->protocol_version > PROT_3)
       send_add_host(new, p);
   for(p = conn_list; p != NULL; p = p->next)
     if(p != new && p->protocol_version > PROT_3)
       send_add_host(new, p);
-
+cp
   return 0;
 }
 
   return 0;
 }
 
@@ -374,7 +384,7 @@ int notify_one(conn_list_t *new)
 int basic_info_h(conn_list_t *cl, unsigned char *d, int len)
 {
   basic_info_t *tmp = (basic_info_t*)d;
 int basic_info_h(conn_list_t *cl, unsigned char *d, int len)
 {
   basic_info_t *tmp = (basic_info_t*)d;
-
+cp
   cl->protocol_version = tmp->protocol;
   cl->port = tmp->portnr;
   cl->vpn_ip = tmp->vpn_ip;
   cl->protocol_version = tmp->protocol;
   cl->port = tmp->portnr;
   cl->vpn_ip = tmp->vpn_ip;
@@ -408,14 +418,14 @@ int basic_info_h(conn_list_t *cl, unsigned char *d, int len)
     }
 
   cl->status.active = 0;
     }
 
   cl->status.active = 0;
-
+cp
   return 0;
 }
 
 int passphrase_h(conn_list_t *cl, unsigned char *d, int len)
 {
   passphrase_t *tmp = (passphrase_t*)d;
   return 0;
 }
 
 int passphrase_h(conn_list_t *cl, unsigned char *d, int len)
 {
   passphrase_t *tmp = (passphrase_t*)d;
-
+cp
   cl->pp = xmalloc(tmp->len+3);
   memcpy(cl->pp, tmp, tmp->len+3);
 
   cl->pp = xmalloc(tmp->len+3);
   memcpy(cl->pp, tmp, tmp->len+3);
 
@@ -426,7 +436,7 @@ int passphrase_h(conn_list_t *cl, unsigned char *d, int len)
     send_passphrase(cl);
   else
     send_public_key(cl);
     send_passphrase(cl);
   else
     send_public_key(cl);
-
+cp
   return 0;
 }
 
   return 0;
 }
 
@@ -434,7 +444,7 @@ int public_key_h(conn_list_t *cl, unsigned char *d, int len)
 {
   char *g_n;
   public_key_t *tmp = (public_key_t*)d;
 {
   char *g_n;
   public_key_t *tmp = (public_key_t*)d;
-
+cp
   if(debug_lvl > 2)
     syslog(LOG_DEBUG, "got PUBLIC_KEY(%hd,%s)", tmp->len, &tmp->key);
 
   if(debug_lvl > 2)
     syslog(LOG_DEBUG, "got PUBLIC_KEY(%hd,%s)", tmp->len, &tmp->key);
 
@@ -459,12 +469,13 @@ int public_key_h(conn_list_t *cl, unsigned char *d, int len)
   cl->status.active = 1;
   notify_others(cl, NULL, send_add_host);
   notify_one(cl);
   cl->status.active = 1;
   notify_others(cl, NULL, send_add_host);
   notify_one(cl);
-
+cp
   return 0;
 }
 
 int ack_h(conn_list_t *cl, unsigned char *d, int len)
 {
   return 0;
 }
 
 int ack_h(conn_list_t *cl, unsigned char *d, int len)
 {
+cp
   if(debug_lvl > 2)
     syslog(LOG_DEBUG, "got ACK");
   
   if(debug_lvl > 2)
     syslog(LOG_DEBUG, "got ACK");
   
@@ -472,6 +483,7 @@ int ack_h(conn_list_t *cl, unsigned char *d, int len)
   syslog(LOG_NOTICE, "Connection with %s activated.", cl->hostname);
 
   /*
   syslog(LOG_NOTICE, "Connection with %s activated.", cl->hostname);
 
   /*
+                        === FIXME ===
     Now I'm going to cheat. The meta protocol is actually
     a stream of requests, that may come in in the same TCP
     packet. This is the only place that it will happen,
     Now I'm going to cheat. The meta protocol is actually
     a stream of requests, that may come in in the same TCP
     packet. This is the only place that it will happen,
@@ -483,30 +495,32 @@ int ack_h(conn_list_t *cl, unsigned char *d, int len)
     {
       if(request_handlers[d[1]] == NULL)
        syslog(LOG_ERR, "Unknown request %d.", d[1]);
     {
       if(request_handlers[d[1]] == NULL)
        syslog(LOG_ERR, "Unknown request %d.", d[1]);
-      if(request_handlers[d[1]](cl, d, len - 1) < 0)
+      if(request_handlers[d[1]](cl, d + 1, len - 1) < 0)
        return -1;
     }
        return -1;
     }
-
+cp
   return 0;
 }
 
 int termreq_h(conn_list_t *cl, unsigned char *d, int len)
 {
   return 0;
 }
 
 int termreq_h(conn_list_t *cl, unsigned char *d, int len)
 {
+cp
   syslog(LOG_NOTICE, IP_ADDR_S " wants to quit", IP_ADDR_V(cl->vpn_ip));
   cl->status.termreq = 1;
   terminate_connection(cl);
 
   notify_others(cl, NULL, send_del_host);
   syslog(LOG_NOTICE, IP_ADDR_S " wants to quit", IP_ADDR_V(cl->vpn_ip));
   cl->status.termreq = 1;
   terminate_connection(cl);
 
   notify_others(cl, NULL, send_del_host);
-
+cp
   return 0;
 }
 
 int timeout_h(conn_list_t *cl, unsigned char *d, int len)
 {
   return 0;
 }
 
 int timeout_h(conn_list_t *cl, unsigned char *d, int len)
 {
+cp
   syslog(LOG_NOTICE, IP_ADDR_S " says it's gotten a timeout from us", IP_ADDR_V(cl->vpn_ip));
   cl->status.termreq = 1;
   terminate_connection(cl);
   syslog(LOG_NOTICE, IP_ADDR_S " says it's gotten a timeout from us", IP_ADDR_V(cl->vpn_ip));
   cl->status.termreq = 1;
   terminate_connection(cl);
-
+cp
   return 0;
 }
 
   return 0;
 }
 
@@ -514,7 +528,7 @@ int del_host_h(conn_list_t *cl, unsigned char *d, int len)
 {
   del_host_t *tmp = (del_host_t*)d;
   conn_list_t *fw;
 {
   del_host_t *tmp = (del_host_t*)d;
   conn_list_t *fw;
-
+cp
   if(debug_lvl > 2)
     syslog(LOG_DEBUG, "got DEL_HOST for " IP_ADDR_S,
           IP_ADDR_V(tmp->vpn_ip));
   if(debug_lvl > 2)
     syslog(LOG_DEBUG, "got DEL_HOST for " IP_ADDR_S,
           IP_ADDR_V(tmp->vpn_ip));
@@ -530,28 +544,30 @@ int del_host_h(conn_list_t *cl, unsigned char *d, int len)
 
   fw->status.termreq = 1;
   terminate_connection(fw);
 
   fw->status.termreq = 1;
   terminate_connection(fw);
-
+cp
   return 0;
 }
 
 int ping_h(conn_list_t *cl, unsigned char *d, int len)
 {
   return 0;
 }
 
 int ping_h(conn_list_t *cl, unsigned char *d, int len)
 {
+cp
   if(debug_lvl > 3)
     syslog(LOG_DEBUG, "responding to ping from " IP_ADDR_S, IP_ADDR_V(cl->vpn_ip));
   cl->status.pinged = 0;
   cl->status.got_pong = 1;
 
   send_pong(cl);
   if(debug_lvl > 3)
     syslog(LOG_DEBUG, "responding to ping from " IP_ADDR_S, IP_ADDR_V(cl->vpn_ip));
   cl->status.pinged = 0;
   cl->status.got_pong = 1;
 
   send_pong(cl);
-  
+cp
   return 0;
 }
 
 int pong_h(conn_list_t *cl, unsigned char *d, int len)
 {
   return 0;
 }
 
 int pong_h(conn_list_t *cl, unsigned char *d, int len)
 {
+cp
   if(debug_lvl > 3)
     syslog(LOG_DEBUG, "ok, got pong from " IP_ADDR_S, IP_ADDR_V(cl->vpn_ip));
   cl->status.got_pong = 1;
   if(debug_lvl > 3)
     syslog(LOG_DEBUG, "ok, got pong from " IP_ADDR_S, IP_ADDR_V(cl->vpn_ip));
   cl->status.got_pong = 1;
-
+cp
   return 0;
 }
 
   return 0;
 }
 
@@ -559,7 +575,7 @@ int add_host_h(conn_list_t *cl, unsigned char *d, int len)
 {
   add_host_t *tmp = (add_host_t*)d;
   conn_list_t *ncn, *fw;
 {
   add_host_t *tmp = (add_host_t*)d;
   conn_list_t *ncn, *fw;
-
+cp
   if(debug_lvl > 2)
     syslog(LOG_DEBUG, "Add host request from " IP_ADDR_S, IP_ADDR_V(cl->vpn_ip));
   if(debug_lvl > 3)
   if(debug_lvl > 2)
     syslog(LOG_DEBUG, "Add host request from " IP_ADDR_S, IP_ADDR_V(cl->vpn_ip));
   if(debug_lvl > 3)
@@ -589,15 +605,16 @@ int add_host_h(conn_list_t *cl, unsigned char *d, int len)
 
   /*
     again, i'm cheating here. see the comment in ack_h.
 
   /*
     again, i'm cheating here. see the comment in ack_h.
+    Naughty zarq! Now you see what cheating will get you... [GS]
   */
   */
-  if(len > sizeof(add_host_t)) /* Another ADD_HOST follows */
+  if(len > sizeof(*tmp)) /* Another ADD_HOST follows */
     {
     {
-      if(request_handlers[d[sizeof(add_host_t)]] == NULL)
-       syslog(LOG_ERR, "Unknown request %d.", d[sizeof(add_host_t)]);
-      if(request_handlers[d[sizeof(add_host_t)]](cl, d, len - sizeof(add_host_t)) < 0)
+      if(request_handlers[d[sizeof(*tmp)]] == NULL)
+       syslog(LOG_ERR, "Unknown request %d.", d[sizeof(*tmp)]);
+      if(request_handlers[d[sizeof(*tmp)]](cl, d + sizeof(*tmp), len - sizeof(*tmp)) < 0)
        return -1;
     }
        return -1;
     }
-
+cp
   return 0;
 }
 
   return 0;
 }
 
@@ -605,7 +622,7 @@ int req_key_h(conn_list_t *cl, unsigned char *d, int len)
 {
   key_req_t *tmp = (key_req_t*)d;
   conn_list_t *fw;
 {
   key_req_t *tmp = (key_req_t*)d;
   conn_list_t *fw;
-
+cp
   if(debug_lvl > 2)
     syslog(LOG_DEBUG, "got REQ_KEY from " IP_ADDR_S " for " IP_ADDR_S,
           IP_ADDR_V(tmp->from), IP_ADDR_V(tmp->to));
   if(debug_lvl > 2)
     syslog(LOG_DEBUG, "got REQ_KEY from " IP_ADDR_S " for " IP_ADDR_S,
           IP_ADDR_V(tmp->from), IP_ADDR_V(tmp->to));
@@ -617,25 +634,33 @@ int req_key_h(conn_list_t *cl, unsigned char *d, int len)
     }
 
   fw = lookup_conn(tmp->to);
     }
 
   fw = lookup_conn(tmp->to);
+  
+  if(!fw)
+  {
+    syslog(LOG_ERR, "Attempting to forward key request to " IP_ADDR_S ", which does not exist?",
+          IP_ADDR_V(tmp->to));
+    return -1;
+  }
+
   if(debug_lvl > 3)
     syslog(LOG_DEBUG, "Forwarding request for public key to " IP_ADDR_S,
           IP_ADDR_V(fw->nexthop->vpn_ip));
   if(debug_lvl > 3)
     syslog(LOG_DEBUG, "Forwarding request for public key to " IP_ADDR_S,
           IP_ADDR_V(fw->nexthop->vpn_ip));
-  if(send(fw->nexthop->meta_socket, tmp, sizeof(key_req_t), 0) < 0)
+  if(write(fw->nexthop->meta_socket, tmp, sizeof(*tmp)) < 0)
     {
       syslog(LOG_ERR, "send failed: %s:%d: %m", __FILE__, __LINE__);
       return -1;
     }
     {
       syslog(LOG_ERR, "send failed: %s:%d: %m", __FILE__, __LINE__);
       return -1;
     }
-
+cp
   return 0;
 }
 
 void set_keys(conn_list_t *cl, key_req_t *k)
 {
   char *ek;
   return 0;
 }
 
 void set_keys(conn_list_t *cl, key_req_t *k)
 {
   char *ek;
-
+cp
   if(!cl->public_key)
     {
   if(!cl->public_key)
     {
-      cl->public_key = xmalloc(sizeof(enc_key_t));
+      cl->public_key = xmalloc(sizeof(*cl->key));
       cl->public_key->key = NULL;
     }
   if(cl->public_key->key)
       cl->public_key->key = NULL;
     }
   if(cl->public_key->key)
@@ -648,7 +673,7 @@ void set_keys(conn_list_t *cl, key_req_t *k)
   ek = make_shared_key(&(k->key));
   if(!cl->key)
     {
   ek = make_shared_key(&(k->key));
   if(!cl->key)
     {
-      cl->key = xmalloc(sizeof(enc_key_t));
+      cl->key = xmalloc(sizeof(*cl->key));
       cl->key->key = NULL;
     }
   if(cl->key->key)
       cl->key->key = NULL;
     }
   if(cl->key->key)
@@ -657,13 +682,14 @@ void set_keys(conn_list_t *cl, key_req_t *k)
   cl->key->expiry = k->expiry;
   cl->key->key = xmalloc(strlen(ek) + 1);
   strcpy(cl->key->key, ek);
   cl->key->expiry = k->expiry;
   cl->key->key = xmalloc(strlen(ek) + 1);
   strcpy(cl->key->key, ek);
+cp
 }
 
 int ans_key_h(conn_list_t *cl, unsigned char *d, int len)
 {
   key_req_t *tmp = (key_req_t*)d;
   conn_list_t *fw, *gk;
 }
 
 int ans_key_h(conn_list_t *cl, unsigned char *d, int len)
 {
   key_req_t *tmp = (key_req_t*)d;
   conn_list_t *fw, *gk;
-
+cp
   if(debug_lvl > 3)
     syslog(LOG_DEBUG, "got ANS_KEY from " IP_ADDR_S " for " IP_ADDR_S,
           IP_ADDR_V(tmp->from), IP_ADDR_V(tmp->to));
   if(debug_lvl > 3)
     syslog(LOG_DEBUG, "got ANS_KEY from " IP_ADDR_S " for " IP_ADDR_S,
           IP_ADDR_V(tmp->from), IP_ADDR_V(tmp->to));
@@ -673,6 +699,14 @@ int ans_key_h(conn_list_t *cl, unsigned char *d, int len)
       if(debug_lvl > 2)
        syslog(LOG_DEBUG, "Yeah! key arrived. Now do something with it.");
       gk = lookup_conn(tmp->from);
       if(debug_lvl > 2)
        syslog(LOG_DEBUG, "Yeah! key arrived. Now do something with it.");
       gk = lookup_conn(tmp->from);
+
+      if(!gk)
+        {
+          syslog(LOG_ERR, "Receiving key from " IP_ADDR_S ", which does not exist?",
+                IP_ADDR_V(tmp->from));
+          return -1;
+        }
+
       set_keys(gk, tmp);
       gk->status.validkey = 1;
       gk->status.waitingforkey = 0;
       set_keys(gk, tmp);
       gk->status.validkey = 1;
       gk->status.waitingforkey = 0;
@@ -681,15 +715,23 @@ int ans_key_h(conn_list_t *cl, unsigned char *d, int len)
     }
 
   fw = lookup_conn(tmp->to);
     }
 
   fw = lookup_conn(tmp->to);
+  
+  if(!fw)
+  {
+    syslog(LOG_ERR, "Attempting to forward key to " IP_ADDR_S ", which does not exist?",
+          IP_ADDR_V(tmp->to));
+    return -1;
+  }
+
   if(debug_lvl > 2)
     syslog(LOG_DEBUG, "Forwarding public key to " IP_ADDR_S,
           IP_ADDR_V(fw->nexthop->vpn_ip));
   if(debug_lvl > 2)
     syslog(LOG_DEBUG, "Forwarding public key to " IP_ADDR_S,
           IP_ADDR_V(fw->nexthop->vpn_ip));
-  if(send(fw->nexthop->meta_socket, tmp, sizeof(key_req_t)+tmp->len, 0) < 0)
+  if(write(fw->nexthop->meta_socket, tmp, sizeof(*tmp)+tmp->len) < 0)
     {
       syslog(LOG_ERR, "send failed: %s:%d: %m", __FILE__, __LINE__);
       return -1;
     }
     {
       syslog(LOG_ERR, "send failed: %s:%d: %m", __FILE__, __LINE__);
       return -1;
     }
-
+cp
   return 0;
 }
 
   return 0;
 }
 
@@ -697,12 +739,20 @@ int key_changed_h(conn_list_t *cl, unsigned char *d, int len)
 {
   key_changed_t *tmp = (key_changed_t*)d;
   conn_list_t *ik;
 {
   key_changed_t *tmp = (key_changed_t*)d;
   conn_list_t *ik;
-
+cp
   if(debug_lvl > 2)
     syslog(LOG_DEBUG, "got KEY_CHANGED from " IP_ADDR_S,
           IP_ADDR_V(tmp->from));
 
   ik = lookup_conn(tmp->from);
   if(debug_lvl > 2)
     syslog(LOG_DEBUG, "got KEY_CHANGED from " IP_ADDR_S,
           IP_ADDR_V(tmp->from));
 
   ik = lookup_conn(tmp->from);
+
+  if(!ik)
+    {
+      syslog(LOG_ERR, "Got changed key from " IP_ADDR_S ", which does not exist?",
+            IP_ADDR_V(tmp->from));
+      return -1;
+    }
+
   ik->status.validkey = 0;
   ik->status.waitingforkey = 0;
 
   ik->status.validkey = 0;
   ik->status.waitingforkey = 0;
 
@@ -710,7 +760,7 @@ int key_changed_h(conn_list_t *cl, unsigned char *d, int len)
     syslog(LOG_DEBUG, "Forwarding key invalidation request");
 
   notify_others(cl, ik, send_key_changed);
     syslog(LOG_DEBUG, "Forwarding key invalidation request");
 
   notify_others(cl, ik, send_key_changed);
-
+cp
   return 0;
 }
 
   return 0;
 }
 
@@ -736,4 +786,3 @@ int (*request_handlers[256])(conn_list_t*, unsigned char*, int) = {
   0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
   0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0
 };
   0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
   0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0
 };
-