source: conf.c @ 2c2df7d

Last change on this file since 2c2df7d was 2c2df7d, checked in by ulim <a.sporto+bee@…>, at 2007-11-28T21:07:30Z

Initial import of jabber file receive and DCC send support. This introduces
only a few changes to bitlbees code, mainly the addition of the "transfers"
command.

This is known to work with Kopete, Psi, and Pidgin (formerly known as gaim).
At least with Pidgin also over a proxy. DCC has only been tested with irssi.
IPV6 is untested but should work.

Currently, only receiving via SOCKS5BYTESREAMS is implemented. I'm not sure if
the alternative(in-band bytestreams IBB) is worth implementing since I didn't
see a client yet that can do it. Additionally, it is probably very slow and
needs support by the server as well.

  • Property mode set to 100644
File size: 9.1 KB
Line 
1  /********************************************************************\
2  * BitlBee -- An IRC to other IM-networks gateway                     *
3  *                                                                    *
4  * Copyright 2002-2005 Wilmer van der Gaast and others                *
5  \********************************************************************/
6
7/* Configuration reading code                                           */
8
9/*
10  This program is free software; you can redistribute it and/or modify
11  it under the terms of the GNU General Public License as published by
12  the Free Software Foundation; either version 2 of the License, or
13  (at your option) any later version.
14
15  This program is distributed in the hope that it will be useful,
16  but WITHOUT ANY WARRANTY; without even the implied warranty of
17  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  GNU General Public License for more details.
19
20  You should have received a copy of the GNU General Public License with
21  the Debian GNU/Linux distribution in /usr/share/common-licenses/GPL;
22  if not, write to the Free Software Foundation, Inc., 59 Temple Place,
23  Suite 330, Boston, MA  02111-1307  USA
24*/
25
26#include "bitlbee.h"
27
28#include <stdio.h>
29#include <string.h>
30#include <stdlib.h>
31#include "conf.h"
32#include "ini.h"
33#include "url.h"
34#include "ipc.h"
35
36#include "proxy.h"
37
38char *CONF_FILE;
39
40static int conf_loadini( conf_t *conf, char *file );
41
42conf_t *conf_load( int argc, char *argv[] )
43{
44        conf_t *conf;
45        int opt, i;
46       
47        conf = g_new0( conf_t, 1 );
48       
49        conf->iface = NULL;
50        conf->port = g_strdup( "6667" );
51        conf->nofork = 0;
52        conf->verbose = 0;
53        conf->primary_storage = g_strdup( "xml" );
54        conf->migrate_storage = g_strsplit( "text", ",", -1 );
55        conf->runmode = RUNMODE_INETD;
56        conf->authmode = AUTHMODE_OPEN;
57        conf->auth_pass = NULL;
58        conf->oper_pass = NULL;
59        conf->configdir = g_strdup( CONFIG );
60        conf->plugindir = g_strdup( PLUGINDIR );
61        conf->pidfile = g_strdup( PIDFILE );
62        conf->motdfile = g_strdup( ETCDIR "/motd.txt" );
63        conf->ping_interval = 180;
64        conf->ping_timeout = 300;
65        conf->max_filetransfer_size = G_MAXUINT;
66        proxytype = 0;
67       
68        i = conf_loadini( conf, CONF_FILE );
69        if( i == 0 )
70        {
71                fprintf( stderr, "Error: Syntax error in configuration file `%s'.\n", CONF_FILE );
72                return( NULL );
73        }
74        else if( i == -1 )
75        {
76                fprintf( stderr, "Warning: Unable to read configuration file `%s'.\n", CONF_FILE );
77        }
78       
79        while( argc > 0 && ( opt = getopt( argc, argv, "i:p:P:nvIDFc:d:hR:" ) ) >= 0 )
80        /*     ^^^^ Just to make sure we skip this step from the REHASH handler. */
81        {
82                if( opt == 'i' )
83                {
84                        conf->iface = g_strdup( optarg );
85                }
86                else if( opt == 'p' )
87                {
88                        g_free( conf->port );
89                        conf->port = g_strdup( optarg );
90                }
91                else if( opt == 'P' )
92                {
93                        g_free( conf->pidfile );
94                        conf->pidfile = g_strdup( optarg );
95                }
96                else if( opt == 'n' )
97                        conf->nofork = 1;
98                else if( opt == 'v' )
99                        conf->verbose = 1;
100                else if( opt == 'I' )
101                        conf->runmode = RUNMODE_INETD;
102                else if( opt == 'D' )
103                        conf->runmode = RUNMODE_DAEMON;
104                else if( opt == 'F' )
105                        conf->runmode = RUNMODE_FORKDAEMON;
106                else if( opt == 'c' )
107                {
108                        if( strcmp( CONF_FILE, optarg ) != 0 )
109                        {
110                                g_free( CONF_FILE );
111                                CONF_FILE = g_strdup( optarg );
112                                g_free( conf );
113                                /* Re-evaluate arguments. Don't use this option twice,
114                                   you'll end up in an infinite loop! Hope this trick
115                                   works with all libcs BTW.. */
116                                optind = 1;
117                                return( conf_load( argc, argv ) );
118                        }
119                }
120                else if( opt == 'd' )
121                {
122                        g_free( conf->configdir );
123                        conf->configdir = g_strdup( optarg );
124                }
125                else if( opt == 'h' )
126                {
127                        printf( "Usage: bitlbee [-D/-F [-i <interface>] [-p <port>] [-n] [-v]] [-I]\n"
128                                "               [-c <file>] [-d <dir>] [-h]\n"
129                                "\n"
130                                "An IRC-to-other-chat-networks gateway\n"
131                                "\n"
132                                "  -I  Classic/InetD mode. (Default)\n"
133                                "  -D  Daemon mode. (Still EXPERIMENTAL!)\n"
134                                "  -F  Forking daemon. (one process per client)\n"
135                                "  -P  Specify PID-file (not for inetd mode)\n"
136                                "  -i  Specify the interface (by IP address) to listen on.\n"
137                                "      (Default: 0.0.0.0 (any interface))\n"
138                                "  -p  Port number to listen on. (Default: 6667)\n"
139                                "  -n  Don't fork.\n"
140                                "  -v  Be verbose (only works in combination with -n)\n"
141                                "  -c  Load alternative configuration file\n"
142                                "  -d  Specify alternative user configuration directory\n"
143                                "  -h  Show this help page.\n" );
144                        return( NULL );
145                }
146                else if( opt == 'R' )
147                {
148                        /* We can't load the statefile yet (and should make very sure we do this
149                           only once), so set the filename here and load the state information
150                           when initializing ForkDaemon. (This option only makes sense in that
151                           mode anyway!) */
152                        ipc_master_set_statefile( optarg );
153                }
154        }
155       
156        if( conf->configdir[strlen(conf->configdir)-1] != '/' )
157        {
158                char *s = g_new( char, strlen( conf->configdir ) + 2 );
159               
160                sprintf( s, "%s/", conf->configdir );
161                g_free( conf->configdir );
162                conf->configdir = s;
163        }
164       
165        return( conf );
166}
167
168static int conf_loadini( conf_t *conf, char *file )
169{
170        ini_t *ini;
171        int i;
172       
173        ini = ini_open( file );
174        if( ini == NULL ) return( -1 );
175        while( ini_read( ini ) )
176        {
177                if( g_strcasecmp( ini->section, "settings" ) == 0 )
178                {
179                        if( g_strcasecmp( ini->key, "runmode" ) == 0 )
180                        {
181                                if( g_strcasecmp( ini->value, "daemon" ) == 0 )
182                                        conf->runmode = RUNMODE_DAEMON;
183                                else if( g_strcasecmp( ini->value, "forkdaemon" ) == 0 )
184                                        conf->runmode = RUNMODE_FORKDAEMON;
185                                else
186                                        conf->runmode = RUNMODE_INETD;
187                        }
188                        else if( g_strcasecmp( ini->key, "pidfile" ) == 0 )
189                        {
190                                g_free( conf->pidfile );
191                                conf->pidfile = g_strdup( ini->value );
192                        }
193                        else if( g_strcasecmp( ini->key, "daemoninterface" ) == 0 )
194                        {
195                                conf->iface = g_strdup( ini->value );
196                        }
197                        else if( g_strcasecmp( ini->key, "daemonport" ) == 0 )
198                        {
199                                conf->port = g_strdup( ini->value );
200                        }
201                        else if( g_strcasecmp( ini->key, "authmode" ) == 0 )
202                        {
203                                if( g_strcasecmp( ini->value, "registered" ) == 0 )
204                                        conf->authmode = AUTHMODE_REGISTERED;
205                                else if( g_strcasecmp( ini->value, "closed" ) == 0 )
206                                        conf->authmode = AUTHMODE_CLOSED;
207                                else
208                                        conf->authmode = AUTHMODE_OPEN;
209                        }
210                        else if( g_strcasecmp( ini->key, "authpassword" ) == 0 )
211                        {
212                                conf->auth_pass = g_strdup( ini->value );
213                        }
214                        else if( g_strcasecmp( ini->key, "operpassword" ) == 0 )
215                        {
216                                conf->oper_pass = g_strdup( ini->value );
217                        }
218                        else if( g_strcasecmp( ini->key, "hostname" ) == 0 )
219                        {
220                                conf->hostname = g_strdup( ini->value );
221                        }
222                        else if( g_strcasecmp( ini->key, "configdir" ) == 0 )
223                        {
224                                g_free( conf->configdir );
225                                conf->configdir = g_strdup( ini->value );
226                        }
227                        else if( g_strcasecmp( ini->key, "motdfile" ) == 0 )
228                        {
229                                g_free( conf->motdfile );
230                                conf->motdfile = g_strdup( ini->value );
231                        }
232                        else if( g_strcasecmp( ini->key, "account_storage" ) == 0 )
233                        {
234                                g_free( conf->primary_storage );
235                                conf->primary_storage = g_strdup( ini->value );
236                        }
237                        else if( g_strcasecmp( ini->key, "account_storage_migrate" ) == 0 )
238                        {
239                                g_strfreev( conf->migrate_storage );
240                                conf->migrate_storage = g_strsplit( ini->value, " \t,;", -1 );
241                        }
242                        else if( g_strcasecmp( ini->key, "pinginterval" ) == 0 )
243                        {
244                                if( sscanf( ini->value, "%d", &i ) != 1 )
245                                {
246                                        fprintf( stderr, "Invalid %s value: %s\n", ini->key, ini->value );
247                                        return( 0 );
248                                }
249                                conf->ping_interval = i;
250                        }
251                        else if( g_strcasecmp( ini->key, "pingtimeout" ) == 0 )
252                        {
253                                if( sscanf( ini->value, "%d", &i ) != 1 )
254                                {
255                                        fprintf( stderr, "Invalid %s value: %s\n", ini->key, ini->value );
256                                        return( 0 );
257                                }
258                                conf->ping_timeout = i;
259                        }
260                        else if( g_strcasecmp( ini->key, "proxy" ) == 0 )
261                        {
262                                url_t *url = g_new0( url_t, 1 );
263                               
264                                if( !url_set( url, ini->value ) )
265                                {
266                                        fprintf( stderr, "Invalid %s value: %s\n", ini->key, ini->value );
267                                        g_free( url );
268                                        return( 0 );
269                                }
270                               
271                                strncpy( proxyhost, url->host, sizeof( proxyhost ) );
272                                strncpy( proxyuser, url->user, sizeof( proxyuser ) );
273                                strncpy( proxypass, url->pass, sizeof( proxypass ) );
274                                proxyport = url->port;
275                                if( url->proto == PROTO_HTTP )
276                                        proxytype = PROXY_HTTP;
277                                else if( url->proto == PROTO_SOCKS4 )
278                                        proxytype = PROXY_SOCKS4;
279                                else if( url->proto == PROTO_SOCKS5 )
280                                        proxytype = PROXY_SOCKS5;
281                               
282                                g_free( url );
283                        }
284                        else
285                        {
286                                fprintf( stderr, "Error: Unknown setting `%s` in configuration file.\n", ini->key );
287                                return( 0 );
288                                /* For now just ignore unknown keys... */
289                        }
290                }
291                else if( g_strcasecmp( ini->section, "defaults" ) != 0 )
292                {
293                        fprintf( stderr, "Error: Unknown section [%s] in configuration file. "
294                                         "BitlBee configuration must be put in a [settings] section!\n", ini->section );
295                        return( 0 );
296                }
297        }
298        ini_close( ini );
299       
300        return( 1 );
301}
302
303void conf_loaddefaults( irc_t *irc )
304{
305        ini_t *ini;
306       
307        ini = ini_open( CONF_FILE );
308        if( ini == NULL ) return;
309        while( ini_read( ini ) )
310        {
311                if( g_strcasecmp( ini->section, "defaults" ) == 0 )
312                {
313                        set_t *s = set_find( &irc->set, ini->key );
314                       
315                        if( s )
316                        {
317                                if( s->def ) g_free( s->def );
318                                s->def = g_strdup( ini->value );
319                        }
320                }
321        }
322        ini_close( ini );
323}
Note: See TracBrowser for help on using the repository browser.