home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume27 / archie / part03 / archie.c < prev    next >
C/C++ Source or Header  |  1992-01-13  |  7KB  |  290 lines

  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.  * v1.2.1 - 11/21/91 (bkc) - added CUTCP library support for MSDOS
  8.  * v1.2.0 - 11/19/91 (mmt) - added MSDOS & OS2 stuff
  9.  * v1.1.2 - 08/27/91 (bpk) - added <pmachine.h> for index()
  10.  * v1.1.1 - 08/22/91 (bpk) - added 0-9 as arguments
  11.  */
  12.  
  13. #include <copyright.h>
  14.  
  15. /*
  16.  * Archie client using the Prospero protocol.
  17.  *
  18.  * Suggestions and improvements to Brendan Kehoe (brendan@cs.widener.edu).
  19.  */
  20.  
  21. #include <stdio.h>
  22. #if defined(OS2)
  23. # include <pctcp.h>
  24. #endif
  25. #ifdef MSDOS
  26. # include <string.h>
  27. # include <stdlib.h>
  28. # ifdef CUTCP
  29. #  include <msdos/cutcp.h>
  30. #  include <msdos/hostform.h>
  31. # endif
  32. #endif
  33.  
  34. #include <pfs.h>
  35. #include <rdgram.h>
  36. #include <archie.h>
  37. #include <pmachine.h>
  38.  
  39. int        listflag = 0;
  40. int        sortflag = 0;   /* 1 = by date                    */
  41. char        *progname;
  42. #ifdef DEBUG
  43. extern int    pfs_debug;
  44. #endif
  45. extern int    rdgram_priority;
  46.  
  47. /* To keep the code clean.. */
  48. #ifdef VMS
  49. # define NFLAG    "\"N\""
  50. # define LFLAG    "\"L\""
  51. # define A_EXIT    SS$_NORMAL
  52. #else
  53. # define NFLAG    "N"
  54. # define LFLAG    "L"
  55. # define A_EXIT    1
  56. #endif
  57. #ifdef CUTCP
  58. # define HFLAG    "[H config.tel]]"
  59. #else
  60. # define HFLAG    "]"
  61. #endif
  62.  
  63. main(argc,argv)
  64.     int        argc;
  65.     char    *argv[];
  66.     {
  67.     char        *cur_arg;
  68.     char        qtype = '=';    /* Default to exact string match  */
  69.     char        etype = '=';    /* Type if only -e is specified   */
  70.     int        eflag = 0;    /* Exact flag specified          */
  71.     int        max_hits = MAX_HITS;
  72.     int        offset = 0;
  73.     int        exitflag = 0;    /* Display release identifier     */
  74.     int        tmp;
  75.     char        *host = ARCHIE_HOST;
  76.     char        *p;
  77.     static char *archies[] = { ARCHIES };
  78. #ifdef CUTCP
  79.     int        hostset = 0;
  80. #endif
  81.     char        *getenv();
  82.  
  83.     progname = *argv;
  84.     argc--; argv++;
  85.  
  86. #ifdef    CUTCP
  87.     if(getenv("CONFIGTEL"))
  88.         if(Shostfile(getenv("CONFIGTEL")) < 0) {
  89.             fprintf(stderr,"Error, couldn't open configtel file %s\n",
  90.                 getenv("CONFIGTEL"));
  91.             exit(1);
  92.         }
  93. #endif
  94.  
  95.     if ((p = getenv("ARCHIE_HOST")) != (char *)NULL)
  96.       host = p;
  97.         
  98.     while (argc > 0 && **argv == '-') {
  99.         cur_arg = argv[0]+1;
  100.  
  101.         /* If a - by itself, or --, then no more arguments */
  102.         if(!*cur_arg || ((*cur_arg == '-') && (!*(cur_arg+1)))) {
  103.             argc--, argv++;
  104.         goto scandone;
  105.         }
  106.  
  107.         while (*cur_arg) {
  108.         switch (*cur_arg++) {
  109. #ifdef DEBUG        
  110.         case 'D':  /* Debug level */
  111.             pfs_debug = 1; /* Default debug level */
  112.             if(*cur_arg && index("0123456789",*cur_arg)) {
  113.             sscanf(cur_arg,"%d",&pfs_debug);
  114.             cur_arg += strspn(cur_arg,"0123456789");
  115.             }
  116.             else if(argc > 2) {
  117.                 tmp = sscanf(argv[1],"%d",&pfs_debug);
  118.             if (tmp == 1) {argc--;argv++;}
  119.             }
  120.             break;
  121. #endif
  122. #ifdef    CUTCP
  123.         case 'H' :
  124.             if(Shostfile(argv[1]) < 0) {
  125.                 fprintf(stderr,"Error, couldn't open configtel file %s\n",argv[1]);
  126.                 exit(1);
  127.             }
  128.              argc--;argv++;
  129.             break;
  130. #endif
  131. #ifndef XARCHIE
  132.         case 'L':
  133.             printf("Known archie servers:\n");
  134.             for (tmp = 0; tmp < NARCHIES; tmp++)
  135.             printf("\t%s\n", archies[tmp]);
  136.             printf(" * %s is the default Archie server.\n", ARCHIE_HOST);
  137.             printf(" * For the most up-to-date list, write to an Archie server and give it\n   the command `servers'.\n");
  138.             exitflag = 1;
  139.             break;
  140. #endif
  141.  
  142.         case 'N':  /* Priority (nice) */
  143.             rdgram_priority = RDGRAM_MAX_PRI; /* Use this if no # */
  144.             if(*cur_arg && index("-0123456789",*cur_arg)) {
  145.             sscanf(cur_arg,"%d",&rdgram_priority);
  146.             cur_arg += strspn(cur_arg,"-0123456789");
  147.             }
  148.             else if(argc > 2) {
  149.                 tmp = sscanf(argv[1],"%d",&rdgram_priority);
  150.             if (tmp == 1) {argc--;argv++;}
  151.             }
  152.             if(rdgram_priority > RDGRAM_MAX_SPRI) 
  153.             rdgram_priority = RDGRAM_MAX_PRI;
  154.             if(rdgram_priority < RDGRAM_MIN_PRI) 
  155.             rdgram_priority = RDGRAM_MIN_PRI;
  156.               break;
  157.  
  158.         case 'c':  /* substring (case sensitive) */
  159.             qtype = 'C';
  160.             etype = 'c';
  161.             break;
  162.  
  163.         case 'e':  /* Exact match */
  164.             /* If -e specified by itself, then we use the  */
  165.             /* default value of etype which must be '='    */
  166.             eflag++;
  167.             break;
  168.  
  169.         case 'h':  /* Host */
  170.             host = argv[1];
  171. #ifdef CUTCP
  172.             hostset++;
  173. #endif
  174.             argc--; argv++;
  175.             break;
  176.  
  177.         case 'l':  /* List one match per line */
  178.             listflag++;
  179.             break;
  180.  
  181.         case '0': case '1': case '2': case '3': case '4':
  182.         case '5': case '6': case '7': case '8': case '9':
  183.             cur_arg--;
  184.         case 'm':  /* Max hits */
  185.             max_hits = -1;  
  186.             if(*cur_arg && index("0123456789",*cur_arg)) {
  187.             sscanf(cur_arg,"%d",&max_hits);
  188.             cur_arg += strspn(cur_arg,"0123456789");
  189.             }
  190.             else if(argc > 1) {
  191.                 tmp = sscanf(argv[1],"%d",&max_hits);
  192.             if (tmp == 1) {argc--;argv++;}
  193.             }
  194.             if (max_hits < 1) {
  195.             fprintf(stderr, "%s: -m option requires a value for max hits (>= 1)\n",
  196.                 progname);
  197.             exit(A_EXIT);
  198.             }
  199.             break;
  200.  
  201.         case 'o':  /* Offset */
  202.             if(argc > 1) {
  203.               tmp = sscanf(argv[1],"%d",&offset);
  204.               if (tmp != 1)
  205.             argc = -1;
  206.               else {
  207.             argc--; argv++;
  208.               }
  209.             }
  210.             break;
  211.  
  212.         case 'r':  /* Regular expression search */
  213.             qtype = 'R';
  214.             etype = 'r';
  215.             break;
  216.  
  217.         case 's':  /* substring (case insensitive) */
  218.             qtype = 'S';
  219.             etype = 's';
  220.             break;
  221.  
  222.         case 't':  /* Sort inverted by date */
  223.             sortflag = 1;
  224.             break;
  225.  
  226.         case 'v':  /* Display version */
  227.             fprintf(stderr,
  228.             "Client version %s based upon Prospero version %s\n",
  229.                 CLIENT_VERSION, PFS_RELEASE);
  230.             exitflag++;
  231.             break;
  232.  
  233.         default:
  234.             fprintf(stderr,"Usage: %s [-[cers][l][t][m#][h host][%s][%s#]%s string\n", progname, LFLAG, NFLAG, HFLAG);
  235.             exit(A_EXIT);
  236.         }
  237.         }
  238.         argc--; argv++;
  239.     }
  240.  
  241.       scandone:
  242.  
  243.     if (eflag) qtype = etype;
  244.  
  245.     if ((argc != 1) && exitflag) exit(0);
  246.  
  247.     if (argc != 1) {
  248.         fprintf(stderr, "Usage: %s [-[cers][l][t][m#][h host][%s][%s#]%s string\n", progname, LFLAG, NFLAG, HFLAG);
  249.         fprintf(stderr,"       -c : case sensitive substring search\n");
  250.         fprintf(stderr,"       -e : exact string match (default)\n");
  251.         fprintf(stderr,"       -r : regular expression search\n");
  252.         fprintf(stderr,"       -s : case insensitive substring search\n");
  253.         fprintf(stderr,"       -l : list one match per line\n");
  254.         fprintf(stderr,"       -t : sort inverted by date\n");
  255.         fprintf(stderr,"      -m# : specifies maximum number of hits to return (default %d)\n", max_hits);
  256.         fprintf(stderr,"  -h host : specifies server host\n");
  257.         fprintf(stderr,"       -%s : list known servers and current default\n", LFLAG);
  258.         fprintf(stderr,"      -%s# : specifies query niceness level (0-35765)\n", NFLAG);
  259. #ifdef CUTCP
  260.         fprintf(stderr,"-H config.tel: specify location of config.tel file\n");
  261. #endif
  262.         exit(A_EXIT);
  263.     }
  264.  
  265. #ifdef    CUTCP
  266.     if(argc = Snetinit()) {
  267.                fprintf(stderr,"Error %d from SNetinit (bad or missing config.tel ?)\n",argc);
  268.         if(argc == -2)
  269.                    netshut();    /* rarp lookup failure */
  270.         exit(1);
  271.     }
  272.     if(!hostset) {        /* if no host on command line, look in config.tel file
  273.                           for name=archie */
  274.         struct machinfo *mp;
  275.  
  276.          mp = Shostlook("archie");
  277.         if(mp) {
  278.                    host = mp->hname ? mp->hname : mp->sname;
  279.         }
  280.        }
  281. #endif
  282.  
  283.     procquery(host, argv[0], max_hits, offset, qtype, sortflag, listflag);
  284.  
  285. #ifdef CUTCP
  286.     netshut();
  287. #endif
  288.     exit(0);
  289.     }
  290.