Blob Blame History Raw
/*********************************************************/
/*  toksvc: a framework-native token broker service      */
/*  Copyright (C) 2020  Z. Gilboa                        */
/*  Released under GPLv2 and GPLv3; see COPYING.TOKSVC.  */
/*********************************************************/

#include <psxtypes/psxtypes.h>
#include <ntapi/ntapi.h>

#include <toksvc/toksvc.h>
#include "toksvc_driver_impl.h"
#include "toksvc_daemon_impl.h"

int32_t toks_client_acquire(struct toks_driver_ctx * dctx)
{
	int32_t			status;
	void *			hport;
	struct _nt_tty_ipc_msg	msg;
	struct _nt_port_keys *	keys;

	hport = toks_get_driver_hservice(dctx);
	keys  = toks_get_driver_keys(dctx);

	ntapi->tt_aligned_block_memset(
		&msg,0,sizeof(msg));

	msg.header.msg_type	= NT_LPC_NEW_MESSAGE;
	msg.header.data_size	= sizeof(msg.data);
	msg.header.msg_size	= sizeof(msg);
	msg.data.ttyinfo.opcode	= TOKS_DAEMON_ACQUIRE;

	msg.data.ipcinfo.ctrlsvc.keys.key[0] = toks_get_driver_tokpid(dctx);
	msg.data.ipcinfo.hevent              = toks_get_driver_hevent(dctx);

	if ((status = ntapi->zw_request_wait_reply_port(hport,&msg,&msg)))
		return status;

	switch (msg.data.ttyinfo.status) {
		case NT_STATUS_SUCCESS:
			break;

		case NT_STATUS_PENDING:
			status = ntapi->zw_wait_for_single_object(
				msg.data.ipcinfo.hevent,
				NT_SYNC_NON_ALERTABLE,
				0);
			break;

		default:
			return msg.data.ttyinfo.status;
	}

	keys->key[0] = msg.data.ipcinfo.ipckeys[0];
	keys->key[1] = msg.data.ipcinfo.ipckeys[1];
	keys->key[2] = msg.data.ipcinfo.ipckeys[2];
	keys->key[3] = msg.data.ipcinfo.ipckeys[3];
	keys->key[4] = msg.data.ipcinfo.ipckeys[4];
	keys->key[5] = msg.data.ipcinfo.ipckeys[5];

	return status;
}