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 / ihave.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-10-17  |  2.4 KB  |  107 lines

  1. #ifndef lint
  2. static char    *sccsid = "@(#)$Header: ihave.c,v 1.18 90/12/23 11:49:59 sob Exp $";
  3. #endif
  4.  
  5. #include "common.h"
  6.  
  7. #ifdef LOG
  8. int    ih_accepted;
  9. int    ih_rejected;
  10. int    ih_failed;
  11. #endif LOG
  12.  
  13. /*
  14.  * IHAVE <messageid>
  15.  *
  16.  * Accept an article for transferral if we haven't seen it before.
  17.  */
  18.  
  19. ihave(argc, argv)
  20.     int        argc;
  21.     char        *argv[];
  22. {
  23.     char        errbuf[2 * NNTP_STRLEN];
  24.     int        retcode;
  25.     register char    *cp;
  26.   
  27.     if (!canxfer)
  28.         {
  29. #ifdef LOG
  30.         syslog(LOG_INFO, "%s ihave attempted without permission",
  31.             hostname);
  32. #endif
  33.         printf("%d You do not have transfer permission\r\n",
  34.             ERR_GOODBYE);
  35.         (void) fflush(stdout);
  36.         return;
  37.         }
  38.  
  39.     if (argc != 2) {
  40.         printf("%d Usage: IHAVE <message-id>.\r\n", ERR_CMDSYN);
  41.         (void) fflush(stdout);
  42.         return;
  43.     }
  44.  
  45.     cp = gethistent(argv[1], 1);
  46.     if (cp != NULL) {
  47.         printf("%d Got it.\r\n", ERR_GOTIT);
  48.         (void) fflush(stdout);
  49. #ifdef LOG
  50.         ih_rejected++;
  51. #ifdef IHAVE_DEBUG
  52.         syslog(LOG_DEBUG, "%s ihave %s rejected", hostname, argv[1]);
  53. #endif IHAVE_DEBUG
  54. #endif LOG
  55.         return;
  56.     }
  57.  
  58.     if (!space(MINFREE)) {
  59.         /* force error reporting code into sending */
  60.         /* an out-of-space error message           */
  61.         if (gethostname(errbuf, MAXHOSTNAMELEN) < 0)
  62.         (void) strcpy(errbuf, "Amnesiac");
  63.  
  64.         (void) strcat(errbuf, " NNTP server out of space. Try later.");
  65.  
  66.         retcode = 0;        /* indicates that an error occurred */
  67.     } else 
  68. #ifdef BATCHED_INPUT
  69.         /* C news input hook */
  70.         retcode = batch_input_article(CONT_XFER, ERR_XFERFAIL,
  71.         errbuf, argv[1]);
  72. #else
  73.         retcode = spawn(rnews, "rnews", (char *) 0, CONT_XFER,
  74.         ERR_XFERFAIL, errbuf, argv[1]);
  75. #endif
  76.  
  77.     if (retcode <= 0){
  78.                /* Reject if "*:<optional_whitespace>inbound*", else fail */
  79.                register int i;
  80.  
  81.                i = ERR_XFERFAIL;
  82.                if (cp = index(errbuf,':')) {
  83.                        for (++cp; isspace(*cp); ++cp)
  84.                                ;
  85.                        if (strncasecmp(cp, "inbound", 7) == 0)
  86.                                i = ERR_XFERRJCT;
  87.                }
  88.                printf("%d %s\r\n", i, errbuf);
  89.        }
  90.         else
  91.                printf("%d Thanks.\r\n", OK_XFERED);
  92.         (void) fflush(stdout);
  93.  
  94. #ifdef LOG
  95.     if (retcode == 1)
  96.         ih_accepted++;
  97.     else
  98.         ih_failed++;
  99.         
  100. #ifdef IHAVE_DEBUG
  101.     syslog(LOG_DEBUG, "%s ihave %s accepted %s",
  102.         hostname, argv[1], retcode == 1 ? "succeeded" : "failed");
  103. #endif IHAVE_DEBUG
  104. #endif LOG
  105.  
  106. }
  107.