Blob Blame History Raw
/********************************************************/
/*  ntapi: Native API core library                      */
/*  Copyright (C) 2013--2017  Z. Gilboa                 */
/*  Released under GPLv2 and GPLv3; see COPYING.NTAPI.  */
/********************************************************/

#include <psxtypes/psxtypes.h>
#include <ntapi/nt_sync.h>
#include <ntapi/nt_socket.h>
#include <ntapi/ntapi.h>
#include "ntapi_impl.h"

int32_t __cdecl __ntapi_sc_wait(
	nt_socket *		hssocket,
	nt_iosb volatile *	iosb,
	nt_timeout *		timeout)
{
	nt_iosb cancel;

	timeout = (timeout && timeout->quad)
		? timeout
		: 0;

	if (hssocket->hevent && (hssocket->iostatus == NT_STATUS_PENDING)) {
		hssocket->waitstatus = __ntapi->zw_wait_for_single_object(
				hssocket->hevent,
				!!(hssocket->ntflags & NT_FILE_SYNCHRONOUS_IO_ALERT),
				timeout);

		switch (hssocket->waitstatus) {
			case NT_STATUS_SUCCESS:
				hssocket->iostatus = iosb->status;
				break;

			case NT_STATUS_ALERTED:
				hssocket->iostatus = NT_STATUS_ALERTED;
				__ntapi->zw_cancel_io_file(
					hssocket->hsocket,
					&cancel);
				break;
		}
	}

	return hssocket->iostatus;
}