DataMuseum.dk

Presents historical artifacts from the history of:

DKUUG/EUUG Conference tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about DKUUG/EUUG Conference tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download
Index: T a

⟦cc2353f56⟧ TextFile

    Length: 7401 (0x1ce9)
    Types: TextFile
    Names: »auto.c«

Derivation

└─⟦2d1937cfd⟧ Bits:30007241 EUUGD22: P.P 5.0
    └─⟦dc59850a2⟧ »EurOpenD22/pp5.0/pp-5.tar.Z« 
        └─⟦e5a54fb17⟧ 
            └─⟦this⟧ »pp-5.0/Src/MTAconsole/auto.c« 

TextFile

/* auto.c:routines for auto things */

# ifndef lint
static char Rcsid[] = "@(#)$Header: /cs/research/pp/hubris/pp-beta/Src/MTAconsole/RCS/auto.c,v 5.0 90/09/20 16:19:19 pp Exp Locker: pp $";
# endif

/*
 * $Header: /cs/research/pp/hubris/pp-beta/Src/MTAconsole/RCS/auto.c,v 5.0 90/09/20 16:19:19 pp Exp Locker: pp $
 *
 * $Log:	auto.c,v $
 * Revision 5.0  90/09/20  16:19:19  pp
 * rcsforce : 5.0 public release
 * 
 */



#include	"console.h"

unsigned long 	timeoutFor = 300000,
		inactiveFor = 600000,
		connectFor,
		connectInit = 300000,
		connectInc = 60000,
		connectMax = 600000;
int	backoff	= TRUE;
caddr_t  retryMask = (caddr_t) XtInputWriteMask;
XtIntervalId	refreshId = 0;
XtIntervalId	connectId = 0;
XtIntervalId	inactiveId = 0;
extern XtAppContext	appContext;
extern Display		*disp;
extern Widget		top;
extern char		*hostname;
extern void 		ChangeMode();
extern int	autoReconnect,
		userConnected,
		autoRefresh;
extern State	connectState;

char	*top_of_refresh_list();
/* ARGSUSED */
ConnectTimeOut(data, id)
caddr_t	data;	/* NOT USED */
XtIntervalId	*id;
{
	/* try connect */
	connectId = 0;
	if (connectState == notconnected && autoReconnect == TRUE) {
		construct_event(connect);
	}
}

InitConnectTimeOut()
{
	if (connectId != 0) XtRemoveTimeOut(connectId);
	if (connectState == notconnected && autoReconnect == TRUE) {
		connectFor = connectInit;
		connectId = XtAppAddTimeOut(appContext,
					    (userConnected == TRUE) ? connectFor : 500,
					    ConnectTimeOut,	
					    NULL);
	}
}

TermConnectTimeOut()
{
	if (connectId != 0) {
		XtRemoveTimeOut(connectId);
		connectId = 0;
	}
}

/* \f

 */
extern Mode	mode;
extern int	errorUp;
extern Widget	error;

/* ARGSUSED */
Inactive(data, id)
caddr_t		data;
XtIntervalId	*id;
{
	inactiveId = 0;
	if (mode == control && connectState == connected)
		ChangeMode((Widget)NULL, (caddr_t) NULL, (caddr_t) NULL);
}


ResetInactiveTimeout()
{
	if (errorUp > 0) {
		errorUp--;
		if (errorUp == 0)
			XtSetMappedWhenManaged(error, False);
	}
	if (inactiveId != 0) XtRemoveTimeOut(inactiveId);
	if (mode == control && connectState == connected)
		inactiveId = XtAppAddTimeOut(appContext,
					     inactiveFor,
					     Inactive,
					     NULL);
	else
		inactiveId = 0;
}

/* \f

 */

/* ARGSUSED */
RefreshTimeOut(data,id)
caddr_t		data;	
XtIntervalId	*id;
{
	refreshId = 0;
	if (connectState == connected ) {
		construct_event(chanread);
		if (autoRefresh == TRUE) 
			refreshId = XtAppAddTimeOut(appContext,
						    timeoutFor,
						    RefreshTimeOut,
						    NULL);
	}
}
		
InitRefreshTimeOut(tx)
unsigned long	tx;
{
	if (refreshId != 0) XtRemoveTimeOut(refreshId);
	if (autoRefresh == TRUE && connectState == connected)
		refreshId = XtAppAddTimeOut(appContext,
					    (tx == 0) ? timeoutFor : tx,
					    RefreshTimeOut,
					    NULL);
	else 
		refreshId = 0;
}

TermRefreshTimeOut()
{
	if (refreshId != 0){
		XtRemoveTimeOut(refreshId);
		refreshId = 0;
	}
}

/* \f

 */

int construct_event(op)
Operations	op;
{
  XClientMessageEvent	event;

  event.type = ClientMessage;
  event.send_event = True;
  event.display = disp;
  event.window = XtWindow(top);
  event.format = 8;
  event.data.b[0] = (char) op;
	  
  XSendEvent(disp,
	     XtWindow(top),
	     False,
	     NoEventMask,
	     (XEvent *) &event);
/*  if (result == 0)
	  temp = result;*/
}

int construct_refresh_event(widget)
Widget	widget;
{
  XClientMessageEvent	event;

  event.type = ResizeRequest;
  event.send_event = True;
  event.display = disp;
  event.window = XtWindow(widget);
	  
  XSendEvent(disp,
	     XtWindow(widget),
	     False,
	     VisibilityChangeMask,
	     (XEvent *)&event);
/*  XSync(XtDisplay(widget), False);*/
}

/* ARGSUSED */
void client_msg_handler(w, client_data, event)
Widget	w;
caddr_t	client_data;
XClientMessageEvent	*event;
{
	char	*name;
	extern char	*msginfo_args[];
	if (event -> type == ClientMessage &&
	    connectState == connected) {
		switch ((Operations) event -> data.b[0]) {
		    case chanread:
			my_invoke(chanread, (char **) NULL);
			break;
		    case mtaread:
			if ((name = top_of_refresh_list()) != NULLCP) {
				my_invoke(mtaread, &name);
				construct_event(mtaread);
			}

			break;
		    case readchannelmtamessage:
			my_invoke(readchannelmtamessage, msginfo_args);
			break;
			
		    default:
			break;
		}

	} else if (event -> type == ClientMessage &&
		   connectState == notconnected &&
		   autoReconnect == TRUE &&
		   (Operations) event -> data.b[0] == connect) {
		XSync(disp, 0);
		Connect(hostname);
		if (connectState == notconnected) {
			if (backoff == TRUE && connectFor < connectMax)
				connectFor += connectInc;
		}
	}
}

/* \f

 */
/* refresh list stuff */
typedef struct mta_refresh_struct {
	char	*name;
	struct mta_refresh_struct *next;
} Mta_refresh_struct;

struct mta_refresh_struct	*mta_refresh_list = NULL;

Mta_refresh_struct	*new_mta_refresh_struct(name)
char	*name;
{
	Mta_refresh_struct * ret =
		(Mta_refresh_struct *) calloc(1, sizeof (*ret));
	ret -> name = strdup(name);
	return ret;
}

free_mta_refresh_list(list)
Mta_refresh_struct	*list;
{
	if (list == NULL)
		return;

	if (list -> next != NULL)
		free_mta_refresh_list(list -> next);

	if (list -> name != NULLCP)
		free(list -> name);

	free((char *) list);
}

clear_mta_refresh_list()
{

	free_mta_refresh_list(mta_refresh_list) ;
	mta_refresh_list = NULL;
}

add_mta_refresh_list(name)
char	*name;
{
	Mta_refresh_struct	*ix = mta_refresh_list;

	if (mta_refresh_list == NULL)
		mta_refresh_list = new_mta_refresh_struct(name);
	else {
		while (ix -> next != NULL)
			ix = ix -> next;
		ix -> next = new_mta_refresh_struct(name);
	}
}

char	*top_of_refresh_list()
{
	if (mta_refresh_list != NULL)
		return mta_refresh_list -> name;
	return NULLCP;
}

char	*pop_from_mta_refresh_list()
{
	char	*ret = NULL;
	Mta_refresh_struct	*temp;

	if ((temp = mta_refresh_list) != NULL) {
		ret = temp -> name;
		mta_refresh_list = mta_refresh_list -> next;
		free((char *) temp);
	}

	return ret;
}

/* \f

 */
XtInputId	retryId = 0,
		assocId = 0;

/* ARGSUSED */
ConnectRetry(data, fd, id)
caddr_t		data;
int		*fd;
XtInputId	*id;
{
	int	result;



	XtRemoveInput(*id);
	retryId = 0;
	switch( result = acsap_retry(*fd)) {
#ifdef	CONNECTING_1
	    case CONNECTING_1:
	    case CONNECTING_2:
		Connecting(result);
		break;
#else
	    case OK:
		retryMask = (caddr_t) XtInputReadMask;
		Connecting(result);
		break;
#endif
	    case DONE:
		Connected();
		break;
	    case NOTOK:
	    default:
		NotConnected();
		break;
	}
}

TermConnectRetry()
{
	if (retryId != 0) {
		XtRemoveInput(retryId);
		retryId = 0;
	}
}

InitConnectRetry(sd, res)
int	sd,
	res;
{
	XSync(disp, 0);
#ifdef CONNECTING_1
	if (res == CONNECTING_1)
		retryMask = (caddr_t) XtInputWriteMask;
	else
		retryMask = (caddr_t) XtInputReadMask;
#endif

	retryId = XtAppAddInput(appContext,
				sd,
				retryMask,
				ConnectRetry,
				NULL);
}



/* \f

 */

/* ARGSUSED */ 
Listen(data, fd, id)
caddr_t		data;	/* unused */
int		*fd;	/* where to read from */
XtInputId	*id;	/* unused */
{
	if (ros_work(*fd) == NOTOK) 
		return;
}

InitListen(fd)
int	fd;
{
	/* set Listen to listen on fd */
	if (assocId != 0) XtRemoveInput(assocId);
	assocId = XtAppAddInput(appContext, fd, 
				XtInputReadMask,
				Listen,
				NULL);
}

/* ARGSUSED */ 
TermListen()
{
	/* unset Listen which is listening on fd */
	if (assocId != 0) {
		XtRemoveInput(assocId);
		assocId = 0;
	}
}