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);
}