0
|
1 /*
|
|
2 fetchlist.c
|
|
3
|
|
4 $Id: fetchlist.c 3 2000-01-04 11:35:42Z enz $
|
|
5 */
|
|
6
|
|
7 #include "fetchlist.h"
|
|
8 #include "config.h"
|
|
9 #include "log.h"
|
|
10 #include "util.h"
|
|
11
|
|
12 struct Elem
|
|
13 {
|
|
14 Str name;
|
|
15 FetchMode mode;
|
|
16 };
|
|
17
|
|
18 static struct Fetchlist
|
|
19 {
|
|
20 struct Elem *elem;
|
|
21 int size;
|
|
22 int max;
|
|
23 } fetchlist = { NULL, 0, 0 };
|
|
24
|
|
25 static const char *
|
|
26 getFile( void )
|
|
27 {
|
|
28 static Str file;
|
|
29 snprintf( file, MAXCHAR, "%s/fetchlist", Cfg_spoolDir() );
|
|
30 return file;
|
|
31 }
|
|
32
|
|
33 static void
|
|
34 clearList( void )
|
|
35 {
|
|
36 fetchlist.size = 0;
|
|
37 }
|
|
38
|
|
39 static int
|
|
40 compareElem( const void *elem1, const void *elem2 )
|
|
41 {
|
|
42 struct Elem* e1 = (struct Elem*)elem1;
|
|
43 struct Elem* e2 = (struct Elem*)elem2;
|
|
44 return strcmp( e1->name, e2->name );
|
|
45 }
|
|
46
|
|
47 static struct Elem *
|
|
48 searchElem( const char *name )
|
|
49 {
|
|
50 int i;
|
|
51
|
|
52 for ( i = 0; i < fetchlist.size; ++i )
|
|
53 if ( strcmp( name, fetchlist.elem[ i ].name ) == 0 )
|
|
54 return &fetchlist.elem[ i ];
|
|
55 return NULL;
|
|
56 }
|
|
57
|
|
58 static void
|
|
59 appGrp( const char *name, FetchMode mode )
|
|
60 {
|
|
61 struct Elem elem;
|
|
62
|
|
63 if ( fetchlist.max < fetchlist.size + 1 )
|
|
64 {
|
|
65 if ( ! ( fetchlist.elem
|
|
66 = realloc( fetchlist.elem,
|
|
67 ( fetchlist.max + 50 )
|
|
68 * sizeof( fetchlist.elem[ 0 ] ) ) ) )
|
|
69 {
|
|
70 Log_err( "Could not realloc fetchlist" );
|
|
71 exit( EXIT_FAILURE );
|
|
72 }
|
|
73 fetchlist.max += 50;
|
|
74 }
|
|
75 strcpy( elem.name, name );
|
|
76 elem.mode = mode;
|
|
77 fetchlist.elem[ fetchlist.size++ ] = elem;
|
|
78 }
|
|
79
|
|
80 void
|
|
81 Fetchlist_read( void )
|
|
82 {
|
|
83 FILE *f;
|
|
84 const char *file = getFile();
|
|
85 char *p;
|
|
86 FetchMode mode = OVER;
|
|
87 Bool valid;
|
|
88 int ret;
|
|
89 Str line, grp, modeStr;
|
|
90
|
|
91 Log_dbg( "Reading %s", file );
|
|
92 clearList();
|
|
93 if ( ! ( f = fopen( file, "r" ) ) )
|
|
94 {
|
|
95 Log_inf( "No file %s", file );
|
|
96 return;
|
|
97 }
|
|
98 while ( fgets( line, MAXCHAR, f ) )
|
|
99 {
|
|
100 p = Utl_stripWhiteSpace( line );
|
|
101 if ( *p == '#' || *p == '\0' )
|
|
102 continue;
|
|
103 ret = sscanf( p, "%s %s", grp, modeStr );
|
|
104 valid = TRUE;
|
|
105 if ( ret < 1 || ret > 2 )
|
|
106 valid = FALSE;
|
|
107 else if ( ret >= 2 )
|
|
108 {
|
|
109 if ( strcmp( modeStr, "full" ) == 0 )
|
|
110 mode = FULL;
|
|
111 else if ( strcmp( modeStr, "thread" ) == 0 )
|
|
112 mode = THREAD;
|
|
113 else if ( strcmp( modeStr, "over" ) == 0 )
|
|
114 mode = OVER;
|
|
115 else
|
|
116 valid = FALSE;
|
|
117 }
|
|
118 if ( ! valid )
|
|
119 {
|
|
120 Log_err( "Invalid entry in %s: %s", file, line );
|
|
121 continue;
|
|
122 }
|
|
123 appGrp( grp, mode );
|
|
124 }
|
|
125 fclose( f );
|
|
126 }
|
|
127
|
|
128 Bool
|
|
129 Fetchlist_write( void )
|
|
130 {
|
|
131 int i;
|
|
132 FILE *f;
|
|
133 const char *file = getFile();
|
|
134 const char *modeStr = "";
|
|
135
|
|
136 qsort( fetchlist.elem, fetchlist.size, sizeof( fetchlist.elem[ 0 ] ),
|
|
137 compareElem );
|
|
138 if ( ! ( f = fopen( file, "w" ) ) )
|
|
139 {
|
|
140 Log_err( "Could not open %s for writing", file );
|
|
141 return FALSE;
|
|
142 }
|
|
143 for ( i = 0; i < fetchlist.size; ++i )
|
|
144 {
|
|
145 switch ( fetchlist.elem[ i ].mode )
|
|
146 {
|
|
147 case FULL:
|
|
148 modeStr = "full"; break;
|
|
149 case THREAD:
|
|
150 modeStr = "thread"; break;
|
|
151 case OVER:
|
|
152 modeStr = "over"; break;
|
|
153 }
|
|
154 fprintf( f, "%s %s\n", fetchlist.elem[ i ].name, modeStr );
|
|
155 }
|
|
156 fclose( f );
|
|
157 return TRUE;
|
|
158 }
|
|
159
|
|
160 int
|
|
161 Fetchlist_size( void )
|
|
162 {
|
|
163 return fetchlist.size;
|
|
164 }
|
|
165
|
|
166 Bool
|
|
167 Fetchlist_contains( const char *name )
|
|
168 {
|
|
169 return ( searchElem( name ) != NULL );
|
|
170 }
|
|
171
|
|
172 Bool
|
|
173 Fetchlist_element( const char **name, FetchMode *mode, int index )
|
|
174 {
|
|
175 if ( index < 0 || index >= fetchlist.size )
|
|
176 return FALSE;
|
|
177 *name = fetchlist.elem[ index ].name;
|
|
178 *mode = fetchlist.elem[ index ].mode;
|
|
179 return TRUE;
|
|
180 }
|
|
181
|
|
182 Bool
|
|
183 Fetchlist_add( const char *name, FetchMode mode )
|
|
184 {
|
|
185 struct Elem *elem = searchElem( name );
|
|
186 if ( elem == NULL )
|
|
187 {
|
|
188 appGrp( name, mode );
|
|
189 return TRUE;
|
|
190 }
|
|
191 strcpy( elem->name, name );
|
|
192 elem->mode = mode;
|
|
193 return FALSE;
|
|
194 }
|
|
195
|
|
196 Bool
|
|
197 Fetchlist_remove( const char *name )
|
|
198 {
|
|
199 struct Elem *elem = searchElem( name );
|
|
200 if ( elem == NULL )
|
|
201 return FALSE;
|
|
202 *elem = fetchlist.elem[ fetchlist.size - 1 ];
|
|
203 --fetchlist.size;
|
|
204 return TRUE;
|
|
205 }
|