home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
rtsi.com
/
2014.01.www.rtsi.com.tar
/
www.rtsi.com
/
OS9
/
OSK
/
TELECOM
/
UUCP_Blars.lzh
/
dcp.c
next >
Wrap
C/C++ Source or Header
|
1992-02-02
|
8KB
|
432 lines
/*
* dcp.c
*
* Revised edition of dcp
*
* Stuart Lynne May/87
*
* Copyright (c) Richard H. Lamb 1985, 1986, 1987
* Changes Copyright (c) Stuart Lynne 1987
*
* Ported to OS-9/68000: Wolfgang Ocker January 1988
*
*/
/*
* "DCP" a uucp clone. Copyright Richard H. Lamb 1985,1986,1987
* This program implements a uucico type file transfer and remote
* execution type protocol.
*/
#include "dcp.h"
#include <pwd.h>
#include "uucp.h"
int pktsize; /* packet size for pro */
FILE *logfile; /* system log file */
FILE *syslog; /* system log file */
FILE *fw; /* cfile pointer */
char state; /* system state */
char cfile[80]; /* work file pointer */
int remote = SLAVE;
int msgtime; /* timout setting */
char fromfile[132];
char hostfile[132]; /* host version of fromfile */
char tofile[132];
int fp; /* current disk file ptr */
int size; /* nbytes in buff */
FILE *fsys;
char Rmtname[20];
char rmtname[20];
char *cctime;
char proto[5];
/* char loginseq[256]; */
char sysline[BUFSIZ];
char s_spooldir[100];
char s_systems[100];
char s_logfile[100];
char s_syslog[100];
char s_libdir[100];
char s_publicdir[100];
char *flds[60];
int kflds;
int debuglevel; /* debugging flag */
char device[40];
char speed[10];
int lock;
int uuxqtpid;
unsigned int checksum();
char nodename[15];
char *uuxarg[] = {"uuxqt", NULL};
extern char **environ;
extern int os9forkc();
/*
* new usage
*
* dcp [-xn] slave mode
* dcp [-xn] -r1 -shost call host
*
* dcp [-xn] -r1 call any hosts as required by C. files
*
*/
static void
cant(file)
char *file;
{
exit(_errmsg(errno, "Can't open/chdir: \"%s\"\n", file));
}
main(argc, argv)
int argc;
char *argv[];
{
FILE *ftmp;
char line[132];
struct passwd *pw;
if (gethostname(nodename, 10) < 0)
exit(_errmsg(1, "Can't get hostname\n"));
if ((pw = getpwname("uucp")) == NULL) {
exit(_errmsg(1, "Can't get uucp's uid"));
}
setuid((pw->pw_gid << 16) | pw->pw_uid);
strcpy(s_spooldir, SPOOLDIR);
strcpy(s_publicdir, PUBLICDIR);
strcpy(s_libdir, LIBDIR);
if (chdir(s_spooldir) == -1)
cant(s_spooldir);
strcpy(s_logfile, ".LOG/logfile");
strcpy(s_syslog, ".LOG/syslog");
sprintf(s_systems, "%s/systems", s_libdir);
if ((logfile = fopen(s_logfile, "a")) == NULL)
cant(s_logfile);
if ((syslog = fopen(s_syslog, "a")) == NULL)
cant(s_syslog);
remote = SLAVE;
debuglevel = 0;
fp = -1;
fw = NULL;
strcpy(Rmtname, "all");
while (--argc) {
if (**++argv == '-') {
switch (argv[0][1]) {
case 'x':
debuglevel = atoi(&argv[0][2]);
break;
case 's':
sprintf(Rmtname, "%.7s", &argv[0][2]);
break;
case 'r':
remote = atoi(&argv[0][2]);
break;
default:
break;
}
}
}
device[0] = '\0';
if (remote == MASTER) {
printmsg(0, "Calling %s", Rmtname);
printmsg(1, "debuglevel=%d", debuglevel);
if ((fsys = fopen(s_systems, "r")) == NULL) {
exit(_errmsg(errno, "Can't open 'systems' file\n"));
}
state = 'I';
do {
printmsg(4, "Mstate = %c", state);
switch (state) {
case 'I':
state = getsystem();
break;
case 'S':
state = callup();
break;
case 'P':
state = startup();
break;
case 'D':
state = master();
break;
case 'Y':
state = sysend();
break;
}
} while(state != 'A');
fclose(fsys);
} else {
if (openline(NULL, NULL) == -1) {
printmsg(0, "Can't open line");
exit(1);
}
/* state = 'L'; */
state = 'I';
while (TRUE) {
printmsg(4, "Sstate = %c", state);
switch (state) {
/* case 'L':
state = login();
break; */
case 'I':
state = startup();
break;
case 'R':
state = slave();
break;
case 'Y':
state = sysend();
break;
}
if (state == 'A')
break;
}
closeline();
}
/* scan and process any recieved files */
fflush(syslog);
fflush(logfile);
if ((uuxqtpid = os9exec(os9forkc, uuxarg[0], uuxarg, environ, 0, 10, 3)) == -1) {
int err = errno;
printmsg(0, "FATAL: can't exec uuxqt (%d)", errno);
fclose(syslog);
fclose(logfile);
exit(err);
}
fclose(syslog);
fclose(logfile);
exit(0);
}
/*
* master
*/
master()
{
state = 'I';
while (TRUE) {
printmsg(4, "Top level state (master mode) %c", state);
switch (state) {
case 'I':
state = sinit();
break;
case 'B':
state = scandir(FALSE);
break;
case 'S':
state = send();
break;
case 'Q':
state = sbreak();
break;
case 'G':
state = receive();
break;
case 'C':
state = 'Y';
break;
case 'Y':
state = endp();
break;
case 'P':
return ('Y');
case 'A':
return ('A');
default:
return ('A');
}
}
}
/*
* slave
*/
slave()
{
state = 'I';
while (TRUE) {
printmsg(4, "Top level state (slave mode) %c", state);
switch (state) {
case 'I':
state = rinit();
break;
case 'F':
state = receive();
break;
case 'C':
state = schkdir();
break;
case 'T':
state = 'B';
break;
case 'B':
state = scandir(FALSE);
break;
case 'S':
state = send();
break;
case 'Q':
state = sbreak();
break;
case 'G':
return ('Y');
case 'Y':
state = endp();
break;
case 'P':
return ('Y');
case 'A':
return ('A');
default:
return ('A');
}
}
}
/*
* r e c e i v e
*
* This is the state table switcher for receiving files.
*/
receive()
{
state = 'F'; /* Receive-Init is the start state */
while (TRUE) {
printmsg(4, " receive state: %c", state);
switch (state) { /* Do until done */
case 'F': /* Receive-File */
state = rfile();
break;
case 'R': /* Receive-Data */
state = rdata();
break;
case 'D': /* send data */
state = sdata();
break;
case 'C':
return ('C'); /* Complete state */
case 'A':
return ('Y'); /* "Abort" state */
default:
return ('Y');
}
}
}
/*
* s e n d
*
* Sendsw is the state table switcher for sending files. It loops until
* either it finishes, or an error is encountered. The routines called
* by sendsw are responsible for changing the state.
*/
send()
{
fp = -1; /* reset file getter/opener */
state = 'F'; /* Send initiate is the start state */
while (TRUE) { /* Do this as long as necessary */
printmsg(4, "send state: %c", state);
switch (state) {
case 'F': /* Send-File */
state = sfile();
break; /* Send-Data */
case 'D':
state = sdata();
break;
case 'R': /* receive data */
state = rdata();
break;
case 'B':
return ('B'); /* Complete */
case 'A':
return ('Y'); /* "Abort" */
default:
return ('Y'); /* Unknown, fail */
}
}
}
/*
* p r i n t m s g
*
* Print error message on standard output if not remote.
*/
#include <varargs.h>
printmsg(va_alist)
va_dcl
{
int level;
char *fmt;
va_list args;
char msg[300], ltime[32];
time_t tstamp;
int len;
va_start(args);
level = va_arg(args, int);
if (debuglevel >= level) {
fmt = va_arg(args, char *);
len = vsprintf(msg, fmt, args);
msg[len++] = '\n';
msg[len] = '\0';
time(&tstamp);
strcpy(ltime, ctime(&tstamp));
ltime[strlen(ltime) - 1] = ' ';
if (remote == MASTER) {
fputs(ltime, stdout);
fputs(msg, stdout);
}
fputs(ltime, logfile);
fputs(msg, logfile);
}
va_end(args);
}