3561c52c20a9a265d755b597b3fc181826d505a3
[crypto.git] / apps / silcmap / silcmap.c
1 /*
2
3   silcmap.c
4
5   Author: Pekka Riikonen <priikone@silcnet.org>
6
7   Copyright (C) 2003 Pekka Riikonen
8
9   This program is free software; you can redistribute it and/or modify
10   it under the terms of the GNU General Public License as published by
11   the Free Software Foundation; version 2 of the License.
12
13   This program is distributed in the hope that it will be useful,
14   but WITHOUT ANY WARRANTY; without even the implied warranty of
15   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16   GNU General Public License for more details.
17
18 */
19
20 #include "silcincludes.h"
21 #include "silcclient.h"
22 #include "silcversion.h"
23 #include "silcmap.h"
24
25 /* Allocates new SilcMap context and the SilcClient in it. */
26
27 SilcMap silc_map_alloc(const char *conffile)
28 {
29   SilcMap map = silc_calloc(1, sizeof(*map));
30   if (!map)
31     return NULL;
32
33   /* Allocate client */
34   map->client = silc_client_alloc(&silc_map_client_ops, NULL, NULL, NULL);
35   if (!map->client) {
36     silc_free(map);
37     return NULL;
38   }
39
40   map->client->username = strdup("silcmap");
41   map->client->hostname = silc_net_localhost();
42   map->client->realname = strdup("silcmap");
43
44   /* Init the client */
45   if (!silc_client_init(map->client)) {
46     silc_client_free(map->client);
47     silc_free(map);
48     return NULL;
49   }
50
51   /* Load new key pair if it exists, create if it doesn't. */
52   if (!silc_load_key_pair("silcmap.pub", "silcmap.prv", "",
53                           &map->client->pkcs,
54                           &map->client->public_key,
55                           &map->client->private_key)) {
56     /* The keys don't exist.  Let's generate us a key pair then!  There's
57        nice ready routine for that too.  Let's do 1024 bit RSA key pair. */
58     if (!silc_create_key_pair("rsa", 1024, "silcmap.pub",
59                               "silcmap.prv", NULL, "",
60                               &map->client->pkcs,
61                               &map->client->public_key,
62                               &map->client->private_key, FALSE)) {
63       fprintf(stderr, "Could not create new key pair");
64       silc_client_free(map->client);
65       silc_free(map);
66       return NULL;
67     }
68   }
69
70   map->conffile = strdup(conffile);
71
72   return map;
73 }
74
75 /* Free the SilcMap context and all data in it. */
76
77 void silc_map_free(SilcMap map)
78 {
79   SilcMapConnection mapconn;
80   SilcMapCommand cmd;
81   char *h;
82   int i;
83
84   silc_free(map->conffile);
85   silc_free(map->bitmap);
86
87   if (map->client) {
88     silc_free(map->client->username);
89     silc_free(map->client->realname);
90     silc_free(map->client->hostname);
91     silc_client_free(map->client);
92   }
93
94   if (map->conns) {
95     silc_dlist_start(map->conns);
96     while ((mapconn = silc_dlist_get(map->conns)) != SILC_LIST_END) {
97       silc_dlist_start(mapconn->hostnames);
98       while ((h = silc_dlist_get(mapconn->hostnames)) != SILC_LIST_END)
99         silc_free(h);
100       silc_dlist_uninit(mapconn->hostnames);
101
102       silc_dlist_start(mapconn->ips);
103       while ((h = silc_dlist_get(mapconn->ips)) != SILC_LIST_END)
104         silc_free(h);
105       silc_dlist_uninit(mapconn->ips);
106
107       silc_dlist_start(mapconn->commands);
108       while ((cmd = silc_dlist_get(mapconn->commands)) != SILC_LIST_END) {
109         silc_free(cmd->filename);
110         silc_free(cmd->text);
111         silc_free(cmd);
112       }
113       silc_dlist_uninit(mapconn->commands);
114
115       silc_free(mapconn->public_key);
116       silc_free(mapconn->country);
117       silc_free(mapconn->city);
118       silc_free(mapconn->admin);
119       silc_free(mapconn->description);
120       silc_free(mapconn->html_url);
121       silc_free(mapconn->up_color);
122       silc_free(mapconn->up_text_color);
123       silc_free(mapconn->down_color);
124       silc_free(mapconn->down_text_color);
125       silc_free(mapconn->data.motd);
126       silc_free(mapconn);
127     }
128     silc_dlist_uninit(map->conns);
129   }
130
131   for (i = 0; i < map->writemaphtml_count; i++) {
132     silc_free(map->writemaphtml[i].filename);
133     silc_free(map->writemaphtml[i].text);
134   }
135   silc_free(map->writemaphtml);
136
137   for (i = 0; i < map->cut_count; i++)
138     silc_free(map->cut[i].filename);
139   silc_free(map->cut);
140
141   silc_free(map->writemap.filename);
142   silc_free(map->writehtml.filename);
143   silc_free(map->writehtml.text);
144
145   silc_free(map);
146 }
147
148 /* Starts the actual silcmap by parsing the commands script. */
149
150 SILC_TASK_CALLBACK(silc_map_start)
151 {
152   SilcMap map = context;
153
154   /* Load default font */
155   silc_map_load_font(map, "default.fnt");
156
157   /* Start command parsing.  Most of the commands are executed when they
158      are parsed so most of the real magic happens here. */
159   if (!silc_map_commands_parse(map, map->conffile)) {
160     /* Program stops */
161     silc_schedule_stop(map->client->schedule);
162   }
163 }
164
165 /* Long command line options */
166 static struct option long_opts[] =
167 {
168   { "config-file", 1, NULL, 'f' },
169   { "debug", 2, NULL, 'd' },
170   { "help", 0, NULL, 'h' },
171   { "version", 0, NULL,'V' },
172
173   { NULL, 0, NULL, 0 }
174 };
175
176 static void silc_map_usage(void)
177 {
178   printf(""
179 "Usage: silcmap [options]\n"
180 "\n"
181 "  Generic Options:\n"
182 "  -f  --config-file=FILE        Alternate SILC Map configuration file\n"
183 "  -d  --debug=string            Enable debugging\n"
184 "  -h  --help                    Display this message and exit\n"
185 "  -V  --version                 Display version and exit\n"
186 "\n");
187   exit(0);
188 }
189
190 int main(int argc, char **argv)
191 {
192   SilcMap map;
193   int opt, option_index;
194   char *filename = NULL;
195
196   if (argc > 1) {
197     while ((opt = getopt_long(argc, argv, "f:d:hV",
198                               long_opts, &option_index)) != EOF) {
199       switch(opt) {
200         case 'h':
201           silc_map_usage();
202           break;
203         case 'V':
204           printf("SILC Map, version %s\n", silc_dist_version);
205           printf("(c) 2003 Pekka Riikonen <priikone@silcnet.org>\n");
206           exit(0);
207           break;
208         case 'd':
209 #ifdef SILC_DEBUG
210           silc_debug = TRUE;
211           silc_debug_hexdump = TRUE;
212           if (optarg)
213             silc_log_set_debug_string(optarg);
214           silc_log_quick = TRUE;
215 #else
216           fprintf(stderr,
217                   "Run-time debugging is not enabled. To enable it recompile\n"
218                   "the server with --enable-debug configuration option.\n");
219 #endif
220           break;
221         case 'f':
222           filename = strdup(optarg);
223           break;
224         default:
225           silc_map_usage();
226           break;
227       }
228     }
229   }
230
231   /* Allocate map context */
232   if (!filename)
233     filename = strdup("silcmap.conf");
234   map = silc_map_alloc(filename);
235   if (!map)
236     return 1;
237
238   /* Schedule for command script parsing */
239   silc_schedule_task_add(map->client->schedule, 0,
240                          silc_map_start, map, 0, 1,
241                          SILC_TASK_TIMEOUT, SILC_TASK_PRI_NORMAL);
242
243   /* Run the silcmap client */
244   silc_client_run(map->client);
245
246   /* Cleanup */
247   silc_client_stop(map->client);
248   silc_map_free(map);
249   silc_free(filename);
250
251   return 0;
252 }