|
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 t
Length: 4200 (0x1068) Types: TextFile Names: »timeout.c«
└─⟦2d1937cfd⟧ Bits:30007241 EUUGD22: P.P 5.0 └─⟦dc59850a2⟧ »EurOpenD22/pp5.0/pp-5.tar.Z« └─⟦e5a54fb17⟧ └─⟦this⟧ »pp-5.0/Chans/timeout/timeout.c«
/* timeout.c: message timeout channel */ # ifndef lint static char Rcsid[] = "@(#)$Header: /cs/research/pp/hubris/pp-beta/Chans/timeout/RCS/timeout.c,v 5.0 90/09/20 15:54:47 pp Exp Locker: pp $"; # endif /* * $Header: /cs/research/pp/hubris/pp-beta/Chans/timeout/RCS/timeout.c,v 5.0 90/09/20 15:54:47 pp Exp Locker: pp $ * * $Log: timeout.c,v $ * Revision 5.0 90/09/20 15:54:47 pp * rcsforce : 5.0 public release * */ #include "head.h" #include "dbase.h" #include "qmgr.h" #include "q.h" #include "dr.h" #include "prm.h" extern char *mquedir; extern char *quedfldir; extern CHAN *ch_nm2struct(); extern void sys_init(), rd_end(), err_abrt(); CHAN *mychan; static struct type_Qmgr_DeliveryStatus *process (); static int initialise (); static void dirinit (); static struct type_Qmgr_DeliveryStatus *new_DeliveryStatus(); static int security_check (); static ADDR *get_address (); /* \f */ /* main routine */ main (argc, argv) int argc; char **argv; { sys_init(argv[0]); dirinit (); #ifdef PP_DEBUG if (argc>1 && (strcmp(argv[1],"debug") == 0)) debug_channel_control(argc,argv,initialise,process,NULLIFP); else #endif channel_control (argc, argv, initialise, process,NULLIFP); } /* \f */ /* 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 */ /* channel initialise routine */ static int initialise (arg) struct type_Qmgr_Channel *arg; { char *name; name = qb2str(arg); if ((mychan = ch_nm2struct(name)) == NULLCHAN) { PP_OPER(NULLCP, ("Chans/timeout : Channel '%s' not known",name)); if (name != NULL) free(name); return NOTOK; } /* check if a timeout channel */ if (name != NULL) free(name); return OK; } /* \f */ /* routine called to clean do timeout out */ static struct type_Qmgr_DeliveryStatus *process (arg) struct type_Qmgr_ProcMsg *arg; { struct prm_vars prm; Q_struct que; ADDR *sender; ADDR *recips; int rcount; char *this_msg; ADDR *adr; prm_init (&prm); q_init (&que); sender = NULLADDR; recips = NULLADDR; delivery_init(arg->users); delivery_setall(int_Qmgr_status_messageFailure); if (security_check(arg) != TRUE) return deliverystate; /* ok-timeout message */ this_msg = qb2str (arg->qid); PP_LOG(LLOG_NOTICE, ("timing out msg %s", this_msg)); if (rp_isbad(rd_msg(this_msg,&prm,&que,&sender,&recips,&rcount))) { PP_LOG(LLOG_EXCEPTIONS, ("Chans/timeout rd_msg err: '%s'",this_msg)); rd_end(); /* free all storage used */ if (this_msg != NULL) free(this_msg); q_free (&que); return deliverystate; } for (adr = que.Raddress; adr; adr = adr -> ad_next) if (adr -> ad_status == AD_STAT_PEND) set_1dr(&que, adr -> ad_no, DRR_UNABLE_TO_TRANSFER, DRD_MAX_TIME_EXPIRED, NULLCP); if (arg->users != NULL && (adr = get_address(arg->users->RecipientId->parm, &que)) != 0 && !rp_isbad(wr_q2dr(&que, this_msg))) delivery_set(adr -> ad_no, int_Qmgr_status_negativeDR); else delivery_set(adr -> ad_no, int_Qmgr_status_messageFailure); /* unlock file */ rd_end(); /* free all storage used */ if (this_msg != NULL) free(this_msg); q_free (&que); return deliverystate; } /* \f */ /* routine to check if allo<wed to timeout this message */ static int security_check (msg) struct type_Qmgr_ProcMsg *msg; { char *msg_file = NULL, *msg_chan = NULL; int result; result = TRUE; msg_file = qb2str (msg->qid); msg_chan = qb2str (msg->channel); if ((mychan == NULLCHAN) || (strcmp(msg_chan,mychan->ch_name) !=0)) { PP_LOG(LLOG_EXCEPTIONS, ("Chans/timeout channel err: '%s'",msg_chan)); result = FALSE; } if (msg_file != NULL) free(msg_file); if (msg_chan != NULL) free(msg_chan); return result; } /* routine to extract the required address from the Q_struct */ static ADDR *get_address (usr, que) int usr; Q_struct *que; { ADDR *ix; if (usr == 0) /* originator */ return que->Oaddress; ix = que->Raddress; while ((ix != 0) && (--usr > 0)) ix = ix->ad_next; return ix; }