|
|
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 o
Length: 16030 (0x3e9e)
Types: TextFile
Names: »ops.c«
└─⟦2d1937cfd⟧ Bits:30007241 EUUGD22: P.P 5.0
└─⟦dc59850a2⟧ »EurOpenD22/pp5.0/pp-5.tar.Z«
└─⟦e5a54fb17⟧
└─⟦this⟧ »pp-5.0/Src/MTAconsole/ops.c«
/* ops.c: encoding and decoding routines for qmgr interaction */
# ifndef lint
static char Rcsid[] = "@(#)$Header: /cs/research/pp/hubris/pp-beta/Src/MTAconsole/RCS/ops.c,v 5.0 90/09/20 16:20:00 pp Exp Locker: pp $";
# endif
/*
* $Header: /cs/research/pp/hubris/pp-beta/Src/MTAconsole/RCS/ops.c,v 5.0 90/09/20 16:20:00 pp Exp Locker: pp $
*
* $Log: ops.c,v $
* Revision 5.0 90/09/20 16:20:00 pp
* rcsforce : 5.0 public release
*
*/
#include "console.h"
#include "Qmgr-types.h"
extern Widget channel_label,
mta_label,
msg_label;
extern struct chan_struct **globallist,
*currentchan,
*find_channel();
extern char *mystrtotime();
extern int forceDown;
/* \f
*/
/* channel operations */
#define CHAN_READ_INTERVAL 60 /* in secs */
CMD_TABLE chantbl_commands [] = {
"start", (int) chanstart,
"stop", (int) chanstop,
"clear", (int) chanclear,
"info", (int) chaninfo,
"cache add", (int) chancacheadd,
0, 0
};
/* ARGSUSED */
int do_channelread (ad, ds, args, arg)
int ad;
struct client_dispatch *ds;
char **args;
struct type_UNIV_UTCTime **arg;
{
char *str;
UTC utc;
utc = (UTC) malloc (sizeof(struct UTCtime));
utc->ut_flags = UT_SEC;
utc->ut_sec = CHAN_READ_INTERVAL;
str = utct2str(utc);
*arg = str2qb (str, strlen(str), 1);
}
/* ARGSUSED */
int do_channelcontrol (ad, ds, args, arg)
int ad;
struct client_dispatch *ds;
char **args;
struct type_Qmgr_ChannelControl **arg;
/* args[0] = channel */
/* args[1] = stop,start,clear,cacheadd */
/* args[2] = time */
{
char *timestr;
*arg = (struct type_Qmgr_ChannelControl *) malloc(sizeof(**arg));
(*arg)->control = (struct type_Qmgr_Control *)
malloc(sizeof(struct type_Qmgr_Control));
(*arg)->channel = str2qb(args[0],
strlen(args[0]),
1);
switch (cmd_srch(args[1], chantbl_commands)) {
case chanstart:
(*arg)->control->offset = type_Qmgr_Control_start;
break;
case chanstop:
(*arg)->control->offset = type_Qmgr_Control_stop;
break;
case chanclear:
(*arg)->control->offset = type_Qmgr_Control_cacheClear;
break;
case chancacheadd:
(*arg)->control->offset = type_Qmgr_Control_cacheAdd;
timestr = mystrtotime(args[2]);
(*arg)->control->un.cacheAdd = str2qb(timestr,strlen(timestr),1);
free(timestr);
break;
default:
PP_LOG(LLOG_EXCEPTIONS,
("console : '%s' unknown control param for channels",
args[1]));
return NOTOK;
}
return OK;
}
extern time_t time();
extern int firstChanRead;
extern Widget top, channel_viewport;
double load1, load2;
int currchans, maxchans;
/* ARGSUSED */
int channelcontrol_result (ad, id, dummy, result, roi)
int ad,
id,
dummy;
register struct type_Qmgr_PrioritisedChannelList *result;
struct RoSAPindication *roi;
{
Dimension width,
height;
extern time_t currentTime;
time(¤tTime);
channel_list(result);
if (globallist != NULL) {
display_channels();
if (firstChanRead == TRUE) {
WidgetGet(channel_viewport,
XtNwidth, &width,
XtNheight, &height,
NULL);
WidgetSet(channel_viewport,
XtNheight, height-1,
XtNwidth, width-1,
NULL);
}
reset_label(channel_label);
return OK;
} else {
currentchan = NULL;
}
reset_label(channel_label);
return NOTOK;
}
/* ARGSUSED */
int channelread_result (ad, id, dummy, result, roi)
int ad,
id,
dummy;
register struct type_Qmgr_ChannelReadResult *result;
struct RoSAPindication *roi;
{
Dimension width,
height;
extern time_t currentTime;
time(¤tTime);
load1 = (double) result->load1;
load2 = (double) result->load2;
currchans = (int) result->currchans;
maxchans = (int) result->maxchans;
channel_list(result->channels);
if (globallist != NULL) {
display_channels();
if (firstChanRead == TRUE) {
WidgetGet(channel_viewport,
XtNwidth, &width,
XtNheight, &height,
NULL);
WidgetSet(channel_viewport,
XtNheight, height-1,
XtNwidth, width-1,
NULL);
}
reset_label(channel_label);
return OK;
} else {
currentchan = NULL;
}
reset_label(channel_label);
return NOTOK;
}
/* ARGSUSED */
int op_channelread (ad, ryo, rox, in, roi)
int ad;
struct RyOperation *ryo;
struct RoSAPinvoke *rox;
caddr_t in;
struct RoSAPindication *roi;
{
register struct type_Qmgr_ChannelReadResult *arg;
arg = (struct type_Qmgr_ChannelReadResult *) in;
channel_list(arg->channels);
load1 = arg->load1;
load2 = arg -> load2;
currchans = arg->currchans;
maxchans = arg->maxchans;
if (globallist != NULL) {
display_channels();
return OK;
} else {
currentchan = NULL;
}
reset_label(channel_label);
return NOTOK;
}
/* \f
*/
/* mtas */
extern struct mta_struct *find_mta(),
*currentmta;
extern struct chan_struct *mta_list();
extern Mode mode;
#define MTA_READ_INTERVAL 60 /* in secs */
CMD_TABLE mtatbl_commands [] = {
"start", (int) mtastart,
"stop", (int) mtastop,
"clear", (int) mtaclear,
"info", (int) mtainfo,
"cache add", (int) mtacacheadd,
0, 0
};
/* ARGSUSED */
int do_mtaread (ad, ds, args, arg)
int ad;
struct client_dispatch *ds;
char **args; /* args[0] is channel name */
struct type_Qmgr_MtaRead **arg;
{
char *str;
UTC utc;
*arg = (struct type_Qmgr_MtaRead *) malloc(sizeof(**arg));
utc = (UTC) malloc (sizeof(struct UTCtime));
utc->ut_flags = UT_SEC;
utc->ut_sec = MTA_READ_INTERVAL;
str = utct2str(utc);
(*arg)->time = str2qb(str, strlen(str), 1);
(*arg)->channel = str2qb(args[0],
strlen(args[0]),
1);
}
/* ARGSUSED */
int do_mtacontrol (ad, ds, args, arg)
int ad;
struct client_dispatch *ds;
char **args;
struct type_Qmgr_MtaControl **arg;
/* args[0] = channel */
/* args[1] = mta */
/* args[2] = stop,start,clear,cacheadd */
/* args[3] = time */
{
char *timestr;
*arg = (struct type_Qmgr_MtaControl *) malloc(sizeof(**arg));
(*arg)->control = (struct type_Qmgr_Control *)
malloc(sizeof(struct type_Qmgr_Control));
(*arg)->channel = str2qb(args[0],
strlen(args[0]),
1);
(*arg)->mta = str2qb(args[1],
strlen(args[1]),
1);
switch (cmd_srch(args[2], mtatbl_commands)) {
case mtastart:
(*arg)->control->offset = type_Qmgr_Control_start;
break;
case mtastop:
(*arg)->control->offset = type_Qmgr_Control_stop;
break;
case mtaclear:
(*arg)->control->offset = type_Qmgr_Control_cacheClear;
break;
case mtacacheadd:
(*arg)->control->offset = type_Qmgr_Control_cacheAdd;
timestr = mystrtotime(args[3]);
(*arg)->control->un.cacheAdd = str2qb(timestr,strlen(timestr),1);
free(timestr);
break;
default:
PP_LOG(LLOG_EXCEPTIONS,
("console : '%s' unknown control param for mtas",
args[2]));
return NOTOK;
}
return OK;
}
/* ARGSUSED */
int mtacontrol_result (ad, id, dummy, result, roi)
int ad,
id,
dummy;
register struct type_Qmgr_MtaInfo *result;
struct RoSAPindication *roi;
{
char *chan_name,
*name;
struct chan_struct *chan;
struct mta_struct *mta;
chan_name = qb2str(result->channel);
chan = find_channel(chan_name);
if (chan == NULL) {
PP_LOG(LLOG_EXCEPTIONS,
("console: mtacontrol_result can't find channel %s",chan_name));
return NOTOK;
}
name = qb2str(result->mta);
mta = find_mta(chan, name);
if (mta == NULL) {
if (forceDown == TRUE) {
free(chan_name);
free(name);
return OK;
}
PP_LOG(LLOG_EXCEPTIONS,
("console:can not find mta %s on channel %s",
name, chan_name));
abort();
} else {
update_mta(mta,result);
}
currentchan = chan;
order_mtas(&(chan->mtalist),chan->num_mtas);
display_mtas(chan);
reset_label(mta_label);
free(chan_name);
free(name);
return OK;
}
extern char *pop_from_mta_refresh_list();
/* ARGSUSED */
int mtaread_result (ad, id, dummy, result, roi)
int ad,
id,
dummy;
register struct type_Qmgr_PrioritisedMtaList *result;
struct RoSAPindication *roi;
{
struct chan_struct *chan;
char *mtaname = NULL;
char *channame;
channame = pop_from_mta_refresh_list();
if (currentmta != NULL)
mtaname = strdup(currentmta->mta);
chan = mta_list(result, channame);
free(channame);
if (forceDown == TRUE
&& chan != currentchan) {
if (chan != NULL) {
free_mta_list(&(chan->mtalist), &(chan->num_mtas));
chan->mtalist = NULL;
chan->num_mtas = 0;
}
return OK;
}
if ((mode == monitor && chan != NULL)
|| (mode == control && chan != NULL && chan == currentchan)) {
order_mtas(&(chan->mtalist),chan->num_mtas);
if (mtaname != NULL) {
/* reset currentmta */
currentmta = find_mta(chan, mtaname);
free(mtaname);
}
reset_label(mta_label);
display_mtas(chan);
return OK;
} else if (mode == control) {
display_empty_mta_list(currentchan);
currentmta = NULL;
display_empty_msg_list();
reset_label(mta_label);
} else {
/* fill in here */
}
return NOTOK;
}
/* ARGSUSED */
int op_mtaread (ad, ryo, rox, in, roi)
int ad;
struct RyOperation *ryo;
struct RoSAPinvoke *rox;
caddr_t in;
struct RoSAPindication *roi;
{
register struct type_Qmgr_PrioritisedMtaList *arg;
struct chan_struct *chan;
char *mtaname=NULL,
*channame;
arg = (struct type_Qmgr_PrioritisedMtaList *) in;
channame = pop_from_mta_refresh_list();
if (currentmta != NULL)
mtaname = strdup(currentmta->mta);
currentmta = NULL;
chan = mta_list(arg, channame);
free(channame);
if (chan != NULL) {
order_mtas(&(chan->mtalist),chan->num_mtas);
if (mtaname != NULL) {
/* reset currentmta */
currentmta = find_mta(chan, mtaname);
free(mtaname);
}
reset_label(mta_label);
display_mtas(chan);
return OK;
}
reset_label(mta_label);
return NOTOK;
}
/* \f
*/
/* msgs */
struct msg_struct *currentmsg,
**global_msg_list,
*find_msg();
struct type_Qmgr_UserList *create_userlist();
struct type_Qmgr_FilterList *fillinfilters();
#define MSG_READ_INTERVAL 60 /* in secs */
CMD_TABLE msgtbl_commands [] = {
"start", (int) msgstart,
"stop", (int) msgstop,
"clear", (int) msgclear,
"info", (int) msginfo,
"cache add", (int) msgcacheadd,
0, 0
};
/* ARGSUSED */
int do_msgcontrol (ad, ds, args, arg)
int ad;
struct client_dispatch *ds;
char **args;
struct type_Qmgr_MsgControl **arg;
/* args[0] = qid */
/* args[1] = time */
/* args[2] = stop, start, clear cacheadd*/
/* args[3..] = NULL terminated list of users */
{
char *timestr;
*arg = (struct type_Qmgr_MsgControl *) malloc(sizeof(**arg));
(*arg)->qid = str2qb(args[0],
strlen(args[0]),
1);
(*arg)->users = create_userlist(args[0], &(args[3]));
(*arg)->control = (struct type_Qmgr_Control *)
malloc(sizeof(struct type_Qmgr_Control));
switch (cmd_srch(args[2], msgtbl_commands)) {
case msgstart:
(*arg)->control->offset = type_Qmgr_Control_start;
break;
case msgstop:
(*arg)->control->offset = type_Qmgr_Control_stop;
break;
case msgclear:
(*arg)->control->offset = type_Qmgr_Control_cacheClear;
break;
case msgcacheadd:
(*arg)->control->offset = type_Qmgr_Control_cacheAdd;
timestr = mystrtotime(args[1]);
(*arg)->control->un.cacheAdd = str2qb(timestr,strlen(timestr),1);
free(timestr);
break;
default:
PP_LOG(LLOG_EXCEPTIONS,
("console : '%s' unknown control param for msgs",
args[1]));
return NOTOK;
}
return OK;
}
extern char *msginfo_args[3];
/* ARGSUSED */
msgcontrol_result (sd, id, dummy, result, roi)
int sd,
id,
dummy;
struct type_Qmgr_Pseudo__newmessage *result;
struct RoSAPindication *roi;
{
if (currentchan != NULL
&& currentmta != NULL) {
msginfo_args[0] = currentchan->channelname;
msginfo_args[1] = currentmta->mta;
if (is_loc_chan(currentchan) == TRUE)
/* local */
msginfo_args[2] = (char *) 1;
else
msginfo_args[2] = (char *) 0;
construct_event(readchannelmtamessage);
}
return OK;
}
/* ARGSUSED */
int do_readchannelmtamessage (ad, ds, args, arg)
int ad;
struct client_dispatch *ds;
char **args;
/* args[0] = chan args[1] = mta or name in case of local chan */
struct type_Qmgr_MsgRead **arg;
{
char *str;
UTC utc;
*arg = (struct type_Qmgr_MsgRead *) malloc(sizeof(**arg));
bzero ((char *) *arg, sizeof(**arg));
/* fillin time */
utc = (UTC) malloc (sizeof(struct UTCtime));
utc->ut_flags = UT_SEC;
utc->ut_sec = MSG_READ_INTERVAL;
str = utct2str(utc);
(*arg)->time = str2qb(str, strlen(str), 1);
if (args[0] != NULLCP)
(*arg)->channel = str2qb(args[0], strlen(args[0]), 1);
if (args[1] != NULLCP)
(*arg)->mta = str2qb(args[1], strlen(args[1]), 1);
}
/* ARGSUSED */
int readchannelmtamessage_result (ad, id, dummy, result, roi)
int ad,
id,
dummy;
register struct type_Qmgr_MsgList *result;
struct RoSAPindication *roi;
{
char *msgname = NULL;
if (currentmsg != NULL)
msgname = strdup(currentmsg->msginfo->queueid);
msg_list(result);
if (forceDown == TRUE) {
free_msg_list();
global_msg_list = NULL;
}
if (global_msg_list != NULL){
order_msgs();
if (msgname != NULL) {
/* reset currentmsg */
currentmsg = find_msg(msgname);
free(msgname);
}
reset_label(msg_label);
display_msgs();
return OK;
} else {
display_empty_msg_list();
}
reset_label(msg_label);
return NOTOK;
}
/* ARGSUSED */
int op_readchannelmtamessage (ad, ryo, rox, in, roi)
int ad;
struct RyOperation *ryo;
struct RoSAPinvoke *rox;
caddr_t in;
struct RoSAPindication *roi;
{
register struct type_Qmgr_MsgList *arg;
char *msgname = NULL;
arg = (struct type_Qmgr_MsgList *) in;
if (currentmsg != NULL)
msgname = strdup(currentmsg->msginfo->queueid);
currentmsg = NULL;
msg_list(arg);
if (global_msg_list != NULL){
order_msgs();
if (msgname != NULL) {
/* reset currentmsg */
currentmsg = find_msg(msgname);
free(msgname);
}
reset_label(msg_label);
display_msgs();
return OK;
}
reset_label(msg_label);
return NOTOK;
}
struct type_Qmgr_FilterList *fillinfilters(args)
char **args;
/* args[0] = chan args[1] = mta or name in case of local chan */
{
struct type_Qmgr_FilterList *retval =
(struct type_Qmgr_FilterList *) calloc(1, sizeof(*retval));
retval->Filter =
(struct type_Qmgr_Filter *) calloc(1, sizeof(*retval->Filter));
retval->Filter->channel = str2qb(args[0], strlen(args[0]), 1);
if (args[1] != NULLCP) {
if (args[2] == (char *) 1)
retval->Filter->recipient = str2qb(args[1], strlen(args[1]), 1);
else
retval->Filter->mta = str2qb(args[1], strlen(args[1]), 1);
}
return retval;
}
struct type_Qmgr_UserList *create_userlist(qid, argv)
char *qid,
**argv;
{
struct type_Qmgr_UserList *temp,
*head = NULL,
*tail = NULL;
int i = 0;
struct msg_struct *msg;
struct recip *ix;
if (strcmp(argv[i], "*") == 0) {
if ((msg = find_msg(qid)) == NULL)
return NULL;
ix = msg -> reciplist;
while (ix != NULL) {
temp = (struct type_Qmgr_UserList *)
calloc (1, sizeof(*temp));
temp->RecipientId = (struct type_Qmgr_RecipientId *)
malloc(sizeof(struct type_Qmgr_RecipientId));
temp->RecipientId->parm = ix -> id;
ix = ix -> next;
if (head == NULL)
head = tail = temp;
else {
tail->next = temp;
tail = tail->next;
}
}
} else {
while (argv[i] != NULL) {
temp = (struct type_Qmgr_UserList *)
calloc (1, sizeof(*temp));
temp->RecipientId = (struct type_Qmgr_RecipientId *)
malloc(sizeof(struct type_Qmgr_RecipientId));
temp->RecipientId->parm = atoi(argv[i++]);
if (head == NULL)
head = tail = temp;
else {
tail->next = temp;
tail = tail->next;
}
}
}
return head;
}
/* ARGSUSED */
int do_quecontrol (ad, ds, args, arg)
int ad;
struct client_dispatch *ds;
int args;
struct type_Qmgr_QMGROp **arg;
{
*arg = (struct type_Qmgr_QMGROp *) malloc(sizeof(**arg));
(*arg)->parm = args;
return OK;
}
/* ARGSUSED */
int quecontrol_result (ad, id, dummy, result, roi)
int ad,
id,
dummy;
struct type_Qmgr_Pseudo__qmgrControl *result;
struct RoSAPindication *roi;
{
return OK;
}