00001
00002
00003
00004
00005
00006 #include "getXmsgTicket.h"
00007 #include "xmsgLib.h"
00008
00009 extern ticketHashQue_t XmsgHashQue[];
00010
00011 int
00012 rsGetXmsgTicket (rsComm_t *rsComm, getXmsgTicketInp_t *getXmsgTicketInp,
00013 xmsgTicketInfo_t **outXmsgTicketInfo)
00014 {
00015 int status;
00016 int hashSlotNum;
00017 time_t thisTime;
00018 time_t inpExpireTime;
00019
00020 *outXmsgTicketInfo = (xmsgTicketInfo_t*)calloc (1, sizeof (xmsgTicketInfo_t));
00021
00022
00023 thisTime = time (NULL);
00024 inpExpireTime = getXmsgTicketInp->expireTime;
00025 if (inpExpireTime > 0) {
00026 if (inpExpireTime - thisTime > MAX_EXPIRE_INT) {
00027 (*outXmsgTicketInfo)->expireTime = thisTime + MAX_EXPIRE_INT;
00028 } else if (inpExpireTime - thisTime <= 0) {
00029 (*outXmsgTicketInfo)->expireTime = thisTime + DEF_EXPIRE_INT;
00030 } else {
00031 (*outXmsgTicketInfo)->expireTime = inpExpireTime;
00032 }
00033 } else {
00034 (*outXmsgTicketInfo)->expireTime = thisTime + DEF_EXPIRE_INT;
00035 }
00036 (*outXmsgTicketInfo)->flag = getXmsgTicketInp->flag;
00037 while (1) {
00038 (*outXmsgTicketInfo)->rcvTicket = random();
00039 (*outXmsgTicketInfo)->sendTicket = (*outXmsgTicketInfo)->rcvTicket;
00040 hashSlotNum = ticketHashFunc ((*outXmsgTicketInfo)->rcvTicket);
00041 status = addTicketToHQue (
00042 *outXmsgTicketInfo, &XmsgHashQue[hashSlotNum]);
00043 if (status != SYS_DUPLICATE_XMSG_TICKET) {
00044 break;
00045 }
00046 }
00047
00048 if (status < 0) {
00049 free (*outXmsgTicketInfo);
00050 *outXmsgTicketInfo = NULL;
00051 }
00052
00053 return (status);
00054 }
00055