|
|
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 q
Length: 10382 (0x288e)
Types: TextFile
Names: »qstub.c«
└─⟦2d1937cfd⟧ Bits:30007241 EUUGD22: P.P 5.0
└─⟦dc59850a2⟧ »EurOpenD22/pp5.0/pp-5.tar.Z«
└─⟦e5a54fb17⟧
└─⟦this⟧ »pp-5.0/Src/qmgr/qstub.c«
/* qstub.c: stub Qmgr for debugging etc. */
# ifndef lint
static char Rcsid[] = "@(#)$Header: /cs/research/pp/hubris/pp-beta/Src/qmgr/RCS/qstub.c,v 5.0 90/09/20 16:21:34 pp Exp Locker: pp $";
# endif
/*
* $Header: /cs/research/pp/hubris/pp-beta/Src/qmgr/RCS/qstub.c,v 5.0 90/09/20 16:21:34 pp Exp Locker: pp $
*
* $Log: qstub.c,v $
* Revision 5.0 90/09/20 16:21:34 pp
* rcsforce : 5.0 public release
*
*/
#include <stdio.h>
#include <isode/rosy.h>
#include "qmgr.h"
#include <isode/logger.h>
#include <varargs.h>
char *myname;
char *chan_context = "pp qmgr channel";
char *chan_pci = "pp qmgr channel pci";
extern char *pptsapd_addr;
void ros_adios (), ros_advise (), acs_adios (), acs_advise (),
adios (), advise ();
struct type_Qmgr_UserList *read_users ();
main (argc, argv)
int argc;
char **argv;
{
extern char *optarg;
extern int optind;
int opt;
char *channel;
int sd, i;
myname = argv[0];
while((opt = getopt(argc, argv, "")) != EOF)
switch (opt) {
default:
fprintf (stderr, "Usage: %s", myname);
break;
}
argc -= optind;
argv += optind;
if (argc <= 0)
adios (NULLCP, "Usage: %s channel [message-id's]", myname);
channel = *argv;
argv ++;
argc --;
sd = start_assoc ("localhost", channel, chan_context, chan_pci);
doinit (sd, channel);
for (i = 0; i < argc; i++)
domessage(sd, channel, argv[i]);
(void) assoc_release (sd);
exit (0);
}
static int start_assoc (myhost, myservice, mycontext, mypci)
char *myhost, *myservice, *mycontext, *mypci;
{
int fd;
AEI aei;
struct PSAPctxlist pcs;
register struct PSAPctxlist *pc = &pcs;
struct SSAPref sfs;
register struct SSAPref *sf;
register struct PSAPaddr *pa;
struct SSAPaddr *sa;
struct TSAPaddr *ta;
OID ctx,
pci;
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;
pa = str2paddr (pptsapd_addr);
sa = &pa -> pa_addr;
ta = &sa -> sa_addr;
ta -> ta_selectlen = str2sel (myservice, 1, ta -> ta_selector, TSSIZE);
if ((ctx = ode2oid (mycontext)) == NULLOID)
adios (NULLCP, "%s: unknown ISO object descriptor", mycontext);
if ((ctx = oid_cpy (ctx)) == NULLOID)
adios (NULLCP, "out of memory");
if ((pci = ode2oid (mypci)) == NULLOID)
adios (NULLCP, "%s: unknown ISO object descriptor", mypci);
if ((pci = oid_cpy (pci)) == NULLOID)
adios (NULLCP, "out of memory");
pc -> pc_nctx = 1;
pc -> pc_ctx[0].pc_id = 1;
pc -> pc_ctx[0].pc_asn = pci;
pc -> pc_ctx[0].pc_atn = NULLOID;
if ((sf = addr2ref (PLocalHostName ())) == NULL) {
sf = &sfs;
(void) bzero ((char *) sf, sizeof *sf);
}
if (AcAssocRequest (ctx, NULLAEI, NULLAEI, NULLPA, pa, pc,
NULLOID, 0, ROS_MYREQUIRE, SERIAL_NONE, 0,
sf, NULLPEP, 0, NULLQOS, acc, aci) == NOTOK)
acs_adios (aca, "A-ASSOCIATE.REQUEST");
if (acc -> acc_result != ACS_ACCEPT)
adios (NULLCP, "Association rejected: [%s]",
AcErrString (acc -> acc_result));
fd = acc -> acc_sd;
ACCFREE (acc);
if (RoSetService (fd, RoPService, roi) == NOTOK)
ros_adios (rop, "set RO/PS fails");
advise (NULLCP, "Association established to %s",
myhost);
return fd;
}
domessage (sd, channel, qid)
int sd;
char *qid;
char *channel;
{
struct type_Qmgr_ProcMsg *pm;
int result;
int proc_results (), proc_error ();
struct RoSAPindication rois;
register struct RoSAPindication *roi = &rois;
register struct RoSAPpreject *rop = &roi -> roi_preject;
pm = (struct type_Qmgr_ProcMsg *) malloc (sizeof *pm);
if (pm == NULL)
adios ("memory", "out of");
pm -> qid = str2qb (qid, strlen (qid), 1);
pm -> channel = str2qb (channel, strlen (channel), 1);
pm -> users = read_users ();
switch (result = RyStub (sd, table_Qmgr_Operations,
operation_Qmgr_processmessage,
RyGenID (sd), NULLIP, (caddr_t)pm,
proc_results, proc_error, ROS_SYNC, roi)) {
case NOTOK:
ros_adios (rop, "STUB");
case OK: /* got a result/error response */
break;
case DONE: /* got RO-END? */
adios (NULLCP, "got RO-END.INDICATION");
default:
adios (NULLCP, "unknown return from RyStub=%d", result);
/* NOTREACHED */
}
free_Qmgr_ProcMsg (pm);
}
doinit (sd, chan)
int sd;
char *chan;
{
struct type_Qmgr_Channel *cp;
int result;
int proc_null (), proc_error ();
struct RoSAPindication rois;
register struct RoSAPindication *roi = &rois;
register struct RoSAPpreject *rop = &roi -> roi_preject;
cp = str2qb (chan, strlen(chan), 1);
switch (result = RyStub (sd, table_Qmgr_Operations,
operation_Qmgr_channelInitialise,
RyGenID (sd), NULLIP, (caddr_t)cp,
proc_null, proc_error, ROS_SYNC, roi)) {
case NOTOK:
ros_adios (rop, "STUB");
case OK: /* got a result/error response */
break;
case DONE: /* got RO-END? */
adios (NULLCP, "got RO-END.INDICATION");
default:
adios (NULLCP, "unknown return from RyStub=%d", result);
/* NOTREACHED */
}
free_Qmgr_Channel (cp);
}
int assoc_release (sd)
int sd;
{
struct AcSAPrelease acrs;
register struct AcSAPrelease *acr = &acrs;
struct AcSAPindication acis;
register struct AcSAPindication *aci = &acis;
register struct AcSAPabort *aca = &aci -> aci_abort;
if (AcRelRequest (sd, ACF_NORMAL, NULLPEP, 0, acr, aci) == NOTOK)
acs_adios (aca, "A-RELEASE.REQUEST");
if (!acr -> acr_affirmative) {
(void) AcUAbortRequest (sd, NULLPEP, 0, aci);
advise (NULLCP, "Release rejected by peer: %d",
acr -> acr_reason);
}
ACRFREE (acr);
advise (NULLCP, "Association released");
return DONE;
}
static struct type_Qmgr_UserList *read_users ()
{
struct type_Qmgr_UserList *ul = NULL, *ul1;
do {
if (ul == NULL)
ul1 = ul = (struct type_Qmgr_UserList *) malloc (sizeof *ul);
else {
ul -> next = (struct type_Qmgr_UserList *)
malloc (sizeof *ul);
ul = ul -> next;
}
ul -> next = 0;
ul -> RecipientId = (struct type_Qmgr_RecipientId *)
malloc (sizeof *ul->RecipientId);
ul -> RecipientId -> parm = getint ("recipient number");
} while (another());
return ul1;
}
static char *getline (prompt)
char *prompt;
{
static char buffer[BUFSIZ];
char *p;
printf ("%s : ", prompt);
fflush (stdout);
if (fgets (buffer, sizeof buffer, stdin) == NULL)
return NULL;
if (buffer[0] == '\n')
return NULL;
if (p = index (buffer, '\n'))
*p = '\0';
return buffer;
}
static another ()
{
char *s;
s = getline ("Another user? ");
if (s == NULL)
return 0;
if (*s == 'y' || *s == 'Y')
return 1;
return 0;
}
static int getint (prompt)
char *prompt;
{
char *s = getline (prompt);
return atoi (s);
}
/* ARGSUSED */
static proc_results (sd, id, error, arg, roi)
int sd,
id,
error;
struct type_Qmgr_DeliveryStatus *arg;
struct RoSAPindication *roi;
{
struct type_Qmgr_DeliveryStatus *ds;
for (ds = arg; ds; ds = ds -> next) {
printf ("Recipient number %d",
ds -> IndividualDeliveryStatus -> recipient -> parm);
switch (ds -> IndividualDeliveryStatus -> status) {
case int_Qmgr_status_success:
printf ("success\n");
break;
case int_Qmgr_status_permanentFailure:
printf ("permanentFailure\n");
break;
case int_Qmgr_status_messageFailure:
printf ("messageFailure\n");
break;
case int_Qmgr_status_mtaFailure:
printf ("mtaFailure\n");
break;
case int_Qmgr_status_mtaAndMessageFailure:
printf ("mtaAndMessageFailure\n");
break;
default:
printf ("Unknown response %d\n",
arg -> IndividualDeliveryStatus -> status);
break;
}
}
return OK;
}
/* ARGSUSED */
static proc_null (sd, id, error, arg, roi)
int sd,
id,
error;
struct type_Qmgr_DeliveryStatus *arg;
struct RoSAPindication *roi;
{
return OK;
}
/* ARGSUSED */
proc_error (sd, id, error, parameter, roi)
int sd,
id,
error;
caddr_t parameter;
struct RoSAPindication *roi;
{
register struct RyError *rye;
if (error == RY_REJECT) {
advise (NULLCP, "%s", RoErrString ((int) parameter));
return OK;
}
if (rye = finderrbyerr (table_Qmgr_Errors, error))
advise (NULLCP, "%s", rye -> rye_name);
else
advise (NULLCP, "Error %d", error);
return OK;
}
/* \f
*/
void ros_adios (rop, event)
register struct RoSAPpreject *rop;
char *event;
{
ros_advise (rop, event);
_exit (1);
}
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);
}
/* \f
*/
void acs_adios (aca, event)
register struct AcSAPabort *aca;
char *event;
{
acs_advise (aca, event);
_exit (1);
}
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);
}
/* \f
*/
#ifndef lint
void _advise ();
void adios (va_alist)
va_dcl
{
va_list ap;
va_start (ap);
_advise (ap);
va_end (ap);
_exit (1);
}
#else
/* VARARGS */
void adios (what, fmt)
char *what,
*fmt;
{
adios (what, fmt);
}
#endif
#ifndef lint
void advise (va_alist)
va_dcl
{
va_list ap;
va_start (ap);
_advise (ap);
va_end (ap);
}
static void _advise (ap)
va_list ap;
{
char buffer[BUFSIZ];
asprintf (buffer, ap);
(void) fflush (stdout);
fprintf (stderr, "%s: ", myname);
(void) fputs (buffer, stderr);
(void) fputc ('\n', stderr);
(void) fflush (stderr);
}
#else
/* VARARGS */
void advise (what, fmt)
char *what,
*fmt;
{
advise (what, fmt);
}
#endif
#ifndef lint
void ryr_advise (va_alist)
va_dcl
{
char *what;
va_list ap;
va_start (ap);
_advise (ap);
va_end (ap);
}
#else
/* VARARGS */
void ryr_advise (what, fmt)
char *what,
*fmt;
{
ryr_advise (what, fmt);
}
#endif