|
|
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: 5503 (0x157f)
Types: TextFile
Names: »qmgr-load.c«
└─⟦2d1937cfd⟧ Bits:30007241 EUUGD22: P.P 5.0
└─⟦dc59850a2⟧ »EurOpenD22/pp5.0/pp-5.tar.Z«
└─⟦e5a54fb17⟧
└─⟦this⟧ »pp-5.0/Chans/qmgr-load/qmgr-load.c«
/* qmgr-load.c: load the queue manager via readqueue */
# ifndef lint
static char Rcsid[] = "@(#)$Header: /cs/research/pp/hubris/pp-beta/Chans/qmgr-load/RCS/qmgr-load.c,v 5.0 90/09/20 15:53:07 pp Exp Locker: pp $";
# endif
/*
* $Header: /cs/research/pp/hubris/pp-beta/Chans/qmgr-load/RCS/qmgr-load.c,v 5.0 90/09/20 15:53:07 pp Exp Locker: pp $
*
* $Log: qmgr-load.c,v $
* Revision 5.0 90/09/20 15:53:07 pp
* rcsforce : 5.0 public release
*
*/
#include "util.h"
#include <pwd.h>
#include "retcode.h"
#include <isode/usr.dirent.h>
#include "ryresponder.h" /* for generic idempotent responders */
#include "Qmgr-ops.h" /* operation definitions */
#include "Qmgr-types.h" /* type definitions */
/* Sumbit types */
#include "q.h"
#include "prm.h"
/* Outside routines */
int rd_msg();
struct type_Qmgr_MsgStruct *qstruct2qmgr();
void qinit();
extern char *quedfldir;
extern void rd_end(), sys_init(), err_abrt(), getfpath();
static char *myservice = "qmgr-load";
/* OPERATIONS */
static int op_readqueue();
static struct server_dispatch dispatches[] = {
"readqueue", operation_Qmgr_readqueue, op_readqueue,
NULL
};
static int get_msg_list();
static struct type_Qmgr_MsgStructList *get_all_messages();
static int isMsgFile();
static void dirinit ();
static struct type_Qmgr_MsgStruct *readInMsg();
/* \f
MAIN */
/* ARGSUSED */
main (argc, argv, envp)
int argc;
char **argv,
**envp;
{
sys_init (argv[0]);
dirinit ();
#ifdef PP_DEBUG
if (argc>1 && (strcmp(argv[1],"debug") == 0))
get_all_messages();
else
#endif
ryresponder (argc, argv, PLocalHostName(), myservice, dispatches,
table_Qmgr_Operations, NULLIFP, NULLIFP);
exit (0); /* NOT REACHED */
}
/* routine to move to correct place in file system */
static void dirinit ()
{
if (chdir (quedfldir) < 0)
err_abrt (RP_LIO, " Unable to change directory to '%s'",
quedfldir);
}
/* \f
OPERATIONS */
/* ARGSUSED */
static int op_readqueue (ad, ryo, rox, in, roi)
int ad;
struct RyOperation *ryo;
struct RoSAPinvoke *rox;
caddr_t in;
struct RoSAPindication *roi;
{
if (rox->rox_nolinked == 0) {
PP_LOG (LLOG_NOTICE,
("RO-INVOKE.INDICATION/%d: %s, unknown linkage %d",
ad, ryo->ryo_name, rox->rox_linkid));
return ureject (ad, ROS_IP_LINKED, rox, roi);
}
PP_LOG (LLOG_NOTICE,
("RO-INVOKE.INDICATION/%d: %s",ad, ryo -> ryo_name));
return get_msg_list(ad, rox, roi);
}
static int get_msg_list(ad, rox, roi)
int ad;
struct RoSAPinvoke *rox;
struct RoSAPindication *roi;
{
struct type_Qmgr_MsgList *base;
PP_TRACE(("get_msg_list ()"));
if ((base = (struct type_Qmgr_MsgList *) calloc (1, sizeof(*base)))
== NULL)
return error (ad, error_Qmgr_congested, (caddr_t) NULL,
rox, roi);
/* now make list */
base->msgs = get_all_messages();
if (RyDsResult (ad, rox->rox_id, (caddr_t) base, ROS_NOPRIO, roi)
== NOTOK)
ros_adios(&roi->roi_preject,"RESULT");
return OK;
}
static struct type_Qmgr_MsgStructList *get_all_messages()
{
struct type_Qmgr_MsgStructList *head, *tail, *temp;
struct type_Qmgr_MsgStruct *msg;
struct dirent **namelist, **ix;
char real_aquedir[FILNSIZE];
extern char *quedfldir;
extern char *aquedir;
int noEntries, i;
head = tail = NULL;
namelist = NULL;
/* get addr directory name */
getfpath (quedfldir, aquedir, real_aquedir);
noEntries = _scandir(real_aquedir, &namelist, isMsgFile, NULLIFP);
i = 0;
ix = namelist;
while ((i++ < noEntries) && (*ix != NULL)) {
PP_TRACE (("reading message %s", (*ix) -> d_name));
if ((msg = readInMsg((*ix)->d_name)) != NULL) {
/* add to list */
temp = (struct type_Qmgr_MsgStructList *)
calloc(1,sizeof(*temp));
temp->MsgStruct = msg;
if (head == NULL)
head = tail = temp;
else {
tail->next = temp;
tail = temp;
}
}
ix++;
}
free((char *)namelist);
return head;
}
static int isMsgFile (entry)
struct dirent *entry;
{
if (strncmp(entry->d_name, "msg.", 4) == 0)
return 1;
else
return 0;
}
static struct type_Qmgr_MsgStruct *readInMsg(name)
char *name;
{
struct type_Qmgr_MsgStruct *arg = NULL;
struct prm_vars prm;
Q_struct que;
ADDR *sender = NULL;
ADDR *recips = NULL;
int rcount, result;
result = OK;
prm_init (&prm);
q_init (&que);
qinit (&que);
if ((result == OK)
&& (rp_isbad(rd_msg(name,&prm,&que,&sender,&recips,&rcount)))) {
PP_LOG(LLOG_EXCEPTIONS,
("Chans/qmgr-load rd_msg err: '%s'",name));
result = NOTOK;
}
/* unlock message */
rd_end();
if ((result == OK)
&& ((arg = qstruct2qmgr(name,&prm,&que,sender,recips,rcount)) == NULL)) {
PP_LOG(LLOG_EXCEPTIONS,
("Chans/qmgr-load qstruct2qmgr err: '%s'",name));
result = NOTOK;
}
/* free all storage */
q_free (&que);
return result == NOTOK ? NULL : arg;
}
/* ERROR */
int error (sd, err, param, rox, roi)
int sd,
err;
caddr_t param;
struct RoSAPinvoke *rox;
struct RoSAPindication *roi;
{
if (RyDsError (sd, rox -> rox_id, err, param, ROS_NOPRIO, roi) == NOTOK)
ros_adios (&roi -> roi_preject, "ERROR");
return OK;
}
int ureject (sd, reason, rox, roi)
int sd, reason;
struct RoSAPinvoke *rox;
struct RoSAPindication *roi;
{
if ( RyDsUReject (sd, rox -> rox_id, reason, ROS_NOPRIO, roi) == NOTOK)
ros_adios (&roi -> roi_preject, "U-REJECT");
return OK;
}