Files
ocs/plat/iptrans/src/queuefunc.c
2025-03-03 11:01:26 +08:00

134 lines
2.8 KiB
C

/*
** CVS $Id: queuefunc.c,v 1.3 2001/02/08 10:53:33 zhangsz Exp $
**
** filename: queuefunc.c
** created at 2000/12/29
** by Zhang Shuzhong
**
** loop message queue operating functions.
**
*/
#include "./include/iptrans.h"
extern u_char warningFlag;
/*@ignore@*/
/* Read a message from loop queue. */
BOOL
iptrReadMsg(void *pbuf, void *pmsg, int max_num)
{
in_buffer *p;
message_list *msg_ptr;
p = (in_buffer *) pbuf;
msg_ptr = (message_list *) pmsg;
// memset(msg_ptr, EMPTY, sizeof(struct message_list));
/*
** these are some messages not to be read
** while subscript of read isn't equal to subscipt of write.
*/
if (p->msgReadSub == p->msgWriteSub)
return FAILURE;
memcpy(msg_ptr, &p->msgList[p->msgReadSub],
p->msgList[p->msgReadSub].msgLength + 44);
/*message head length */
// sizeof(struct message_list));
/*
** increase READ SUBSCRIPT after got a message,
** set READ SUBSCRIPT to 0 while it equal to max_num.
*/
p->msgReadSub ++;
if (p->msgReadSub == max_num)
p->msgReadSub = 0;
return SUCCESS;
}
extern int SetAsciioutMsg(int flag, const char *fmt, ...);
/* Write a message to loop queue. */
BOOL
iptrWriteMsg(void *pbuf, void *pmsg, int max_num)
{
in_buffer *p;
message_list *msg_ptr;
int port;
p = (in_buffer *) pbuf;
msg_ptr = (message_list *) pmsg;
memcpy(&p->msgList[p->msgWriteSub], msg_ptr,
msg_ptr->msgLength + 44);//sizeof(struct message_list));
p->msgWriteSub ++;
/*
** if write subscript more than max_num,
** write subscript equal 0.
*/
if (p->msgWriteSub == max_num)
p->msgWriteSub = 0;
/*
** if message written successful,
** Read subscript is same as Write subscript,
** then Read subsrcipt add 1.
*/
if (p->msgReadSub == p->msgWriteSub)
{
(p->msgReadSub == max_num-1) ?
(p->msgReadSub = 0) : (p->msgReadSub ++);
if(warningFlag){
port = msg_ptr->msgDstPort;
SetAsciioutMsg(1,"Warning! Port: %d overflowed!\r\n",port);
return 0;
}
}
return 1;
}
void
iptrByteRev(BYTE *pbuf, BYTE *p, size_t size)
{
int i;
char ch;
for (i=0; i<size; i++) {
ch = *(pbuf++) >> 4;
*pbuf <<= 4;
*pbuf &= ch;
}
memcpy(p, pbuf, size);
}
void
iptrStrrev(char *sp)
{
char ch;
ch = sp[0];
sp[0] = sp[1];
sp[1] = ch;
}
void
iptrByteReverse(BYTE *pbuf, BYTE *p, size_t size)
{
int i;
char *sp=NULL, tmpbuf[3];
sp = (char *) malloc(4*size + 1);
bzero(p, size);
for (i=0; i<2*size; i+=2) {
sprintf(tmpbuf, "%02x", *(pbuf++));
tmpbuf[2]=0;
iptrStrrev(tmpbuf);
strncpy(sp+i, tmpbuf, 2);
}
AsciiToBcd(pbuf, sp, 4*size);
memcpy(p, pbuf, 2*size);
free(sp);
}
/*@end@*/