procquery.c
上传用户:sddyfurun
上传日期:2007-01-04
资源大小:525k
文件大小:7k
源码类别:

代理服务器

开发平台:

Unix_Linux

  1. /*                                                                           */
  2. /*  * procquery.c : Routines for processing results from Archie              */
  3. /*  *                                                                        */
  4. /*  * Originally part of the Prospero Archie client by Cliff Neuman          */
  5. /*    (bcn@isi.edu).                                                         */
  6. /*  * Modified by Brendan Kehoe (brendan@cygnus.com).                        */
  7. /*  * Re-modified by George Ferguson (ferguson@cs.rochester.edu).            */
  8. /*  *                                                                        */
  9. /*  * Copyright (c) 1991 by the University of Washington                     */
  10. /*  *                                                                        */
  11. /*  * For copying and distribution information, please see the file          */
  12. /*  * <copyright.h>.                                                         */
  13. /*  *                                                                        */
  14. #include "pmachine.h"
  15. #include "pfs.h"
  16. #include "perrno.h"
  17. #include "archie.h"
  18. /* Defined in dirsend.c.  */
  19. extern int client_dirsrv_timeout, client_dirsrv_retry;
  20. /* In archie.c.  */
  21. extern char *program_name;
  22. extern FILE *archie_out;
  23. /*
  24.  * Functions defined here
  25.  */
  26. static void display_link (), alex_name ();
  27. void procquery ();
  28. /*
  29.  * Data defined here
  30.  */
  31. extern int pwarn, perrno;
  32. extern int listflag, sortflag, alex;
  33. int pfs_debug;
  34. static struct tm *presenttime;
  35. static char lastpath[MAX_VPATH] = "01";
  36. static char lasthost[MAX_VPATH] = "01";
  37. /* Print the contents of the given virtual link.  */
  38. static void
  39. display_link (l)
  40.      VLINK l;
  41. {
  42.     PATTRIB  ap;
  43.     char linkpath[MAX_VPATH];
  44.     int dirflag = 0;
  45.     int size = 0;
  46.     char *modes = "";
  47.     char archie_date[20];
  48.     char *gt_date = "";
  49.     int gt_year = 0;
  50.     int gt_mon = 0;
  51.     int gt_day = 0;
  52.     int gt_hour = 0;
  53.     int gt_min = 0;
  54.     int special = listflag || alex;
  55.     /* Initialize local buffers */
  56.     *archie_date = '';
  57.     /* Remember if we're looking at a directory */
  58.     if (sindex(l->type,"DIRECTORY"))
  59. dirflag = 1;
  60.     else
  61. dirflag = 0;
  62.     
  63.     /* Extract the linkpath from the filename */
  64.     strcpy(linkpath,l->filename);
  65.     *(linkpath + (strlen(linkpath) - strlen(l->name) - 1)) = '';
  66.     
  67.     /* Is this a new host? */
  68.     if (strcmp(l->host,lasthost) != 0) {
  69. if (!special)
  70.     fprintf (archie_out, "nHost %snn",l->host);
  71. strcpy(lasthost,l->host);
  72. *lastpath = '01';
  73.     }
  74.     
  75.     /* Is this a new linkpath (location)? */
  76.     if(strcmp(linkpath,lastpath) != 0) {
  77. if (!special)
  78.     fprintf (archie_out,
  79.      "    Location: %sn",(*linkpath ? linkpath : "/"));
  80. strcpy(lastpath,linkpath);
  81.     }
  82.     
  83.     /* Parse the attibutes of this link */
  84.     for (ap = l->lattrib; ap; ap = ap->next) {
  85. if (strcmp(ap->aname,"SIZE") == 0) {
  86.     sscanf(ap->value.ascii,"%d",&size);
  87. } else if(strcmp(ap->aname,"UNIX-MODES") == 0) {
  88.     modes = ap->value.ascii;
  89. } else if(strcmp(ap->aname,"LAST-MODIFIED") == 0) {
  90.     gt_date = ap->value.ascii;
  91.     sscanf(gt_date,"%4d%2d%2d%2d%2d",&gt_year,
  92.    &gt_mon, &gt_day, &gt_hour, &gt_min);
  93.     if ((12 * (presenttime->tm_year + 1900 - gt_year) + 
  94. presenttime->tm_mon - gt_mon) > 6) 
  95. sprintf(archie_date,"%s %2d %4d",month_sname(gt_mon),
  96. gt_day, gt_year);
  97.     else
  98. sprintf(archie_date,"%s %2d %02d:%02d",month_sname(gt_mon),
  99.  gt_day, gt_hour, gt_min);
  100. }
  101.     }
  102.     
  103.     /* Print this link's information */
  104.     if (listflag)
  105.     fprintf (archie_out,
  106.      "%s %6d %s %s%sn",gt_date,size,l->host,l->filename,
  107.      (dirflag ? "/" : ""));
  108.     else if (alex)
  109.       alex_name (l->host, l->filename, dirflag);
  110.     else
  111. fprintf (archie_out,
  112.  "      %9s %s %10d  %s  %sn",(dirflag ? "DIRECTORY" : "FILE"),
  113.  modes,size,archie_date,l->name);
  114.     /* Free the attibutes */
  115.     atlfree(l->lattrib);
  116.     l->lattrib = NULL;
  117. }
  118. /* - - - - - - - - */
  119. /*
  120.  * procquery : Process the given query and display the results. If
  121.  * sortflag is non-zero, then the results are sorted by increasing
  122.  * date, else by host/filename. If listflag is non-zero then each
  123.  * entry is printed on a separate, complete line. Note that listflag
  124.  * is ignored by xarchie.
  125.  */
  126. void
  127. procquery(host,str,max_hits,offset,query)
  128. char *host,*str;
  129. int max_hits,offset;
  130. Query query;
  131. {
  132.     VLINK l;
  133.     time_t now;
  134.     /* initialize data structures for this query */
  135.     (void)time(&now);
  136.     presenttime = localtime(&now);
  137.     /* Do the query */
  138.     if (sortflag == 1)
  139. l = archie_query(host,str,max_hits,offset,query,AQ_INVDATECMP,0);
  140.     else
  141. l = archie_query(host,str,max_hits,offset,query,NULL,0);
  142.     /* Error? */
  143.     if (perrno != PSUCCESS) {
  144. if (p_err_text[perrno]) {
  145.     if (*p_err_string)
  146. fprintf(stderr, "%s: failed: %s - %sn",
  147. program_name, p_err_text[perrno], p_err_string);
  148.     else
  149.         fprintf(stderr, "%s failed: %sn",
  150. program_name, p_err_text[perrno]);
  151. } else
  152.     fprintf(stderr, "%s failed: Undefined error %d (prospero)",
  153.     program_name, perrno);
  154.     }
  155.     /* Warning? */
  156.     if (pwarn != PNOWARN) {
  157. if (*p_warn_string)
  158.     fprintf(stderr, "%s: Warning! %s - %sn", program_name,
  159. p_warn_text[pwarn], p_warn_string);
  160. else
  161.     fprintf(stderr, "%s: Warning! %sn", program_name, p_warn_text[pwarn]);
  162.     }
  163.     /* Display the results */
  164.     if (l == (VLINK)NULL && pwarn == PNOWARN && perrno == PSUCCESS) {
  165. if (! listflag) puts ("No matches.");
  166. exit (1);
  167.     }
  168.     *lasthost = '01';
  169.     *lastpath = '01';
  170.     while (l != NULL) {
  171. display_link (l);
  172. l = l->next;
  173.     }
  174. }
  175. /* Given a dotted hostname, return its Alex root.  */
  176. static char *
  177. alex_reverse (string, len)
  178.      char *string;
  179.      int len;
  180. {
  181.   register char *p, *q;
  182.   register int i = 0;
  183.   char *buf = (char *) malloc (len);
  184.   p = buf;
  185.   q = (char *) (string + len - 1);
  186.   while (q > string)
  187.     {
  188.       for (i = 0; q > string; q--, i++)
  189. if (*q == '.')
  190.   {
  191.     q++;
  192.     break;
  193.   }
  194.       if (q == string)
  195. i++;
  196.       strncpy (p, q, i);
  197.       p += i;
  198.       *p++ = '/';
  199.       i = 0;
  200.       q -= 2;
  201.     }
  202.   *--p = '';
  203.   return buf;
  204. }
  205. /* Emit a string that's the Alex filename for the given host and file.  */
  206. static void
  207. alex_name (host, file, dirp)
  208.      char *host, *file;
  209.      int dirp;
  210. {
  211.   int hostlen = strlen (host);
  212.   int len = 6 + hostlen + strlen (file) + dirp +  1;
  213.   char *buf = (char *) malloc (len);
  214.   if (! buf)
  215.     exit (99);
  216.   sprintf (buf, "/alex/%s%s", alex_reverse (host, hostlen), file);
  217.   if (dirp)
  218.     {
  219.       len -= dirp;
  220.       buf[len - 1] = '/';
  221.       buf[len] = '';
  222.     }
  223.   fputs (buf, archie_out);
  224. }