/*
 *	Packet functions.
 *
 */

#include "hc.h"


void ReturnPacket (struct DosPacket *Packet, struct Process *Proc)
{
	struct Message *Msg;
	struct MsgPort *Port;

	Port = Packet->dp_Port;
	Msg = Packet->dp_Link;
	Packet->dp_Port = &Proc->pr_MsgPort;
	Msg->mn_Node.ln_Name = (char *)Packet;
	PutMsg (Port, Msg);
}


struct DosPacket *WaitPacket(struct Process *Proc)
{
	struct Message *Msg;
	struct MsgPort *Port;

	Port = &Proc->pr_MsgPort;

	while (1)
	{
		if (SetSignal (0L, 0L) & ReadFlag)
		{
			SetSignal (0L, ReadFlag);
			ReadSer ();
		}
		else if (Msg = GetMsg (Port))
		{
			return (struct DosPacket *)Msg->mn_Node.ln_Name;
		}
		else
		{
			if (Wait ( (1L << Port->mp_SigBit) | ReadFlag) & ReadFlag)
			{
				ReadSer ();
			}
		}
	}
}
