#include <door.h>
#include <errno.h>
#include <syslog.h>
#include <unistd.h>
#include <varargs.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <synch.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/param.h>
#include <pthread.h>
#include "vs_incl.h"
#define VS_DOOR_VERSION 1
static int vs_door_cookie;
static void vs_door_scan_req(void *, char *, size_t, door_desc_t *, uint_t);
static int vs_door_fd = -1;
static pthread_mutex_t vs_door_mutex = PTHREAD_MUTEX_INITIALIZER;
int
vs_door_init(void)
{
(void) pthread_mutex_lock(&vs_door_mutex);
if ((vs_door_fd = door_create(vs_door_scan_req,
&vs_door_cookie, (DOOR_UNREF | DOOR_REFUSE_DESC))) < 0) {
syslog(LOG_ERR, "vscand: door create%s", strerror(errno));
vs_door_fd = -1;
}
(void) pthread_mutex_unlock(&vs_door_mutex);
return (vs_door_fd);
}
void
vs_door_fini(void)
{
(void) pthread_mutex_lock(&vs_door_mutex);
if (vs_door_fd >= 0) {
if (door_revoke(vs_door_fd) < 0)
syslog(LOG_ERR, "vscand: door revoke %s",
strerror(errno));
}
vs_door_fd = -1;
(void) pthread_mutex_unlock(&vs_door_mutex);
}
static void
vs_door_scan_req(void *cookie, char *ptr, size_t size, door_desc_t *dp,
uint_t n_desc)
{
vs_scan_req_t *scan_req;
uint32_t result = VS_STATUS_ERROR;
if (ptr != NULL) {
scan_req = (vs_scan_req_t *)ptr;
result = vs_svc_queue_scan_req(scan_req);
}
(void) door_return((char *)&result, sizeof (uint32_t), NULL, 0);
}