comparison lib/cache.c @ 1:8b1883341c6f

Initial revision
author masneyb
date Mon, 05 Aug 2002 19:46:57 +0000
parents
children c8ec7877432e
comparison
equal deleted inserted replaced
0:674ed97069fd 1:8b1883341c6f
1 /*****************************************************************************/
2 /* cache.c - contains the cache routines */
3 /* Copyright (C) 1998-2002 Brian Masney <masneyb@gftp.org> */
4 /* */
5 /* This program is free software; you can redistribute it and/or modify */
6 /* it under the terms of the GNU General Public License as published by */
7 /* the Free Software Foundation; either version 2 of the License, or */
8 /* (at your option) any later version. */
9 /* */
10 /* This program is distributed in the hope that it will be useful, */
11 /* but WITHOUT ANY WARRANTY; without even the implied warranty of */
12 /* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
13 /* GNU General Public License for more details. */
14 /* */
15 /* You should have received a copy of the GNU General Public License */
16 /* along with this program; if not, write to the Free Software */
17 /* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111 USA */
18 /*****************************************************************************/
19
20 #include "gftp.h"
21
22
23 char *
24 gftp_cache_get_url_prefix (gftp_request * request)
25 {
26 if (strcmp (request->protocol_name, "HTTP") == 0 &&
27 strcmp (request->proxy_config, "ftp") == 0)
28 return ("ftp");
29
30 return (request->url_prefix);
31 }
32
33
34 FILE *
35 gftp_new_cache_entry (gftp_request * request)
36 {
37 char *cachedir, tempstr[BUFSIZ];
38 int cache_fd;
39 FILE *fd;
40
41 if ((fd = gftp_find_cache_entry (request)) != NULL)
42 return (fd);
43
44 cachedir = expand_path (BASE_CONF_DIR "/cache");
45 if (access (cachedir, F_OK) == -1)
46 {
47 if (mkdir (cachedir, 0x1C0) < 0)
48 return (NULL);
49 }
50
51 g_snprintf (tempstr, sizeof (tempstr), "%s/index.db", cachedir);
52 if ((fd = fopen (tempstr, "ab+")) == NULL)
53 {
54 g_free (cachedir);
55 return (NULL);
56 }
57
58 g_snprintf (tempstr, sizeof (tempstr), "%s/cache.XXXXXX", cachedir);
59 if ((cache_fd = mkstemp (tempstr)) < 0)
60 return (NULL);
61 g_free (cachedir);
62
63 fseek (fd, 0, SEEK_END);
64 fprintf (fd, "%s://%s@%s:%d%s\t%s\n",
65 gftp_cache_get_url_prefix (request),
66 request->username == NULL ? "" : request->username,
67 request->hostname == NULL ? "" : request->hostname,
68 request->port,
69 request->directory == NULL ? "" : request->directory,
70 tempstr);
71
72 if (fclose (fd) != 0)
73 {
74 close (cache_fd);
75 return (NULL);
76 }
77
78 if ((fd = fdopen (cache_fd, "wb+")) == NULL)
79 {
80 close (cache_fd);
81 return (NULL);
82 }
83
84 return (fd);
85 }
86
87
88 FILE *
89 gftp_find_cache_entry (gftp_request * request)
90 {
91 char *indexfile, *pos, buf[BUFSIZ], description[BUFSIZ];
92 FILE *indexfd, *cachefd;
93 size_t len;
94
95 g_snprintf (description, sizeof (description), "%s://%s@%s:%d%s",
96 gftp_cache_get_url_prefix (request),
97 request->username == NULL ? "" : request->username,
98 request->hostname == NULL ? "" : request->hostname,
99 request->port,
100 request->directory == NULL ? "" : request->directory);
101
102 indexfile = expand_path (BASE_CONF_DIR "/cache/index.db");
103 if ((indexfd = fopen (indexfile, "rb")) == NULL)
104 {
105 g_free (indexfile);
106 return (NULL);
107 }
108 g_free (indexfile);
109
110 while (fgets (buf, sizeof (buf), indexfd))
111 {
112 len = strlen (buf);
113 if (buf[len - 1] == '\n')
114 buf[--len] = '\0';
115 if (buf[len - 1] == '\r')
116 buf[--len] = '\0';
117
118 if (!((pos = strrchr (buf, '\t')) != NULL && *(pos + 1) != '\0'))
119 continue;
120
121 len = strlen (description);
122 if (pos - buf != len)
123 continue;
124
125 if (strncmp (buf, description, len) == 0)
126 {
127 pos++;
128 if (fclose (indexfd) != 0)
129 return (NULL);
130
131 if ((cachefd = fopen (pos, "rb+")) == NULL)
132 return (NULL);
133
134 fseek (cachefd, 0, SEEK_END);
135 if (ftell (cachefd) == 0)
136 {
137 fclose (cachefd);
138 return (NULL);
139 }
140 fseek (cachefd, 0, SEEK_SET);
141 return (cachefd);
142 }
143 }
144 fclose (indexfd);
145 return (NULL);
146 }
147
148
149 void
150 gftp_clear_cache_files (void)
151 {
152 char *indexfile, buf[BUFSIZ], *pos;
153 FILE *indexfd;
154 size_t len;
155
156 indexfile = expand_path (BASE_CONF_DIR "/cache/index.db");
157 if ((indexfd = fopen (indexfile, "rb")) == NULL)
158 {
159 g_free (indexfile);
160 return;
161 }
162
163 while (fgets (buf, sizeof (buf), indexfd))
164 {
165 len = strlen (buf);
166 if (buf[len - 1] == '\n')
167 buf[--len] = '\0';
168 if (buf[len - 1] == '\r')
169 buf[--len] = '\0';
170
171 if (!((pos = strrchr (buf, '\t')) != NULL && *(pos + 1) != '\0'))
172 {
173 printf (_("Error: Invalid line %s in cache index file\n"), buf);
174 continue;
175 }
176 unlink (pos + 1);
177 }
178
179 fclose (indexfd);
180 unlink (indexfile);
181 g_free (indexfile);
182 }
183
184
185 void
186 gftp_delete_cache_entry (gftp_request * request)
187 {
188 char *oldindexfile, *newindexfile, *pos, buf[BUFSIZ], description[BUFSIZ];
189 FILE *indexfd, *newfd;
190 size_t len, buflen;
191
192 g_snprintf (description, sizeof (description), "%s://%s@%s:%d%s",
193 gftp_cache_get_url_prefix (request),
194 request->username == NULL ? "" : request->username,
195 request->hostname == NULL ? "" : request->hostname,
196 request->port,
197 request->directory == NULL ? "" : request->directory);
198
199 oldindexfile = expand_path (BASE_CONF_DIR "/cache/index.db");
200 if ((indexfd = fopen (oldindexfile, "rb")) == NULL)
201 {
202 g_free (oldindexfile);
203 return;
204 }
205
206 newindexfile = expand_path (BASE_CONF_DIR "/cache/index.db.new");
207 if ((newfd = fopen (newindexfile, "wb")) == NULL)
208 {
209 g_free (oldindexfile);
210 g_free (newindexfile);
211 return;
212 }
213
214 buflen = strlen (description);
215 while (fgets (buf, sizeof (buf) - 1, indexfd))
216 {
217 len = strlen (buf);
218 if (buf[len - 1] == '\n')
219 buf[--len] = '\0';
220 if (buf[len - 1] == '\r')
221 buf[--len] = '\0';
222
223 if (!((pos = strrchr (buf, '\t')) != NULL && *(pos + 1) != '\0'))
224 {
225 printf (_("Error: Invalid line %s in cache index file\n"), buf);
226 continue;
227 }
228
229 if (buflen == pos - buf && strncmp (buf, description, pos - buf) == 0)
230 unlink (pos + 1);
231 else
232 {
233 buf[strlen (buf)] = '\n';
234 fwrite (buf, 1, strlen (buf), newfd);
235 }
236 }
237
238 fclose (indexfd);
239 fclose (newfd);
240
241 unlink (oldindexfile);
242 rename (newindexfile, oldindexfile);
243
244 g_free (oldindexfile);
245 g_free (newindexfile);
246 }
247