|
|
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 a
Length: 7401 (0x1ce9)
Types: TextFile
Names: »auto.c«
└─⟦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«
/* 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;
}
}