|
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: 26198 (0x6656) Types: TextFile Names: »assoc.c«
└─⟦2d1937cfd⟧ Bits:30007241 EUUGD22: P.P 5.0 └─⟦dc59850a2⟧ »EurOpenD22/pp5.0/pp-5.tar.Z« └─⟦e5a54fb17⟧ └─⟦this⟧ »pp-5.0/Src/MTAconsole/assoc.c«
/* routines to start and stop associations */ # ifndef lint static char Rcsid[] = "@(#)$Header: /cs/research/pp/hubris/pp-beta/Src/MTAconsole/RCS/assoc.c,v 5.0 90/09/20 16:19:10 pp Exp Locker: pp $"; # endif /* * $Header: /cs/research/pp/hubris/pp-beta/Src/MTAconsole/RCS/assoc.c,v 5.0 90/09/20 16:19:10 pp Exp Locker: pp $ * * $Log: assoc.c,v $ * Revision 5.0 90/09/20 16:19:10 pp * rcsforce : 5.0 public release * */ #include "util.h" #include <varargs.h> #include <isode/rosy.h> #include "console.h" #include "Qmgr-ops.h" #include "qmgr.h" static char *myservice = "pp qmgr"; extern char *myname; int remoteStop(); static void initiate_responder(); static IFP startfnx; static IFP stopfnx; int sd = -1; static int tryForAuth; static struct client_dispatch *channelread_op, *channelcontrol_op, *mtaread_op, *mtacontrol_op, *readchannelmtamessage_op, *msgcontrol_op, *quecontrol_op, *quit_op; extern caddr_t retryMask; extern Authentication authentication; extern char *Qinformation, *Qversion; extern Widget qversion; extern int hack; /* CLIENT OPERATIONS */ extern int do_channelread(); extern int do_channelcontrol(); extern int do_mtaread(); extern int do_mtacontrol(); extern int do_readchannelmtamessage(); extern int do_msgcontrol(); extern int do_quecontrol(); int do_quit(); /* CLIENT RESULTS */ extern int channelread_result(); extern int channelcontrol_result(); extern int mtaread_result(); extern int mtacontrol_result(); extern int readchannelmtamessage_result(); extern int msgcontrol_result(); extern int quecontrol_result(); /* CLIENT ERRORS */ static int general_error(); #define channelread_error general_error #define channelcontrol_error general_error #define mtaread_error general_error #define mtacontrol_error general_error #define readchannelmtamessage_error general_error #define msgcontrol_error general_error #define quecontrol_error general_error /* CLIENT STRUCTURE */ struct client_dispatch client_dispatches[] = { { "channelread", operation_Qmgr_channelread, do_channelread, free_Qmgr_channelread_argument, channelread_result, channelread_error, "read information on channels" }, { "channelcontrol", operation_Qmgr_channelcontrol, do_channelcontrol, free_Qmgr_channelcontrol_argument, channelcontrol_result, channelcontrol_error, "control channel" }, { "mtaread", operation_Qmgr_mtaread, do_mtaread, free_Qmgr_mtaread_argument, mtaread_result, mtaread_error, "read information on mtas" }, { "mtacontrol", operation_Qmgr_mtacontrol, do_mtacontrol, free_Qmgr_mtacontrol_argument, mtacontrol_result, mtacontrol_error, "control mta" }, { "readchannelmtamessage", operation_Qmgr_readChannelMtaMessage, do_readchannelmtamessage, free_Qmgr_readChannelMtaMessage_argument, readchannelmtamessage_result, readchannelmtamessage_error, "read a set of messages" }, { "msgcontrol", operation_Qmgr_msgcontrol, do_msgcontrol, free_Qmgr_msgcontrol_argument, msgcontrol_result, msgcontrol_error, "control msg" }, { "quecontrol", operation_Qmgr_qmgrControl, do_quecontrol, free_Qmgr_qmgrControl_argument, quecontrol_result, quecontrol_error, "control qmgr" }, { "quit", 0, do_quit, NULLIFP, NULLIFP, NULLIFP, "terminate the association and exit" }, { NULL } }; /* SERVER OPERATIONS */ extern int op_channelread(); extern int op_mtaread(); extern int op_readchannelmtamessage(); /* SERVER STRUCTURE */ static struct server_dispatch server_dispatches[] = { "channelread", operation_Qmgr_channelread, op_channelread, "mtaread", operation_Qmgr_mtaread, op_mtaread, "readchannelmtamessage", operation_Qmgr_readChannelMtaMessage, op_readchannelmtamessage, NULL }; static void acs_advise(), ros_advise(); void advise(); int remoteStop(); PE passwdpeps[1], *passwdpep = passwdpeps; int fatal; initiate_assoc(argc, argv) int argc; char **argv; { struct client_dispatch *ix; initiate_responder(argc,argv, PLocalHostName(), myservice, server_dispatches, table_Qmgr_Operations, NULLIFP, remoteStop); for (ix = client_dispatches; ix->ds_name; ix++){ if (strcmp(ix -> ds_name, "channelread") == 0) channelread_op = ix; else if (strcmp(ix->ds_name, "channelcontrol") == 0) channelcontrol_op = ix; else if (strcmp(ix->ds_name, "quit") == 0) quit_op = ix; else if (strcmp(ix->ds_name, "mtaread") == 0) mtaread_op = ix; else if (strcmp(ix->ds_name, "mtacontrol") == 0) mtacontrol_op = ix; else if (strcmp(ix->ds_name, "readchannelmtamessage") == 0) readchannelmtamessage_op = ix; else if (strcmp(ix->ds_name, "msgcontrol") == 0) msgcontrol_op = ix; else if (strcmp(ix->ds_name, "quecontrol") == 0) quecontrol_op = ix; } } /* ARGSUSED */ static void initiate_responder(argc, argv, host, service, dispatches, ops, start, stop) int argc; char **argv, *host, *service; struct server_dispatch *dispatches; struct RyOperation *ops; IFP start, stop; { register struct server_dispatch *ds; struct RoSAPindication rois; register struct RoSAPindication *roi = &rois; register struct RoSAPpreject *rop = &roi -> roi_preject; /* if ((aei = str2aei (host, service)) == NULLAEI) { advise (NULLCP, "%s-%s: unknown application-entity", host, service); exit(1); */ for (ds = dispatches; ds -> ds_name; ds++) if (RyDispatch (NOTOK, ops, ds -> ds_operation, ds -> ds_vector, roi) == NOTOK) { ros_advise (rop, ds -> ds_name); exit(1); } startfnx = start; stopfnx = stop; } /* \f */ /* connection stuff */ /* ARGSUSED */ int assoc_start (argc, argv, service) int argc; char **argv, *service; /*struct RyOperation ops[]; struct client_dispatch *dispatches;*/ { struct SSAPref sfs; register struct SSAPref *sf; register struct PSAPaddr *pa; struct AcSAPconnect accs; register struct AcSAPconnect *acc = &accs; struct AcSAPindication acis; register struct AcSAPindication *aci = &acis; register struct AcSAPabort *aca = &aci -> aci_abort; AEI aei; OID ctx, tmppci; struct PSAPctxlist pcs; register struct PSAPctxlist *pc = &pcs; struct RoSAPindication rois; register struct RoSAPindication *roi = &rois; register struct RoSAPpreject *rop = &roi -> roi_preject; int result; if ((aei = str2aei (argv[1], service)) == NULLAEI && (aei = str2aei (argv[1], "pp-qmgr")) == NULLAEI) { fatal = TRUE; advise (NULLCP, "%s: unknown entity", argv[1]); return NOTOK; } if ((pa = aei2addr (aei)) == NULLPA) { fatal = TRUE; advise (NULLCP, "%s", "address translation failed"); return NOTOK; } if ((ctx = oid_cpy (QMGR_AC)) == NULLOID) { fatal = TRUE; advise (NULLCP, "%s", "out of memory"); return NOTOK; } if ((tmppci = oid_cpy (QMGR_PCI)) == NULLOID) { fatal = TRUE; advise (NULLCP, "%s", "out of memory"); return NOTOK; } pc -> pc_nctx = 1; pc -> pc_ctx[0].pc_id = 1; pc -> pc_ctx[0].pc_asn = tmppci; pc -> pc_ctx[0].pc_atn = NULLOID; if ((sf = addr2ref (PLocalHostName ())) == NULL) { sf = &sfs; (void) bzero ((char *) sf, sizeof *sf); } switch (result = AcAsynAssocRequest (ctx, NULLAEI, NULLAEI, NULLPA, pa, pc, NULLOID, 0, ROS_MYREQUIRE, SERIAL_NONE, 0, sf, passwdpep, 1, NULLQOS, acc, aci, 1)) { case NOTOK: acs_advise (aca, "A-ASSOCIATE.REQUEST"); return NOTOK; #ifdef CONNECTING_1 case CONNECTING_1: case CONNECTING_2: sd = acc -> acc_sd; ACCFREE (acc); PP_TRACE (("Association initiated")); return result; #else case OK: sd = acc -> acc_sd; ACCFREE (acc); PP_TRACE (("Association initiated")); return OK; #endif case DONE: if (acc -> acc_result != ACS_ACCEPT) { set_failmode (acc); ACCFREE (acc); return NOTOK; } sd = acc -> acc_sd; set_authmode(acc); ACCFREE (acc); if (RoSetService (sd, RoPService, roi) == NOTOK) { ros_advise (rop, "set RO/PS fails"); return NOTOK; } PP_TRACE (("Service set")); return DONE; default: advise (NULLCP, "%s", "Bad response from AcAsynAssocRequest"); return NOTOK; } } set_failmode (acc) struct AcSAPconnect *acc; { struct type_Qmgr_BindError *be; char *info = NULLCP; be = NULL; /* failed by qmgr so no point in retrying connect */ if (acc -> acc_result == ACS_PERMANENT) fatal = TRUE; if (acc->acc_ninfo >= 1) { if (decode_Qmgr_BindError (acc->acc_info[0], 1, NULLVP, NULLIP, &be) == NOTOK) PP_LOG(LLOG_EXCEPTIONS, ("failed to parse connect data [%s]", PY_pepy)); else { if (be -> information != NULL) info = qb2str (be -> information); advise (NULLCP, "Association rejected [%s] (%s)", (be -> reason == int_Qmgr_reason_badCredentials) ? "Bad Credentials" : "Congested", (info != NULLCP) ? info : ""); if (info != NULLCP) free(info); } } else advise (NULLCP, "Association rejected: [%s]", AcErrString (acc -> acc_result)); } set_authmode (acc) struct AcSAPconnect *acc; { struct type_Qmgr_BindResult *br; br = NULL; authentication = limited; if (Qversion != NULLCP) { free(Qversion); Qversion = NULLCP; } if (Qinformation != NULLCP) { free (Qinformation); Qinformation = NULLCP; } if (acc->acc_ninfo >= 1) { if (decode_Qmgr_BindResult (acc->acc_info[0], 1, NULLVP, NULLIP, &br) == NOTOK) PP_LOG(LLOG_EXCEPTIONS, ("failed to parse connect data [%s]", PY_pepy)); else { switch (br->result) { case int_Qmgr_result_acceptedFullAccess: authentication = full; break; case int_Qmgr_result_acceptedLimitedAccess: default: authentication = limited; break; } if (br -> information != NULL) Qinformation = qb2str (br -> information); if (br -> version != NULL) { Qversion = qb2str (br -> version); WidgetSet (qversion, XtNlabel, Qversion, NULL); free(Qversion); Qversion = NULLCP; } free_Qmgr_BindResult(br); } } if (hack == TRUE) authentication = full; } int acsap_retry (fd) int fd; { struct AcSAPconnect accs; register struct AcSAPconnect *acc = &accs; struct AcSAPindication acis; register struct AcSAPindication *aci = &acis; register struct AcSAPabort *aca = &aci -> aci_abort; struct RoSAPindication rois; register struct RoSAPindication *roi = &rois; register struct RoSAPpreject *rop = &roi -> roi_preject; int result; PP_TRACE (("acsap_retry(%d)", fd)); switch (result = AcAsynRetryRequest (fd, acc, aci)) { #ifdef CONNECTING_1 case CONNECTING_1: case CONNECTING_2: ACCFREE (acc); return result; #else case OK: ACCFREE (acc); return OK; #endif case NOTOK: acs_advise (aca, "A-ASSOCIATE.REQUEST"); return NOTOK; case DONE: if (acc -> acc_result != ACS_ACCEPT) { set_failmode(acc); ACCFREE (acc); return NOTOK; } sd = acc -> acc_sd; set_authmode(acc); ACCFREE (acc); if (RoSetService (sd, RoPService, roi) == NOTOK) { ros_advise (rop, "set RO/PS fails"); return NOTOK; } return DONE; default: advise (NULLCP, "%s", "Bad response from AcAsynRetryRequest"); return NOTOK; } } int assoc_release (ad) int ad; { struct AcSAPrelease acrs; register struct AcSAPrelease *acr = &acrs; struct AcSAPindication acis; register struct AcSAPindication *aci = &acis; register struct AcSAPabort *aca = &aci -> aci_abort; #ifdef CONNECTING_1 if (AcRelRequest (ad, ACF_NORMAL, NULLPEP, 0, NOTOK, acr, aci) == NOTOK) { #else if (AcRelRequest (ad, ACF_NORMAL, NULLPEP, 0, acr, aci) == NOTOK) { #endif acs_advise (aca, "A-RELEASE.REQUEST"); return DONE; } if (!acr -> acr_affirmative) { (void) AcUAbortRequest (ad, NULLPEP, 0, aci); advise (NULLCP, "Release rejected by peer: %d", acr -> acr_reason); } ACRFREE (acr); PP_TRACE (("Association released")); return DONE; } /* \f */ /* work routines */ extern State connectState; static jmp_buf toplevel; static int invoke (ad, ops, ds, args) int ad; struct RyOperation ops[]; register struct client_dispatch *ds; char **args; { int result; caddr_t in; struct AcSAPindication acis; struct RoSAPindication rois; register struct RoSAPindication *roi = &rois; register struct RoSAPpreject *rop = &roi -> roi_preject; in = NULL; if (ds -> ds_argument && (*ds -> ds_argument) (ad, ds, args, &in) == NOTOK) return 0; switch (setjmp (toplevel)) { case OK: break; default: if (stopfnx) return (*stopfnx) (ad, (struct AcSAPfinish *) 0); break; case DONE: (void) AcUAbortRequest (ad, NULLPEP, 0, &acis); (void) RyLose (ad, roi); return NOTOK; } if (connectState != connected) return NOTOK; switch (result = RyStub (ad, ops, ds -> ds_operation, RyGenID (ad), NULLIP, in, ds -> ds_result, ds -> ds_error, ROS_SYNC, roi)) { case NOTOK: /* failure */ if (ROS_FATAL(rop->rop_reason)) { ros_advise (rop, "STUB"); emergency_disconnect(ad); } break; case OK: /* got a result/error response */ break; case DONE: /* got RO-END? */ advise (NULLCP, "%s", "got RO-END.INDICATION"); connectState = notconnected; /* NOTREACHED */ default: advise (NULLCP, "unknown return from RyStub=%d", result); /* NOTREACHED */ } if (ds -> ds_free && in) (void) (*ds -> ds_free) (in); return OK; } extern Operations currentop; my_invoke(op, args) Operations op; char **args; { currentop = op; StartWait(); switch (op) { case chanread: invoke(sd, table_Qmgr_Operations, channelread_op,(char **) NULL); update_time_label(); break; case chanstop: case chanstart: case chanclear: case chancacheadd: invoke(sd, table_Qmgr_Operations, channelcontrol_op, args); break; case mtaread: invoke(sd, table_Qmgr_Operations, mtaread_op, args); break; case mtastop: case mtastart: case mtaclear: case mtacacheadd: invoke(sd, table_Qmgr_Operations, mtacontrol_op, args); break; case readchannelmtamessage: invoke(sd, table_Qmgr_Operations, readchannelmtamessage_op, args); break; case msgstop: case msgstart: case msgclear: case msgcacheadd: invoke(sd, table_Qmgr_Operations, msgcontrol_op, args); break; case quit: invoke(sd, table_Qmgr_Operations, quit_op, (char **) NULL); break; case connect: EndWait(); return do_connect(args); case disconnect: do_disconnect(); break; case quecontrol: invoke(sd, table_Qmgr_Operations, quecontrol_op, args); break; default: break; } InitRefreshTimeOut((unsigned long) 0); EndWait(); return 0; } /* \f */ /* advising routines */ static void acs_advise (aca, event) register struct AcSAPabort *aca; char *event; { char buffer[BUFSIZ]; if (aca -> aca_cc > 0) (void) sprintf (buffer, "[%s] %*.*s", AcErrString (aca -> aca_reason), aca -> aca_cc, aca -> aca_cc, aca -> aca_data); else (void) sprintf (buffer, "[%s]", AcErrString (aca -> aca_reason)); advise (NULLCP, "%s: %s (source %d)", event, buffer, aca -> aca_source); } int ros_work (fd) int fd; { int result; caddr_t out; struct AcSAPindication acis; struct RoSAPindication rois; register struct RoSAPindication *roi = &rois; register struct RoSAPpreject *rop = &roi -> roi_preject; switch (setjmp (toplevel)) { case OK: break; default: if (stopfnx) return (*stopfnx) (fd, (struct AcSAPfinish *) 0); break; case DONE: (void) AcUAbortRequest (fd, NULLPEP, 0, &acis); (void) RyLose (fd, roi); return NOTOK; } switch (result = RyWait (fd, NULLIP, &out, OK, roi)) { case NOTOK: if (rop -> rop_reason == ROS_TIMER) break; case OK: case DONE: ros_indication (fd, roi); break; default: advise (NULLCP, "unknown return from RoWaitRequest=%d", result); } return OK; } ros_indication (ad, roi) int ad; register struct RoSAPindication *roi; { int reply, result; switch (roi -> roi_type) { case ROI_INVOKE: case ROI_RESULT: case ROI_ERROR: advise (NULLCP, "unexpected indication type=%d", roi -> roi_type); break; case ROI_UREJECT: { register struct RoSAPureject *rou = &roi -> roi_ureject; if (rou -> rou_noid) advise (NULLCP, "RO-REJECT-U.INDICATION/%d: %s", ad, RoErrString (rou -> rou_reason)); else advise (NULLCP, "RO-REJECT-U.INDICATION/%d: %s (id=%d)", ad, RoErrString (rou -> rou_reason), rou -> rou_id); } break; case ROI_PREJECT: { register struct RoSAPpreject *rop = &roi -> roi_preject; connectState = notconnected; if (ROS_FATAL (rop -> rop_reason)) { ros_adios (rop, "RO-REJECT-P.INDICATION"); emergency_disconnect(ad); } ros_advise (rop, "RO-REJECT-P.INDICATION"); } break; case ROI_FINISH: { register struct AcSAPfinish *acf = &roi -> roi_finish; struct AcSAPindication acis; register struct AcSAPabort *aca = &acis.aci_abort; advise (NULLCP, "A-RELEASE.INDICATION/%d: %d", ad, acf -> acf_reason); reply = stopfnx ? (*stopfnx) (ad, acf) : ACS_ACCEPT; result = AcRelResponse (ad, reply, ACR_NORMAL, NULLPEP, 0, &acis); ACFFREE (acf); if (result == NOTOK) acs_advise (aca, "A-RELEASE.RESPONSE"); else if (reply != ACS_ACCEPT) break; longjmp (toplevel, DONE); } /* NOTREACHED */ default: advise (NULLCP, "unknown indication type=%d", roi -> roi_type); } } ros_adios (rop, event) register struct RoSAPpreject *rop; char *event; { ros_advise (rop, event); longjmp (toplevel, NOTOK); } static void ros_advise (rop, event) register struct RoSAPpreject *rop; char *event; { char buffer[BUFSIZ]; if (rop -> rop_cc > 0) (void) sprintf (buffer, "[%s] %*.*s", RoErrString (rop -> rop_reason), rop -> rop_cc, rop -> rop_cc, rop -> rop_data); else (void) sprintf (buffer, "[%s]", RoErrString (rop -> rop_reason)); advise (NULLCP, "%s: %s", event, buffer); } extern Widget header, error, refresh_command; extern int autoReconnect, userConnected, errorUp; extern char *hostname; #ifndef lint void advise (va_alist) va_dcl { va_list ap; char buffer[BUFSIZ], headerbuf[BUFSIZ]; va_start (ap); asprintf (buffer, ap); if (header != NULL) { XtSetMappedWhenManaged(error, True); errorUp = 5; } if (header == NULL) printf("%s\n",buffer); else if (connectState == notconnected && autoReconnect == TRUE && fatal == FALSE) { sprintf(headerbuf,"Attempting to reconnect to %s", hostname); WidgetSet(header, XtNlabel, headerbuf, NULL); WidgetSet(error, XtNlabel, buffer, NULL); } else { WidgetSet(error, XtNlabel, buffer, NULL); } va_end (ap); } #else /* VARARGS2 */ void advise(what, fmt) char *what, *fmt; { advise(what,fmt); } #endif /* \f */ /* error routine */ /* ARGSUSED */ static general_error (ad, id, err, parameter, roi) int ad, id, err; caddr_t parameter; struct RoSAPindication *roi; { register struct RyError *rye; if (err == RY_REJECT) { advise (NULLCP, "%s", RoErrString ((int) parameter)); return OK; } if (rye = finderrbyerr (table_Qmgr_Errors, err)) advise (NULLCP, "Error: %s", rye -> rye_name); else advise (NULLCP, "Error: %d", err); return OK; } /* \f */ /* ARGSUSED */ int remoteStop(fd, dummy) int fd; struct AcSAPfinish *dummy; { struct AcSAPindication acis; struct RoSAPindication rois; register struct RoSAPindication *roi = &rois; /* x release */ connectState = notconnected; SensitizeButtons(False); TermRefreshTimeOut(); TermConnectRetry(); TermListen(); if (autoReconnect == FALSE) userConnected = FALSE; /* isode release */ (void) AcUAbortRequest (fd, NULLPEP, 0, &acis); (void) RyLose (fd, roi); if (autoReconnect == TRUE && userConnected == TRUE) { clear_displays(); WidgetSet(refresh_command, XtNlabel, "Reconnect", NULL); InitConnectTimeOut(); MapVolume(False); } else { WidgetSet(header, XtNlabel, NO_CONNECTION, NULL); ResetForDisconnect(); } return NOTOK; } /* ARGSUSED */ emergency_disconnect(ad) int ad; { char headerbuf[BUFSIZ]; connectState = notconnected; SensitizeButtons(False); TermRefreshTimeOut(); TermConnectRetry(); TermListen(); if (autoReconnect == FALSE) userConnected = FALSE; if (autoReconnect == TRUE && userConnected == TRUE) { clear_displays(); WidgetSet(refresh_command, XtNlabel, "Reconnect", NULL); sprintf(headerbuf,"Attempting to reconnect to %s", hostname); WidgetSet(header, XtNlabel, headerbuf, NULL); InitConnectTimeOut(); MapVolume(False); } else { WidgetSet(header, XtNlabel, NO_CONNECTION, NULL); ResetForDisconnect(); } } /* \f */ /* disconnect from current host with part of a quit */ do_disconnect() { struct AcSAPrelease acrs; register struct AcSAPrelease *acr = &acrs; struct AcSAPindication acis; register struct AcSAPindication *aci = &acis; register struct AcSAPabort *aca = &aci -> aci_abort; if (connectState == connected) { /* Disconnect(sd) */ TermListen(); connectState = notconnected; #ifdef CONNECTING_1 if (AcRelRequest (sd, ACF_NORMAL, NULLPEP, 0, NOTOK, acr, aci) == NOTOK) { #else if (AcRelRequest (sd, ACF_NORMAL, NULLPEP, 0, acr, aci) == NOTOK) { #endif acs_advise (aca, "A-RELEASE.REQUEST"); return; } if (!acr -> acr_affirmative) { (void) AcUAbortRequest (sd, NULLPEP, 0, aci); advise (NULLCP, "Release rejected by peer: %d", acr -> acr_reason); } ACRFREE (acr); sd = -1; } else if (autoReconnect == TRUE) { TermConnectTimeOut(); WidgetSet(header, XtNlabel, NO_CONNECTION, NULL); autoReconnect = FALSE; } } /* ARGSUSED */ int do_quit (ad, ds, args, arg) int ad; struct client_dispatch *ds; char **args, **arg; { struct AcSAPrelease acrs; register struct AcSAPrelease *acr = &acrs; struct AcSAPindication acis; register struct AcSAPindication *aci = &acis; register struct AcSAPabort *aca = &aci -> aci_abort; if (ad >= 0) { #ifdef CONNECTING_1 if (AcRelRequest (ad, ACF_NORMAL, NULLPEP, 0, NOTOK, acr, aci) == NOTOK) #else if (AcRelRequest (ad, ACF_NORMAL, NULLPEP, 0, acr, aci) == NOTOK) #endif acs_advise (aca, "A-RELEASE.REQUEST"); if (!acr -> acr_affirmative) { (void) AcUAbortRequest (ad, NULLPEP, 0, aci); advise (NULLCP, "Release rejected by peer: %d", acr -> acr_reason); } ad = -1; } terminate_display(); exit (0); } /* \f */ do_connect(phost) char **phost; { char *targv[2]; int result; targv[0] = myname; targv[1] = *phost; fatal = FALSE; switch(result = assoc_start(2, targv, myservice)) { #ifdef CONNECTING_1 case CONNECTING_1: case CONNECTING_2: Connecting(result); break; #else case OK: retryMask = (caddr_t) XtInputWriteMask; Connecting(result); break; #endif case DONE: Connected(); break; case NOTOK: default: NotConnected(); break; } return result; } char buf[BUFSIZ]; extern Widget header, error, connect_command, refresh_command; Connected() { sprintf(buf, "Connected to %s (%s)", (Qinformation != NULLCP && *Qinformation != '\0') ? Qinformation : hostname, (authentication == full) ? "full authorisation" : "limited authorisation"); WidgetSet(header, XtNlabel, buf, NULL); display_time_label(); /* if (authentication != full && tryForAuth == TRUE) advise(NULLCP, "%s", "Failed to gain authorised connection"); else XtSetMappedWhenManaged(error, False); */ MapButtons(authentication == full); SensitizeButtons(True); WidgetSet(connect_command, XtNlabel, "disconnect", NULL); WidgetSet(refresh_command, XtNlabel, "refresh", NULL); XtSetMappedWhenManaged(error, False); errorUp = 0; connectState = connected; TaiInit(); InitListen(sd); InitRefreshTimeOut((unsigned long) 500); TermConnectTimeOut(); userConnected = TRUE; } extern Widget time_label; NotConnected() { char headerbuf[BUFSIZ]; connectState = notconnected; undisplay_time_label(); TermRefreshTimeOut(); MapButtons(False); MapVolume(False); if (autoReconnect == TRUE && fatal == FALSE) { WidgetSet(refresh_command, XtNlabel, "reconnect", NULL); WidgetSet(connect_command, XtNlabel, "disconnect", NULL); sprintf(headerbuf, "Attempting to reconnect to %s",hostname); WidgetSet(header, XtNlabel, headerbuf, NULL); InitConnectTimeOut(); } else { WidgetSet(header, XtNlabel, NO_CONNECTION, NULL); userConnected = FALSE; ResetForDisconnect(); } } Connecting(res) int res; { connectState = connecting; sprintf(buf,"Connecting to %s",hostname); WidgetSet(header, XtNlabel, buf, NULL); WidgetSet(connect_command, XtNlabel, "disconnect", NULL); InitConnectRetry(sd, res); } struct type_Qmgr_BindArgument *ba; fillin_passwdpep(user, passwd, auth) char *user, *passwd; int auth; { if (*passwdpep != NULL) { pe_free(*passwdpep); free_Qmgr_BindArgument(ba); *passwdpep = NULL; } ba = (struct type_Qmgr_BindArgument *) smalloc (sizeof *ba); if (auth != TRUE) { /* no authentication */ ba -> offset = type_Qmgr_BindArgument_noAuthentication; tryForAuth = FALSE; } else { ba -> offset = type_Qmgr_BindArgument_weakAuthentication; ba -> un.weakAuthentication = (struct type_Qmgr_WeakAuthentication *) smalloc(sizeof(struct type_Qmgr_WeakAuthentication)); ba -> un.weakAuthentication->username = str2qb(user, strlen(user), 1); if (passwd != NULLCP && *passwd != '\0') ba -> un.weakAuthentication->passwd = str2qb(passwd, strlen(passwd), 1); else ba -> un.weakAuthentication->passwd = NULL; tryForAuth = TRUE; } if (encode_Qmgr_BindArgument(passwdpep, 1, NULLCP, 0, ba) == NOTOK) { PP_LOG(LLOG_EXCEPTIONS, ("failed to encode BindArgument [%s]", PY_pepy)); *passwdpep = NULLPE; free_Qmgr_BindArgument(ba); exit(1); } (*passwdpep)->pe_context = 3; }