along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- $Id: protocol.c,v 1.28.4.35 2000/09/22 16:20:07 guus Exp $
+ $Id: protocol.c,v 1.28.4.38 2000/10/11 22:01:00 guus Exp $
*/
#include "config.h"
#include "net.h"
#include "netutl.h"
#include "protocol.h"
+#include "meta.h"
#include "system.h"
return 1;
}
-/* Generic outgoing request routine - takes care of logging and error detection as well */
+/* Generic request routines - takes care of logging and error detection as well */
int send_request(conn_list_t *cl, const char *format, int request, /*args*/ ...)
{
if(debug_lvl >= DEBUG_PROTOCOL)
syslog(LOG_DEBUG, _("Sending %s to %s (%s)"), request_name[request], cl->name, cl->hostname);
cp
- return send_meta(cl, buffer, length);
+ return send_meta(cl, buffer, len);
}
-
-int send_meta(conn_list_t *cl, const char *buffer, int length)
+int receive_request(conn_list_t *cl)
{
-cp
- if(debug_lvl >= DEBUG_META)
- syslog(LOG_DEBUG, _("Sending %d bytes of metadata to %s (%s): %s"), int length,
- cl->name, cl->hostname, buffer);
-
- if(cl->status.encryptin)
+ int request;
+cp
+ if(sscanf(cl->buffer, "%d", &request) == 1)
{
- /* FIXME: Do encryption */
+ if((request < 0) || (request > 255) || (request_handlers[request] == NULL))
+ {
+ syslog(LOG_ERR, _("Unknown request from %s (%s)"),
+ cl->name, cl->hostname);
+ return -1;
+ }
+ else
+ {
+ if(debug_lvl > DEBUG_PROTOCOL)
+ syslog(LOG_DEBUG, _("Got %s from %s (%s)"),
+ request_name[request], cl->name, cl->hostname);
+ }
+ if(request_handlers[request](cl))
+ /* Something went wrong. Probably scriptkiddies. Terminate. */
+ {
+ syslog(LOG_ERR, _("Error while processing %s from %s (%s)"),
+ request_name[request], cl->name, cl->hostname);
+ return -1;
+ }
}
-
- if(write(cl->meta_socket, buffer, length) < 0)
+ else
{
- syslog(LOG_ERR, _("Sending meta data to %s (%s) failed: %m"), cl->name, cl->hostname);
+ syslog(LOG_ERR, _("Bogus data received from %s (%s)"),
+ cl->name, cl->hostname);
return -1;
}
-cp
- return 0;
-}
-
-int broadcast_meta(conn_list_t *cl, const char *buffer, int length)
-{
- conn_list_t *p;
-cp
- for(p = conn_list; p != NULL; p = p->next)
- if(p != cl && p->status.meta && p->status.active)
- send_meta(p, buffer, length);
-cp
- return 0;
}
/* Connection protocol:
/* Load information about peer */
- if(!read_id(cl))
+ if(!read_host_config(cl))
{
syslog(LOG_ERR, _("Peer %s had unknown identity (%s)"), cl->hostname, cl->name);
return -1;
/* Convert the random data to a hexadecimal formatted string */
bin2hex(cl->hischallenge,buffer,CHAL_LENGTH);
- buffer[keylength*2] = '\0';
+ buffer[CHAL_LENGTH*2] = '\0';
/* Send the challenge */
/* Check if subnet string is valid */
- if((subnet = str2net(subnetstr)) == -1)
+ if(!(subnet = str2net(subnetstr)))
{
syslog(LOG_ERR, _("Got bad ADD_SUBNET from %s (%s): invalid subnet string"), cl->name, cl->hostname);
free(name); free(subnetstr);
/* Check if the owner of the new subnet is in the connection list */
- if(!(owner = lookup_id(name))
+ if(!(owner = lookup_id(name)))
{
syslog(LOG_ERR, _("Got ADD_SUBNET for %s from %s (%s) which is not in our connection list"),
name, cl->name, cl->hostname);
}
/* If everything is correct, add the subnet to the list of the owner */
+
+ subnet_add(owner, subnet);
cp
- return subnet_add(owner, subnet);
+ return 0;
}
int send_del_subnet(conn_list_t *cl, conn_list_t *other, subnet_t *subnet)
/* Check if subnet string is valid */
- if((subnet = str2net(subnetstr)) == -1)
+ if(!(subnet = str2net(subnetstr)))
{
syslog(LOG_ERR, _("Got bad DEL_SUBNET from %s (%s): invalid subnet string"), cl->name, cl->hostname);
free(name); free(subnetstr);
/* Check if the owner of the new subnet is in the connection list */
- if(!(owner = lookup_id(name))
+ if(!(owner = lookup_id(name)))
{
syslog(LOG_ERR, _("Got DEL_SUBNET for %s from %s (%s) which is not in our connection list"),
name, cl->name, cl->hostname);
return -1;
}
- /* If everything is correct, add the subnet to the list of the owner */
+ /* If everything is correct, delete the subnet from the list of the owner */
+
+ subnet_del(subnet);
cp
- return subnet_del(owner, subnet);
+ return 0;
}
/* New and closed connections notification */
{
cp
return send_request(cl, "%d %s %s %lx:%d %lx", ADD_HOST,
- myself->name, other->name, other->real_ip, other->port, other->options);
+ myself->name, other->name, other->address, other->port, other->options);
}
int add_host_h(conn_list_t *cl)
/* Lookup his uplink */
- if(!(new->hisuplink = lookup_id(sender))
+ if(!(new->hisuplink = lookup_id(sender)))
{
syslog(LOG_ERR, _("Got ADD_HOST from %s (%s) with origin %s which is not in our connection list"),
sender, cl->name, cl->hostname);
/* Fill in more of the new conn_list structure */
- new->hostname = hostlookup(htonl(new->real_ip));
+ new->hostname = hostlookup(htonl(new->address));
/* Check if the new host already exists in the connnection list */
if((old = lookup_id(new->name)))
{
- if((new->real_ip == old->real_ip) && (new->port == old->port))
+ if((new->address == old->address) && (new->port == old->port))
{
if(debug_lvl > DEBUG_CONNECTIONS)
syslog(LOG_NOTICE, _("Got duplicate ADD_HOST for %s (%s) from %s (%s)"),
{
cp
return send_request(cl, "%d %s %s %lx:%d %lx", DEL_HOST,
- myself->name, other->name, other->real_ip, other->port, other->options);
+ myself->name, other->name, other->address, other->port, other->options);
}
int del_host_h(conn_list_t *cl)
/* Lookup his uplink */
- if(!(hisuplink = lookup_id(sender))
+ if(!(hisuplink = lookup_id(sender)))
{
syslog(LOG_ERR, _("Got DEL_HOST from %s (%s) with origin %s which is not in our connection list"),
cl->name, cl->hostname, sender);