home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
rtsi.com
/
2014.01.www.rtsi.com.tar
/
www.rtsi.com
/
OS9
/
OSK
/
TELECOM
/
OSKBox.lzh
/
MAILBOX
/
CC
/
clksrv.c
< prev
next >
Wrap
C/C++ Source or Header
|
1992-03-28
|
8KB
|
416 lines
#include <stdio.h>
#include <ctype.h>
#include <setjmp.h>
#include "mailbox.h"
#define TIMEOUT (5 * 60) /* maximum # of seconds to wait for response */
int tnc_in, tnc_out, ctl_in, ctl_out;
jmp_buf disconnected;
int ok_flag, bid_flag, mid_flag;
int sec;
main (argc, argv)
char *argv[];
{
int i, flag, flag2;
if (argc < 2) {
printf ("No port supplied.\n");
exit (0);
}
for (i = 2; i < argc; i++) {
flag = (*argv[i] == '$'); /* use GMT */
if (flag) argv[i]++;
flag2 = (*argv[i] == '@'); /* use GMT */
if (flag2) argv[i]++;
while (clock_serve (argv[i], argv[1], flag, flag2) == 0)
sleep (60); /* try again later */
}
}
clock_serve (mbox, port, zflag, bbflag)
char *mbox, *port;
{
int i, curtime, curdate, tick;
short curday;
char str[40];
printf ("clock_serve: mbox=%s port=%s zflag=%d bbflag=%d\n",mbox,port,zflag,bbflag);
ok_flag = bid_flag = mid_flag = 0;
if (!open_channel (port)) {
return (-1);
}
if (setjmp (disconnected)) {
close_channel (port);
return (-1);
}
if ((i = connect (mbox)) < 1) {
close_channel (port);
return (i);
}
get_prompt ();
if (ok_flag) {
sprintf (str, "%s\n", SID);
write_path (tnc_out, str);
get_prompt ();
}
if (bbflag) {
write_path (tnc_out, "@\n");
get_prompt ();
}
/* next minute */
_sysdate (0, &curtime, &curdate, &curday, &tick);
sleep (61 - (curtime & 0xff));
_sysdate (0, &curtime, &curdate, &curday, &tick);
if (zflag)
ztime (&curtime, &curdate, &curday);
sprintf (str, (bbflag) ? "C %02d%02d%02d%02d%02d\n" : "C %02d%02d%02d %02d%02d\n",
(curdate >> 16) % 100,
(curdate >> 8) & 0xff,
curdate & 0xff,
(curtime >> 16) & 0xff,
(curtime >> 8) & 0xff);
write_path (tnc_out, str);
get_prompt ();
disconnect ();
close_channel (port);
return (1);
}
get_prompt ()
{
char str[256];
char *f1, *f2, *f3, *f4, *p;
printf ("get_prompt\n");
while (1) {
get_line (str);
if ((f1 = strchr (str, '[')) == str && (f2 = strrchr (f1, ']')) &&
(f3 = strchr (f1, '-')) && f3 < f2 && (f4 = strrchr (f1, '-')) &&
f4 > f3) {
ok_flag = 1;
for (p = f4 + 1; p < f2; p++)
switch (*p) {
case '$': bid_flag++; break;
case 'M': mid_flag++; break;
default: break;
}
}
else if ((f1 = strchr (str, '[')) == str && (f2 = strchr (f1, ']'))) {
*(f1+4) = '\0';
if (strcmp (f1+1, "MBL" == 0))
ok_flag = bid_flag = 1;
}
if (str[strlen (str) - 1] == '>')
return;
}
}
get_line (str)
char *str;
{
int len;
int time = 0;
int status_disp, data_disp, data_send, data_ack, tries, state;
time = tick ();
data_send = data_ack = -1;
while (1) {
if (data_send || data_ack) {
write_path (ctl_out, "L\n");
do read_path (ctl_in, str, 80); while (str[0] == '(');
printf ("status %s\n", str);
scan_status (str, &status_disp, &data_disp, &data_send,
&data_ack, &tries, &state);
if (state == 0)
longjmp (disconnected, 2);
if (data_send || data_ack)
time = tick ();
}
else if (_gs_rdy (ctl_in) > 0)
check_status ();
if (_gs_rdy (tnc_in) > 0) {
read_path (tnc_in, str, 256);
printf ("get_line: '%s'\n", str);
return;
}
sleep (3);
if ((tick() - time) / sec > TIMEOUT) {
printf ("TIMEOUT\n");
write_path (ctl_out, "D\n");
time = tick ();
}
}
}
disconnect ()
{
printf ("disconnect\n");
write_path (ctl_out, "D\n");
while (!check_disconnect ())
;
}
check_status ()
{
if (check_disconnect ())
longjmp (disconnected, 1);
}
check_disconnect ()
{
char str[80];
char *p, w[20];
int len;
read_path (ctl_in, str, 80);
printf ("%s\n", str);
p = str;
p += scanword (p, w, 20);
p += scanword (p, w, 20);
if (strcmp (w, "CHANNEL") == 0) {
p += scanword (p, w, 20);
if (strcmp (w, "NOT") == 0) {
p += scanword (p, w, 20);
return (strcmp (w, "CONNECTED") == 0);
}
else
return 0;
}
else if (strcmp (w, "LINK") == 0) {
p += scanword (p, w, 20);
if (strcmp (w, "FAILURE") != 0)
return 0;
}
else if (strcmp (w, "DISCONNECTED") != 0)
return 0;
return 1;
}
connect (mbox)
char *mbox;
{
char path[30];
strcpy (path, mbox);
return (try_connect (mbox));
}
try_connect (fpath)
char *fpath;
{
char str[95], w[20], *p;
int len;
int tries = 0;
printf ("try_connect %s\n", fpath);
sprintf (str, "C %s\n", fpath);
write_path (ctl_out, str);
read_path (ctl_in, str, 95);
printf ("%s\n", str);
p = str + scanword (str, w, 20);
p += scanword (p, w, 20);
if (strcmp (w, "CONNECTED") == 0)
return 1;
else if (strcmp (w, "BUSY") == 0 || strcmp (w, "STATION") == 0) {
return 0;
}
else
return -1;
}
open_channel (port)
char *port;
{
int hostcmd;
int i, pid;
char str[40];
strcpy (str, "/pipe/command.");
strcat (str, port);
if ((hostcmd = open (str, 2)) < 0)
return (0);
pid = getpid ();
sprintf (str, "o%d\n", pid);
write_path (hostcmd, str);
close (hostcmd);
sprintf (str, "/pipe/data_in.%d", pid);
for (i = 0; i < 10; i++) {
if ((tnc_in = open (str, 3)) != -1) break;
sleep (1);
}
if (tnc_in == -1)
return (0);
sprintf (str, "/pipe/data_out.%d", pid);
tnc_out = open (str, 3);
sprintf (str, "/pipe/ctl_in.%d", pid);
ctl_in = open (str, 3);
sprintf (str, "/pipe/ctl_out.%d", pid);
ctl_out = open (str, 3);
return (1);
}
close_channel (port)
char *port;
{
int hostcmd;
int i, j, pid;
char str[40];
strcpy (str, "/pipe/command.");
strcat (str, port);
if ((hostcmd = open (str, 2)) < 0)
return (0);
pid = getpid ();
sprintf (str, "c%d\n", pid);
write_path (hostcmd, str);
close (hostcmd);
sleep (5);
drain (tnc_in);
drain (tnc_out);
drain (ctl_in);
drain (ctl_out);
close (tnc_in);
close (tnc_out);
close (ctl_in);
close (ctl_out);
sprintf (str, "/pipe/data_in.%d", pid);
for (i = 0; i < 10; i++) {
if (access (str, 0) == -1) break;
sleep (1);
}
if (i == 10) return 0;
return (1);
}
drain (path)
{
int i, j;
char c;
while ((i = _gs_rdy (path)) > 0) {
for (j = 0; j < i; j++)
read (path, &c, 1);
sleep (1);
}
}
write_path (path, str)
char *str;
{
write (path, str, strlen (str));
if (path == tnc_out) writeln (1, str, strlen (str));
}
read_path (path, str, len)
char *str;
{
int i;
i = readln (path, str, len);
if (i)
str[i-1] = '\0';
return i;
}
scan_status (s, a, b, c, d, x, f)
char *s;
int *a, *b, *c, *d, *x, *f;
{
char *p, w[20];
p = s;
p += scanword (p, w, 20);
*a = atoi (w);
p += scanword (p, w, 20);
*b = atoi (w);
p += scanword (p, w, 20);
*c = atoi (w);
p += scanword (p, w, 20);
*d = atoi (w);
p += scanword (p, w, 20);
*x = atoi (w);
p += scanword (p, w, 20);
*f = atoi (w);
}
#asm
gregorian:
link.w a5,#0
movem.l d1-d2/a0,-(a7)
move.l a1,-(a7)
movea.l d0,a0
movea.l d1,a1
move.l (a0),d0
move.l (a1),d1
os9 F$Gregor
bcs _sysret
move.l d0,(a0)
move.l d1,(a1)
bra.w _sysret
#endasm
ztime (time, date, weekday)
int *time, *date, *weekday;
{
int oneday = 60 * 60 * 24;
_julian (time, date);
*time += 60 * 60 * UTC;
if (*time >= oneday) {
*time -= oneday;
(*date)++;
*weekday = (*weekday + 1) % 7;
}
gregorian (time, date);
}
tick ()
{
int time, date, i_tick;
short day;
_sysdate (3, &time, &date, &day, &i_tick);
sec = i_tick >> 16;
return (time * sec + (i_tick & 0xFFFF));
}
scanword (s, d, len)
char *s, *d;
{
char *p;
int num = 0;
while (*s && isspace (*s)) {
s++;
num++;
}
p = d;
while (*s && !isspace (*s)) {
if (p - d < len - 1) *p++ = *s;
s++;
num++;
}
*p = '\0';
return (num);
}
char *strchr (str, c)
char *str;
{
while (*str && *str != c)
str++;
return ((*str) ? str : 0);
}
char *strrchr (str, c)
char *str;
{
char *p;
for (p = str; *p; p++) ;
while (p >= str && *p != c)
p--;
return ((p >= str) ? p : 0);
}