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

代理服务器

开发平台:

Unix_Linux

  1. /*                                                                           */
  2. /*  * Copyright (c) 1991 by the University of Washington                     */
  3. /*  *                                                                        */
  4. /*  * For copying and distribution information, please see the file          */
  5. /*  * <copyright.h>.                                                         */
  6. /*                                                                           */
  7. /*  * Archie client using the Prospero protocol.                             */
  8. /*  *                                                                        */
  9. /*  * Suggestions and improvements to Brendan Kehoe (brendan@cygnus.com).    */
  10. #include "pmachine.h"
  11. #include "getopt.h"
  12. #include "pfs.h"
  13. #include "rdgram.h"
  14. #include "archie.h"
  15. /* Whether we should produce single-line listings suitable for frobbing by   */
  16. /*    other programs, or produce nice clean human output (default).          */
  17. int listflag = 0;
  18. /* How to sort the data; 1 means by date, 0 is by inverse hostname.          */
  19. int sortflag = 0;
  20. /* Used by CUTCP to see if they specified the host with `-h' or if           */
  21. /*    the config.tel file should be consulted.                               */
  22. int hostset = 0;
  23. /* When doing searches, should we make some comments to pacify the user?     */
  24. int verbose = 0;
  25. /* Maximum number of hits for this query; pushing this high is very          */
  26. /*    anti-social.                                                           */
  27. int max_hits = MAX_HITS;
  28. /* The offset for the Prospero query.                                        */
  29. int offset = 0;
  30. /* Display the Alex filename?                                                */
  31. int alex = 0;
  32. /* The default host to query for searches.                                   */
  33. char *host = ARCHIE_HOST;
  34. FILE *archie_out;
  35. /* The name this program was run with.                                       */
  36. char *program_name;
  37. extern int pfs_debug;
  38. extern int rdgram_priority;
  39. void usage ();
  40. extern char *getenv ();
  41. void
  42. main (argc, argv)
  43.      int argc;
  44.      char **argv;
  45. {
  46.   Query query = EXACT;
  47.   int optc, tmp;
  48.   /* If true, display the release.                                           */
  49.   int exitflag = 0;
  50.   /* The file to print the results to.  Defaults to stdout.                  */
  51.   char *outfile = (char *)NULL;
  52.   char *p;
  53.   static char *archies[] = { ARCHIES };
  54. #ifdef SOCKS
  55.   LIBPREFIX2(init)(argv[0]);
  56. #endif
  57.   program_name = argv[0];
  58.   /* Default debugging level.                                                */
  59.   pfs_debug = 0;
  60.   if ((p = getenv ("ARCHIE_HOST")) != (char *) NULL)
  61.     host = p;
  62.   while ((optc = getopt (argc, argv, "D:LN::O:ceh:alm:o:rstvV")) != EOF)
  63.     {
  64.       switch (optc)
  65. {
  66. case 'D':
  67.   pfs_debug = atoi (optarg);
  68.   break;
  69. case 'L':
  70.   printf ("Known archie servers:n");
  71.   for (tmp = 0; tmp < NARCHIES; tmp++)
  72.     printf ("t%sn", archies[tmp]);
  73.   printf (" * %s is the default Archie server.n", ARCHIE_HOST);
  74.   printf (" * For the most up-to-date list, write to an Archie server and give itn   the command `servers'.n");
  75.   exitflag = 1;
  76.   break;
  77. case 'N':
  78.   if (optarg)
  79.     {
  80.       rdgram_priority = atoi (optarg);
  81.       if (rdgram_priority > RDGRAM_MAX_SPRI)
  82. rdgram_priority = RDGRAM_MAX_PRI;
  83.       else if (rdgram_priority < RDGRAM_MIN_PRI)
  84. rdgram_priority = RDGRAM_MIN_PRI;
  85.     }
  86.   else
  87.     rdgram_priority = RDGRAM_MAX_PRI;
  88.   break;
  89. case 'c': /* Substring (case-sensitive).  */
  90.   query = SUBSTRING_CASE;
  91.   break;
  92. case 'e': /* Exact match.  */
  93.   query = EXACT;
  94.   break;
  95. case 'h': /* Archie host.  */
  96.   host = optarg;
  97.   break;
  98. case 'a': /* List matches as Alex filenames.  */
  99.   alex = 1;
  100.   break;
  101. case 'l': /* List one match per line.  */
  102.   listflag = 1;
  103.   break;
  104. case 'm': /* Maximum number of hits for the query.  */
  105.   max_hits = atoi (optarg);
  106.   if (max_hits < 1)
  107.     {
  108.       fprintf (stderr,
  109.        "%s: option `-m' requires a max hits value >= 1n",
  110.        program_name);
  111.       exit (ERROR_EXIT);
  112.     }
  113.   break;
  114. case 'o': /* output file */
  115.   if (outfile)
  116.     {
  117.       fprintf (stderr, "%s: multiple output files specifiedn",
  118.        program_name);
  119.       exit (ERROR_EXIT);
  120.     }
  121.   outfile = optarg;
  122.   break;
  123. case 'O': /* Specify the offset.  */
  124.   offset = atoi (optarg);
  125.   break;
  126. case 'r': /* Regexp search.  */
  127.   query = REGEXP;
  128.   break;
  129. case 's': /* Substring (case insensitive).  */
  130.   query = SUBSTRING;
  131.   break;
  132. case 't': /* Sort inverted by date.  */
  133.   sortflag = 1;
  134.   break;
  135. case 'v': /* Display version.  */
  136.   fprintf (stderr,
  137.    "Client version %s based upon Prospero version %s%sn",
  138.    CLIENT_VERSION,
  139. #ifdef DEBUG
  140.    PFS_RELEASE, " with debugging.");
  141. #else
  142.    PFS_RELEASE, ".");
  143. #endif
  144.   exitflag = 1;
  145.   break;
  146. case 'V': /* Verbose when search is happening.  */
  147.   verbose = 1;
  148.   break;
  149. default:
  150.   usage ();
  151. }
  152.     }
  153.   if (exitflag)
  154.     exit (0);
  155.   else if (optind == argc)
  156.     usage ();
  157.   else if (alex && listflag)
  158.     {
  159.       fprintf (stderr, "%s: only one of `-a' or `-l' may be usedn",
  160.        program_name);
  161.       exit (ERROR_EXIT);
  162.     }
  163.   if (outfile)
  164.     {
  165.       archie_out = fopen (outfile, "w+");
  166.       if (archie_out == (FILE *) NULL)
  167. {
  168.   fprintf (stderr, "%s: cannot open %sn", program_name, outfile);
  169.   exit (ERROR_EXIT);
  170. }
  171.     }
  172.   else
  173.     archie_out = stdout;
  174.   for (; optind < argc; ++optind)
  175.     procquery (host, argv[optind], max_hits, offset, query);
  176.   if (outfile)
  177.     fclose (archie_out);
  178.   exit (0);
  179. }
  180. #define HFLAG "]"
  181. void
  182. usage ()
  183. {
  184.   fprintf (stderr, "Usage: %s [-acelorstvLV] [-m hits%s [-N level] stringn", program_name, HFLAG);
  185.   fprintf (stderr, "          -a : list matches as Alex filenamesn");
  186.   fprintf (stderr, "          -c : case sensitive substring searchn");
  187.   fprintf (stderr, "          -e : exact string match (default)n");
  188.   fprintf (stderr, "          -r : regular expression searchn");
  189.   fprintf (stderr, "          -s : case insensitive substring searchn");
  190.   fprintf (stderr, "          -l : list one match per linen");
  191.   fprintf (stderr, "          -t : sort inverted by daten");
  192.   fprintf (stderr, "     -m hits : specifies maximum number of hits to return (default %d)n", max_hits);
  193.   fprintf (stderr, " -o filename : specifies file to store results inn");
  194.   fprintf (stderr, "     -h host : specifies server hostn");
  195.   fprintf (stderr, "          -L : list known servers and current defaultn");
  196.   fprintf (stderr, "    -N level : specifies query niceness level (0-35765)n");
  197.   exit (ERROR_EXIT);
  198. }