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 memset(mapconn, 'F', sizeof(*mapconn));
127 silc_free(mapconn);
128 }
129 silc_dlist_uninit(map->conns);
130 }
131
132 for (i = 0; i < map->writemaphtml_count; i++) {
133 silc_free(map->writemaphtml[i].filename);
134 silc_free(map->writemaphtml[i].text);
135 }
136 silc_free(map->writemaphtml);
137
138 for (i = 0; i < map->cut_count; i++)
139 silc_free(map->cut[i].filename);
140 silc_free(map->cut);
141
142 silc_free(map->writemap.filename);
143 silc_free(map->writehtml.filename);
144 silc_free(map->writehtml.text);
145 silc_free(map->writerel.filename);
146 silc_free(map->writerel.text);
147
148 silc_free(map);
149 }
150
151 /* Starts the actual silcmap by parsing the commands script. */
152
153 SILC_TASK_CALLBACK(silc_map_start)
154 {
155 SilcMap map = context;
156
157 /* Load default font */
158 silc_map_load_font(map, "default.fnt");
159
160 /* Start command parsing. Most of the commands are executed when they
161 are parsed so most of the real magic happens here. */
162 if (!silc_map_commands_parse(map, map->conffile)) {
163 /* Program stops */
164 silc_schedule_stop(map->client->schedule);
165 }
166 }
167
168 /* Long command line options */
169 static struct option long_opts[] =
170 {
171 { "config-file", 1, NULL, 'f' },
172 { "debug", 2, NULL, 'd' },
173 { "help", 0, NULL, 'h' },
174 { "version", 0, NULL,'V' },
175
176 { NULL, 0, NULL, 0 }
177 };
178
179 static void silc_map_usage(void)
180 {
181 printf(""
182 "Usage: silcmap [options]\n"
183 "\n"
184 " Generic Options:\n"
185 " -f --config-file=FILE Alternate SILC Map configuration file\n"
186 " -d --debug=string Enable debugging\n"
187 " -h --help Display this message and exit\n"
188 " -V --version Display version and exit\n"
189 "\n");
190 exit(0);
191 }
192
193 int main(int argc, char **argv)
194 {
195 SilcMap map;
196 int opt, option_index;
197 char *filename = NULL;
198
199 if (argc > 1) {
200 while ((opt = getopt_long(argc, argv, "f:d:hV",
201 long_opts, &option_index)) != EOF) {
202 switch(opt) {
203 case 'h':
204 silc_map_usage();
205 break;
206 case 'V':
207 printf("SILC Map, version %s\n", silc_dist_version);
208 printf("(c) 2003 Pekka Riikonen <priikone@silcnet.org>\n");
209 exit(0);
210 break;
211 case 'd':
212 #ifdef SILC_DEBUG
213 silc_debug = TRUE;
214 silc_debug_hexdump = TRUE;
215 if (optarg)
216 silc_log_set_debug_string(optarg);
217 silc_log_quick = TRUE;
218 #else
219 fprintf(stderr,
220 "Run-time debugging is not enabled. To enable it recompile\n"
221 "the server with --enable-debug configuration option.\n");
222 #endif
223 break;
224 case 'f':
225 filename = strdup(optarg);
226 break;
227 default:
228 silc_map_usage();
229 break;
230 }
231 }
232 }
233
234 /* Allocate map context */
235 if (!filename)
236 filename = strdup("silcmap.conf");
237 map = silc_map_alloc(filename);
238 if (!map)
239 return 1;
240
241 /* Schedule for command script parsing */
242 silc_schedule_task_add(map->client->schedule, 0,
243 silc_map_start, map, 0, 1,
244 SILC_TASK_TIMEOUT, SILC_TASK_PRI_NORMAL);
245
246 /* Run the silcmap client */
247 silc_client_run(map->client);
248
249 /* Cleanup */
250 silc_client_stop(map->client);
251 silc_map_free(map);
252 silc_free(filename);
253
254 return 0;
255 }
256
This page was automatically generated by the LXR engine.
Free-text search provided by Glimpse