#ifndef DIAL
static char SCCSID[] = "@(#)dkdial.c 2.7+BNU DKHOST 87/03/09";
#endif
#include <fcntl.h>
#include "dk.h"
#include <stdio.h>
#include <signal.h>
#define SIGRTN void
#include <setjmp.h>
#include <sysexits.h>
#include <errno.h>
#define DK_DEFWAIT 89
#define DK_MAXWAIT 600
GLOBAL unsigned int dk_timewait = DK_DEFWAIT;
static char Conn_Msg[] = "Can't connect to %s: %s\n";
static char Resp_Msg[] = "No response from Datakit";
static SIGRTN timout();
static void setalarm(), usralarm();
EXTERN int dkndial();
static int Elapsed;
static int Timer;
static short TimeErr;
extern char *getenv();
EXTERN int dk_verbose, dk_errno;
GLOBAL int
dkdial(dest)
char *dest;
{
return(dkndial(dest, atoi(getenv("DKINTF"))));
}
GLOBAL int
dkndial(dest, intf)
char *dest;
{
short fd;
SIGRTN (*SigWas)();
unsigned int TimWas;
char *key;
struct diocdial {
struct diocreq iocb;
char dialstring[128];
} ioreq;
char dial_dev[32];
sprintf(dial_dev, "/dev/dk/dial%d", intf);
Timer = Elapsed = 0;
SigWas = signal(SIGALRM, timout);
TimWas = alarm(0);
if ((dk_timewait == 0) || (dk_timewait > DK_MAXWAIT))
dk_timewait = DK_DEFWAIT;
setalarm(dk_timewait);
if ((fd = open(dial_dev, O_RDWR)) < 0) {
setalarm(0);
if (dk_verbose)
fprintf(stderr, "dkdial: Can't open %s\n", dial_dev);
usralarm(TimWas, SigWas);
if (errno == EBUSY)
return(dk_errno = -EX_TEMPFAIL);
else
return(dk_errno = -EX_OSFILE);
}
if((key = getenv("DKKEY")) != NULL && getuid() == geteuid())
sprintf(ioreq.dialstring, "%s\n%s", dest, key);
else
strcpy(ioreq.dialstring, dest);
ioreq.iocb.req_traffic = 0;
ioreq.iocb.req_1param = 0;
ioreq.iocb.req_2param = 0;
if (ioctl(fd, DKIODIAL, &ioreq) < 0) {
setalarm(0);
if (dk_verbose)
if (TimeErr)
fprintf(stderr, Conn_Msg, Resp_Msg, ioreq.dialstring);
else
fprintf(stderr, Conn_Msg, ioreq.dialstring, dkerr(ioreq.iocb.req_error));
setalarm(2);
close(fd);
usralarm(TimWas, SigWas);
if (errno == EBUSY)
return(-dkerrmap(dk_errno = -EX_TEMPFAIL));
else
return(-dkerrmap(dk_errno = ioreq.iocb.req_error));
}
usralarm(TimWas, SigWas);
return (fd);
}
static SIGRTN
timout(arg)
int arg;
{
TimeErr++;
}
static void
setalarm(Seconds)
{
TimeErr = 0;
(void) signal(SIGALRM, timout);
Elapsed += Timer - alarm(Seconds);
Timer = Seconds;
}
static void
usralarm(TimWas, SigWas)
int TimWas;
SIGRTN (*SigWas)();
{
Elapsed += Timer - alarm(0);
(void) signal(SIGALRM, SigWas);
if (TimWas > 0) {
TimWas -= Elapsed;
if (TimWas < 2)
TimWas = 2;
}
alarm(TimWas);
}