comparison src/configfile.c @ 104:402300614185 noffle

[svn] Remove expire enum, add Cfg_expire(grp). Rename Cfg_autoSubscribeMode() Cfg_defaultAutoSubscribeMode() and add Cfg_autoSubscribeMode(grp).
author bears
date Tue, 13 Jun 2000 07:34:25 +0100
parents 1fcdced0246e
children 6f681d41734c
comparison
equal deleted inserted replaced
103:f782184db8bc 104:402300614185
4 The following macros must be set, when compiling this file: 4 The following macros must be set, when compiling this file:
5 CONFIGFILE 5 CONFIGFILE
6 SPOOLDIR 6 SPOOLDIR
7 VERSION 7 VERSION
8 8
9 $Id: configfile.c 100 2000-05-18 12:17:23Z bears $ 9 $Id: configfile.c 143 2000-06-13 06:34:25Z bears $
10 */ 10 */
11 11
12 #if HAVE_CONFIG_H 12 #if HAVE_CONFIG_H
13 #include <config.h> 13 #include <config.h>
14 #endif 14 #endif
19 #include <limits.h> 19 #include <limits.h>
20 #include "itemlist.h" 20 #include "itemlist.h"
21 #include "log.h" 21 #include "log.h"
22 #include "util.h" 22 #include "util.h"
23 #include "portable.h" 23 #include "portable.h"
24 #include "wildmat.h"
24 25
25 typedef struct 26 typedef struct
26 { 27 {
27 int numGroup; 28 int numGroup;
28 int maxGroup; 29 int maxGroup;
50 { 51 {
51 char *pattern; 52 char *pattern;
52 int days; 53 int days;
53 } 54 }
54 ExpireEntry; 55 ExpireEntry;
56
57 typedef struct
58 {
59 char *pattern;
60 char *mode;
61 }
62 AutoSubscribeModeEntry;
55 63
56 struct 64 struct
57 { 65 {
58 /* Compile time options */ 66 /* Compile time options */
59 const char *spoolDir; 67 const char *spoolDir;
66 Bool autoSubscribe; 74 Bool autoSubscribe;
67 Bool autoUnsubscribe; 75 Bool autoUnsubscribe;
68 Bool infoAlways; 76 Bool infoAlways;
69 Bool replaceMsgId; 77 Bool replaceMsgId;
70 Bool postLocal; 78 Bool postLocal;
71 Str autoSubscribeMode; 79 Str defaultAutoSubscribeMode;
72 Str mailTo; 80 Str mailTo;
73 int defaultExpire; 81 int defaultExpire;
74 int numServ; 82 int numServ;
75 int maxServ; 83 int maxServ;
76 ServEntry *serv; 84 ServEntry *serv;
77 int servIdx; /* for server enumeration */ 85 int servIdx; /* for server enumeration */
78 int numExpire; 86 int numExpire;
79 int maxExpire; 87 int maxExpire;
80 ExpireEntry *expire; 88 ExpireEntry *expire;
81 int expireIdx; 89 int numAutoSubscribeMode;
90 int maxAutoSubscribeMode;
91 AutoSubscribeModeEntry *autoSubscribeMode;
82 } config = 92 } config =
83 { 93 {
84 SPOOLDIR, /* spoolDir */ 94 SPOOLDIR, /* spoolDir */
85 VERSION, /* version */ 95 VERSION, /* version */
86 300, /* maxFetch */ 96 300, /* maxFetch */
90 FALSE, /* autoSubscribe */ 100 FALSE, /* autoSubscribe */
91 FALSE, /* autoUnsubscribe */ 101 FALSE, /* autoUnsubscribe */
92 TRUE, /* infoAlways */ 102 TRUE, /* infoAlways */
93 TRUE, /* replaceMsgId */ 103 TRUE, /* replaceMsgId */
94 FALSE, /* postLocal */ 104 FALSE, /* postLocal */
95 "over", /* autoSubscribeMode */ 105 "over", /* defaultAutoSubscribeMode */
96 "", /* mailTo */ 106 "", /* mailTo */
97 14, /* defaultExpire */ 107 14, /* defaultExpire */
98 0, /* numServ */ 108 0, /* numServ */
99 0, /* maxServ */ 109 0, /* maxServ */
100 NULL, /* serv */ 110 NULL, /* serv */
101 0, /* servIdx */ 111 0, /* servIdx */
102 0, /* numExpire */ 112 0, /* numExpire */
103 0, /* maxExpire */ 113 0, /* maxExpire */
104 NULL, /* expire */ 114 NULL, /* expire */
105 0 /* expireIdx */ 115 0, /* numAutoSubscribeMode */
116 0, /* maxAutoSubscribeMode */
117 NULL /* autoSubscribeMode */
106 }; 118 };
107 119
108 const char * Cfg_spoolDir( void ) { return config.spoolDir; } 120 const char * Cfg_spoolDir( void ) { return config.spoolDir; }
109 const char * Cfg_version( void ) { return config.version; } 121 const char * Cfg_version( void ) { return config.version; }
110 122
115 Bool Cfg_autoUnsubscribe( void ) { return config.autoUnsubscribe; } 127 Bool Cfg_autoUnsubscribe( void ) { return config.autoUnsubscribe; }
116 Bool Cfg_autoSubscribe( void ) { return config.autoSubscribe; } 128 Bool Cfg_autoSubscribe( void ) { return config.autoSubscribe; }
117 Bool Cfg_infoAlways( void ) { return config.infoAlways; } 129 Bool Cfg_infoAlways( void ) { return config.infoAlways; }
118 Bool Cfg_replaceMsgId( void ) { return config.replaceMsgId; } 130 Bool Cfg_replaceMsgId( void ) { return config.replaceMsgId; }
119 Bool Cfg_postLocal( void ) { return config.postLocal; } 131 Bool Cfg_postLocal( void ) { return config.postLocal; }
120 const char * Cfg_autoSubscribeMode( void ) { 132 const char * Cfg_defaultAutoSubscribeMode( void ) {
121 return config.autoSubscribeMode; } 133 return config.defaultAutoSubscribeMode; }
122 const char * Cfg_mailTo( void ) { return config.mailTo; } 134 const char * Cfg_mailTo( void ) { return config.mailTo; }
123 int Cfg_expire( void ) { return config.defaultExpire; } 135 int Cfg_defaultExpire( void ) { return config.defaultExpire; }
124 136
125 void 137 void
126 Cfg_beginServEnum( void ) 138 Cfg_beginServEnum( void )
127 { 139 {
128 config.servIdx = 0; 140 config.servIdx = 0;
191 user[ 0 ] = '\0'; 203 user[ 0 ] = '\0';
192 pass[ 0 ] = '\0'; 204 pass[ 0 ] = '\0';
193 } 205 }
194 } 206 }
195 207
196 void
197 Cfg_beginExpireEnum( void )
198 {
199 config.expireIdx = 0;
200 }
201
202 int 208 int
203 Cfg_nextExpire( Str pattern ) 209 Cfg_expire( const char *grp )
204 { 210 {
205 if ( config.expireIdx >= config.numExpire ) 211 int i, res;
206 return -1; 212
207 strcpy( pattern, config.expire[ config.expireIdx ].pattern ); 213 for ( i = 0; i < config.numExpire; i++ )
208 return config.expire[ config.expireIdx++ ].days; 214 if ( Wld_match( grp, config.expire[ i ].pattern ) )
215 {
216 res = config.expire[ i ].days;
217 Log_dbg( "Custom expire period %d for group %s", res, grp );
218 return res;
219 }
220
221 return Cfg_defaultExpire();
222 }
223
224 const char *
225 Cfg_autoSubscribeMode( const char *grp )
226 {
227 int i;
228 const char *res;
229
230 for ( i = 0; i < config.numAutoSubscribeMode; i++ )
231 if ( Wld_match( grp, config.autoSubscribeMode[ i ].pattern ) )
232 {
233 res = config.autoSubscribeMode[ i ].mode;
234 Log_dbg( "Custom auto subscribe mode %s for group %s", res, grp );
235 return res;
236 }
237
238 return Cfg_defaultAutoSubscribeMode();
209 } 239 }
210 240
211 GroupEnum * 241 GroupEnum *
212 new_GetGrEn( const char *name ) 242 new_GetGrEn( const char *name )
213 { 243 {
372 { 402 {
373 Str dummy, pattern; 403 Str dummy, pattern;
374 ExpireEntry entry; 404 ExpireEntry entry;
375 int days; 405 int days;
376 406
377 /*
378 The line is either "expire <num>" or "expire <pat> <num>".
379 The former updates the overall default.
380 */
381 if ( sscanf( line, "%s %s %d", dummy, pattern, &days ) != 3 ) 407 if ( sscanf( line, "%s %s %d", dummy, pattern, &days ) != 3 )
382 { 408 {
383 logSyntaxErr( line ); 409 logSyntaxErr( line );
384 return; 410 return;
385 } 411 }
400 { 426 {
401 if ( ! ( config.expire = realloc( config.expire, 427 if ( ! ( config.expire = realloc( config.expire,
402 ( config.maxExpire + 5 ) 428 ( config.maxExpire + 5 )
403 * sizeof( ExpireEntry ) ) ) ) 429 * sizeof( ExpireEntry ) ) ) )
404 { 430 {
405 Log_err( "Could not realloc exipre list" ); 431 Log_err( "Could not realloc expire list" );
406 exit( EXIT_FAILURE ); 432 exit( EXIT_FAILURE );
407 } 433 }
408 config.maxExpire += 5; 434 config.maxExpire += 5;
409 } 435 }
410 config.expire[ config.numExpire++ ] = entry; 436 config.expire[ config.numExpire++ ] = entry;
459 g->maxGroup += 5; 485 g->maxGroup += 5;
460 } 486 }
461 Utl_allocAndCpy( &g->groups[ g->numGroup++ ], pattern ); 487 Utl_allocAndCpy( &g->groups[ g->numGroup++ ], pattern );
462 } 488 }
463 del_Itl( patterns) ; 489 del_Itl( patterns) ;
490 }
491
492 static Bool
493 isValidAutoSubscribeMode( const char *mode )
494 {
495 return strcmp( mode, "full" ) == 0
496 || strcmp( mode, "thread" ) == 0
497 || strcmp( mode, "over" ) == 0
498 || strcmp( mode, "off" ) == 0;
499 }
500
501 static void
502 getAutoSubscribeMode( const char *line )
503 {
504 Str dummy, pattern, mode;
505 AutoSubscribeModeEntry entry;
506 int items;
507
508 items = sscanf( line, "%s %s %s", dummy, pattern, mode );
509 if ( items == 2 )
510 {
511 /* Backwards compat. default-auto-subscribe-mode */
512 Utl_cpyStr( mode, pattern );
513 Utl_toLower( mode );
514 if ( ! isValidAutoSubscribeMode( mode ) )
515 {
516 logSyntaxErr( line );
517 return;
518 }
519 strcpy( config.defaultAutoSubscribeMode, mode );
520 return;
521 }
522 else if ( items != 3 )
523 {
524 logSyntaxErr( line );
525 return;
526 }
527
528 Utl_toLower( mode );
529 if ( ! isValidAutoSubscribeMode( mode ) )
530 {
531 logSyntaxErr( line );
532 return;
533 }
534
535 Utl_toLower( pattern );
536 Utl_allocAndCpy( &entry.pattern, pattern );
537 Utl_allocAndCpy( &entry.mode, mode );
538
539 if ( config.maxAutoSubscribeMode < config.numAutoSubscribeMode + 1 )
540 {
541 if ( ! ( config.autoSubscribeMode =
542 realloc( config.autoSubscribeMode,
543 ( config.maxAutoSubscribeMode + 5 )
544 * sizeof( AutoSubscribeModeEntry ) ) ) )
545 {
546 Log_err( "Could not realloc auto subscribe mode list" );
547 exit( EXIT_FAILURE );
548 }
549 config.maxAutoSubscribeMode += 5;
550 }
551 config.autoSubscribeMode[ config.numAutoSubscribeMode++ ] = entry;
464 } 552 }
465 553
466 void 554 void
467 Cfg_read( void ) 555 Cfg_read( void )
468 { 556 {
504 getBool( &config.infoAlways, p ); 592 getBool( &config.infoAlways, p );
505 else if ( strcmp( "replace-messageid", name ) == 0 ) 593 else if ( strcmp( "replace-messageid", name ) == 0 )
506 getBool( &config.replaceMsgId, p ); 594 getBool( &config.replaceMsgId, p );
507 else if ( strcmp( "post-locally", name ) == 0 ) 595 else if ( strcmp( "post-locally", name ) == 0 )
508 getBool( &config.postLocal, p ); 596 getBool( &config.postLocal, p );
509 else if ( strcmp( "auto-subscribe-mode", name ) == 0 ) 597 else if ( strcmp( "default-auto-subscribe-mode", name ) == 0 )
510 { 598 {
511 getStr( s, p ); 599 getStr( s, p );
512 Utl_toLower( s ); 600 Utl_toLower( s );
513 if ( strcmp( s, "full" ) != 0 601 if ( ! isValidAutoSubscribeMode( s ) )
514 && strcmp( s, "thread" ) != 0 602 {
515 && strcmp( s, "over" ) != 0 603 logSyntaxErr( line );
516 && strcmp( s, "off" ) != 0 ) 604 return;
517 { 605 }
518 Log_err( "Syntax error in config file: %s", line );
519 return;
520 }
521 else 606 else
522 strcpy( config.autoSubscribeMode, s ); 607 strcpy( config.defaultAutoSubscribeMode, s );
523 } 608 }
524 else if ( strcmp( "server", name ) == 0 ) 609 else if ( strcmp( "server", name ) == 0 )
525 /* Server needs line not p, 610 /* Server needs line not p,
526 because password may contain uppercase */ 611 because password may contain uppercase */
527 getServ( line ); 612 getServ( line );
528 else if ( strcmp( "mail-to", name ) == 0 ) 613 else if ( strcmp( "mail-to", name ) == 0 )
529 getStr( config.mailTo, p ); 614 getStr( config.mailTo, p );
530 else if ( strcmp( "expire", name ) == 0 ) 615 else if ( strcmp( "expire", name ) == 0 )
531 getExpire( p ); 616 getExpire( p );
617 else if ( strcmp( "auto-subscribe-mode", name ) == 0 )
618 getAutoSubscribeMode( p );
532 else if ( strcmp( "getgroups", name ) == 0 ) 619 else if ( strcmp( "getgroups", name ) == 0 )
533 getGroups( p, TRUE ); 620 getGroups( p, TRUE );
534 else if ( strcmp( "omitgroups", name ) == 0 ) 621 else if ( strcmp( "omitgroups", name ) == 0 )
535 getGroups( p, FALSE ); 622 getGroups( p, FALSE );
536 else 623 else