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

浏览器

开发平台:

Unix_Linux

  1. /***************************************
  2.   $Header: /home/amb/wwwoffle/RCS/htdig.c 1.10 1999/09/06 18:15:42 amb Exp $
  3.   WWWOFFLE - World Wide Web Offline Explorer - Version 2.5.
  4.   Handle the interface to the htdig search engine.
  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 <time.h>
  16. #include <utime.h>
  17. #include <sys/types.h>
  18. #include <sys/stat.h>
  19. #include <dirent.h>
  20. #include <fcntl.h>
  21. #include <unistd.h>
  22. #include <sys/wait.h>
  23. #include "wwwoffle.h"
  24. #include "misc.h"
  25. #include "proto.h"
  26. #include "errors.h"
  27. static void HTDigIndex(int fd,URL *Url);
  28. static void HTDigIndexRoot(int fd);
  29. static void HTDigIndexProtocol(int fd,char *proto);
  30. static void HTDigIndexHost(int fd,char *proto,char *host);
  31. static void HTDigIndexLastTime(int fd);
  32. static int HTSearch(int fd,char *args);
  33. /*++++++++++++++++++++++++++++++++++++++
  34.   Create a page for one of the htdig pages on the local server.
  35.   int fd The file descriptor to write the output to.
  36.   URL *Url The URL that specifies the path to generate the index for.
  37.   Header *head The head of the request.
  38.   ++++++++++++++++++++++++++++++++++++++*/
  39. void HTDigPage(int fd,URL *Url,Header *head)
  40. {
  41.  if(!strncmp(Url->path+7,"index/",5))
  42.     HTDigIndex(fd,Url);
  43.  else if(!strcmp(Url->path+7,"htsearch"))
  44.    {
  45.     if(HTSearch(fd,Url->args))
  46.        HTMLMessage(fd,500,"WWWOFFLE Server Error",NULL,"ServerError",
  47.                    "error","Problem running htsearch program.",
  48.                    NULL);
  49.    }
  50.  else if(!strchr(Url->path+7,'/'))
  51.     LocalPage(fd,Url->path,head);
  52.  else
  53.     HTMLMessage(fd,404,"WWWOFFLE Page Not Found",NULL,"PageNotFound",
  54.                 "url",Url->name,
  55.                 NULL);
  56. }
  57. /*++++++++++++++++++++++++++++++++++++++
  58.   Produce one of the indexes for htdig to search.
  59.   int fd The file descriptor to write to.
  60.   URL *Url The URL that was requested.
  61.   ++++++++++++++++++++++++++++++++++++++*/
  62. static void HTDigIndex(int fd,URL *Url)
  63. {
  64.  char *proto=(char*)malloc(strlen(Url->path)-10),*host="";
  65.  int lasttime;
  66.  int i;
  67.  strcpy(proto,Url->path+13);
  68.  lasttime=!strcmp(proto,"lasttime");
  69.  if(*proto && proto[strlen(proto)-1]=='/')
  70.     proto[strlen(proto)-1]=0;
  71.  for(i=0;proto[i];i++)
  72.     if(proto[i]=='/')
  73.       {
  74.        proto[i]=0;
  75.        host=proto+i+1;
  76.        break;
  77.       }
  78.  if(*proto)
  79.    {
  80.     for(i=0;i<NProtocols;i++)
  81.        if(!strcmp(Protocols[i].name,proto))
  82.           break;
  83.     if(i==NProtocols)
  84.        *proto=0;
  85.    }
  86.  if(!lasttime &&
  87.     ((*host && (strchr(host,'/') || !strcmp(host,"..") || !strcmp(host,"."))) ||
  88.      (*proto && (!strcmp(host,"..") || !strcmp(host,".")))||
  89.      (*host && !*proto) || (Url->path[13] && !*proto)))
  90.     HTMLMessage(fd,404,"WWWOFFLE Page Not Found",NULL,"PageNotFound",
  91.                 "url",Url->name,
  92.                 NULL);
  93.  else
  94.    {
  95.     HTMLMessageHead(fd,200,"WWWOFFLE HTDig Index",
  96.                     NULL);
  97.     write_string(fd,"<html>n"
  98.                     "<head>n"
  99.                     "<title></title>n"
  100.                     "</head>n"
  101.                     "<body>n");
  102.     if(lasttime)
  103.        HTDigIndexLastTime(fd);
  104.     else if(!*host && !*proto)
  105.        HTDigIndexRoot(fd);
  106.     else if(!*host)
  107.        HTDigIndexProtocol(fd,proto);
  108.     else
  109.        HTDigIndexHost(fd,proto,host);
  110.     write_string(fd,"</body>n"
  111.                     "</html>n");
  112.    }
  113.  free(proto);
  114. }
  115. /*++++++++++++++++++++++++++++++++++++++
  116.   Index the root of the cache.
  117.   int fd The file descriptor to write to.
  118.   ++++++++++++++++++++++++++++++++++++++*/
  119. static void HTDigIndexRoot(int fd)
  120. {
  121.  int i;
  122.  for(i=0;i<NProtocols;i++)
  123.     write_formatted(fd,"<a href="%s/"> </a>n",Protocols[i].name);
  124. }
  125. /*++++++++++++++++++++++++++++++++++++++
  126.   Index the hosts for one protocol in the cache.
  127.   int fd The file descriptor to write to.
  128.   char *proto The protocol to index.
  129.   ++++++++++++++++++++++++++++++++++++++*/
  130. static void HTDigIndexProtocol(int fd,char *proto)
  131. {
  132.  DIR *dir;
  133.  struct dirent* ent;
  134.  struct stat buf;
  135.  /* Open the spool directory. */
  136.  if(chdir(proto))
  137.     return;
  138.  dir=opendir(".");
  139.  if(!dir)
  140.    {chdir("..");return;}
  141.  ent=readdir(dir);  /* skip .  */
  142.  if(!ent)
  143.    {closedir(dir);chdir("..");return;}
  144.  ent=readdir(dir);  /* skip .. */
  145.  /* Output all of the host sub-directories. */
  146.  while((ent=readdir(dir)))
  147.     if(!stat(ent->d_name,&buf) && S_ISDIR(buf.st_mode))
  148.       {
  149. #if defined(__CYGWIN__)
  150.        if(strchr(ent->d_name,'!'))
  151.          {
  152.           char *bang=strchr(ent->d_name,'!');
  153.           *bang=':';
  154.          }
  155. #endif
  156.        write_formatted(fd,"<a href="%s/"> </a>n",ent->d_name);
  157.       }
  158.  closedir(dir);
  159.  chdir("..");
  160. }
  161. /*++++++++++++++++++++++++++++++++++++++
  162.   Create an index of the pages on a host.
  163.   int fd The file descriptor to write to.
  164.   char *proto The protocol to index.
  165.   char *host The name of the subdirectory.
  166.   ++++++++++++++++++++++++++++++++++++++*/
  167. static void HTDigIndexHost(int fd,char *proto,char *host)
  168. {
  169.  DIR *dir;
  170.  struct dirent* ent;
  171.  char *url;
  172.  /* Open the spool subdirectory. */
  173.  if(chdir(proto))
  174.     return;
  175.  /* Open the spool subdirectory. */
  176. #if defined(__CYGWIN__)
  177.  if(strchr(host,':'))
  178.    {
  179.     char *colon=strchr(host,':');
  180.     *colon='!';
  181.    }
  182. #endif
  183.  if(chdir(host))
  184.    {chdir("..");return;}
  185.  dir=opendir(".");
  186.  if(!dir)
  187.    {chdir("../..");return;}
  188.  ent=readdir(dir);  /* skip .  */
  189.  if(!ent)
  190.    {closedir(dir);chdir("../..");return;}
  191.  ent=readdir(dir);  /* skip .. */
  192.  /* Output all of the file names. */
  193.  while((ent=readdir(dir)))
  194.     if(*ent->d_name=='D' && (url=FileNameToURL(ent->d_name)))
  195.       {
  196.        URL *Url=SplitURL(url);
  197.        if(Url->Protocol->number==Protocol_HTTP)
  198.           write_formatted(fd,"<a href="%s"> </a>n",Url->name);
  199.        else
  200.           write_formatted(fd,"<a href="/%s/%s"> </a>n",Url->proto,Url->hostp);
  201.        FreeURL(Url);
  202.        free(url);
  203.       }
  204.  closedir(dir);
  205.  chdir("../..");
  206. }
  207. /*++++++++++++++++++++++++++++++++++++++
  208.   Create an index of the lasttime accessed pages.
  209.   int fd The file descriptor to write to.
  210.   ++++++++++++++++++++++++++++++++++++++*/
  211. static void HTDigIndexLastTime(int fd)
  212. {
  213.  DIR *dir;
  214.  struct dirent* ent;
  215.  char *url;
  216.  /* Open the spool subdirectory. */
  217.  if(chdir("lasttime"))
  218.     return;
  219.  dir=opendir(".");
  220.  if(!dir)
  221.    {chdir("..");return;}
  222.  ent=readdir(dir);  /* skip .  */
  223.  if(!ent)
  224.    {closedir(dir);chdir("..");return;}
  225.  ent=readdir(dir);  /* skip .. */
  226.  /* Output all of the file names. */
  227.  while((ent=readdir(dir)))
  228.     if(*ent->d_name=='D' && (url=FileNameToURL(ent->d_name)))
  229.       {
  230.        URL *Url=SplitURL(url);
  231.        if(Url->Protocol->number==Protocol_HTTP)
  232.           write_formatted(fd,"<a href="%s"> </a>n",Url->name);
  233.        else
  234.           write_formatted(fd,"<a href="/%s/%s"> </a>n",Url->proto,Url->hostp);
  235.        FreeURL(Url);
  236.        free(url);
  237.       }
  238.  closedir(dir);
  239.  chdir("..");
  240. }
  241. /*++++++++++++++++++++++++++++++++++++++
  242.   Perform a search using the data from the posted form.
  243.   int HTSearch Returns 1 in case of error.
  244.   int fd The file descriptor to write to.
  245.   char *args The arguments of the request.
  246.   ++++++++++++++++++++++++++++++++++++++*/
  247. static int HTSearch(int fd,char *args)
  248. {
  249.  pid_t pid;
  250.  if((pid=fork())==-1)
  251.    {PrintMessage(Warning,"Cannot fork to call htsearch [%!s].");return(1);}
  252.  else if(pid)
  253.    {
  254.     int status;
  255.     wait(&status);
  256.     if(!WIFEXITED(status))
  257.        return(1);
  258.    }
  259.  else
  260.    {
  261.     char *query=(char*)malloc(strlen(args)+16);
  262.     if(fd!=1)
  263.       {
  264.        close(1);
  265.        dup(fd);
  266.        close(fd);
  267.       }
  268.     write_string(1,"HTTP/1.0 200 htsearch outputrn");
  269.     putenv("REQUEST_METHOD=GET");
  270.     sprintf(query,"QUERY_STRING=%s",args);
  271.     putenv(query);
  272.     putenv("SCRIPT_NAME=htsearch");
  273.     execl("html/htdig/scripts/wwwoffle-htsearch","html/htdig/scripts/wwwoffle-htsearch",NULL);
  274.     PrintMessage(Warning,"Cannot exec html/htdig/scripts/wwwoffle-htsearch. [%!s]");
  275.     exit(1);
  276.    }
  277.  return(0);
  278. }