annotate content.c @ 15:54f08929b195 noffle

[svn] Bring up to date
author enz
date Sat, 29 Apr 2000 13:22:25 +0100
parents 912123d43a87
children 8e972daaeab9
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
1
912123d43a87 [svn] Fixed bug introduced by recent changes.
enz
parents: 0
diff changeset
4 $Id: content.c 6 2000-01-04 13:49:50Z enz $
0
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;
1
912123d43a87 [svn] Fixed bug introduced by recent changes.
enz
parents: 0
diff changeset
107 int numb;
0
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 f = fopen( cont.file, "r" );
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
120 if ( ! f )
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
121 {
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
122 Log_dbg( "No group overview file: %s", cont.file );
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
123 return;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
124 }
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
125 Log_dbg( "Reading %s", cont.file );
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
126 while ( fgets( line, MAXCHAR, f ) )
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
127 {
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
128 if ( ! ( ov = Ov_read( line ) ) )
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
129 {
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
130 Log_err( "Overview corrupted in %s: %s", name, line );
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
131 continue;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
132 }
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
133 numb = Ov_numb( ov );
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
134 if ( numb < cont.first )
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
135 {
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
136 Log_err( "Wrong ordering in %s: %s", name, line );
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
137 continue;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
138 }
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
139 if ( cont.first == 0 )
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
140 cont.first = numb;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
141 cont.last = numb;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
142 extendCont( numb - cont.first + 1 );
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
143 cont.elem[ numb - cont.first ] = ov;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
144 }
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
145 fclose( f );
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
146 }
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
147
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
148 void
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
149 Cont_write( void )
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
150 {
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
151 Bool anythingWritten;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
152 int i, first;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
153 FILE *f;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
154 const Over *ov;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
155
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
156 first = cont.first;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
157 while ( ! Cont_validNumb( first ) && first <= cont.last )
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
158 ++first;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
159 if ( ! ( f = fopen( cont.file, "w" ) ) )
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
160 {
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
161 Log_err( "Could not open %s for writing", cont.file );
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
162 return;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
163 }
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
164 Log_dbg( "Writing %s (%lu)", cont.file, cont.size );
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
165 anythingWritten = FALSE;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
166 for ( i = 0; i < cont.size; ++i )
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
167 {
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
168 if ( ( ov = cont.elem[ i ] ) )
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
169 {
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
170 if ( ! Pseudo_isGeneralInfo( Ov_msgId( ov ) ) )
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
171 {
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
172 if ( ! Ov_write( ov, f ) )
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
173 {
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
174 Log_err( "Writing of overview line failed" );
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
175 break;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
176 }
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
177 else
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
178 anythingWritten = TRUE;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
179 }
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
180 }
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
181 }
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
182 fclose( f );
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
183 if ( ! anythingWritten )
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
184 unlink( cont.file );
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
185 }
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
186
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
187 const Over *
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
188 Cont_get( int numb )
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
189 {
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
190 if ( ! Cont_validNumb( numb ) )
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
191 return NULL;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
192 return cont.elem[ numb - cont.first ];
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
193 }
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
194
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
195 int
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
196 Cont_first( void ) { return cont.first; }
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
197
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
198 int
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
199 Cont_last( void ) { return cont.last; }
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
200
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
201 const char *
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
202 Cont_grp( void ) { return cont.name; }
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
203
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
204 Bool
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
205 Cont_nextGrp( Str result )
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
206 {
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
207 struct dirent *d;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
208
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
209 ASSERT( cont.dir );
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
210 if ( ! ( d = readdir( cont.dir ) ) )
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
211 {
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
212 cont.dir = NULL;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
213 return FALSE;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
214 }
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
215 if ( ! d->d_name )
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
216 return FALSE;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
217 Utl_cpyStr( result, d->d_name );
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
218 result[ MAXCHAR - 1 ] = '\0';
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
219 return TRUE;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
220 }
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
221
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
222 Bool
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
223 Cont_firstGrp( Str result )
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
224 {
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
225 Str name;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
226
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
227 snprintf( name, MAXCHAR, "%s/overview", Cfg_spoolDir() );
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
228 if ( ! ( cont.dir = opendir( name ) ) )
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
229 {
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
230 Log_err( "Cannot open %s", name );
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
231 return FALSE;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
232 }
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
233 Cont_nextGrp( result ); /* "." */
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
234 Cont_nextGrp( result ); /* ".." */
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
235 return Cont_nextGrp( result );
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
236 }