9fd23a75d2e519d8d8d48b0ad4384fd977334f4a
[tinc] / src / connection.c
1 /*
2     connection.c -- connection list management
3     Copyright (C) 2000-2002 Guus Sliepen <guus@sliepen.eu.org>,
4                   2000-2002 Ivo Timmermans <ivo@o2w.nl>
5
6     This program is free software; you can redistribute it and/or modify
7     it under the terms of the GNU General Public License as published by
8     the Free Software Foundation; either version 2 of the License, or
9     (at your option) any later version.
10
11     This program is distributed in the hope that it will be useful,
12     but WITHOUT ANY WARRANTY; without even the implied warranty of
13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14     GNU General Public License for more details.
15
16     You should have received a copy of the GNU General Public License
17     along with this program; if not, write to the Free Software
18     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19
20     $Id: connection.c,v 1.1.2.32 2002/09/09 19:39:58 guus Exp $
21 */
22
23 #include "config.h"
24
25 #include <stdio.h>
26 #include <syslog.h>
27 #include <string.h>
28 #include <sys/time.h>
29
30 #include <avl_tree.h>
31 #include <list.h>
32
33 #include "net.h"        /* Don't ask. */
34 #include "netutl.h"
35 #include "config.h"
36 #include "conf.h"
37 #include <utils.h>
38 #include "subnet.h"
39
40 #include "xalloc.h"
41 #include "system.h"
42
43 avl_tree_t *connection_tree;    /* Meta connections */
44 connection_t *broadcast;
45
46 int connection_compare(connection_t *a, connection_t *b)
47 {
48   return a - b;
49 }
50
51 void init_connections(void)
52 {
53   cp();
54   connection_tree = avl_alloc_tree((avl_compare_t)connection_compare, NULL);
55   cp();
56   broadcast = new_connection();
57   broadcast->name = xstrdup(_("everyone"));
58   broadcast->hostname = xstrdup(_("BROADCAST"));
59   cp();
60 }
61
62 void exit_connections(void)
63 {
64   cp();
65   avl_delete_tree(connection_tree);
66   cp();
67   free_connection(broadcast);
68   cp();
69 }
70
71 connection_t *new_connection(void)
72 {
73   connection_t *c;
74   cp();
75   c = (connection_t *)xmalloc_and_zero(sizeof(connection_t));
76
77   if(!c)
78     return NULL;
79
80   gettimeofday(&c->start, NULL);
81   cp();
82   return c;
83 }
84
85 void free_connection(connection_t *c)
86 {
87   cp();
88   if(c->hostname)
89     free(c->hostname);
90   if(c->inkey)
91     free(c->inkey);
92   if(c->outkey)
93     free(c->outkey);
94   if(c->mychallenge)
95     free(c->mychallenge);
96   if(c->hischallenge)
97     free(c->hischallenge);
98   free(c);
99   cp();
100 }
101
102 void connection_add(connection_t *c)
103 {
104   cp();
105   avl_insert(connection_tree, c);
106   cp();
107 }
108
109 void connection_del(connection_t *c)
110 {
111   cp();
112   avl_delete(connection_tree, c);
113   cp();
114 }
115
116 void dump_connections(void)
117 {
118   avl_node_t *node;
119   connection_t *c;
120   cp();
121   syslog(LOG_DEBUG, _("Connections:"));
122
123   for(node = connection_tree->head; node; node = node->next)
124     {
125       c = (connection_t *)node->data;
126       syslog(LOG_DEBUG, _(" %s at %s options %lx socket %d status %04x"),
127              c->name, c->hostname, c->options, c->socket, c->status);
128     }
129     
130   syslog(LOG_DEBUG, _("End of connections."));
131   cp();
132 }
133
134 int read_connection_config(connection_t *c)
135 {
136   char *fname;
137   int x;
138   cp();
139   asprintf(&fname, "%s/hosts/%s", confbase, c->name);
140   x = read_config_file(c->config_tree, fname);
141   free(fname);
142   cp();
143   return x;
144 }