00001
00002
00003
00004
00005
00006 #include "sendXmsg.h"
00007 #include "xmsgLib.h"
00008
00009
00010 extern ticketHashQue_t XmsgHashQue[];
00011 extern xmsgQue_t XmsgQue;
00012
00013 int
00014 rsSendXmsg (rsComm_t *rsComm, sendXmsgInp_t *sendXmsgInp)
00015 {
00016 int status, i;
00017 ticketMsgStruct_t *ticketMsgStruct = NULL;
00018 irodsXmsg_t *irodsXmsg;
00019 char *miscInfo;
00020
00021 status = getTicketMsgStructByTicket (sendXmsgInp->ticket.rcvTicket,
00022 &ticketMsgStruct);
00023
00024 if (status < 0 || NULL == ticketMsgStruct ) {
00025 clearSendXmsgInfo (&sendXmsgInp->sendXmsgInfo);
00026 return status;
00027 }
00028
00029
00030 if (ticketMsgStruct->ticket.sendTicket != sendXmsgInp->ticket.sendTicket) {
00031
00032 rodsLog (LOG_ERROR,
00033 "rsSendXmsg: sendTicket mismatch, input %d, in cache %d",
00034 sendXmsgInp->ticket.sendTicket, ticketMsgStruct->ticket.sendTicket);
00035 return (SYS_UNMATCHED_XMSG_TICKET);
00036 }
00037
00038
00039 miscInfo = sendXmsgInp->sendXmsgInfo.miscInfo;
00040 if (miscInfo != NULL && strlen(miscInfo) > 0) {
00041 if(!strcmp(miscInfo,"CLEAR_STREAM")) {
00042 i = clearAllXMessages(ticketMsgStruct);
00043 return(i);
00044 }
00045 else if (!strcmp(miscInfo,"DROP_STREAM")) {
00046 if(sendXmsgInp->ticket.rcvTicket > 5) {
00047 i = clearAllXMessages(ticketMsgStruct);
00048 if (i < 0) return (i);
00049 i = rmTicketMsgStructFromHQue (ticketMsgStruct,
00050 (ticketHashQue_t *) ticketMsgStruct->ticketHashQue);
00051 return(i);
00052 }
00053 }
00054 else if (!strcmp(miscInfo,"ERASE_MESSAGE")) {
00055
00056 i = clearOneXMessage(ticketMsgStruct, sendXmsgInp->sendXmsgInfo.msgNumber);
00057 return(i);
00058 }
00059 }
00060
00061
00062
00063 irodsXmsg = (irodsXmsg_t*)calloc (1, sizeof (irodsXmsg_t));
00064 irodsXmsg->sendXmsgInfo = (sendXmsgInfo_t*)calloc (1, sizeof (sendXmsgInfo_t));
00065 *irodsXmsg->sendXmsgInfo = sendXmsgInp->sendXmsgInfo;
00066 irodsXmsg->sendTime = time (0);
00067
00068 snprintf(irodsXmsg->sendUserName,NAME_LEN,"%s@%s",rsComm->clientUser.userName,rsComm->clientUser.rodsZone);
00069 rstrcpy (irodsXmsg->sendAddr,sendXmsgInp->sendAddr, NAME_LEN);
00070
00071
00072
00073
00074 status = addXmsgToQues(irodsXmsg, ticketMsgStruct);
00075 return (status);
00076 }
00077
00078