wwwoffle-tools.c
上传用户:seven77cht
上传日期:2007-01-04
资源大小:486k
文件大小:10k
源码类别:

浏览器

开发平台:

Unix_Linux

  1. /***************************************
  2.   $Header: /home/amb/wwwoffle/RCS/wwwoffle-tools.c 1.16 1999/12/18 12:27:03 amb Exp $
  3.   WWWOFFLE - World Wide Web Offline Explorer - Version 2.5.
  4.   Tools for use in the cache for version 2.x.
  5.   ******************/ /******************
  6.   Written by Andrew M. Bishop
  7.   This file Copyright 1997,98,99 Andrew M. Bishop
  8.   It may be distributed under the GNU Public License, version 2, or
  9.   any higher version.  See section COPYING of the GNU Public license
  10.   for conditions under which this file may be redistributed.
  11.   ***************************************/
  12. #include <stdio.h>
  13. #include <stdlib.h>
  14. #include <string.h>
  15. #include <ctype.h>
  16. #include <time.h>
  17. #include <utime.h>
  18. #include <sys/time.h>
  19. #include <sys/types.h>
  20. #include <sys/stat.h>
  21. #include <dirent.h>
  22. #include <fcntl.h>
  23. #include <unistd.h>
  24. #include <errno.h>
  25. #include "wwwoffle.h"
  26. #include "misc.h"
  27. #include "errors.h"
  28. #include "config.h"
  29. #ifndef SPOOL_DIR
  30. #define SPOOL_DIR DEF_SPOOL
  31. #endif
  32. /*+ Need this for Win32 to use binary mode +*/
  33. #ifndef O_BINARY
  34. #define O_BINARY 0
  35. #endif
  36. #define LS         1
  37. #define LS_SPECIAL 2
  38. #define MV         3
  39. #define RM         4
  40. #define READ       5
  41. #define WRITE      6
  42. static void wwwoffle_ls(URL *Url);
  43. static void wwwoffle_ls_special(char *name);
  44. static void wwwoffle_mv(URL *Url1,URL *Url2);
  45. static void wwwoffle_rm(URL *Url);
  46. static void wwwoffle_read(URL *Url);
  47. static void wwwoffle_write(URL *Url);
  48. static void ls(char *file);
  49. /*++++++++++++++++++++++++++++++++++++++
  50.   The main program
  51.   ++++++++++++++++++++++++++++++++++++++*/
  52. int main(int argc,char **argv)
  53. {
  54.  struct stat buf;
  55.  URL *Url[2];
  56.  int mode=0;
  57.  int i;
  58.  char *p;
  59.  p=argv[0]+strlen(argv[0])-1;
  60.  while(p>=argv[0] && *p!='/')
  61.     p--;
  62.  p++;
  63.  if(!strcmp(p,"wwwoffle-ls"))
  64.     mode=LS;
  65.  else if(!strcmp(p,"wwwoffle-mv"))
  66.     mode=MV;
  67.  else if(!strcmp(p,"wwwoffle-rm"))
  68.     mode=RM;
  69.  else if(!strcmp(p,"wwwoffle-read"))
  70.     mode=READ;
  71.  else if(!strcmp(p,"wwwoffle-write"))
  72.     mode=WRITE;
  73.  else
  74.    {
  75.     fprintf(stderr,"Program must be started as: wwwoffle-ls, wwwoffle-mv, wwwoffle-rmn");
  76.     fprintf(stderr,"                            wwwoffle-read or wwwoffle-writen");
  77.     exit(1);
  78.    }
  79.  /* Initialise */
  80.  if(mode==LS && argc!=2)
  81.    {fprintf(stderr,"Usage: wwwoffle-ls ( <dir>/<subdir> | <protocol>://<host> | <URL> | n"
  82.                    "                     outgoing | monitor | lasttime | prevtime[0-9] )n");exit(0);}
  83.  else if(mode==MV && argc!=3)
  84.    {fprintf(stderr,"Usage: wwwoffle-mv (<dir1>/<subdir1> | <protocol1>://<host1>)n"
  85.                    "                   (<dir2>/<subdir2> | <protocol2>://<host2>)n");exit(0);}
  86.  else if(mode==RM && argc!=2)
  87.    {fprintf(stderr,"Usage: wwwoffle-rm <URL>n");exit(0);}
  88.  else if(mode==READ && argc!=2)
  89.    {fprintf(stderr,"Usage: wwwoffle-read <URL>n");exit(0);}
  90.  else if(mode==WRITE && argc!=2)
  91.    {fprintf(stderr,"Usage: wwwoffle-write <URL>n");exit(0);}
  92.  if(stat("outgoing",&buf) || !S_ISDIR(buf.st_mode))
  93.    {
  94.     chdir(SPOOL_DIR);
  95.     if(stat("outgoing",&buf) || !S_ISDIR(buf.st_mode))
  96.       {fprintf(stderr,"The wwwoffle-tools programs must be started from the spool directoryn"
  97.                       "There is no 'outgoing' directory here so it can't be right.n");exit(1);}
  98.    }
  99.  InitErrorHandler(p,0,1);
  100.  umask(0);
  101.  /* Get the arguments */
  102.  for(i=1;i<argc;i++)
  103.    {
  104.     char *colon=strchr(argv[i],':');
  105.     char *slash=strchr(argv[i],'/');
  106.     if(mode==LS && (!strcmp(argv[i],"outgoing") || !strcmp(argv[i],"monitor") ||
  107.                     !strcmp(argv[i],"lasttime") || (!strncmp(argv[i],"prevtime",8) && isdigit(argv[i][8]))))
  108.       {
  109.        mode=LS_SPECIAL;
  110.       }
  111.     else if(colon && slash && colon<slash)
  112.       {
  113.        Url[i-1]=SplitURL(argv[i]);
  114.       }
  115.     else
  116.       {
  117.        char *slash,*url;
  118.        slash=strchr(argv[i],'/');
  119.        if(!slash)
  120.          {fprintf(stderr,"Cannot parse the argument '%s'n",argv[i]);exit(1);}
  121.        *slash=0;
  122.        url=(char*)malloc(strlen(slash+1)+strlen(argv[i])+8);
  123.        sprintf(url,"%s://%s",argv[i],slash+1);
  124.        Url[i-1]=SplitURL(url);
  125.       }
  126.    }
  127.  if(mode==LS)
  128.     wwwoffle_ls(Url[0]);
  129.  else if(mode==LS_SPECIAL)
  130.     wwwoffle_ls_special(argv[1]);
  131.  else if(mode==MV)
  132.     wwwoffle_mv(Url[0],Url[1]);
  133.  else if(mode==RM)
  134.     wwwoffle_rm(Url[0]);
  135.  else if(mode==READ)
  136.     wwwoffle_read(Url[0]);
  137.  else if(mode==WRITE)
  138.     wwwoffle_write(Url[0]);
  139.  exit(0);
  140. }
  141. /*++++++++++++++++++++++++++++++++++++++
  142.   List the URLs within a directory of the cache.
  143.   URL *Url The URL to list.
  144.   ++++++++++++++++++++++++++++++++++++++*/
  145. static void wwwoffle_ls(URL *Url)
  146. {
  147.  if(chdir(Url->proto))
  148.    {PrintMessage(Warning,"Cannot change to directory '%s' [%!s].",Url->proto);return;}
  149.  if(chdir(Url->dir))
  150.    {PrintMessage(Warning,"Cannot change to directory '%s/%s' [%!s].",Url->proto,Url->dir);chdir("..");return;}
  151.  if(strcmp(Url->path,"/"))
  152.    {
  153.     char *name=URLToFileName(Url);
  154.     *name='D';
  155.     ls(name);
  156.     free(name);
  157.    }
  158.  else
  159.    {
  160.     struct dirent* ent;
  161.     DIR *dir=opendir(".");
  162.     if(!dir)
  163.       {PrintMessage(Warning,"Cannot open current directory '%s/%s' [%!s].",Url->proto,Url->dir);chdir("../..");return;}
  164.     ent=readdir(dir);  /* skip .  */
  165.     if(!ent)
  166.       {PrintMessage(Warning,"Cannot read current directory '%s/%s' [%!s].",Url->proto,Url->dir);closedir(dir);chdir("../..");return;}
  167.     ent=readdir(dir);  /* skip .. */
  168.     while((ent=readdir(dir)))
  169.       {
  170.        if(*ent->d_name=='D' && ent->d_name[strlen(ent->d_name)-1]!='~')
  171.           ls(ent->d_name);
  172.       }
  173.     closedir(dir);
  174.    }
  175.  chdir("../..");
  176. }
  177. /*++++++++++++++++++++++++++++++++++++++
  178.   List the URLs within the outgoing, monitor or lasttime/prevtime special directory of the cache.
  179.   char *name The name of the directory to list.
  180.   ++++++++++++++++++++++++++++++++++++++*/
  181. static void wwwoffle_ls_special(char *name)
  182. {
  183.  struct dirent* ent;
  184.  DIR *dir;
  185.  if(chdir(name))
  186.    {PrintMessage(Warning,"Cannot change to directory '%s' [%!s].",name);return;}
  187.  dir=opendir(".");
  188.  if(!dir)
  189.    {PrintMessage(Warning,"Cannot open current directory '%s' [%!s].",name);chdir("..");return;}
  190.  ent=readdir(dir);  /* skip .  */
  191.  if(!ent)
  192.    {PrintMessage(Warning,"Cannot read current directory '%s' [%!s].",name);closedir(dir);chdir("..");return;}
  193.  ent=readdir(dir);  /* skip .. */
  194.  while((ent=readdir(dir)))
  195.    {
  196.     if((*ent->d_name=='D' || *ent->d_name=='O') && ent->d_name[strlen(ent->d_name)-1]!='~')
  197.        ls(ent->d_name);
  198.    }
  199.  closedir(dir);
  200.  chdir("..");
  201. }
  202. /*++++++++++++++++++++++++++++++++++++++
  203.   List one file.
  204.   char *file The name of the file to ls.
  205.   ++++++++++++++++++++++++++++++++++++++*/
  206. static void ls(char *file)
  207. {
  208.  static char *month[12]={"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"};
  209.  struct stat buf;
  210.  time_t now=-1;
  211.  if(now==-1)
  212.     now=time(NULL);
  213.  if(stat(file,&buf))
  214.    {PrintMessage(Warning,"Cannot stat the file '%s' [%!s].",file);return;}
  215.  else
  216.    {
  217.     char *url=FileNameToURL(file);
  218.     if(url)
  219.       {
  220.        struct tm *tim=localtime(&buf.st_mtime);
  221.        if(buf.st_mtime<(now-(180*24*3600)))
  222.           printf("%s %7ld %3s %2d %d %sn",file,(long)buf.st_size,month[tim->tm_mon],tim->tm_mday,tim->tm_year+1900,url);
  223.        else
  224.           printf("%s %7ld %3s %2d %2d:%02d %sn",file,(long)buf.st_size,month[tim->tm_mon],tim->tm_mday,tim->tm_hour,tim->tm_min,url);
  225.        free(url);
  226.       }
  227.    }
  228. }
  229. /*++++++++++++++++++++++++++++++++++++++
  230.   Move one URL or host to another.
  231.   URL *Url1 The source URL.
  232.   URL *Url2 The destination URL.
  233.   ++++++++++++++++++++++++++++++++++++++*/
  234. static void wwwoffle_mv(URL *Url1,URL *Url2)
  235. {
  236.  struct dirent* ent;
  237.  DIR *dir;
  238.  if(chdir(Url1->proto))
  239.    {PrintMessage(Warning,"Cannot change to directory '%s' [%!s].",Url1->proto);return;}
  240.  if(chdir(Url1->dir))
  241.    {PrintMessage(Warning,"Cannot change to directory '%s/%s' [%!s].",Url1->proto,Url1->dir);chdir("..");return;}
  242.  dir=opendir(".");
  243.  if(!dir)
  244.    {PrintMessage(Warning,"Cannot open current directory '%s/%s' [%!s].",Url1->proto,Url1->dir);chdir("../..");return;}
  245.  ent=readdir(dir);  /* skip .  */
  246.  if(!ent)
  247.    {PrintMessage(Warning,"Cannot read current directory '%s/%s' [%!s].",Url1->proto,Url1->dir);closedir(dir);chdir("../..");return;}
  248.  ent=readdir(dir);  /* skip .. */
  249.  while((ent=readdir(dir)))
  250.    {
  251.     if(*ent->d_name=='D')
  252.       {
  253.        char *url1=FileNameToURL(ent->d_name);
  254.        if(url1)
  255.          {
  256.           char *url2;
  257.           URL *Url;
  258.           char *path2,*name1,*name2;
  259.           int fd2;
  260.           Url=SplitURL(url1);
  261.           url2=(char*)malloc(strlen(Url->pathp)+strlen(Url2->dir)+strlen(Url2->proto)+8);
  262.           sprintf(url2,"%s://%s%s",Url2->proto,Url2->dir,Url->pathp);
  263.           FreeURL(Url);
  264.           name1=ent->d_name;
  265.           Url=SplitURL(url2);
  266.           name2=URLToFileName(Url);
  267.           path2=(char*)malloc(strlen(Url2->proto)+strlen(Url2->dir)+strlen(name2)+16);
  268.           sprintf(path2,"../../%s",Url2->proto);
  269.           mkdir(path2,DEF_DIR_PERM);
  270.           sprintf(path2,"../../%s/%s",Url2->proto,Url2->dir);
  271.           mkdir(path2,DEF_DIR_PERM);
  272.           *name1=*name2='D';
  273.           sprintf(path2,"../../%s/%s/%s",Url2->proto,Url2->dir,name2);
  274.           rename(name1,path2);
  275.           *name1=*name2='U';
  276.           sprintf(path2,"../../%s/%s/%s",Url2->proto,Url2->dir,name2);
  277.           fd2=open(path2,O_WRONLY|O_CREAT|O_TRUNC|O_BINARY,DEF_FILE_PERM);
  278.           write_string(fd2,Url->name);
  279.           close(fd2);
  280.           unlink(name2);
  281.           free(url1);
  282.           free(url2);
  283.           free(name2);
  284.           free(path2);
  285.           FreeURL(Url);
  286.          }
  287.       }
  288.    }
  289.  closedir(dir);
  290.  chdir("../..");
  291. }
  292. /*++++++++++++++++++++++++++++++++++++++
  293.   Delete a URL.
  294.   URL *Url The URL to delete.
  295.   ++++++++++++++++++++++++++++++++++++++*/
  296. static void wwwoffle_rm(URL *Url)
  297. {
  298.  DeleteWebpageSpoolFile(Url,0);
  299. }
  300. /*++++++++++++++++++++++++++++++++++++++
  301.   Read a URL and output on stdout.
  302.   URL *Url The URL to read.
  303.   ++++++++++++++++++++++++++++++++++++++*/
  304. static void wwwoffle_read(URL *Url)
  305. {
  306.  char buffer[READ_BUFFER_SIZE];
  307.  int n,spool=OpenWebpageSpoolFile(1,Url);
  308.  if(spool==-1)
  309.     return;
  310.  init_buffer(spool);
  311.  while((n=read_data(spool,buffer,READ_BUFFER_SIZE))>0)
  312.     write_data(1,buffer,n);
  313.  close(spool);
  314. }
  315. /*++++++++++++++++++++++++++++++++++++++
  316.   Write a URL from the input on stdin.
  317.   URL *Url The URL to write.
  318.   ++++++++++++++++++++++++++++++++++++++*/
  319. static void wwwoffle_write(URL *Url)
  320. {
  321.  char buffer[READ_BUFFER_SIZE];
  322.  int n,spool=OpenWebpageSpoolFile(0,Url);
  323.  if(spool==-1)
  324.     return;
  325.  init_buffer(0);
  326.  while((n=read_data(0,buffer,READ_BUFFER_SIZE))>0)
  327.     write_data(spool,buffer,n);
  328.  close(spool);
  329. }