cache.c
上传用户:tjfeida
上传日期:2013-03-10
资源大小:1917k
文件大小:9k
源码类别:

Ftp客户端

开发平台:

Visual C++

  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. #include "gftp.h"
  20. static const char cvsid[] = "$Id: cache.c,v 1.6 2002/11/27 14:29:55 masneyb Exp $";
  21. char *
  22. gftp_cache_get_url_prefix (gftp_request * request)
  23. {
  24.   if (strcmp (request->protocol_name, "HTTP") == 0 &&
  25.       strcmp (request->proxy_config, "ftp") == 0)
  26.     return ("ftp");
  27.   return (request->url_prefix);
  28. }
  29. int
  30. gftp_new_cache_entry (gftp_request * request)
  31. {
  32.   char *cachedir, *tempstr, *temp1str;
  33.   int cache_fd, fd;
  34.   ssize_t ret;
  35.   cachedir = expand_path (BASE_CONF_DIR "/cache");
  36.   if (access (cachedir, F_OK) == -1)
  37.     {
  38.       if (mkdir (cachedir, S_IRUSR | S_IWUSR | S_IXUSR) < 0)
  39.         {
  40.           if (request != NULL)
  41.             request->logging_function (gftp_logging_error, request->user_data,
  42.                                  _("Error: Could not make directory %s: %sn"),
  43.                                  cachedir, g_strerror (errno));
  44.           return (-1);
  45.         }
  46.     }
  47.   tempstr = g_strdup_printf ("%s/index.db", cachedir);
  48.   if ((fd = open (tempstr, O_WRONLY | O_APPEND | O_CREAT, 
  49.                   S_IRUSR | S_IWUSR)) == -1)
  50.     {
  51.       if (request != NULL)
  52.         request->logging_function (gftp_logging_error, request->user_data,
  53.                                    _("Error: Cannot open local file %s: %sn"),
  54.                                    tempstr, g_strerror (errno));
  55.       g_free (tempstr);
  56.       g_free (cachedir);
  57.       return (-1);
  58.     }
  59.   g_free (tempstr);
  60.   tempstr = g_strdup_printf ("%s/cache.XXXXXX", cachedir);
  61.   if ((cache_fd = mkstemp (tempstr)) < 0)
  62.     {
  63.       g_free (tempstr);
  64.       if (request != NULL)
  65.         request->logging_function (gftp_logging_error, request->user_data,
  66.                                  _("Error: Cannot create temporary file: %sn"),
  67.                                  g_strerror (errno));
  68.       return (-1);
  69.     }
  70.   g_free (cachedir);
  71.   lseek (fd, 0, SEEK_END);
  72.   temp1str = g_strdup_printf ("%s://%s@%s:%d%st%sn", 
  73.                            gftp_cache_get_url_prefix (request),
  74.                            request->username == NULL ? "" : request->username,
  75.                            request->hostname == NULL ? "" : request->hostname,
  76.                            request->port, 
  77.                            request->directory == NULL ? "" : request->directory,
  78.                            tempstr);
  79.   g_free (tempstr);
  80.   ret = gftp_write (NULL, temp1str, strlen (temp1str), fd);
  81.   g_free (temp1str);
  82.   if (close (fd) != 0 || ret < 0)
  83.     {
  84.       if (request != NULL)
  85.         request->logging_function (gftp_logging_error, request->user_data,
  86.                                    _("Error closing file descriptor: %sn"),
  87.                                    g_strerror (errno));
  88.       close (cache_fd);
  89.       return (-1);
  90.     }
  91.   return (cache_fd);
  92. }
  93. int
  94. gftp_find_cache_entry (gftp_request * request)
  95. {
  96.   char *indexfile, *pos, buf[BUFSIZ], description[BUFSIZ];
  97.   gftp_getline_buffer * rbuf;
  98.   int indexfd, cachefd;
  99.   size_t len;
  100.   g_snprintf (description, sizeof (description), "%s://%s@%s:%d%s",
  101.               gftp_cache_get_url_prefix (request),
  102.               request->username == NULL ? "" : request->username,
  103.               request->hostname == NULL ? "" : request->hostname,
  104.               request->port, 
  105.               request->directory == NULL ? "" : request->directory);
  106.   indexfile = expand_path (BASE_CONF_DIR "/cache/index.db");
  107.   if ((indexfd = open (indexfile, O_RDONLY)) == -1)
  108.     {
  109.       g_free (indexfile);
  110.       return (-1);
  111.     }
  112.   g_free (indexfile);
  113.   rbuf = NULL;
  114.   while (gftp_get_line (NULL, &rbuf, buf, sizeof (buf), indexfd) > 0)
  115.     {
  116.       len = strlen (buf);
  117.       if (!((pos = strrchr (buf, 't')) != NULL && *(pos + 1) != ''))
  118. continue;
  119.       len = strlen (description);
  120.       if (pos - buf != len)
  121.         continue;
  122.       if (strncmp (buf, description, len) == 0)
  123. {
  124.   pos++;
  125.   if (close (indexfd) != 0)
  126.             {
  127.               if (request != NULL)
  128.                 request->logging_function (gftp_logging_error, 
  129.                                        request->user_data,
  130.                                        _("Error closing file descriptor: %sn"),
  131.                                        g_strerror (errno));
  132.               return (-1);
  133.             }
  134.   if ((cachefd = open (pos, O_RDONLY)) == -1)
  135.             {
  136.               if (request != NULL)
  137.                 request->logging_function (gftp_logging_error, 
  138.                                    request->user_data,
  139.                                    _("Error: Cannot open local file %s: %sn"),
  140.                                    pos, g_strerror (errno));
  141.               return (-1);
  142.             }
  143.           if (lseek (cachefd, 0, SEEK_END) == 0)
  144.             { 
  145.               close (cachefd); 
  146.               return (-1);
  147.             } 
  148.           if (lseek (cachefd, 0, SEEK_SET) == -1)
  149.             {
  150.               if (request != NULL)
  151.                 request->logging_function (gftp_logging_error, 
  152.                                        request->user_data,
  153.                                        _("Error: Cannot seek on file %s: %sn"),
  154.                                        pos, g_strerror (errno));
  155.             }
  156.   return (cachefd);
  157. }
  158.     }
  159.   close (indexfd);
  160.   return (-1);
  161. }
  162. void
  163. gftp_clear_cache_files (void)
  164. {
  165.   char *indexfile, buf[BUFSIZ], *pos;
  166.   gftp_getline_buffer * rbuf;
  167.   int indexfd;
  168.   size_t len;
  169.   indexfile = expand_path (BASE_CONF_DIR "/cache/index.db");
  170.   if ((indexfd = open (indexfile, O_RDONLY)) == -1)
  171.     {
  172.       g_free (indexfile);
  173.       return;
  174.     }
  175.   rbuf = NULL;
  176.   while (gftp_get_line (NULL, &rbuf, buf, sizeof (buf), indexfd) > 0)
  177.     {
  178.       len = strlen (buf);
  179.       if (!((pos = strrchr (buf, 't')) != NULL && *(pos + 1) != ''))
  180. continue;
  181.       unlink (pos + 1);
  182.     }
  183.   close (indexfd);
  184.   unlink (indexfile);
  185.   g_free (indexfile);
  186. }
  187. void
  188. gftp_delete_cache_entry (gftp_request * request, int ignore_directory)
  189. {
  190.   char *oldindexfile, *newindexfile, *pos, buf[BUFSIZ], description[BUFSIZ];
  191.   gftp_getline_buffer * rbuf;
  192.   int indexfd, newfd;
  193.   size_t len, buflen;
  194.   int remove;
  195.   g_snprintf (description, sizeof (description), "%s://%s@%s:%d%s",
  196.               gftp_cache_get_url_prefix (request),
  197.               request->username == NULL ? "" : request->username,
  198.               request->hostname == NULL ? "" : request->hostname,
  199.               request->port, 
  200.               ignore_directory || request->directory == NULL ? "" : request->directory);
  201.   oldindexfile = expand_path (BASE_CONF_DIR "/cache/index.db");
  202.   if ((indexfd = open (oldindexfile, O_RDONLY)) == -1)
  203.     {
  204.       g_free (oldindexfile);
  205.       return;
  206.     }
  207.   newindexfile = expand_path (BASE_CONF_DIR "/cache/index.db.new");
  208.   if ((newfd = open (newindexfile, O_WRONLY | O_CREAT, 
  209.                      S_IRUSR | S_IWUSR)) == -1)
  210.     {
  211.       if (request != NULL)
  212.         request->logging_function (gftp_logging_error, request->user_data,
  213.                                    _("Error: Cannot open local file %s: %sn"),
  214.                                    newindexfile, g_strerror (errno));
  215.       g_free (oldindexfile);
  216.       g_free (newindexfile);
  217.       return;
  218.     }
  219.   rbuf = NULL;
  220.   buflen = strlen (description);
  221.   while (gftp_get_line (NULL, &rbuf, buf, sizeof (buf), indexfd) > 0)
  222.     {
  223.       len = strlen (buf);
  224.       if (!((pos = strrchr (buf, 't')) != NULL && *(pos + 1) != ''))
  225.         {
  226.           if (request != NULL)
  227.             request->logging_function (gftp_logging_error, request->user_data,
  228.                             _("Error: Invalid line %s in cache index filen"), 
  229.                             buf);
  230.           continue;
  231.         }
  232.       remove = 0;
  233.       if (ignore_directory)
  234.         {
  235.           if (strncmp (buf, description, strlen (description)) == 0)
  236.             remove = 1;
  237.         }
  238.       else
  239.         {
  240.           if (buflen == pos - buf && strncmp (buf, description, pos - buf) == 0)
  241.             remove = 1;
  242.         }
  243.  
  244.       if (remove)
  245.         unlink (pos + 1);
  246.       else
  247.         {
  248.           buf[strlen (buf)] = 'n';
  249.           if (gftp_write (NULL, buf, strlen (buf), newfd) < 0)
  250.             break;
  251.         }
  252.     }
  253.   close (indexfd);
  254.   close (newfd);
  255.   unlink (oldindexfile);
  256.   rename (newindexfile, oldindexfile);
  257.   g_free (oldindexfile);
  258.   g_free (newindexfile);
  259. }