⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hostatus.c

📁 大量的汇编程序源代码
💻 C
字号:
/*--------------------------------------------------------------------*/
/*    h o s t a t u s . c                                             */
/*                                                                    */
/*    Load host status information for UUPC/extended                  */
/*                                                                    */
/*    Copyright (c) 1991, Andrew H. Derbyshire                        */
/*--------------------------------------------------------------------*/

/*--------------------------------------------------------------------*/
/*    Changes Copyright (c) 1990-1993 by Kendra Electronic            */
/*    Wonderworks.                                                    */
/*                                                                    */
/*    All rights reserved except those explicitly granted by the      */
/*    UUPC/extended license agreement.                                */
/*--------------------------------------------------------------------*/

/*--------------------------------------------------------------------*/
/*                          RCS Information                           */
/*--------------------------------------------------------------------*/

/*
 *    $Id: hostatus.c 1.4 1993/07/06 10:56:27 ahd Exp $
 *
 *    Revision history:
 *    $Log: hostatus.c $
 *     Revision 1.4  1993/07/06  10:56:27  ahd
 *     Always report bad record failures
 *
 */

/*--------------------------------------------------------------------*/
/*                        System include files                        */
/*--------------------------------------------------------------------*/

#include <stdio.h>
#include <string.h>
#include <time.h>

#include <io.h>

/*--------------------------------------------------------------------*/
/*                    UUPC/extended include files                     */
/*--------------------------------------------------------------------*/

#include "lib.h"
#include "hlib.h"
#include "hostable.h"
#include "hostatus.h"
#include "security.h"
#include "timestmp.h"
#include "stater.h"

/*--------------------------------------------------------------------*/
/*        Define current file name for panic() and printerr()         */
/*--------------------------------------------------------------------*/

currentfile();

/*--------------------------------------------------------------------*/
/*                          Global variables                          */
/*--------------------------------------------------------------------*/

time_t start_stats = 0;
time_t hstatus_age = -2;

void HostStatus( void )
{

   char fname[FILENAME_MAX];
   char buf[BUFSIZ];
   struct HostTable *host;
   FILE *stream;
   unsigned short len1;
   unsigned short len2;
   long size;

   time_t age;

   mkfilename( fname, E_confdir, DCSTATUS );

/*--------------------------------------------------------------------*/
/*    If the file does not exist but does exist in the spool          */
/*    directory, attempt to move it, else use the spool directory.    */
/*    If the file doesn't exist at all, return quietly.               */
/*--------------------------------------------------------------------*/

   if ( access( fname, 0 ))
   {
      mkfilename( buf, E_spooldir, DCSTATUS );
      if ( access( buf, 0 ))
         return;

      if (rename( buf, fname ))
      {
         printerr( buf );
         strcpy( fname, buf );
      }
   }

/*--------------------------------------------------------------------*/
/*              Get the age of the file to avoid reloads              */
/*--------------------------------------------------------------------*/

   age = stater( fname , &size );

   if ( age == hstatus_age )  /* Unchanged file?                     */
      return;                 /* Yes --> Just return quietly         */

/*--------------------------------------------------------------------*/
/*                       Actually open the file                       */
/*--------------------------------------------------------------------*/

   if ((stream  = FOPEN(fname , "r", BINARY_MODE)) == NULL)
   {

      perror( fname );
      printmsg(1,"HostStatus: Unable to open host status file");
      time(&start_stats);
      return;

   } /* if */

/*--------------------------------------------------------------------*/
/*                    Read the header information                     */
/*--------------------------------------------------------------------*/

   fread( &len1, sizeof len1, 1, stream );
   fread( &len2, sizeof len2, 1, stream );
   fread( buf , 1, len1, stream);
   buf[len1++] = ' ';
   fread( buf + len1 , 1, len2, stream);
   buf[ len1 + len2 ] = '\0';
   fread( &start_stats , sizeof start_stats , 1,  stream);

   printmsg(5,"HostStatus: %s generated by %s beginning %s",
         fname,
         buf,
         ctime(&start_stats));

   if ( start_stats < 630720000L )  /* Invalid date?              */
      time(&start_stats);           /* Yes --> reset date to today*/

/*--------------------------------------------------------------------*/
/*                           Load each host                           */
/*--------------------------------------------------------------------*/

   while  (!feof( stream ) && !ferror(stream))
   {
      if (fread( &len1, sizeof len1, 1, stream ) < 1)
         break;

      fread( &len2, sizeof len2, 1, stream );
      fread( buf , sizeof host->hostname[0], len1, stream);
      buf[ len1 ] = '\0';

      printmsg(5,"HostStatus: Name length %d, status length %d, "
                 "host name \"%s\"",
                 len1, len2, buf );

      host = checkreal( buf );

      if ( host == BADHOST )
      {
         printmsg(1,"HostStatus: Host \"%s\" not found, purging entry",
                     buf );
         fread( buf , len2, 1,  stream);
      }
      else if ( len2 <= (sizeof *(host->hstats)))
      {
         struct HostStats stats;    /* host status, as defined by hostatus */

         fread( &stats , len2, 1,  stream);

         printmsg(5,"HostStatus: Loaded status for host %s",
                  host->hostname);

/*--------------------------------------------------------------------*/
/*        Update the host status to the best known information        */
/*--------------------------------------------------------------------*/

         if ( host->hstats->lconnect > stats.lconnect )
            stats.lconnect = host->hstats->lconnect;

         if ( host->hstats->ltime > stats.ltime )
            stats.ltime = host->hstats->ltime;
         else if ( host->hstats->lconnect > stats.ltime )
            ; /* No operation */
         else if (( stats.save_hstatus >= nocall ) &&
                  ( stats.save_hstatus < last_status ))
            host->hstatus = stats.save_hstatus;
         else
            printmsg(0,"HostStatus: Invalid status (%d) ignored for \"%s\"",
               stats.save_hstatus,host->hostname ) ;

         memcpy( host->hstats, &stats , sizeof stats );
      }
      else {
         printmsg(0,"HostStatus: Bad record length %d (wanted %d), "
                    "purging status for host %s",
                    len2, (int) (sizeof *(host->hstats)), buf);
         fread( buf , len2, 1,  stream);
      } /* else */
   } /* while */

   if (ferror( stream ))
   {
      printerr( fname );
      clearerr( stream );
   }

   fclose( stream );

   hstatus_age = age;             /* Remember the age of the file     */

} /* HostStatus */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -