annotate content.c @ 0:04124a4423d4 noffle

[svn] Initial revision
author enz
date Tue, 04 Jan 2000 11:35:42 +0000
parents
children 912123d43a87
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
1 /*
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
2 content.c
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
3
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
4 $Id: content.c 3 2000-01-04 11:35:42Z enz $
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
5 */
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
6
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
7 #include <dirent.h>
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
8 #include <fcntl.h>
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
9 #include <sys/types.h>
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
10 #include <sys/stat.h>
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
11 #include <unistd.h>
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
12 #include "common.h"
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
13 #include "config.h"
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
14 #include "log.h"
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
15 #include "over.h"
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
16 #include "pseudo.h"
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
17 #include "util.h"
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
18
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
19 struct
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
20 {
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
21 DIR *dir; /* Directory for browsing through all
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
22 groups */
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
23 int first;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
24 int last;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
25 unsigned int size; /* Number of overviews. */
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
26 unsigned int max; /* Size of elem. */
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
27 Over **elem; /* Ptr to array with ptrs to overviews.
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
28 NULL entries for non-existing article numbers
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
29 in group. */
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
30 Str name;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
31 Str file;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
32 } cont = { NULL, 1, 0, 0, 0, NULL, "", "" };
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
33
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
34 void
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
35 Cont_app( Over *ov )
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
36 {
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
37 if ( cont.max < cont.size + 1 )
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
38 {
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
39 if ( ! ( cont.elem = realloc( cont.elem,
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
40 ( cont.max + 500 )
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
41 * sizeof( cont.elem[ 0 ] ) ) ) )
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
42 {
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
43 Log_err( "Could not realloc overview list" );
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
44 exit( EXIT_FAILURE );
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
45 }
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
46 cont.max += 500;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
47 }
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
48 if ( cont.first == 0 )
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
49 cont.first = 1;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
50 if ( ov )
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
51 Ov_setNumb( ov, cont.first + cont.size );
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
52 cont.elem[ cont.size++ ] = ov;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
53 cont.last = cont.first + cont.size - 1;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
54 }
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
55
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
56 Bool
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
57 Cont_validNumb( int n )
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
58 {
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
59 return ( n != 0 && n >= cont.first && n <= cont.last
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
60 && cont.elem[ n - cont.first ] );
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
61 }
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
62
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
63 void
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
64 Cont_delete( int n )
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
65 {
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
66 Over **ov;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
67
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
68 if ( ! Cont_validNumb( n ) )
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
69 return;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
70 ov = &cont.elem[ n - cont.first ];
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
71 free( *ov );
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
72 *ov = NULL;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
73 }
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
74
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
75 /* Remove all overviews from content. */
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
76 static void
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
77 clearCont()
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
78 {
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
79 int i;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
80
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
81 for ( i = 0; i < cont.size; ++i )
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
82 del_Over( cont.elem[ i ] );
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
83 cont.size = 0;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
84 }
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
85
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
86 /* Extend content list to size "cnt" and append NULL entries. */
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
87 static void
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
88 extendCont( int cnt )
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
89 {
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
90 int i, n;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
91
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
92 if ( cont.size < cnt )
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
93 {
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
94 n = cnt - cont.size;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
95 for ( i = 0; i < n; ++i )
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
96 Cont_app( NULL );
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
97 }
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
98 }
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
99
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
100 /* Discard all cached overviews, and read in the overviews of a new group
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
101 from its overviews file. */
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
102 void
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
103 Cont_read( const char *name )
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
104 {
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
105 FILE *f;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
106 Over *ov;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
107 int cnt, numb;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
108 Str line;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
109
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
110 /* Delete old overviews and make room for new ones. */
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
111 cont.first = 0;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
112 cont.last = 0;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
113 Utl_cpyStr( cont.name, name );
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
114 clearCont();
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
115
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
116 /* read overviews from overview file and store them in the overviews
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
117 list */
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
118 snprintf( cont.file, MAXCHAR, "%s/overview/%s", Cfg_spoolDir(), name );
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
119 if ( cnt == 0 )
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
120 return;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
121 f = fopen( cont.file, "r" );
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
122 if ( ! f )
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
123 {
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
124 Log_dbg( "No group overview file: %s", cont.file );
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
125 return;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
126 }
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
127 Log_dbg( "Reading %s", cont.file );
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
128 while ( fgets( line, MAXCHAR, f ) )
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
129 {
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
130 if ( ! ( ov = Ov_read( line ) ) )
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
131 {
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
132 Log_err( "Overview corrupted in %s: %s", name, line );
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
133 continue;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
134 }
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
135 numb = Ov_numb( ov );
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
136 if ( numb < cont.first )
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
137 {
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
138 Log_err( "Wrong ordering in %s: %s", name, line );
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
139 continue;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
140 }
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
141 if ( cont.first == 0 )
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
142 cont.first = numb;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
143 cont.last = numb;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
144 extendCont( numb - cont.first + 1 );
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
145 cont.elem[ numb - cont.first ] = ov;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
146 }
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
147 fclose( f );
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
148 }
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
149
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
150 void
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
151 Cont_write( void )
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
152 {
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
153 Bool anythingWritten;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
154 int i, first;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
155 FILE *f;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
156 const Over *ov;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
157
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
158 first = cont.first;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
159 while ( ! Cont_validNumb( first ) && first <= cont.last )
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
160 ++first;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
161 if ( ! ( f = fopen( cont.file, "w" ) ) )
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
162 {
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
163 Log_err( "Could not open %s for writing", cont.file );
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
164 return;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
165 }
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
166 Log_dbg( "Writing %s (%lu)", cont.file, cont.size );
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
167 anythingWritten = FALSE;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
168 for ( i = 0; i < cont.size; ++i )
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
169 {
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
170 if ( ( ov = cont.elem[ i ] ) )
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
171 {
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
172 if ( ! Pseudo_isGeneralInfo( Ov_msgId( ov ) ) )
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
173 {
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
174 if ( ! Ov_write( ov, f ) )
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
175 {
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
176 Log_err( "Writing of overview line failed" );
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
177 break;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
178 }
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
179 else
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
180 anythingWritten = TRUE;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
181 }
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
182 }
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
183 }
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
184 fclose( f );
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
185 if ( ! anythingWritten )
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
186 unlink( cont.file );
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
187 }
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
188
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
189 const Over *
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
190 Cont_get( int numb )
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
191 {
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
192 if ( ! Cont_validNumb( numb ) )
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
193 return NULL;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
194 return cont.elem[ numb - cont.first ];
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
195 }
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
196
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
197 int
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
198 Cont_first( void ) { return cont.first; }
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
199
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
200 int
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
201 Cont_last( void ) { return cont.last; }
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
202
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
203 const char *
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
204 Cont_grp( void ) { return cont.name; }
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
205
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
206 Bool
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
207 Cont_nextGrp( Str result )
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
208 {
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
209 struct dirent *d;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
210
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
211 ASSERT( cont.dir );
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
212 if ( ! ( d = readdir( cont.dir ) ) )
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
213 {
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
214 cont.dir = NULL;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
215 return FALSE;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
216 }
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
217 if ( ! d->d_name )
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
218 return FALSE;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
219 Utl_cpyStr( result, d->d_name );
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
220 result[ MAXCHAR - 1 ] = '\0';
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
221 return TRUE;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
222 }
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
223
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
224 Bool
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
225 Cont_firstGrp( Str result )
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
226 {
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
227 Str name;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
228
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
229 snprintf( name, MAXCHAR, "%s/overview", Cfg_spoolDir() );
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
230 if ( ! ( cont.dir = opendir( name ) ) )
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
231 {
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
232 Log_err( "Cannot open %s", name );
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
233 return FALSE;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
234 }
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
235 Cont_nextGrp( result ); /* "." */
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
236 Cont_nextGrp( result ); /* ".." */
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
237 return Cont_nextGrp( result );
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
238 }