📄 dcp.c
字号:
/*--------------------------------------------------------------------*/
/* d c p . c */
/* */
/* Main routines for UUCICO */
/*--------------------------------------------------------------------*/
/*--------------------------------------------------------------------*/
/* Changes Copyright (c) 1989-1993 by Kendra Electronic */
/* Wonderworks. */
/* */
/* All rights reserved except those explicitly granted by the */
/* UUPC/extended license agreement. */
/*--------------------------------------------------------------------*/
/*--------------------------------------------------------------------*/
/* Copyright (c) Richard H. Lamb 1985, 1986, 1987 */
/* Changes Copyright (c) Stuart Lynne 1987 */
/*--------------------------------------------------------------------*/
/*
* $Id: dcp.c 1.20 1993/10/03 20:37:34 ahd Exp $
*
* $Log: dcp.c $
* Revision 1.20 1993/10/03 20:37:34 ahd
* Don't attempt to suspend port if using network protocol suite
*
* Revision 1.19 1993/09/30 03:06:28 ahd
* Move suspend signal handler into suspend2
*
* Revision 1.18 1993/09/29 13:18:06 ahd
* Don't call suspend handler under DOS Turbo C++ (not impletemented, anyway)
*
* Revision 1.17 1993/09/29 04:52:03 ahd
* Suspend port by port name, not modem file name
*
* Revision 1.16 1993/09/27 00:48:43 ahd
* Control UUCICO in passive mode by K. Rommel
*
* Revision 1.15 1993/09/20 04:46:34 ahd
* OS/2 2.x support (BC++ 1.0 support)
* TCP/IP support from Dave Watt
* 't' protocol support
*
* Revision 1.14 1993/08/02 03:24:59 ahd
* Further changes in support of Robert Denny's Windows 3.x support
*
* Revision 1.13 1993/07/31 16:26:01 ahd
* Changes in support of Robert Denny's Windows support
*
* Revision 1.12 1993/07/22 23:22:27 ahd
* First pass at changes for Robert Denny's Windows 3.1 support
*
* Revision 1.11 1993/05/30 00:01:47 ahd
* Allow tracing connection via UUCICO -t flag
*
* Revision 1.10 1993/04/11 00:35:46 ahd
* Global edits for year, TEXT, etc.
*
* Revision 1.9 1993/04/05 04:32:19 ahd
* Allow unique send and receive packet sizes
*
* Revision 1.8 1993/01/23 19:08:09 ahd
* Don't update host status at sysend() if hostp is not initialized
*
* Revision 1.7 1992/12/18 12:05:57 ahd
* Suppress duplicate machine state messages to improve OS/2 scrolling
*
* Revision 1.6 1992/12/01 04:37:03 ahd
* Add standard comment block for header
*
* Revision 1.5 1992/11/28 19:51:16 ahd
* If in multitask mode, only open syslog on demand basis
*
* Revision 1.4 1992/11/22 21:30:55 ahd
* Do not bother to strdup() string arguments
*
* 25Aug87 - Added a version number - Jal
* 25Aug87 - Return 0 if contact made with host, or 5 otherwise.
* 04Sep87 - Bug causing premature sysend() fixed. - Randall Jessup
* 13May89 - Add date to version message - Drew Derbyshire
* 17May89 - Add '-u' (until) option for login processing
* 01 Oct 89 Add missing function prototypes
* 28 Nov 89 Add parse of incoming user id for From record
* 18 Mar 90 Change checktime() calls to Microsoft C 5.1
*/
/*--------------------------------------------------------------------*/
/* This program implements a uucico type file transfer and remote */
/* execution protocol. */
/* */
/* Usage: UUCICO [-s sys] */
/* [-r 0|1] */
/* [-x debug] */
/* [-d hhmm] */
/* [-m modem] */
/* [-l logfile] */
/* [-x debuglevel] */
/* [-w userid] */
/* [-z bps] */
/* [-t] */
/* */
/* e.g. */
/* */
/* UUCICO [-x n] -r 0 [-d hhmm] client mode, wait for an incoming */
/* call for 'hhmm'. */
/* UUCICO [-x n] -s HOST call the host "HOST". */
/* UUCICO [-x n] -s all call all known hosts in the systems */
/* file. */
/* UUCICO [-x n] -s any call any host we have work queued for. */
/* UUCICO [-x n] same as the above. */
/*--------------------------------------------------------------------*/
/*--------------------------------------------------------------------*/
/* System include files */
/*--------------------------------------------------------------------*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <limits.h>
#include <time.h>
#ifdef _Windows
#include <Windows.h>
#endif
/*--------------------------------------------------------------------*/
/* UUPC/extended prototypes */
/*--------------------------------------------------------------------*/
#include "lib.h"
#include "arpadate.h"
#include "catcher.h"
#include "checktim.h"
#include "dcp.h"
#include "dcplib.h"
#include "dcpstats.h"
#include "dcpsys.h"
#include "dcpxfer.h"
#include "expath.h"
#include "getopt.h"
#include "hlib.h"
#include "hostable.h"
#include "hostatus.h"
#include "lock.h"
#include "logger.h"
#include "modem.h"
#include "security.h"
#include "ssleep.h"
#include "suspend.h"
#include "commlib.h"
#if defined(_Windows)
#include "winutil.h"
#endif
/*--------------------------------------------------------------------*/
/* Define passive and active polling modes; passive is */
/* sometimes refered to as "slave", "active" as master. Since */
/* the roles can actually switch during processing, we avoid */
/* the terms here */
/*--------------------------------------------------------------------*/
typedef enum {
POLL_PASSIVE = 0, /* We answer the telephone */
POLL_ACTIVE = 1 /* We call out to another host */
} POLL_MODE ;
/*--------------------------------------------------------------------*/
/* Global variables */
/*--------------------------------------------------------------------*/
size_t s_pktsize; /* send packet size for protocol */
size_t r_pktsize; /* receive packet size for protocol */
FILE *xfer_stream = NULL; /* stream for file being handled */
boolean callnow = FALSE; /* TRUE = ignore time in L.SYS */
FILE *fwork = NULL, *fsys= NULL ;
FILE *syslog = NULL;
char workfile[FILENAME_MAX]; /* name of current workfile */
char *Rmtname = nil(char); /* system we want to call */
char rmtname[20]; /* system we end up talking to */
struct HostTable *hostp;
struct HostStats remote_stats; /* host status, as defined by hostatus */
static boolean dialed = FALSE;/* True = We attempted a phone call */
currentfile();
/*--------------------------------------------------------------------*/
/* Local function prototypes */
/*--------------------------------------------------------------------*/
static CONN_STATE process( const POLL_MODE poll_mode, const char callgrade );
/*--------------------------------------------------------------------*/
/* d c p m a i n */
/* */
/* main program for DCP, called by uuhost */
/*--------------------------------------------------------------------*/
int dcpmain(int argc, char *argv[])
{
char *logfile_name = NULL;
boolean Contacted = FALSE;
int option;
int poll_mode = POLL_ACTIVE; /* Default = dial out to system */
time_t exit_time = LONG_MAX;
char recvgrade = ALL_GRADES;
boolean override_grade = FALSE;
char sendgrade = ALL_GRADES;
char *hotuser = NULL;
BPS hotbaud = 0;
fwork = nil(FILE);
/*--------------------------------------------------------------------*/
/* Process our options */
/*--------------------------------------------------------------------*/
while ((option = getopt(argc, argv, "d:g:m:l:r:s:tw:x:z:n?")) != EOF)
switch (option)
{
case 'd':
exit_time = atoi( optarg );
exit_time = time(NULL) + hhmm2sec(exit_time);
poll_mode = 0; // Implies passive polling
break;
case 'g':
if (strlen(optarg) == 1 )
recvgrade = *optarg;
else {
recvgrade = checktime( optarg );
/* Get restriction for this hour */
if ( ! recvgrade ) /* If no class, use the default */
recvgrade = ALL_GRADES;
}
override_grade = TRUE;
break;
case 'm': /* Override in modem name */
E_inmodem = optarg;
poll_mode = 0; /* Presume passive polling */
break;
case 'l': /* Log file name */
logfile_name = optarg;
break;
case 'n':
callnow = TRUE;
break;
case 'r':
poll_mode = atoi(optarg);
break;
case 's':
Rmtname = optarg;
break;
case 't':
traceEnabled = TRUE;
break;
case 'x':
debuglevel = atoi(optarg);
break;
case 'z':
hotbaud = atoi(optarg);
break;
case 'w':
poll_mode = 0; /* Presume passive polling */
hotuser = optarg;
break;
case '?':
puts("\nUsage:\tuucico\t"
"[-s [all | any | sys]] [-r 1|0] [-x debug] [-d hhmm]\n"
"\t\t[-n] [-t] [-w user] [-l logfile] [-m modem] [-z bps]");
return 4;
}
/*--------------------------------------------------------------------*/
/* Abort if any options were left over */
/*--------------------------------------------------------------------*/
if (optind != argc) {
puts("Extra parameter(s) at end.");
return 4;
}
if (Rmtname == nil(char))
Rmtname = "any";
/*--------------------------------------------------------------------*/
/* Initialize logging and the name of the systems file */
/*--------------------------------------------------------------------*/
openlog( logfile_name );
if (bflag[F_SYSLOG] && ! bflag[F_MULTITASK])
{
syslog = FOPEN(SYSLOG, "a",TEXT_MODE);
if ((syslog == nil(FILE)) || setvbuf( syslog, NULL, _IONBF, 0))
{
printerr( SYSLOG );
panic();
}
}
if ( terminate_processing )
return 100;
/*--------------------------------------------------------------------*/
/* Initialize security */
/*--------------------------------------------------------------------*/
if ( !LoadSecurity())
{
printmsg(0,"Unable to initialize security, see previous message");
panic();
}
if ( terminate_processing )
return 100;
#if defined(_Windows)
atexit(CloseEasyWin); // Auto-close EasyWin window on exit
#endif
atexit( shutDown ); /* Insure port is closed by panic() */
remote_stats.save_hstatus = nocall;
/* Known state for automatic status
update */
/*--------------------------------------------------------------------*/
/* Begin main processing loop */
/*--------------------------------------------------------------------*/
if (poll_mode == POLL_ACTIVE) {
CONN_STATE m_state = CONN_INITSTAT;
CONN_STATE old_state = CONN_EXIT;
printmsg(2, "calling \"%s\", debug=%d", Rmtname, debuglevel);
if ((fsys = FOPEN(E_systems, "r",TEXT_MODE)) == nil(FILE))
{
printerr(E_systems);
panic();
}
setvbuf( fsys, NULL, _IONBF, 0);
while (m_state != CONN_EXIT )
{
printmsg(old_state == m_state ? 10 : 4 ,
"M state = %c", m_state);
old_state = m_state;
if (bflag[F_MULTITASK] &&
(hostp != NULL ) &&
(remote_stats.save_hstatus != hostp->hstatus ))
{
dcupdate();
remote_stats.save_hstatus = hostp->hstatus;
}
switch (m_state)
{
case CONN_INITSTAT:
HostStatus();
m_state = CONN_INITIALIZE;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -