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

📄 dcp.c

📁 大量的汇编程序源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
               break;

            case CONN_INITIALIZE:
               hostp = NULL;

               if ( locked )
                  UnlockSystem();

               m_state = getsystem(recvgrade);
               if ( hostp != NULL )
                  remote_stats.save_hstatus = hostp->hstatus;
               break;

            case CONN_CHECKTIME:
               sendgrade = checktime(flds[FLD_CCTIME]);

               if ( (override_grade && sendgrade) || callnow )
                  sendgrade = recvgrade;

               if ( !CallWindow( sendgrade ))
                  m_state = CONN_INITIALIZE;
               else if ( LockSystem( hostp->hostname , B_UUCICO))
               {
                  dialed = TRUE;
                  time(&hostp->hstats->ltime);
                                 /* Save time of last attempt to call   */
                  hostp->hstatus = autodial;
                  m_state = CONN_MODEM;
               }
               else
                  m_state = CONN_INITIALIZE;

               break;

            case CONN_MODEM:
               if (getmodem(flds[FLD_TYPE]))
                  m_state = CONN_DIALOUT;
               else {
                  hostp->hstatus = invalid_device;
                  m_state = CONN_INITIALIZE;
               }
               break;

            case CONN_DIALOUT:

               if ( !IsNetwork() && suspend_other(TRUE, M_device ) < 0 )
               {
                  hostp->hstatus =  nodevice;
                  m_state = CONN_INITIALIZE;    // Try next system
               }
               else
                  m_state = callup( );
               break;

            case CONN_PROTOCOL:
               m_state = startup_server( (char)
                                          (bflag[F_SYMMETRICGRADES] ?
                                          sendgrade  : recvgrade) );
               break;

            case CONN_SERVER:
               m_state = process( poll_mode, recvgrade );
               Contacted = TRUE;
               break;

            case CONN_TERMINATE:
               m_state = sysend();
               if ( hostp != NULL )
               {
                  if (hostp->hstatus == inprogress)
                     hostp->hstatus = call_failed;
                  dcstats();
               }
               break;

            case CONN_DROPLINE:
               shutDown();
               UnlockSystem();
               suspend_other(FALSE, M_device);
               m_state = CONN_INITIALIZE;
               break;

            case CONN_EXIT:
               break;

            default:
               printmsg(0,"dcpmain: Unknown master state = %c",m_state );
               panic();
               break;
         } /* switch */

         if ( terminate_processing )
            m_state = CONN_EXIT;

      } /* while */

      fclose(fsys);

   }
   else { /* client mode */

      CONN_STATE s_state = CONN_INITIALIZE;
      CONN_STATE old_state = CONN_EXIT;

      if (!getmodem(E_inmodem))  /* Initialize modem configuration      */
         panic();                /* Avoid loop if bad modem name        */

      if ( ! IsNetwork() )
         suspend_init(M_device);

      while (s_state != CONN_EXIT )
      {
         printmsg(s_state == old_state ? 10 : 4 ,
                  "S state = %c", s_state);
         old_state = s_state;

         if (bflag[F_MULTITASK] &&
              (hostp != NULL ) &&
              (remote_stats.save_hstatus != hostp->hstatus ))
         {
            printmsg(2, "Updating status for host %s, status %d",
                        hostp->hostname ,
                        (int) hostp->hstatus );
            dcupdate();
            remote_stats.save_hstatus = hostp->hstatus;
         }

         switch (s_state) {
            case CONN_INITIALIZE:
               if ( hotuser == NULL )
                  s_state = CONN_ANSWER;
               else
                  s_state = CONN_HOTMODEM;
               break;

            case CONN_WAIT:
#if !defined(__TURBOC__) || defined(BIT32ENV)
              s_state = suspend_wait();
#else
              panic();                 // Why are we here?!
#endif
              break;

            case CONN_ANSWER:
               s_state = callin( exit_time );
               break;

            case CONN_HOTMODEM:
               s_state = callhot( hotbaud );
               break;

            case CONN_HOTLOGIN:
               if ( loginbypass( hotuser ) )
                  s_state = CONN_INITSTAT;
               else
                  s_state = CONN_DROPLINE;
               break;

            case CONN_LOGIN:
               if ( login( ) )
                  s_state = CONN_INITSTAT;
               else
                  s_state = CONN_DROPLINE;
               break;

            case CONN_INITSTAT:
               HostStatus();
               s_state = CONN_PROTOCOL;
               break;

            case CONN_PROTOCOL:
               s_state = startup_client(&sendgrade);
               break;

            case CONN_CLIENT:
               Contacted = TRUE;
               s_state = process( poll_mode, sendgrade );
               break;

            case CONN_TERMINATE:
               s_state = sysend();
               if ( hostp != NULL )
                  dcstats();
               break;

            case CONN_DROPLINE:
               shutDown();
               if ( locked )     /* Cause could get here w/o
                                    locking                    */
                  UnlockSystem();
               s_state = CONN_EXIT;
               break;

            case CONN_EXIT:
               break;

            default:
               printmsg(0,"dcpmain: Unknown slave state = %c",s_state );
               panic();
               break;
         } /* switch */

         if ( terminate_processing )
            s_state = CONN_EXIT;

      } /* while */
   } /* else */

/*--------------------------------------------------------------------*/
/*                         Report our results                         */
/*--------------------------------------------------------------------*/

   if (!Contacted && (poll_mode == POLL_ACTIVE))
   {
      if (dialed)
         printmsg(0, "Could not connect to remote system.");
      else
         printmsg(0,
               "No work for requested system or wrong time to call.");
   }

   dcupdate();

   if (bflag[F_SYSLOG] && ! bflag[F_MULTITASK])
      fclose(syslog);

   return terminate_processing ? 100 : (Contacted ? 0 : 5);

} /*dcpmain*/


/*--------------------------------------------------------------------*/
/*    p r o c e s s                                                   */
/*                                                                    */
/*    The procotol state machine                                      */
/*--------------------------------------------------------------------*/

static CONN_STATE process( const POLL_MODE poll_mode, const char callgrade )
{
   boolean master  = ( poll_mode == POLL_ACTIVE );
   boolean aborted = FALSE;
   XFER_STATE state =  master ? XFER_SENDINIT : XFER_RECVINIT;
   XFER_STATE old_state = XFER_EXIT;
                              /* Initialized to any state but the
                                 original value of "state"           */
   XFER_STATE save_state = XFER_EXIT;

/*--------------------------------------------------------------------*/
/*  Yea old state machine for the high level file transfer procotol   */
/*--------------------------------------------------------------------*/

   while( state != XFER_EXIT )
   {
      printmsg(state == old_state ? 14 : 4 ,
               "process: Machine state is = %c", state );
      old_state = state;

      if ( terminate_processing != aborted )
      {
         aborted = terminate_processing;
         state = XFER_ABORT;
      }

      switch( state )
      {

         case XFER_SENDINIT:  /* Initialize outgoing protocol        */
            state = sinit();
            break;

         case XFER_RECVINIT:  /* Initialize Receive protocol         */
            state = rinit();
            break;

         case XFER_MASTER:    /* Begin master mode                   */
            master = TRUE;
            state = XFER_NEXTJOB;
            break;

         case XFER_SLAVE:     /* Begin slave mode                    */
            master = FALSE;
            state = XFER_RECVHDR;
            break;

         case XFER_NEXTJOB:   /* Look for work in local queue        */
            state = scandir( rmtname, callgrade );
            break;

         case XFER_REQUEST:   /* Process next file in current job
                                 in queue                            */
            state = newrequest();
            break;

         case XFER_PUTFILE:   /* Got local tranmit request           */
            state = ssfile();
            break;

         case XFER_GETFILE:   /* Got local tranmit request           */
            state = srfile();
            break;

         case XFER_SENDDATA:  /* Remote accepted our work, send data */
            state = sdata();
            break;

         case XFER_SENDEOF:   /* File xfer complete, send EOF        */
            state = seof( master );
            break;

         case XFER_FILEDONE:  /* Receive or transmit is complete     */
            state = master ? XFER_REQUEST : XFER_RECVHDR;
            break;

         case XFER_NOLOCAL:   /* No local work, remote have any?     */
            state = sbreak();
            break;

         case XFER_NOREMOTE:  /* No remote work, local have any?     */
            state = schkdir( poll_mode == POLL_ACTIVE, callgrade );
            break;

         case XFER_RECVHDR:   /* Receive header from other host      */
            state = rheader();
            break;

         case XFER_TAKEFILE:  /* Set up to receive remote requested
                                 file transfer                       */
            state = rrfile();
            break;

         case XFER_GIVEFILE:  /* Set up to transmit remote
                                 requuest file transfer              */
            state = rsfile();
            break;

         case XFER_RECVDATA:  /* Receive file data from other host   */
            state = rdata();
            break;

         case XFER_RECVEOF:
            state = reof();
            break;

         case XFER_LOST:      /* Lost the other host, flame out      */
            printmsg(0,"process: Connection lost to %s, "
                       "previous system state = %c",
                       rmtname, save_state );
            hostp->hstatus = call_failed;
            state = XFER_EXIT;
            break;

         case XFER_ABORT:     /* Internal error, flame out           */
            printmsg(0,"process: Aborting connection to %s, "
                       "previous system state = %c",
                       rmtname, save_state );
            hostp->hstatus = call_failed;
            state = XFER_ENDP;
            break;

         case XFER_ENDP:      /* Terminate the protocol              */
            state = endp();
            break;

         default:
            printmsg(0,"process: Unknown state = %c, "
                       "previous system state = %c",
                       state, save_state );
            state = XFER_ABORT;
            break;
      } /* switch */

      save_state = old_state; /* Used only if we abort               */

   } /* while( state != XFER_EXIT ) */

/*--------------------------------------------------------------------*/
/*           Protocol is complete, terminate the connection           */
/*--------------------------------------------------------------------*/

   return CONN_TERMINATE;

} /* process */

⌨️ 快捷键说明

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