Listing 3 (comm.c)

#include "ipc.h"

ULONG open_comm_link(USHORT *mbxid, ULONG mbxsiz,
   char *mbxname)
{
char   permanence_flag  =  TEMPORARY_MBX;
ULONG  protection       =  WORLD_ACCESS;
ULONG  access_mode      =  PSL$C_USER;
$DESCRIPTOR (mbx_logical_name, mbxname);
mbx_logical_name.dsc$w_length = strlen(mbxname);

return (SYS$CREMBX(permanence_flag, mbxid, mbxsiz, mbxsiz,
   protection, access_mode, &mbx_logical_name));
}

ULONG close_comm_link(USHORT mbxid)
{
return (SYS$DASSGN(mbxid));
}


ULONG send(USHORT mbxid, MSGBUF *msg, int msgsiz)
{
int              status;
USHORT           func = IO$_WRITEVBLK | IO$M_NOW;
IO_STATUS_BLOCK  iosb = {0, 0, 0};

status = SYS$QIOW(0, mbxid, func, &iosb, 0, 0, msg,
       msgsiz, 0, 0, 0, 0);

return status;
}

ULONG broadcast(MSGBUF *msg, ULONG msgsiz, CLIENT *p)
{
while (p) {
   send(p->mbxid, msg, msgsiz);
   p = p->link;
}
return SUCCEED;
}

void receive(USHORT mbxid)
{
int     status;
USHORT  func = IO$_READVBLK;

extern RCVBUF msgque[QSIZE];
extern BOOL qfull, qempty, qovrflo;
extern int qtail, qhead;

if (!qfull) {
   qempty = FALSE;
   qtail = (++qtail) % QSIZE;
   status = SYS$QIO (RCVEF, mbxid, func,
              &msgque[qtail].iosb, &receive,
              mbxid, &msgque[qtail].msg, sizeof(MSGBUF),
              0, 0, 0, 0);
   if (((qtail+1) % QSIZE) == qhead)
     qfull = TRUE;
}
else {
   qovrflo = TRUE;
}
}