Mercurial > gftp.yaz
diff lib/cache.c @ 1:8b1883341c6f
Initial revision
author | masneyb |
---|---|
date | Mon, 05 Aug 2002 19:46:57 +0000 |
parents | |
children | c8ec7877432e |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/cache.c Mon Aug 05 19:46:57 2002 +0000 @@ -0,0 +1,247 @@ +/*****************************************************************************/ +/* cache.c - contains the cache routines */ +/* Copyright (C) 1998-2002 Brian Masney <masneyb@gftp.org> */ +/* */ +/* This program is free software; you can redistribute it and/or modify */ +/* it under the terms of the GNU General Public License as published by */ +/* the Free Software Foundation; either version 2 of the License, or */ +/* (at your option) any later version. */ +/* */ +/* This program is distributed in the hope that it will be useful, */ +/* but WITHOUT ANY WARRANTY; without even the implied warranty of */ +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */ +/* GNU General Public License for more details. */ +/* */ +/* You should have received a copy of the GNU General Public License */ +/* along with this program; if not, write to the Free Software */ +/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111 USA */ +/*****************************************************************************/ + +#include "gftp.h" + + +char * +gftp_cache_get_url_prefix (gftp_request * request) +{ + if (strcmp (request->protocol_name, "HTTP") == 0 && + strcmp (request->proxy_config, "ftp") == 0) + return ("ftp"); + + return (request->url_prefix); +} + + +FILE * +gftp_new_cache_entry (gftp_request * request) +{ + char *cachedir, tempstr[BUFSIZ]; + int cache_fd; + FILE *fd; + + if ((fd = gftp_find_cache_entry (request)) != NULL) + return (fd); + + cachedir = expand_path (BASE_CONF_DIR "/cache"); + if (access (cachedir, F_OK) == -1) + { + if (mkdir (cachedir, 0x1C0) < 0) + return (NULL); + } + + g_snprintf (tempstr, sizeof (tempstr), "%s/index.db", cachedir); + if ((fd = fopen (tempstr, "ab+")) == NULL) + { + g_free (cachedir); + return (NULL); + } + + g_snprintf (tempstr, sizeof (tempstr), "%s/cache.XXXXXX", cachedir); + if ((cache_fd = mkstemp (tempstr)) < 0) + return (NULL); + g_free (cachedir); + + fseek (fd, 0, SEEK_END); + fprintf (fd, "%s://%s@%s:%d%s\t%s\n", + gftp_cache_get_url_prefix (request), + request->username == NULL ? "" : request->username, + request->hostname == NULL ? "" : request->hostname, + request->port, + request->directory == NULL ? "" : request->directory, + tempstr); + + if (fclose (fd) != 0) + { + close (cache_fd); + return (NULL); + } + + if ((fd = fdopen (cache_fd, "wb+")) == NULL) + { + close (cache_fd); + return (NULL); + } + + return (fd); +} + + +FILE * +gftp_find_cache_entry (gftp_request * request) +{ + char *indexfile, *pos, buf[BUFSIZ], description[BUFSIZ]; + FILE *indexfd, *cachefd; + size_t len; + + g_snprintf (description, sizeof (description), "%s://%s@%s:%d%s", + gftp_cache_get_url_prefix (request), + request->username == NULL ? "" : request->username, + request->hostname == NULL ? "" : request->hostname, + request->port, + request->directory == NULL ? "" : request->directory); + + indexfile = expand_path (BASE_CONF_DIR "/cache/index.db"); + if ((indexfd = fopen (indexfile, "rb")) == NULL) + { + g_free (indexfile); + return (NULL); + } + g_free (indexfile); + + while (fgets (buf, sizeof (buf), indexfd)) + { + len = strlen (buf); + if (buf[len - 1] == '\n') + buf[--len] = '\0'; + if (buf[len - 1] == '\r') + buf[--len] = '\0'; + + if (!((pos = strrchr (buf, '\t')) != NULL && *(pos + 1) != '\0')) + continue; + + len = strlen (description); + if (pos - buf != len) + continue; + + if (strncmp (buf, description, len) == 0) + { + pos++; + if (fclose (indexfd) != 0) + return (NULL); + + if ((cachefd = fopen (pos, "rb+")) == NULL) + return (NULL); + + fseek (cachefd, 0, SEEK_END); + if (ftell (cachefd) == 0) + { + fclose (cachefd); + return (NULL); + } + fseek (cachefd, 0, SEEK_SET); + return (cachefd); + } + } + fclose (indexfd); + return (NULL); +} + + +void +gftp_clear_cache_files (void) +{ + char *indexfile, buf[BUFSIZ], *pos; + FILE *indexfd; + size_t len; + + indexfile = expand_path (BASE_CONF_DIR "/cache/index.db"); + if ((indexfd = fopen (indexfile, "rb")) == NULL) + { + g_free (indexfile); + return; + } + + while (fgets (buf, sizeof (buf), indexfd)) + { + len = strlen (buf); + if (buf[len - 1] == '\n') + buf[--len] = '\0'; + if (buf[len - 1] == '\r') + buf[--len] = '\0'; + + if (!((pos = strrchr (buf, '\t')) != NULL && *(pos + 1) != '\0')) + { + printf (_("Error: Invalid line %s in cache index file\n"), buf); + continue; + } + unlink (pos + 1); + } + + fclose (indexfd); + unlink (indexfile); + g_free (indexfile); +} + + +void +gftp_delete_cache_entry (gftp_request * request) +{ + char *oldindexfile, *newindexfile, *pos, buf[BUFSIZ], description[BUFSIZ]; + FILE *indexfd, *newfd; + size_t len, buflen; + + g_snprintf (description, sizeof (description), "%s://%s@%s:%d%s", + gftp_cache_get_url_prefix (request), + request->username == NULL ? "" : request->username, + request->hostname == NULL ? "" : request->hostname, + request->port, + request->directory == NULL ? "" : request->directory); + + oldindexfile = expand_path (BASE_CONF_DIR "/cache/index.db"); + if ((indexfd = fopen (oldindexfile, "rb")) == NULL) + { + g_free (oldindexfile); + return; + } + + newindexfile = expand_path (BASE_CONF_DIR "/cache/index.db.new"); + if ((newfd = fopen (newindexfile, "wb")) == NULL) + { + g_free (oldindexfile); + g_free (newindexfile); + return; + } + + buflen = strlen (description); + while (fgets (buf, sizeof (buf) - 1, indexfd)) + { + len = strlen (buf); + if (buf[len - 1] == '\n') + buf[--len] = '\0'; + if (buf[len - 1] == '\r') + buf[--len] = '\0'; + + if (!((pos = strrchr (buf, '\t')) != NULL && *(pos + 1) != '\0')) + { + printf (_("Error: Invalid line %s in cache index file\n"), buf); + continue; + } + + if (buflen == pos - buf && strncmp (buf, description, pos - buf) == 0) + unlink (pos + 1); + else + { + buf[strlen (buf)] = '\n'; + fwrite (buf, 1, strlen (buf), newfd); + } + } + + fclose (indexfd); + fclose (newfd); + + unlink (oldindexfile); + rename (newindexfile, oldindexfile); + + g_free (oldindexfile); + g_free (newindexfile); +} +