www.pudn.com > unixtonxunchengxu.rar > UnionMsg.c
// Author: Wolfgang Wang // Date: 2001/8/29 #include#include #include #include #include #include "CommMsg.h" #include "CommMain.h" TUnionIDOfMsgBuf UnionInitializeMessageBuffer(TUnionUserIDOfMsgBuf UserIDOfMsg) { TUnionIDOfMsgBuf IDOfMsg; if (UserIDOfMsg <= 0) { UnionUserErrLog("in UnionInitializeMessageBuffer:: UserIDOfMsg [%d] must >= 0\n",UserIDOfMsg); return(-1); } if ( (IDOfMsg = msgget(UserIDOfMsg,0)) == -1) IDOfMsg = msgget(UserIDOfMsg,0666 | IPC_CREAT); if (IDOfMsg == -1) { UnionSystemErrLog("in UnionInitializeMessageBuffer:: cannot get queue id = %d\n",UserIDOfMsg); return(gErrHostCommCallingMsgget); } return (IDOfMsg); } int UnionReleaseMessageBuffer(TUnionUserIDOfMsgBuf UserIDOfMsg) { TUnionIDOfMsgBuf IDOfMsg; char buf[513]; if ((IDOfMsg = msgget(UserIDOfMsg,0666)) == -1) { UnionSystemErrLog("in UnionReleaseMessageBuffer::msgget fail! Message user ID = [%d]\n",IDOfMsg); return(gErrHostCommCallingMsgget); } memset(buf,0,513); sprintf(buf,"ipcrm -q %d",IDOfMsg); if (system(buf) < 0) { UnionSystemErrLog("in UnionReleaseMessageBuffer:: ipcrm -q [%d]\n",IDOfMsg); return(gErrHostCommCallingIpcrm); } return(0); } int UnionCleanMessageBuffer(TUnionIDOfMsgBuf IDOfMsgBuf,TUnionIDOfMsg IDOfMsg) { TUnionMsgInQueue sysmsg; int nNumber=0; memset(sysmsg.mtext,0,1024); for (;;) { if (msgrcv(IDOfMsgBuf,&sysmsg,1024,IDOfMsg,IPC_NOWAIT) < 0) break; nNumber++; } return (nNumber); } int UnionAddMessageToBuffer(TUnionIDOfMsgBuf IDOfMsgBuf,TUnionIDOfMsg IDOfMsg,PUnionAddress pMsgBuf,int nMsgBufLen) { TUnionMsgInQueue sysmsg; if (nMsgBufLen > 1024) { UnionSystemErrLog("in UnionAddMessageToBuffer:: Message buffer too long [%d]\n",nMsgBufLen); return (-1); } sysmsg.mtype = IDOfMsg; memset(sysmsg.mtext,0,1024); memcpy(sysmsg.mtext,pMsgBuf,nMsgBufLen); if (msgsnd(IDOfMsgBuf,&sysmsg,nMsgBufLen,~IPC_NOWAIT) == -1) { UnionSystemErrLog("in UnionAddMessageToBuffer: send msg to message queue [%d],Message buffer = *%s*\n",IDOfMsg,pMsgBuf); return (gErrHostCommCallingMsgsnd); } return(0); } int UnionGetFirstMessageFromBuffer(TUnionIDOfMsgBuf IDOfMsgBuf,PUnionIDOfMsg pIDOfMsg,PUnionAddress pMsgBuf) { TUnionMsgInQueue sysmsg; int rc; memset(sysmsg.mtext,0,1024); if ((rc = msgrcv(IDOfMsgBuf,&sysmsg,1024,0L,~IPC_NOWAIT)) == -1) { UnionSystemErrLog("in UnionGetFirstMessageFromBuffer:: msgrcv from queue = [%d]\n",IDOfMsgBuf); return (gErrHostCommCallingMsgrcv); } memcpy(pMsgBuf,sysmsg.mtext,rc); *pIDOfMsg = sysmsg.mtype; return(rc); } int UnionGetSpecifiedMessageFromBuffer(TUnionIDOfMsgBuf IDOfMsgBuf,TUnionIDOfMsg IDOfMsg,PUnionAddress pMsgBuf) { TUnionMsgInQueue sysmsg; int rc; memset(sysmsg.mtext,0,1024); if ((rc = msgrcv(IDOfMsgBuf,&sysmsg,1024,IDOfMsg,~IPC_NOWAIT)) < 0) { UnionSystemErrLog("in UnionGetSpecifiedMessageFromBuffer:: msgrcv from queue = %d msgid = %ld\n",IDOfMsg,IDOfMsg); return (gErrHostCommCallingMsgrcv); } memcpy(pMsgBuf,sysmsg.mtext,rc); return (rc); }