home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume30 / tin / part14 / xindex.c < prev    next >
C/C++ Source or Header  |  1992-05-20  |  3KB  |  158 lines

  1. /*
  2.  *  Project   : NNTP (RFC 977) extension
  3.  *  Module    : xindex.c
  4.  *  Author    : I.Lea
  5.  *  Created   : 07-03-92
  6.  *  Updated   : 22-03-92
  7.  *  Notes     : Add a command to retieve index files from the
  8.  *              NNTP server so as to save space on the client.
  9.  *              Ideas borrowed from XTHREAD nntp extension code
  10.  *              posted by Tim Iverson to alt.sources in mid'91.
  11.  *  Copyright : (c) Copyright 1992 by Iain Lea
  12.  *              You may  freely  copy or  redistribute  this software,
  13.  *              so  long as there is no profit made from its use, sale
  14.  *              trade or  reproduction.  You may not change this copy-
  15.  *              right notice, and it must be included in any copy made
  16.  */
  17.  
  18. #include "common.h"
  19.  
  20. #ifdef XINDEX
  21.  
  22. #undef    DEBUG_XINDEX        /* set to define to turn on more debug info */
  23. #define HASH_VALUE 1409        /* mod value for hashing group name */
  24.  
  25. #ifdef __STDC__
  26. void xindex (int argc, char *argv[]);
  27. static void find_index_file (char *group, char *index_file);
  28. static long hash_groupname (char *group);
  29. #else
  30. void xindex ();
  31. static void find_index_file ();
  32. static long hash_groupname ();
  33. #endif
  34.  
  35. /*
  36.  *  Usage: XINDEX GROUP
  37.  *
  38.  *  GROUP    Group for which to retrieve index file
  39.  *
  40.  *  This command is NOT documented in RFC977.
  41.  */
  42.  
  43. void xindex (argc, argv)
  44.     int    argc;
  45.     char    *argv[];
  46. {
  47.     char    line[NNTP_STRLEN];
  48.     char    group[256];
  49.     char    index_file[256];
  50.     char    *cp;
  51.     FILE    *fp;
  52.     
  53.     /*
  54.      * "parse" the argument list
  55.      */
  56.     if (argc == 1) {
  57.         printf("%d Usage: XINDEX group\r\n", ERR_CMDSYN);
  58.         (void) fflush(stdout);
  59.         return;
  60.     } else {
  61.         strncpy (group, argv[1], sizeof (group)-1);
  62. #if defined(SYSLOG) && defined(DEBUG_XINDEX)
  63.         syslog(LOG_INFO, "%s xindex %s", hostname, group);
  64. #endif
  65.  
  66.         find_index_file(group, index_file);
  67.         
  68.         if ((fp = fopen(index_file, "r")) == NULL) {
  69. #ifdef SYSLOG
  70.             syslog(LOG_INFO, "%s xindex cannot open %s (%s)",
  71.                 hostname, group, index_file);
  72. #endif
  73.             printf("%d XINDEX Cannot open %s\r\n",
  74.                 ERR_XINDEX, group);
  75.             (void) fflush(stdout);
  76.             return;
  77.         }
  78.  
  79.         printf("%d XINDEX group in index format\r\n", OK_XINDEX);
  80.         (void) fflush(stdout);
  81.         
  82.         while (fgets(line, sizeof(line), fp) != NULL) {
  83.             if ((cp = index(line, '\n')) != NULL)
  84.                 *cp = '\0';
  85.             putline(line);
  86.         }
  87.         (void) fclose(fp);
  88.     
  89.         putline(".");
  90.         (void) fflush(stdout);
  91.     }
  92. }
  93.  
  94. /*
  95.  *  Look in <SPOOLDIR>/.index directory for the index file for the
  96.  *  given group.  Hashing the group name gets a number. See if that
  97.  *  #.1 file exists; if so, read first line. Group we want? If not,
  98.  *  try #.2.  Repeat until no such file or we find the right file.
  99.  */
  100.  
  101. static void find_index_file (group, index_file)
  102.     char *group;
  103.     char *index_file;
  104. {
  105.     char buf[256], *p;
  106.     FILE *fp;
  107.     int i = 1;
  108.     unsigned long hash;
  109.  
  110.     hash = hash_groupname (group);
  111.  
  112.     while (1) {
  113.         sprintf (index_file, "%s/.index/%lu.%d", SPOOLDIR, hash, i);
  114.         
  115.         if ((fp = fopen (index_file, "r")) == NULL) {
  116.             return;
  117.         }
  118.  
  119.         if (fgets (buf, sizeof (buf), fp) == NULL) {
  120.             fclose (fp);
  121.             return;
  122.         }
  123.         fclose (fp);
  124.  
  125.         for (p = buf; *p && *p != '\n'; p++) {
  126.             continue;
  127.         }    
  128.         *p = '\0';
  129.  
  130.         if (strcmp (buf, group) == 0) {
  131.             return;
  132.         }    
  133.         i++;
  134.     }    
  135. }
  136.  
  137. /*
  138.  * hash group name for filename of group
  139.  */
  140.  
  141. static long hash_groupname (group)
  142.     char *group;
  143. {
  144.     unsigned long hash_value;
  145.     unsigned char *ptr = (unsigned char *) group;
  146.  
  147.     hash_value = *ptr++;
  148.  
  149.     while (*ptr)
  150.         hash_value = ((hash_value << 1) ^ *ptr++) % HASH_VALUE;
  151.  
  152.     return (hash_value);
  153. }
  154.  
  155.  
  156. #endif /* XINDEX */
  157.  
  158.