home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
rtsi.com
/
2014.01.www.rtsi.com.tar
/
www.rtsi.com
/
OS9
/
OSK
/
TELECOM
/
UUCP_Blars.lzh
/
dcpsys.c
< prev
next >
Wrap
Text File
|
1991-11-24
|
16KB
|
884 lines
/*
* dcpsys.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
* Get the next system, and other support routines
*/
#include "dcp.h"
#define PROTOS "g"
#define MAXLOGTRY 3
int I_HAVE_HAYES = FALSE;
static char *days[] = {"Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"};
static int waitlogin;
char *fstring();
Proto Protolst[] = {'g', ggetpkt, gsendpkt, gopenpk, gclosepk,
#ifdef FPROTO
'f', fgetpkt, fsendpkt, fopenpk, fclosepk,
#endif
'\0'};
#define EOTMSG "\004\r\004\r"
procref getpkt, sendpkt, openpk, closepk;
/*
* g e t s y s t e m
*
* Process an "systems" file entry (like L.sys)
*/
getsystem()
{
int i;
if (fgets(sysline, BUFSIZ, fsys) == NULL)
return ('A');
printmsg(2, "%s", sysline);
if ((kflds = dgetargs(sysline, flds)) < FLD_PROTO + 1) {
printmsg(1, "wrong system line, only %d arguments\n", kflds);
return ('I'); /* next line */
}
strcpy(rmtname, flds[FLD_REMOTE]);
cctime = flds[FLD_CCTIME];
strcpy(device, flds[FLD_DEVICE]);
/* strcpy(type, flds[FLD_TYPE]); */
strcpy(speed, flds[FLD_SPEED]);
strcpy(proto, flds[FLD_PROTO]);
fw = (FILE *) NULL;
if (((strcmp(Rmtname, rmtname) == SAME) ||
((strcmp(Rmtname, "all") == SAME) && scandir(TRUE) == 'S')) &&
checktime(cctime) == 0) {
if (fw != (FILE *) NULL)
fclose(fw); /* in case we matched with scandir */
if (debuglevel > 3) {
for (i = FLD_EXPECT; i < kflds - 1; i += 2)
fprintf(stderr, "expect[%02d]:\t%s\nsend [%02d]:\t%s\n",
i, flds[i], i + 1, flds[i + 1]);
printmsg(2, "rmt= %s ctm= %s", rmtname, flds[FLD_CCTIME]);
printmsg(2, "dev= %s ", device);
printmsg(2, "spd= %s pro= %s", speed, proto);
}
return ('S'); /* startup this system */
} else {
if (fw != (FILE *) NULL)
fclose(fw); /* in case we matched with scandir */
return ('I');
}
}
/*
* c h e c k n a m e
*
* Do we know the guy ?
*/
checkname(name)
char name[];
{
FILE *ff;
char line[BUFSIZ], tmp[20]; /* can change to 8 if %8s works */
if ((ff = fopen(s_systems, "r")) == NULL)
return (FAILED);
printmsg(0, "%s is calling", name);
while (mfgets(line, BUFSIZ, ff) != NULL) {
sscanf(line, "%8s ", tmp);
printmsg(6, "rmt= %s sys= %s", name, tmp);
if (strncmp(name, tmp, 7) == SAME) {
fclose(ff);
return (OK); /* OK I like you */
}
}
printmsg(0, "Unknown host = %s", name);
fclose(ff);
return (FAILED); /* Who are you ? */
}
/*
*
* c h e c k t i m e
*
* check if we may make a call at this time
*/
checktime(xtime)
char *xtime;
{
time_t tstamp;
struct tm *ltime;
int frtime, totime, now;
char *cp, *cp2;
if (strcmp(xtime, "Never") == SAME || strcmp(xtime, "Slave") == SAME) {
printmsg(0, "Can't call %s (time or slave)", rmtname);
return (1);
}
time(&tstamp);
ltime = localtime(&tstamp);
now = ltime->tm_hour * 100 + ltime->tm_min;
cp = xtime;
while (1) {
if (!xtime)
break; /* not allowed */
if (xtime = index(xtime, '|'))
*xtime++ = '\0';
if (isdigit(*cp) || fstring(0, cp, "Any") ||
(fstring(0, cp, "Wk") && ltime->tm_wday != 0 && ltime->tm_wday != 6) ||
fstring(0, cp, days[ltime->tm_wday])) { /* Day Ok */
for (; *cp; cp++)
if (isdigit(*cp))
break;
if (!*cp)
return (0); /* ok, no time given */
frtime = atoi(cp);
if (!(cp2 = index(cp, '-'))) {
printmsg(0, "Wrong system time in systems\n");
return (1);
}
totime = atoi(cp2 + 1);
printmsg(5, "now: %d from: %d to: %d", now, frtime, totime);
if (frtime < totime) {
if ((frtime <= now) && (now <= totime))
return (0);
} else if ((now >= frtime) || (now <= totime))
return (0);
}
cp = xtime;
}
printmsg(0, "Can't call %s (time)", rmtname);
return (1);
}
/*
* s y s e n d
*
* end UUCP session negotiation
*/
sysend()
{
char msg[80];
msg[1] = '\0';
msgtime = 2 * MSGTIME;
/* while (msg[1] != 'O') { */
wmsg("OOOOOO", 2);
if (rmsg(msg, 2) == -1)
goto hang;
/* } */
hang:
wmsg("OOOOOO", 2);
sleep(2);
swrite("\n", 1);
swrite("+++", 3);
sleep(2);
swrite("\nATZ\n", 5);
sleep(1);
closeline();
if (remote == MASTER)
return ('I');
return ('A');
}
/*
* d d e l a y
*/
#ifdef NOTDEF
ddelay(dtime)
int dtime;
{
int i, j;
for (i = 0; i < dtime; i++);
}
#endif
/*
* w m s g
*
* write a ^P type msg to the remote uucp
*/
wmsg(msg, syn)
int syn;
char msg[];
{
int len;
len = strlen(msg);
if (syn == 2)
swrite("\0\020", 2);
swrite(msg, len);
if (syn == 2)
swrite("\0", 1);
}
/*
* r m s g
*
* read a ^P msg from UUCP
*/
rmsg(msg, syn)
int syn;
char msg[];
{
int ii;
char c;
register char *cp = msg;
printmsg(10, "rmsg(,%d)", syn);
if (syn == 2) {
do {
if (sread(&c, 1, msgtime) < 1)
return -1;
printmsg(9, "rmsg: got '%c' looking for ^P", c);
} while ((c & 0x7f) != '\020');
}
while (c && cp <= msg + 132) {
if (sread(&c, 1, msgtime) < 1)
return -1;
c &= 0x7f;
printmsg(9, "rmsg: got '%c'", c);
if (c == '\l' || c == '\r')
c = '\0';
*cp++ = c;
if (c == '\020')
cp = msg;
}
return cp - msg - 1;
}
/*
* s t a rt u p
*/
startup()
{
char msg[80], tmp1[20], tmp2[20];
if (remote == MASTER) {
sleep(1);
msgtime = 5 * MSGTIME;
if (rmsg(msg, 2) == -1) {
printmsg(0, "Timeout during startup ...");
return ('Y');
}
printmsg(2, "1st msg = %s", msg);
if (msg[5] == '=' && strncmp(&msg[6], rmtname, 7))
return ('Y');
printmsg(2, "sending nodename = %s", nodename);
/* sprintf(msg, "S%.7s -Q0 -x%d", nodename, debuglevel); *//* -Q0 -x16
* remote debuglevel set */
sprintf(msg, "S%.7s", nodename);
wmsg(msg, 2);
if (rmsg(msg, 2) == -1) {
printmsg(0, "Timeout during startup ...");
return ('Y');
}
printmsg(2, "2nd msg = %s", msg);
if (strncmp(&msg[1], "OK", 2))
return ('Y');
if (rmsg(msg, 2) == -1) {
printmsg(0, "Timeout during startup ...");
return ('Y');
}
printmsg(2, "3rd msg = %s", msg);
if (msg[0] != 'P' || index(&msg[1], proto[0]) == (char *) NULL) {
wmsg("UN", 2);
return ('Y');
}
sprintf(msg, "U%c", proto[0]);
wmsg(msg, 2);
setproto(proto[0]);
return ('D');
} else {
msgtime = 5 * MSGTIME;
sprintf(msg, "Shere=%s", nodename);
wmsg(msg, 2);
if (rmsg(msg, 2) == -1) {
printmsg(0, "Timeout during startup ...");
return ('Y');
}
sscanf(&msg[1], "%s %s %s", rmtname, tmp1, tmp2);
sscanf(tmp2, "-x%d", &debuglevel);
printmsg(1, "debuglevel level = %d", debuglevel);
printmsg(2, "1st msg from remote = %s", msg);
if (checkname(rmtname))
return ('Y');
wmsg("ROK", 2);
sprintf(msg, "P%s", PROTOS);
wmsg(msg, 2);
if (rmsg(msg, 2) == -1) {
printmsg(0, "Timeout during startup ...");
return ('Y');
}
if (msg[0] != 'U' || index(PROTOS, msg[1]) == (char *) NULL)
return ('Y');
proto[0] = msg[1];
setproto(proto[0]);
return ('R');
}
}
/*
* s e t p r o t o
*
* set the protocol
*/
setproto(pr)
char pr;
{
int i;
Proto *tproto;
for (tproto = Protolst; tproto->type != '\0' && pr != tproto->type;
tproto++)
printmsg(3, "setproto: %c %c", pr, tproto->type);
if (tproto->type == '\0') {
printmsg(0, "setproto: You said I had it but I cant find it");
exit(1);
}
getpkt = tproto->a;
sendpkt = tproto->b;
openpk = tproto->c;
closepk = tproto->d;
}
/*
* p r e f i x
*/
int
prefix(sh, lg)
char *sh, *lg;
{
return (strncmp(sh, lg, strlen(sh)) == SAME);
}
/*
* n o t i n
*/
int
notin(sh, lg)
char *sh, *lg;
{
while (*lg) {
if (prefix(sh, lg++))
return (FALSE);
}
return (TRUE);
}
#define MAXR 300
/*
* e x p e c t s t r
*/
int
expectstr(str, timeout)
char *str;
int timeout;
{
char rdvec[MAXR];
register char *rp = rdvec;
char nextch;
printmsg(3, "wanted %s", str);
if (strcmp(str, "\"\"") == SAME)
return TRUE;
*rp = 0;
while (notin(str, rdvec)) {
if (sread(&nextch, 1, timeout) <= 0)
return FALSE;
if ((*rp++ = nextch & 0177) < ' ')
rp = rdvec;
*rp = '\0';
printmsg(8, "---------->%s<------\n", rdvec);
if (rp >= rdvec + MAXR) {
if ((rp = index(rdvec + MAXR - strlen(str) - 1, *str)) != NULL) {
strcpy(rdvec, rp);
rp = rdvec + strlen(rdvec);
} else
rp = rdvec;
}
}
return TRUE;
}
/*
* w r i t e s t r
*/
int
writestr(s)
register char *s;
{
register char last;
register char *m;
int nocr;
extern int fpw;
last = '\0';
nocr = FALSE;
while (*s) {
if (last == '\\') {
switch (*s) {
case 'd':
case 'D': /* delay */
sleep(2);
break;
case 'c':
case 'C': /* end string don't output CR */
nocr = TRUE;
break;
case 'r':
case 'R': /* carriage return */
case 'm':
case 'M':
swrite("\r", 1);
break;
case 'n':
case 'N':
swrite("\l", 1);
break;
case 'b':
case 'B':
swrite("\b", 1);
break;
case 'u':
case 'U':
#ifdef TOPS
_ss_break(fpw);
#endif
break;
case 't':
case 'T':
swrite("\t", 1);
break;
case 's':
case 'S':
swrite(" ", 1);
break;
case 'z':
case 'Z':
SIOSpeed(++s);
while (*s != '\0' && *s != '\\')
s++;
if (*s == '\\')
s++;
break;
default:
swrite(s, 1);
}
last = '\0';
} else if (*s != '\\') {
swrite(s, 1);
/* fputc(*s, stderr); */
} else
last = *s;
s++;
}
return (nocr);
}
/*
* s e n d s t r
*
* send line of login sequence
*/
void
sendstr(str)
char *str;
{
int nw, ns;
int nulls;
printmsg(2, "sending %s", str);
#ifdef BREAK
if (prefix("BREAK", str)) {
sscanf(&str[5], "%1d", &nulls);
if (nulls <= 0 || nulls > 10)
nulls = 3;
/* send break */
ssendbrk(nulls);
return;
}
#endif
if (strcmp(str, "EOT") == SAME) {
swrite(EOTMSG, strlen(EOTMSG));
return;
}
if (strcmp(str, "\"\"") == SAME)
*str = '\0';
if (strcmp(str, "") != SAME) {
if (!writestr(str)) {
swrite("\r", 1);
}
} else {
swrite("\r", 1);
}
return;
}
/*
* s e n d e x p e c t
*/
int
sendexpect(s, e, timeout)
char *s;
char *e;
{
sendstr(s);
return (expectstr(e, timeout));
}
/*
* d i a l
*/
dial()
{
extern int fpr, fpw;
int i;
char cmd[100];
int fdsav0, fdsav1, err;
if (!strncmp(flds[FLD_TYPE], "PRG-", 4)) {
if (openline(device, speed)) {
printmsg(0, "dial: CAN'T OPEN TTY");
return (FALSE);
}
fdsav0 = dup(0);
fdsav1 = dup(1);
close(0);
dup(fpr);
close(1);
dup(fpw);
sprintf(cmd, "%s %s", flds[FLD_TYPE] + 4, rmtname);
err = 0;
#ifdef TOPS
if (xshell(cmd) < 0)
#else
if (system(cmd) < 0)
#endif
err = errno;
if (fdsav0 >= 0) {
close(0);
dup(fdsav0);
close(fdsav0);
}
if (fdsav1 >= 0) {
close(1);
dup(fdsav1);
close(fdsav1);
}
if (err != 0) {
printmsg(0, "dial: dialer failed (%d)");
return (FALSE);
}
return (TRUE);
}
if (strncmp(flds[FLD_TYPE], "HAYES", 5) != SAME) {
printmsg(0, "dial: unsupported dialer %s", flds[FLD_TYPE]);
return (FALSE);
}
if (flds[FLD_TYPE][5] == '-')
waitlogin = atoi(flds[FLD_TYPE] + 6);
printmsg(3, "calling host %s", rmtname);
if (openline(device, speed)) {
printmsg(0, "dial: CAN'T OPEN TTY");
return (FALSE);
}
printmsg(3, "hayes: trying %s", speed);
SIOSpeed(speed);
sendstr("ATZ");
sleep(1);
if (sendexpect("ATZ", "OK", 2) != TRUE) {
sendexpect("\\d+++\\d", "OK", 2);
if (sendexpect("ATZ", "OK", 2) != TRUE) {
printmsg(0, "dial: NO MODEM RESPONSE");
return (FALSE);
}
}
printmsg(3, "hayes: got modem response");
#ifdef SCREW_WITH_THE_MODEM_SETTINGS_FOR_NO_GOOD_REASON_OTHER_THAN_TO_BREAK_THINGS
if (sendexpect("\\d\\dATX4", "OK", 2) != TRUE) {
printmsg(0, "dial: NO MODEM RESPONSE");
return (FALSE);
} else {
sleep(1);
return (TRUE);
}
#else
return TRUE;
#endif
}
/*
* d o c a l l u p
*
* script processor - nothing fancy!
*/
docallup()
{
int flg, kk, jj, ll, firstflg;
char exptmp[100];
char *exp;
char *alternate;
int ok;
int i;
printmsg(1, "calling host %s", rmtname);
printmsg(1, "debuglevel=%d", debuglevel);
waitlogin = 30;
if (strcmp(flds[FLD_TYPE], "DIR") != SAME) {
I_HAVE_HAYES = TRUE;
if (dial() == FALSE)
return ('G');
} else {
I_HAVE_HAYES = FALSE;
if (openline(device, speed))
return ('G');
}
for (i = 6; i < kflds; i += 2) {
strcpy(exptmp, flds[i]);
exp = exptmp;
printmsg(2, "callup: expect %d of %d \"%s\"", i, kflds, exp);
ok = FALSE;
while (ok != TRUE) {
alternate = index(exp, '-');
if (alternate != (char *) NULL)
*alternate++ = '\0';
ok = expectstr(exp, waitlogin);
printmsg(1, "got %s", ok != TRUE ? "?" : "that");
if (ok == TRUE)
break;
if (alternate == (char *) NULL) {
printmsg(0, "LOGIN FAILED");
return ('Y');
}
exp = index(alternate, '-');
if (exp != (char *) NULL)
*exp++ = '\0';
printmsg(1, "send alternate");
sendstr(alternate);
}
printmsg(2, "callup: send %d of %d \"%s\"", i + 1, kflds, flds[i + 1]);
sleep(1); /* (1) */
sendstr(flds[i + 1]);
}
return ('P');
}
/*
* c a l l u p
*/
callup()
{
int trys;
for (trys = 0; trys < 4; trys++) {
if (docallup() == 'P')
return ('P');
else {
closeline();
sleep(60); /* Wait 60 secs and than try again */
}
}
printmsg(0, "LOGIN FAILED, ABORTING");
return ('I');
}
/*
* s l o w r i t e
*
* comunication slow write. needed for auto-baud modems
*/
slowrite(st)
register char *st;
{
printmsg(2, "sent %s", st);
while (*st != '\0') {
swrite(st, 1);
tsleep(20);
}
}
#include <dir.h>
/*
* s c a n d i r
*
* scan work dir for C. files matching current remote host (rmtname)
* return
* A - abort
* Y - can't open file
* S - ok
* Q - no files
*/
scandir(closeit)
int closeit;
{
int fn, len, i;
char cname[64], tmp[40];
static DIR *dirp = NULL;
struct direct *dp;
if (closeit && dirp) {
closedir(dirp);
dirp = NULL;
}
if (dirp == NULL)
if ((dirp = opendir(rmtname)) == (DIR *) NULL) {
fprintf(stderr, "couldn't open dir %s\n", rmtname);
return ('A');
}
sprintf(cname, CALLFILE, rmtname);
len = strlen(cname);
while ((dp = readdir(dirp)) != (struct direct *) NULL) {
printmsg(4, "scandir: %s", dp->d_name);
strcpy(tmp, dp->d_name);
tmp[strlen(tmp) - 5] = '\0'; /* WARNING: This is a hack */
if (strcmp(cname, tmp) == SAME) {
printmsg(4, "scandir: match!!");
sprintf(cfile, "%s/%s", rmtname, dp->d_name);
if (closeit) {
closedir(dirp);
dirp = NULL;
}
if (fw)
fclose(fw); /* added ... (weo) */
if ((fw = fopen(cfile, "r")) == NULL) {
printmsg(0, "Can't open %s", cfile);
continue; /* return('Y'); was here. We want to
* continue! (weo) */
}
return ('S');
}
}
closedir(dirp);
dirp = NULL;
return ('Q');
}
/*
* f s t r i n g
*/
char *
fstring(pos, str, pat)
int pos;
char *str, *pat;
{
char *cp;
int len;
if (pos >= strlen(str))
return (NULL);
len = strlen(pat);
for (cp = str + pos; *cp; cp++)
if (!strncmp(cp, pat, len))
return (cp);
return (NULL);
}