www.pudn.com > socks5.zip > archie.c


/*                                                                           */ 
/*  * Copyright (c) 1991 by the University of Washington                     */ 
/*  *                                                                        */ 
/*  * For copying and distribution information, please see the file          */ 
/*  * .                                                         */ 
 
/*                                                                           */ 
/*  * Archie client using the Prospero protocol.                             */ 
/*  *                                                                        */ 
/*  * Suggestions and improvements to Brendan Kehoe (brendan@cygnus.com).    */ 
 
#include "pmachine.h" 
#include "getopt.h" 
#include "pfs.h" 
#include "rdgram.h" 
#include "archie.h" 
 
/* Whether we should produce single-line listings suitable for frobbing by   */ 
/*    other programs, or produce nice clean human output (default).          */ 
int listflag = 0; 
 
/* How to sort the data; 1 means by date, 0 is by inverse hostname.          */ 
int sortflag = 0; 
 
/* Used by CUTCP to see if they specified the host with `-h' or if           */ 
/*    the config.tel file should be consulted.                               */ 
int hostset = 0; 
 
/* When doing searches, should we make some comments to pacify the user?     */ 
int verbose = 0; 
 
/* Maximum number of hits for this query; pushing this high is very          */ 
/*    anti-social.                                                           */ 
int max_hits = MAX_HITS; 
 
/* The offset for the Prospero query.                                        */ 
int offset = 0; 
 
/* Display the Alex filename?                                                */ 
int alex = 0; 
 
/* The default host to query for searches.                                   */ 
char *host = ARCHIE_HOST; 
 
FILE *archie_out; 
 
/* The name this program was run with.                                       */ 
char *program_name; 
 
extern int pfs_debug; 
extern int rdgram_priority; 
 
void usage (); 
extern char *getenv (); 
 
void 
main (argc, argv) 
     int argc; 
     char **argv; 
{ 
  Query query = EXACT; 
  int optc, tmp; 
  /* If true, display the release.                                           */ 
  int exitflag = 0; 
  /* The file to print the results to.  Defaults to stdout.                  */ 
  char *outfile = (char *)NULL; 
  char *p; 
  static char *archies[] = { ARCHIES }; 
 
#ifdef SOCKS 
  LIBPREFIX2(init)(argv[0]); 
#endif 
 
  program_name = argv[0]; 
 
  /* Default debugging level.                                                */ 
  pfs_debug = 0; 
 
  if ((p = getenv ("ARCHIE_HOST")) != (char *) NULL) 
    host = p; 
 
  while ((optc = getopt (argc, argv, "D:LN::O:ceh:alm:o:rstvV")) != EOF) 
    { 
      switch (optc) 
	{ 
	case 'D': 
	  pfs_debug = atoi (optarg); 
	  break; 
 
	case 'L': 
	  printf ("Known archie servers:\n"); 
	  for (tmp = 0; tmp < NARCHIES; tmp++) 
	    printf ("\t%s\n", archies[tmp]); 
	  printf (" * %s is the default Archie server.\n", ARCHIE_HOST); 
	  printf (" * For the most up-to-date list, write to an Archie server and give it\n   the command `servers'.\n"); 
	  exitflag = 1; 
	  break; 
	case 'N': 
	  if (optarg) 
	    { 
	      rdgram_priority = atoi (optarg); 
	      if (rdgram_priority > RDGRAM_MAX_SPRI) 
		rdgram_priority = RDGRAM_MAX_PRI; 
	      else if (rdgram_priority < RDGRAM_MIN_PRI) 
		rdgram_priority = RDGRAM_MIN_PRI; 
	    } 
	  else 
	    rdgram_priority = RDGRAM_MAX_PRI; 
	  break; 
 
	case 'c': /* Substring (case-sensitive).  */ 
	  query = SUBSTRING_CASE; 
	  break; 
 
	case 'e': /* Exact match.  */ 
	  query = EXACT; 
	  break; 
 
	case 'h': /* Archie host.  */ 
	  host = optarg; 
	  break; 
 
	case 'a': /* List matches as Alex filenames.  */ 
	  alex = 1; 
	  break; 
 
	case 'l': /* List one match per line.  */ 
	  listflag = 1; 
	  break; 
 
	case 'm': /* Maximum number of hits for the query.  */ 
	  max_hits = atoi (optarg); 
	  if (max_hits < 1) 
	    { 
	      fprintf (stderr, 
		       "%s: option `-m' requires a max hits value >= 1\n", 
		       program_name); 
	      exit (ERROR_EXIT); 
	    } 
	  break; 
 
	case 'o': /* output file */ 
	  if (outfile) 
	    { 
	      fprintf (stderr, "%s: multiple output files specified\n", 
		       program_name); 
	      exit (ERROR_EXIT); 
	    } 
	  outfile = optarg; 
	  break; 
 
	case 'O': /* Specify the offset.  */ 
	  offset = atoi (optarg); 
	  break; 
 
	case 'r': /* Regexp search.  */ 
	  query = REGEXP; 
	  break; 
 
	case 's': /* Substring (case insensitive).  */ 
	  query = SUBSTRING; 
	  break; 
 
	case 't': /* Sort inverted by date.  */ 
	  sortflag = 1; 
	  break; 
 
	case 'v': /* Display version.  */ 
	  fprintf (stderr, 
		   "Client version %s based upon Prospero version %s%s\n", 
		   CLIENT_VERSION, 
#ifdef DEBUG 
		   PFS_RELEASE, " with debugging."); 
#else 
		   PFS_RELEASE, "."); 
#endif 
	  exitflag = 1; 
	  break; 
 
	case 'V': /* Verbose when search is happening.  */ 
	  verbose = 1; 
	  break; 
 
	default: 
	  usage (); 
	} 
    } 
 
  if (exitflag) 
    exit (0); 
  else if (optind == argc) 
    usage (); 
  else if (alex && listflag) 
    { 
      fprintf (stderr, "%s: only one of `-a' or `-l' may be used\n", 
	       program_name); 
      exit (ERROR_EXIT); 
    } 
 
  if (outfile) 
    { 
      archie_out = fopen (outfile, "w+"); 
      if (archie_out == (FILE *) NULL) 
	{ 
	  fprintf (stderr, "%s: cannot open %s\n", program_name, outfile); 
	  exit (ERROR_EXIT); 
	} 
    } 
  else 
    archie_out = stdout; 
 
  for (; optind < argc; ++optind) 
    procquery (host, argv[optind], max_hits, offset, query); 
 
  if (outfile) 
    fclose (archie_out); 
 
  exit (0); 
} 
 
#define HFLAG	"]" 
 
void 
usage () 
{ 
  fprintf (stderr, "Usage: %s [-acelorstvLV] [-m hits%s [-N level] string\n", program_name, HFLAG); 
  fprintf (stderr, "          -a : list matches as Alex filenames\n"); 
  fprintf (stderr, "          -c : case sensitive substring search\n"); 
  fprintf (stderr, "          -e : exact string match (default)\n"); 
  fprintf (stderr, "          -r : regular expression search\n"); 
  fprintf (stderr, "          -s : case insensitive substring search\n"); 
  fprintf (stderr, "          -l : list one match per line\n"); 
  fprintf (stderr, "          -t : sort inverted by date\n"); 
  fprintf (stderr, "     -m hits : specifies maximum number of hits to return (default %d)\n", max_hits); 
  fprintf (stderr, " -o filename : specifies file to store results in\n"); 
  fprintf (stderr, "     -h host : specifies server host\n"); 
  fprintf (stderr, "          -L : list known servers and current default\n"); 
  fprintf (stderr, "    -N level : specifies query niceness level (0-35765)\n"); 
 
  exit (ERROR_EXIT); 
}