
/*
 *  WaitQueue.C
 */

#include "lib.h"

short
WaitQueue(_chan, skipior)
void *_chan;
IOSTD *skipior;
{
    CHANN *chan = (CHANN *)_chan;
    IOSTD *io;

    short error = 0;
    while (chan->queued > chan->qlen) {     /*  until done  */
	WaitPort(&chan->port);                     /*  something   */
	io = (IOSTD *)GetMsg(&chan->port);
	if (io->io_Message.mn_Node.ln_Type == NT_REPLYMSG) {
	    if (error == 0)
		error = io->io_Error;
	    if (io != skipior) {
		if (io->io_Length)
		    FreeMem(io->io_Data, io->io_Length);
		FreeMem(io, sizeof(IOSTD));
	    }
	    --chan->queued;
	} else {
	    AddTail(&chan->rdylist, (NODE *)io);
	}
    }
    return(error);
}

