home *** CD-ROM | disk | FTP | other *** search
/ Il CD di internet / CD.iso / SOURCE / N / TCPIP / NNTP-1.000 / NNTP-1 / nntp.1.5.11t / server / xhdr.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-10-17  |  3.4 KB  |  170 lines

  1. #ifndef lint
  2. static char    *sccsid = "@(#)$Header: xhdr.c,v 1.11 90/12/11 23:59:53 sob Exp $";
  3. #endif
  4.  
  5. #include "common.h"
  6.  
  7. #ifdef XHDR
  8.  
  9. /*
  10.  * XHDR header [<messageid>|articlerange]
  11.  *
  12.  * header is a case-insensitive header field, minus any colons.
  13.  *
  14.  * articlerange is one of:
  15.  *    an article number
  16.  *    an article number followed by a dash to indicate all following
  17.  *    an article number followed by a dash followed by another
  18.  *        article number.
  19.  * e.g.,
  20.  * XHDR subject            retrieve subject of current article
  21.  * XHDR subject 5589-6325    retrieve subject of arts 5589 to 6325
  22.  * XHDR subject 5589-        retrieve subject of arts 5589 and up
  23.  * XHDR subject 5589        retrieve subject of art 5589 only
  24.  * XHDR subject <123@ucbvax>    retrieve subject of art <123@ucbvax>
  25.  *
  26.  * This command is an extension, and not included in RFC 977.
  27.  */
  28.  
  29. xhdr(argc, argv)
  30.     int        argc;
  31.     char        *argv[];
  32. {
  33.     char        buf[MAXPATHLEN];
  34.     register int    artptr;
  35.     register int    artnum;
  36.     register int    low, high;
  37.     register FILE    *fp;
  38.     register char    *cp;
  39.  
  40.     if (argc < 2 || argc > 3) {
  41.         printf("%d Usage: XHDR headerfield [artrange|<message-id>]\r\n",
  42.             ERR_CMDSYN);
  43.         (void) fflush(stdout);
  44.         return;
  45.     }
  46.  
  47.     if (!canread) {
  48.         printf("%d You only have permission to transfer, sorry.\r\n",
  49.             ERR_ACCESS);
  50.         (void) fflush(stdout);
  51.         return;
  52.     }
  53.  
  54.     /* Handle message-id requests */
  55.  
  56.     if (argc == 3 && *argv[2] == '<') {    /* Message ID */
  57.         fp = openartbyid(argv[2]);
  58.         if (fp == NULL) {
  59.             printf("%d No article by message-id %s, sorry.\r\n",
  60.                 ERR_NOART, argv[2]);
  61.             (void) fflush(stdout);
  62.             return;
  63.         }
  64.         printf("%d 0 %s header of article %s.\r\n",
  65.             OK_HEAD, argv[1], argv[2]);
  66.         print_header(fp, argv[1], argv[2]);
  67.         (void) fclose(fp);
  68.  
  69.         putchar('.');
  70.         putchar('\r');
  71.         putchar('\n');
  72.         (void) fflush(stdout);
  73.         return;
  74.     }
  75.  
  76.     /*
  77.      * It must be a range of articles, which means that we need
  78.      * to be in a newsgroup already.
  79.      */
  80.  
  81.     if (!ingroup) {
  82.         printf("%d You are not currently in a newsgroup.\r\n",
  83.             ERR_NCING);
  84.         (void) fflush(stdout);
  85.         return;
  86.     }
  87.  
  88.     artptr = 0;
  89.  
  90.     if (argc == 2) {
  91.         if (art_ptr < 0 || art_ptr >= num_arts) {
  92.             printf("%d No article is currently selected.\r\n",
  93.                 ERR_NOCRNT);
  94.             (void) fflush(stdout);
  95.             return;
  96.         }
  97.         high = low = art_array[art_ptr];
  98.         artptr = art_ptr;
  99.     } else {
  100.         cp = index(argv[2], '-');
  101.         if (cp == NULL)
  102.             low = high = atoi(argv[2]);
  103.         else {
  104.             *cp = '\0';
  105.             low = atoi(argv[2]);
  106.             cp++;
  107.             high = atoi(cp);
  108.             if (high < low)
  109.                 high = art_array[num_arts-1];
  110.         }
  111.     }
  112.  
  113.     printf("%d %s fields follow\r\n", OK_HEAD, argv[1]);
  114.  
  115.        for (;artptr<num_arts; artptr++) {
  116.         if ((artnum = art_array[artptr]) < low)
  117.             continue;
  118.         if (artptr >= num_arts || artnum > high)
  119.             break;
  120.  
  121.         (void) sprintf(buf, "%d", artnum);
  122.         fp = fopen(buf, "r");
  123.         if (fp == NULL)
  124.             continue;
  125.         print_header(fp, argv[1], buf);
  126.         (void) fclose(fp);
  127.     }
  128.  
  129.     putchar('.');
  130.     putchar('\r');
  131.     putchar('\n');
  132.     (void) fflush(stdout);
  133. }
  134.  
  135.  
  136. print_header(fp, header, artname)
  137.     register FILE    *fp;
  138.     register char    *header;
  139.     register char    *artname;
  140. {
  141.     char        line[NNTP_STRLEN];
  142.     register char    *cp, *cp1;
  143.  
  144.     while (fgets(line, sizeof (line), fp) != NULL) {
  145.         if (*line == '\n' || *line == '\0') {
  146.             printf("%s (none)\r\n", artname);
  147.             return;
  148.         }
  149.         if (cp = index(line, ':')) {
  150.             *cp = '\0';
  151.             if (!strcasecmp(header, line)) {
  152.                 if (cp1 = index(cp + 2, '\n'))
  153.                     *cp1 = '\0';
  154.                 printf("%s %s\r\n", artname, cp + 2);
  155.                 return;
  156.             }
  157.         }
  158.     }
  159. }
  160.  
  161. #else not XHDR
  162.  
  163. /* Kludge to get around Greenhills C compiler */
  164.  
  165. xhdr_greenkluydge()
  166. {
  167. }
  168.  
  169. #endif not XHDR
  170.