|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T d
Length: 6663 (0x1a07)
Types: TextFile
Names: »dsa_wait.c«
└─⟦2d1937cfd⟧ Bits:30007241 EUUGD22: P.P 5.0
└─⟦35176feda⟧ »EurOpenD22/isode/isode-6.tar.Z«
└─⟦de7628f85⟧
└─⟦this⟧ »isode-6.0/quipu/dsa_wait.c«
/* dsa_wait.c - accept and process events listened for */
#ifndef lint
static char *rcsid = "$Header: /f/osi/quipu/RCS/dsa_wait.c,v 7.1 89/12/19 16:20:30 mrose Exp $";
#endif
/*
* $Header: /f/osi/quipu/RCS/dsa_wait.c,v 7.1 89/12/19 16:20:30 mrose Exp $
*
*
* $Log: dsa_wait.c,v $
* Revision 7.1 89/12/19 16:20:30 mrose
* sync
*
* Revision 7.0 89/11/23 22:17:25 mrose
* Release 6.0
*
*/
/*
* NOTICE
*
* Acquisition, use, and distribution of this module and related
* materials are subject to the restrictions of a license agreement.
* Consult the Preface in the User's Manual for the full terms of
* this agreement.
*
*/
#include "rosap.h"
#include "tsap.h"
#include "quipu/util.h"
#include "quipu/connection.h"
#include <signal.h>
extern LLog * log_dsap;
extern int start_nameserver;
extern int nameserver_unused;
extern unsigned watchdog_time;
extern unsigned watchdog_delta;
dsa_wait(secs)
int secs;
{
int vecp = 0;
char *vec[4];
fd_set iads;
fd_set wads;
int nads;
struct TSAPdisconnect td_s;
struct TSAPdisconnect *td = &td_s;
struct connection * cn;
struct connection * next_cn;
char ibuffer[BUFSIZ];
char *ibp;
char wbuffer[BUFSIZ];
char *wbp;
extern int nameservice;
SFD attempt_restart();
int newfd;
nads = 0;
FD_ZERO(&iads);
FD_ZERO(&wads);
ibp = ibuffer;
wbp = wbuffer;
/*
DLOG(log_dsap, LLOG_DEBUG, ("dsa_wait connections:"));
conn_list_log(connlist);
*/
for(cn=connlist; cn != NULLCONN; cn=cn->cn_next)
{
if (cn->cn_state == CN_CONNECTING1)
{
FD_SET(cn->cn_ad, &wads);
(void) sprintf(wbp, ", %d.", cn->cn_ad);
wbp += (strlen(wbp) - 1);
}
else
{
FD_SET(cn->cn_ad, &iads);
(void) sprintf(ibp, ", %d.", cn->cn_ad);
ibp += (strlen(ibp) - 1);
}
if(cn->cn_ad >= nads)
nads = cn->cn_ad + 1;
}
if(ibp == ibuffer)
{
DLOG (log_dsap, LLOG_DEBUG, ("Listening for new associations"));
}
else
{
LLOG (log_dsap, LLOG_NOTICE, ("Listening on ads: %s", (ibuffer+1)));
}
if(wbp == wbuffer)
{
DLOG (log_dsap, LLOG_DEBUG, ("Not making new associations"));
}
else
{
LLOG (log_dsap, LLOG_NOTICE, ("Making ads: %s", (wbuffer+1)));
}
if (start_nameserver)
{
if(nameserver_unused)
{
DLOG (log_dsap, LLOG_DEBUG, ("Nameservice on ad: %d", nameservice));
if ( FD_ISSET (nameservice, &iads)) {
LLOG(log_dsap, LLOG_EXCEPTIONS, ("Nameservice set by connection!"));
}
else {
if (nameservice >= nads)
nads = nameservice + 1;
FD_SET (nameservice,&iads);
DLOG(log_dsap, LLOG_DEBUG, ("Set nameservice"));
}
}
else
{
DLOG (log_dsap, LLOG_DEBUG, ("Nameservice in use (ad: %d)", nameservice));
if ( FD_ISSET (nameservice, &iads)) {
LLOG(log_dsap, LLOG_EXCEPTIONS, ("Nameservice IN USE and set by connection!"));
}
}
}
else {
DLOG (log_dsap, LLOG_DEBUG, ("Nameservice off"));
}
DLOG (log_dsap, LLOG_NOTICE, ("secs: %d; nads: %d; iads 0x%x, wads 0x%x",
secs, nads, iads.fds_bits[0], wads.fds_bits[0]));
if (secs != NOTOK) {
/* if secs == NOTOK we want to block, otherwise set watchdog, but
beware of setting watchdog off accidentally !
*/
if (secs > (watchdog_time - watchdog_delta))
watch_dog_aux ("TNetAccept (long)",(unsigned)secs + watchdog_delta);
else
watch_dog ("TNetAccept");
}
if(TNetAcceptAux(&vecp, vec, &newfd, NULLTA, nads, &iads, &wads, NULLFD, secs, td) == NOTOK)
{
watch_dog_reset();
td_log (td, "TNetAccept");
if (td -> td_reason == DR_PROTOCOL || td -> td_reason == DR_NETWORK)
return;
attempt_restart (NOTOK);
exit (0); /* should not be reached */
}
watch_dog_reset();
if (vecp > 0)
conn_pre_init (newfd,vecp,vec);
if (start_nameserver)
{
if (FD_ISSET (nameservice,&iads))
{
ns_process (nameservice);
}
}
for(cn = connlist; cn != NULLCONN; cn = next_cn)
{
next_cn = cn->cn_next;
switch(cn->cn_state)
{
case CN_CONNECTING1:
DLOG(log_dsap, LLOG_TRACE, ("Checking %d", cn->cn_ad));
if(FD_ISSET(cn->cn_ad, &wads))
{
DLOG(log_dsap, LLOG_DEBUG, ("Polling %d", cn->cn_ad));
conn_retry(cn);
}
break;
case CN_CONNECTING2:
DLOG (log_dsap, LLOG_TRACE, ("Checking %d (2)", cn ->cn_ad));
if (FD_ISSET(cn->cn_ad, &iads))
{
DLOG(log_dsap, LLOG_DEBUG, ("Polling %d (2)", cn->cn_ad));
conn_retry(cn);
}
break;
case CN_OPEN:
if (FD_ISSET (cn->cn_ad, &iads))
{
DLOG (log_dsap,LLOG_DEBUG,( "Activity on association: %d", cn->cn_ad));
conn_dispatch(cn);
} /* if there is work on this connection */
break;
case CN_CLOSING:
if (FD_ISSET (cn->cn_ad, &iads))
(void) conn_release_retry(cn);
break;
case CN_OPENING:
if (FD_ISSET (cn->cn_ad, &iads))
conn_init(cn);
break;
case CN_INDICATED:
if (FD_ISSET (cn->cn_ad, &iads))
{
if(cn->cn_bind_compare == NULLOPER)
{
LLOG(log_dsap, LLOG_EXCEPTIONS, ("cn_state = INDICATED but no bind_compare operation"));
}
else
{
cn->cn_bind_compare->on_bind_compare = NULLCONN;
}
}
/* FALL THROUGH */
default:
if (FD_ISSET (cn->cn_ad, &iads))
{
if (cn->cn_initiator == INITIATED_BY_THIS) {
LLOG (log_dsap,LLOG_EXCEPTIONS,( "Unexpected activity on association %d ... aborting",cn->cn_ad));
net_send_abort(cn);
conn_extract(cn);
} else
LLOG (log_dsap,LLOG_EXCEPTIONS,( "Unexpected activity on association %d ... ignoring",cn->cn_ad));
} /* if there is work on this connection */
break;
}
} /* for each connection */
} /* dsa_wait */
static char * watch_dog_where;
static SFD watch_dog_activate ()
{
static char called = FALSE;
if (!called) {
called = TRUE;
LLOG (log_dsap, LLOG_FATAL, ("Watchdog activated in %s", watch_dog_where));
attempt_restart (-2);
} else
LLOG (log_dsap, LLOG_FATAL, ("Repeated lower level blocking in %s", watch_dog_where));
exit(-1);
}
watch_dog (where)
char * where;
{
/*
A simple timer to stop DSAs holding onto associations, due to
a lower level failure.
*/
watch_dog_where = where;
(void) signal (SIGALRM, watch_dog_activate);
(void) alarm (watchdog_time);
}
watch_dog_aux (where,secs)
char * where;
unsigned secs;
{
watch_dog_where = where;
(void) signal (SIGALRM, watch_dog_activate);
(void) alarm (secs);
}
watch_dog_reset ()
{
(void) signal (SIGALRM, SIG_IGN);
(void) alarm ((unsigned) 0);
}