#ifndef _SYS_DOOR_H
#define _SYS_DOOR_H
#ifdef __cplusplus
extern "C" {
#endif
#define DOOR_UNREF 0x01
#define DOOR_PRIVATE 0x02
#define DOOR_UNREF_MULTI 0x10
#define DOOR_REFUSE_DESC 0x40
#define DOOR_NO_CANCEL 0x80
#define DOOR_NO_DEPLETION_CB 0x100
#define DOOR_LOCAL 0x04
#define DOOR_REVOKED 0x08
#define DOOR_IS_UNREF 0x20
#define DOOR_PRIVCREATE 0x200
#define DOOR_DEPLETION_CB 0x400
#if !defined(_ASM)
#include <sys/types.h>
#if defined(_KERNEL)
#include <sys/mutex.h>
#include <sys/vnode.h>
#include <sys/door_impl.h>
#endif
typedef unsigned long long door_ptr_t;
typedef unsigned long long door_id_t;
typedef unsigned int door_attr_t;
#ifdef _KERNEL
struct __door_handle;
typedef struct __door_handle *door_handle_t;
#endif
#define DOOR_INVAL -1
#define DOOR_UNREF_DATA ((void *)1)
#define DOOR_QUERY -2
#define DOOR_CREATE_MASK (DOOR_UNREF | DOOR_PRIVATE | \
DOOR_UNREF_MULTI | DOOR_REFUSE_DESC | DOOR_NO_CANCEL | \
DOOR_NO_DEPLETION_CB | DOOR_PRIVCREATE)
#define DOOR_KI_CREATE_MASK (DOOR_UNREF | DOOR_UNREF_MULTI)
#define DOOR_ATTR_MASK (DOOR_CREATE_MASK | \
DOOR_LOCAL | DOOR_REVOKED | DOOR_IS_UNREF)
#define DOOR_DESCRIPTOR 0x10000
#ifdef _KERNEL
#define DOOR_HANDLE 0x20000
#endif
#define DOOR_RELEASE 0x40000
#define DOOR_DELAY 0x80000
#define DOOR_UNREF_ACTIVE 0x100000
#define DOOR_PARAM_DESC_MAX 1
#define DOOR_PARAM_DATA_MAX 2
#define DOOR_PARAM_DATA_MIN 3
#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
#pragma pack(4)
#endif
typedef struct door_desc {
door_attr_t d_attributes;
union {
struct {
int d_descriptor;
door_id_t d_id;
} d_desc;
#ifdef _KERNEL
door_handle_t d_handle;
#endif
int d_resv[5];
} d_data;
} door_desc_t;
typedef struct door_info {
pid_t di_target;
door_ptr_t di_proc;
door_ptr_t di_data;
door_attr_t di_attributes;
door_id_t di_uniquifier;
int di_resv[4];
} door_info_t;
#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
#pragma pack()
#endif
typedef struct door_cred {
uid_t dc_euid;
gid_t dc_egid;
uid_t dc_ruid;
gid_t dc_rgid;
pid_t dc_pid;
int dc_resv[4];
} door_cred_t;
typedef struct door_arg {
char *data_ptr;
size_t data_size;
door_desc_t *desc_ptr;
uint_t desc_num;
char *rbuf;
size_t rsize;
} door_arg_t;
#if defined(_SYSCALL32)
typedef struct door_arg32 {
caddr32_t data_ptr;
size32_t data_size;
caddr32_t desc_ptr;
uint32_t desc_num;
caddr32_t rbuf;
size32_t rsize;
} door_arg32_t;
#endif
struct door_results {
void *cookie;
char *data_ptr;
size_t data_size;
door_desc_t *desc_ptr;
size_t desc_num;
void (*pc)();
int nservers;
door_info_t *door_info;
};
#if defined(_SYSCALL32)
struct door_results32 {
caddr32_t cookie;
caddr32_t data_ptr;
size32_t data_size;
caddr32_t desc_ptr;
size32_t desc_num;
caddr32_t pc;
int nservers;
caddr32_t door_info;
};
#endif
typedef struct door_return_desc {
door_desc_t *desc_ptr;
uint_t desc_num;
} door_return_desc_t;
#if defined(_SYSCALL32)
typedef struct door_return_desc32 {
caddr32_t desc_ptr;
uint_t desc_num;
} door_return_desc32_t;
#endif
#if defined(_KERNEL)
#define DOOR_WAIT -1
#define DOOR_EXIT -2
#define VTOD(v) ((struct door_node *)(v->v_data))
#define DTOV(d) ((d)->door_vnode)
typedef struct door_node {
vnode_t *door_vnode;
struct proc *door_target;
struct door_node *door_list;
struct door_node *door_ulist;
void (*door_pc)();
void *door_data;
door_id_t door_index;
door_attr_t door_flags;
uint_t door_active;
door_pool_t door_servers;
size_t door_data_max;
size_t door_data_min;
uint_t door_desc_max;
uint_t door_bound_threads;
} door_node_t;
#define DOOR_INVALID(dp) ((dp)->door_flags & DOOR_REVOKED)
struct file;
int door_insert(struct file *, door_desc_t *);
int door_finish_dispatch(caddr_t);
uintptr_t door_final_sp(uintptr_t, size_t, int);
int door_upcall(vnode_t *, door_arg_t *, struct cred *, size_t, uint_t);
void door_slam(void);
void door_exit(void);
void door_revoke_all(void);
void door_deliver_unref(door_node_t *);
void door_list_delete(door_node_t *);
void door_fork(kthread_t *, kthread_t *);
void door_bind_thread(door_node_t *);
void door_unbind_thread(door_node_t *);
extern kmutex_t door_knob;
extern kcondvar_t door_cv;
extern size_t door_max_arg;
int door_ki_upcall(door_handle_t, door_arg_t *);
int door_ki_upcall_limited(door_handle_t, door_arg_t *, struct cred *,
size_t, uint_t);
int door_ki_create(void (*)(void *, door_arg_t *,
void (**)(void *, void *), void **, int *), void *, door_attr_t,
door_handle_t *);
void door_ki_hold(door_handle_t);
void door_ki_rele(door_handle_t);
int door_ki_open(char *, door_handle_t *);
int door_ki_info(door_handle_t, door_info_t *);
int door_ki_getparam(door_handle_t, int, size_t *);
int door_ki_setparam(door_handle_t, int, size_t);
door_handle_t door_ki_lookup(int did);
#endif
#endif
#define DOOR_CREATE 0
#define DOOR_REVOKE 1
#define DOOR_INFO 2
#define DOOR_CALL 3
#define DOOR_BIND 6
#define DOOR_UNBIND 7
#define DOOR_UNREFSYS 8
#define DOOR_UCRED 9
#define DOOR_RETURN 10
#define DOOR_GETPARAM 11
#define DOOR_SETPARAM 12
#ifdef __cplusplus
}
#endif
#endif