|
|
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 n
Length: 6472 (0x1948)
Types: TextFile
Names: »net_monitor.c«
└─⟦3d0c2be1b⟧ Bits:30001254 ISODE-5.0 Tape
└─⟦eba4602b1⟧ »./isode-5.0.tar.Z«
└─⟦d3ac74d73⟧
└─⟦this⟧ »isode-5.0/quipu/net_monitor.c«
/* net_monitor.c - accept and process events listened for */
#ifndef lint
static char *rcsid = "$Header: /f/osi/quipu/RCS/net_monitor.c,v 6.1 89/03/23 22:27:56 mrose Exp $";
#endif
/*
* $Header: /f/osi/quipu/RCS/net_monitor.c,v 6.1 89/03/23 22:27:56 mrose Exp $
*
*
* $Log: net_monitor.c,v $
* Revision 6.1 89/03/23 22:27:56 mrose
* out-the-door
*
* Revision 6.0 89/03/18 23:41:42 mrose
* Release 5.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"
extern LLog * log_dsap;
extern int start_nameserver;
net_monitor(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;
Conn cn;
int i;
char ibuffer[BUFSIZ];
char *ibp;
char wbuffer[BUFSIZ];
char *wbp;
#ifdef DSAP
extern int nameservice;
#endif
ibp = ibuffer;
wbp = wbuffer;
for(i=id_st.nads; i>0; i--)
{
if (FD_ISSET (i, &id_st.iads))
{
(void) sprintf(ibp, ", %d.", i);
ibp += (strlen(ibp) - 1);
}
if (FD_ISSET (i, &id_st.wads))
{
/* secs = 0; /* Force polling to allow RETRYs */
(void) sprintf(wbp, ", %d.", i);
wbp += (strlen(wbp) - 1);
}
}
if(ibp == ibuffer)
{
DLOG (log_dsap, LLOG_DEBUG, ("Listening for new associations"));
}
else
{
DLOG (log_dsap, LLOG_DEBUG, ("Listening on ads: %s", (ibuffer+1)));
}
if(wbp == wbuffer)
{
DLOG (log_dsap, LLOG_DEBUG, ("Not making new associations"));
}
else
{
DLOG (log_dsap, LLOG_DEBUG, ("Making ads: %s", (wbuffer+1)));
}
#ifdef DSAP
if (start_nameserver) {
DLOG (log_dsap, LLOG_DEBUG, ("Nameservice on ad: %d", nameservice));
if ( FD_ISSET (nameservice, &id_st.iads)) {
DLOG(log_dsap, LLOG_DEBUG, ("Nameservice already set! WHERE?"));
}
else {
if(secs != 0) {
if (nameservice >= id_st.nads)
id_st.nads = nameservice + 1;
FD_SET (nameservice,&id_st.iads);
DLOG(log_dsap, LLOG_DEBUG, ("Not polling: set nameservice"));
}
else {
DLOG(log_dsap, LLOG_DEBUG, ("Polling: don't set nameservice"));
}
}
}
else {
DLOG (log_dsap, LLOG_DEBUG, ("Nameservice off"));
}
#endif
iads = id_st.iads;
wads = id_st.wads;
nads = id_st.nads;
DLOG (log_dsap, LLOG_DEBUG, ("secs : %d; nads : %d", secs, nads));
if(TNetAccept(&vecp, vec, nads, &iads, &wads, NULLFD, secs, td) == NOTOK)
{
LLOG(log_dsap, LLOG_EXCEPTIONS, ("TNetAccept Failed"));
td_log(td);
return;
}
#ifdef DSAP
if (start_nameserver)
if (FD_ISSET (nameservice,&iads)) {
ns_process (nameservice);
return;
}
#endif
if(vecp > 0)
{
if(net_wait_init_request(vecp, vec) == OK)
{
/*
* If OK a new connection block will have been prefixed
* to the existing list.
*/
cn = id_st.connlist;
if((cn->cn_state == CN_STATE_INIT) &&
(cn->cn_init_act.ia_type == ACT_TYPE_REQ))
dsa_work_init_request(cn);
if(cn->cn_init_act.ia_type == ACT_TYPE_RESP)
net_send_init_response(cn);
}
}
for(cn = id_st.connlist; cn != NULLCONN; cn = cn->cn_next)
{
switch(cn->cn_state)
{
case CN_STATE_INIT:
LLOG(log_dsap, LLOG_EXCEPTIONS, ("Checking %d", cn->cn_ad));
if(FD_ISSET(cn->cn_ad, &wads))
{
LLOG(log_dsap, LLOG_EXCEPTIONS, ("Polling %d", cn->cn_ad));
net_wait_init_response(cn);
}
break;
case CN_STATE_INIT2:
LLOG (log_dsap, LLOG_EXCEPTIONS, ("Checking %d (2)", cn ->cn_ad));
if (FD_ISSET(cn->cn_ad, &iads))
{
LLOG(log_dsap, LLOG_EXCEPTIONS, ("Polling %d (2)", cn->cn_ad));
net_wait_init_response(cn);
}
break;
case CN_STATE_OPEN:
case CN_STATE_EXIT:
if (FD_ISSET (cn->cn_ad, &iads))
{
DLOG (log_dsap,LLOG_TRACE,( "Activity on association: %d", cn->cn_ad));
net_dispatch(cn);
} /* if there is work on this connection */
break;
case CN_STATE_FAIL:
default:
if (FD_ISSET (cn->cn_ad, &iads))
{
LLOG (log_dsap,LLOG_EXCEPTIONS,( "Unexpected activity on association %d",
cn->cn_ad));
} /* if there is work on this connection */
break;
}
} /* for each connection */
} /* net_monitor */
/*
* Something has happened on the association with descriptor "ad".
* Check what type of activity it is and dispatch to an appropriate
* routine to handle the activity.
*/
net_dispatch(cn)
Conn cn;
{
struct RoSAPindication roi_s;
struct RoSAPindication *roi = &roi_s;
struct RoSAPpreject *rop = &(roi->roi_preject);
extern void ros_log();
DLOG (log_dsap,LLOG_TRACE,( "net_dispatch()"));
if(RoWaitRequest(cn->cn_ad, OK, roi) == NOTOK)
{
ros_log(rop, "RoWaitRequest");
if(ROS_FATAL(rop->rop_reason))
{
cn->cn_state = CN_STATE_FAIL;
cn->cn_ad = 0;
}
return;
}
switch(roi->roi_type)
{
case ROI_INVOKE:
{
struct RoSAPinvoke *rox = &(roi->roi_invoke);
net_wait_ro_invoke(cn, rox);
ROXFREE(rox);
}
break;
case ROI_RESULT:
{
struct RoSAPresult *ror = &(roi->roi_result);
net_wait_ro_result(cn, ror);
RORFREE(ror);
}
break;
case ROI_ERROR:
{
struct RoSAPerror *roe = &(roi->roi_error);
net_wait_ro_error(cn, roe);
ROEFREE(roe);
}
break;
case ROI_UREJECT:
{
struct RoSAPureject *rou = &roi->roi_ureject;
net_wait_ro_ureject(cn, rou);
}
break;
case ROI_PREJECT:
{
struct RoSAPpreject *rop2 = &roi->roi_preject;
net_wait_ro_preject(cn, rop2);
ROPFREE(rop2);
}
break;
case ROI_END:
{
struct RoSAPend *roe = &(roi->roi_end);
DLOG (log_dsap,LLOG_TRACE,( "RO-END.INDICATION outmoded"));
net_wait_ro_end(cn, roe);
}
break;
case ROI_FINISH:
{
struct AcSAPfinish *acf = &roi->roi_finish;
net_wait_ro_finish(cn, acf);
}
break;
default:
LLOG (log_dsap,LLOG_EXCEPTIONS,( "Unknown indication type : %d", roi->roi_type));
break;
}
}