#ifndef lint static char sccsid[] = "@(#)$Id: xhdr.c,v 1.13 1994/11/01 06:08:21 sob Exp sob $"; #endif #include "common.h" #ifdef XHDR #ifdef XOVER #include "xover.h" #endif /* forward declarations */ void print_header(); /* * XHDR header [|articlerange] * * header is a case-insensitive header field, minus any colons. * * articlerange is one of: * an article number * an article number followed by a dash to indicate all following * an article number followed by a dash followed by another * article number. * e.g., * XHDR subject retrieve subject of current article * XHDR subject 5589-6325 retrieve subject of arts 5589 to 6325 * XHDR subject 5589- retrieve subject of arts 5589 and up * XHDR subject 5589 retrieve subject of art 5589 only * XHDR subject <123@ucbvax> retrieve subject of art <123@ucbvax> * * This command is an extension, and not included in RFC 977. */ void xhdr(argc, argv) int argc; char *argv[]; { char buf[MAXPATHLEN]; register int artptr; register int artnum; register int low, high; register FILE *fp; #ifdef XOVER int over_candidate, hdr; #endif if (argc < 2 || argc > 3) { printf("%d Usage: XHDR headerfield [artrange|]\r\n", ERR_CMDSYN); (void) fflush(stdout); return; } if (!canread) { printf("%d You only have permission to transfer, sorry.\r\n", ERR_ACCESS); (void) fflush(stdout); return; } /* Handle message-id requests */ if (argc == 3 && *argv[2] == '<') { /* Message ID */ fp = openartbyid(argv[2]); if (fp == NULL) { printf("%d No article by message-id %s, sorry.\r\n", ERR_NOART, argv[2]); (void) fflush(stdout); return; } printf("%d %d %s header of article %s.\r\n%s ", OK_HEAD, group_artnum, argv[1], argv[2], argv[2]); print_header(fp, argv[1]); (void) fclose(fp); putline("."); (void) fflush(stdout); return; } /* * It must be a range of articles, which means that we need * to be in a newsgroup already. */ if (!ingroup) { printf("%d You are not currently in a newsgroup.\r\n", ERR_NCING); (void) fflush(stdout); return; } if (argc == 2) { if (art_ptr < 0 || art_ptr >= num_arts) { printf("%d No article is currently selected.\r\n", ERR_NOCRNT); (void) fflush(stdout); return; } high = low = art_array[art_ptr]; artptr = art_ptr; } else { register char *cp = index(argv[2], '-'); if (cp == NULL) low = high = atoi(argv[2]); else { *cp++ = '\0'; low = atoi(argv[2]); high = atoi(cp); if (high < low) if (num_arts > 0) high = art_array[num_arts-1]; else high = low; } artptr = 0; } printf("%d %s fields follow\r\n", OK_HEAD, argv[1]); #ifdef XOVER if (over_is_cheap(low, high)) over_candidate = ((hdr = over_header(argv[1])) > 0); else over_candidate = 0; #endif for (;artptr high) break; (void) sprintf(buf, "%d", artnum); printf("%s ", buf); #ifdef XOVER if (over_candidate) { if (xfind(&over,artnum)) { over_grab_header(hdr, 1); continue; } else if (over.num == -1) over_candidate = 0; } #endif fp = fopen(buf, "r"); if (fp == NULL) continue; print_header(fp, argv[1]); (void) fclose(fp); } putline("."); (void) fflush(stdout); } void print_header(fp, header) register FILE *fp; register char *header; { char line[NNTP_STRLEN]; register char *cp, *cp2; register int found = 0; cp = line; while (fgets(line, sizeof line, fp) != NULL) { if (cp && *line == '\n') { break; } cp2 = cp; cp = index(line, '\n'); if (!cp2 || isspace(*line)) { if (found) { if (cp2) { for (cp2 = line+1; isspace(*cp2); cp2++) ; *--cp2 = ' '; } else cp2 = line; if (cp) *cp = '\0'; printf("%s", cp2); } } else if (found) break; else if ((cp2 = index(line, ':')) != NULL) { *cp2 = '\0'; if (strcasecmp(header, line) == 0) { cp2 += 2; if (cp) *cp = '\0'; printf("%s", cp2); found = 1; } } } if (!found) printf("(none)"); putchar('\r'); putchar('\n'); } #else /* !XHDR */ /* Kludge to get around Greenhills C compiler */ xhdr_greenkluydge() { } #endif