annotate request.c @ 15:54f08929b195 noffle

[svn] Bring up to date
author enz
date Sat, 29 Apr 2000 13:22:25 +0100
parents 04124a4423d4
children
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 request.c
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
3
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
4 Collection of articles that are marked for download.
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
5
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
6 $Id: request.c 3 2000-01-04 11:35:42Z enz $
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
7 */
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
8
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
9 #include "request.h"
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
10 #include <dirent.h>
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
11 #include <errno.h>
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
12 #include <fcntl.h>
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
13 #include <sys/types.h>
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
14 #include <sys/stat.h>
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
15 #include <unistd.h>
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
16 #include <assert.h>
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
17 #include "config.h"
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
18 #include "log.h"
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
19 #include "util.h"
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
20
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
21
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
22 /* This struct keeps record of the message IDs that are to be fetched from
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
23 one particular host. Several of these are chained together via the
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
24 "next" pointer, if we have several servers.
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
25 */
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
26
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
27 struct Reqserv;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
28 typedef struct Reqserv Reqserv;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
29
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
30 struct Reqserv {
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
31 char* serv; /* Server the messages are to be requested
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
32 from */
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
33 char** reql; /* List of message IDs of requested
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
34 messages. Some entries (that have been
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
35 deleted) may be NULL */
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
36 int reql_length; /* Number of string pointers in reql,
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
37 including NULL entries */
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
38 int reql_capacity; /* maximum number of string pointers reql
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
39 can hold */
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
40 Bool dirty; /* whether the request list needs to be
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
41 rewritten to disk */
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
42 Reqserv* next; /* next Reqserv in list */
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
43 time_t mtime; /* last modification time of request file */
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
44 };
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
45
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
46 /* List of servers */
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
47 static Reqserv* reqserv = 0;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
48
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
49 /* sanity check */
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
50 static Bool is_open = FALSE;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
51
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
52 /* for Req_first/Req_next */
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
53 static char** iterator = 0;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
54 static char** iterator_end = 0;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
55
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
56
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
57 /* local functions */
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
58 static Reqserv* newReqserv (const char* serv);
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
59 static Bool getReqserv (const char* serv, Reqserv** rsz);
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
60 static void fileRequest (Str file, const char *serv);
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
61 static char** searchMsgId (const Reqserv * rs, const char *msgId);
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
62 static void storeMsgId (Reqserv* rs, const char* msgId);
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
63 static Bool readRequestfile (const char* serv, Reqserv** rsz);
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
64 static time_t get_mtime (const char* serv);
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
65
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
66 /* read modification time of request file */
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
67 static time_t get_mtime(const char* serv)
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
68 {
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
69 Str filename;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
70 struct stat stat1;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
71
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
72 fileRequest(filename, serv);
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
73 stat(filename, &stat1);
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
74 return stat1.st_mtime;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
75 }
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
76
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
77
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
78 /* create new Reqserv and queue it */
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
79 static Reqserv* newReqserv(const char* serv)
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
80 {
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
81 Reqserv* rs = (Reqserv*) malloc(sizeof(Reqserv));
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
82 rs->serv = strcpy(malloc(strlen(serv)+1), serv);
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
83 rs->reql = 0;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
84 rs->reql_length = 0;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
85 rs->reql_capacity = 0;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
86 rs->next = reqserv;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
87 rs->dirty = FALSE;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
88 rs->mtime = 0;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
89 reqserv = rs;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
90 return rs;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
91 }
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
92
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
93
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
94 /* get Reqserv for given server, and save it in "rsz". Load from file as
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
95 necessary. Return TRUE on success. Otherwise log errors and return
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
96 FALSE. (details in errno)
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
97 */
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
98 static Bool getReqserv(const char* serv, Reqserv** rsz)
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
99 {
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
100 Reqserv* rs;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
101 for (rs = reqserv; rs; rs = rs->next)
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
102 if (!strcmp(serv, rs->serv)) {
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
103 *rsz = rs;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
104 return TRUE;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
105 }
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
106 return readRequestfile(serv, rsz);
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
107 }
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
108
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
109
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
110 /* Delete Reqserv from cache, if not up-to-date */
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
111 static void
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
112 cleanupReqserv( void )
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
113 {
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
114 Reqserv *rs, *prev, *next;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
115
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
116 rs = reqserv;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
117 prev = NULL;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
118 while ( rs != NULL )
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
119 {
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
120 ASSERT( ! rs->dirty );
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
121 next = rs->next;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
122 if ( get_mtime( rs->serv ) != rs->mtime )
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
123 {
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
124 if ( prev != NULL )
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
125 prev->next = next;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
126 else
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
127 reqserv = next;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
128 free( rs->serv );
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
129 rs->serv = NULL;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
130 free( rs->reql );
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
131 rs->reql = NULL;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
132 free( rs );
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
133 }
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
134 prev = rs;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
135 rs = next;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
136 }
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
137 }
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
138
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
139 /* Save name of file storing requests from server "serv" in "file" */
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
140 static void fileRequest( Str file, const char *serv)
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
141 {
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
142 snprintf( file, MAXCHAR, "%s/requested/%s", Cfg_spoolDir(), serv);
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
143 }
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
144
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
145
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
146 /* Search for msgid in Reqserv. Return pointer to list entry. Return 0 if
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
147 list does not contain msgid. */
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
148 static char** searchMsgId(const Reqserv * rs, const char *msgId )
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
149 {
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
150 char** rz;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
151 ASSERT(rs != 0);
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
152
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
153 if (!rs->reql)
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
154 return 0;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
155
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
156 for (rz = rs->reql; rz < rs->reql + rs->reql_length; rz++)
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
157 if (*rz && !strcmp(*rz, msgId))
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
158 return rz;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
159
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
160 return 0;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
161 }
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
162
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
163
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
164 Bool
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
165 Req_contains(const char *serv, const char *msgId)
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
166 {
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
167 Reqserv* rs;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
168 ASSERT( is_open );
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
169 if (getReqserv(serv, &rs) == FALSE)
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
170 return FALSE;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
171 return searchMsgId(rs, msgId) ? TRUE : FALSE;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
172 }
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
173
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
174
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
175 static void storeMsgId(Reqserv* rs, const char* msgId)
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
176 {
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
177 char* msgid;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
178
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
179 if (searchMsgId(rs, msgId))
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
180 /* already recorded */
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
181 return;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
182
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
183 msgid = strcpy(malloc(strlen(msgId)+1), msgId);
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
184
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
185 if (rs->reql_length >= rs->reql_capacity) {
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
186 int c1 = rs->reql_capacity*2 + 10;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
187 rs->reql = (char**) realloc(rs->reql, c1*sizeof(char*));
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
188 rs->reql_capacity = c1;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
189 }
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
190
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
191 *(rs->reql + rs->reql_length++) = msgid;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
192 rs->dirty = TRUE;
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
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
196 /* Add request for message "msgIg" from server "serv". Return TRUE iff
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
197 successful.
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
198 */
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
199 Bool Req_add(const char *serv, const char *msgId)
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
200 {
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
201 Reqserv* rs;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
202 ASSERT( is_open );
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
203 Log_dbg( "Marking %s on %s for download", msgId, serv );
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
204
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
205 if (getReqserv(serv, &rs) == FALSE)
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
206 return FALSE;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
207 storeMsgId(rs, msgId);
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
208 return TRUE;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
209 }
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
210
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
211 static Bool
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
212 readLn( Str line, FILE* f )
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
213 {
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
214 size_t len;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
215
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
216 if ( ! fgets( line, MAXCHAR, f ) )
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
217 return FALSE;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
218 len = strlen( line );
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
219 if ( line[ len - 1 ] == '\n' )
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
220 line[ len - 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 /* Read request file into new, non-queued Reqserv. Save new Reqserv in
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
225 "rsz" and return TRUE on success. Returns FALSE on failure, see errno.
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
226 If the file doesn't exist, an empty Reqserv is returned.
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
227 */
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
228 static Bool readRequestfile(const char* serv, Reqserv** rsz)
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
229 {
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
230 Str filename;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
231 Str line;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
232 FILE* file;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
233 Reqserv* rs;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
234
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
235 fileRequest(filename, serv);
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
236 Log_dbg("reading request file %s", filename);
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
237
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
238 file = fopen(filename, "r");
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
239 if (!file && (errno == ENOENT)) {
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
240 *rsz = newReqserv(serv);
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
241 (*rsz)->mtime = get_mtime(serv);
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
242 return TRUE;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
243 }
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
244 if (Log_check(file != 0,
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
245 "could not open %s for reading: %s",
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
246 filename, strerror(errno)))
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
247 return FALSE;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
248
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
249 rs = *rsz = newReqserv(serv);
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
250
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
251 while( readLn(line, file) == TRUE) {
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
252 char* line1 = Utl_stripWhiteSpace(line);
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
253 if (*line1)
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
254 storeMsgId(rs, line1);
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
255 }
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
256
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
257 rs->dirty = FALSE;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
258
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
259 if (Log_check(fclose(file) != EOF,
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
260 "could not close %s properly: %s\n",
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
261 filename, strerror(errno)))
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
262 return FALSE;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
263
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
264 return TRUE;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
265 }
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
266
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
267
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
268 /* Write out request file for given Reqserv. Return TRUE on success. If an
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
269 I/O error occurs, it is logged, and FALSE is returned.
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
270 */
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
271 static Bool writeRequestfile(Reqserv* rs)
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
272 {
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
273 Str filename;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
274 FILE* file;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
275 char** z;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
276
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
277 fileRequest(filename, rs->serv);
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
278 Log_dbg("writing request file %s", filename);
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
279
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
280 if (Log_check((file = fopen(filename, "w")) != 0,
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
281 "could not open %s for writing: %s",
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
282 filename, strerror(errno)))
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
283 return FALSE;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
284
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
285 if (rs->reql)
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
286 for (z = rs->reql; z < rs->reql+rs->reql_length; z++)
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
287 if (*z) {
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
288 if (Log_check( fputs(*z, file) != EOF
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
289 && fputs("\n", file) != EOF,
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
290 "write error: %s", strerror(errno)))
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
291 return FALSE;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
292 }
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
293
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
294 if (Log_check(fclose(file) != EOF,
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
295 "could not close %s properly: %s\n",
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
296 filename, strerror(errno)))
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
297 return FALSE;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
298
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
299 rs->dirty = FALSE;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
300 rs->mtime = get_mtime(rs->serv);
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
301
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
302 return TRUE;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
303 }
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
304
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
305
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
306 void
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
307 Req_remove( const char *serv, const char *msgId )
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
308 {
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
309 Reqserv* rs;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
310 char** z;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
311
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
312 ASSERT( is_open );
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
313 Log_dbg("Req_remove(\"%s\", \"%s\")", serv, msgId);
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
314
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
315 if (getReqserv(serv, &rs) == FALSE)
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
316 return;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
317
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
318 z = searchMsgId(rs, msgId);
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
319 if ( ! z )
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
320 return;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
321
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
322 free(*z);
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
323 *z = 0;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
324 rs->dirty = TRUE;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
325 }
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
326
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
327
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
328 Bool
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
329 Req_first( const char *serv, Str msgId )
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
330 {
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
331 Reqserv* rs;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
332
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
333 ASSERT( is_open );
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
334 ASSERT( !iterator && !iterator_end );
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
335
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
336 if (getReqserv(serv, &rs) == FALSE)
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
337 return FALSE;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
338
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
339 if (!rs->reql)
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
340 return FALSE;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
341
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
342 iterator = rs->reql - 1;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
343 iterator_end = rs->reql + rs->reql_length;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
344
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
345 return Req_next(msgId);
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
346 }
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
347
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
348
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
349 Bool
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
350 Req_next( Str msgId )
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
351 {
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
352 ASSERT( is_open );
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
353 ASSERT(iterator && iterator_end);
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
354
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
355 if (iterator >= iterator_end)
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
356 return FALSE;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
357 iterator++;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
358
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
359 while (iterator < iterator_end) {
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
360 if (!*iterator)
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
361 iterator++;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
362 else {
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
363 Utl_cpyStr(msgId, *iterator);
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
364 return TRUE;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
365 }
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
366 }
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
367
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
368 iterator = iterator_end = 0;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
369 return FALSE;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
370 }
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
371
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
372
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
373 /* Get exclusive access to all request files. Maybe we already have had it,
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
374 and the cache is outdated. So we delete request files, which have
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
375 changed recently, from cache. These files will be reread on demand.
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
376 */
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
377 Bool
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
378 Req_open(void)
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
379 {
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
380 Log_dbg("opening request database");
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
381 ASSERT(is_open == FALSE);
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
382 cleanupReqserv();
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
383 is_open = TRUE;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
384 return TRUE;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
385 }
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
386
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
387
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
388 /* Do not occupy the request files any longer. Write any changes to disk.
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
389 Return TRUE on success, FALSE if an IO error occurs. */
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
390 void Req_close(void)
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
391 {
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
392 Bool ret = TRUE;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
393 Reqserv* rs;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
394 Log_dbg("closing request database, writing changes to disk");
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
395 ASSERT(is_open == TRUE);
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
396
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
397 for (rs = reqserv; rs; rs = rs->next) {
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
398 if (rs->dirty == TRUE) {
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
399 if (!writeRequestfile(rs))
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
400 ret = FALSE;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
401 }
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
402 }
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
403
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
404 is_open = FALSE;
04124a4423d4 [svn] Initial revision
enz
parents:
diff changeset
405 }