4 * Implements an architecture independant Capability Service API
6 * $DragonFly: src/sys/sys/caps.h,v 1.8 2004/04/25 18:54:32 cpressey Exp $
13 #include <sys/types.h>
15 #ifndef _SYS_MSGPORT_H_
16 #include <sys/msgport.h>
22 typedef enum caps_msg_state
{
24 CAPMS_REQUEST_RETRY
, /* internal / FUTURE */
26 CAPMS_REPLY_RETRY
, /* internal / FUTURE */
30 typedef struct caps_msgid
{
32 caps_msg_state_t c_state
;
36 typedef enum caps_type
{
37 CAPT_UNKNOWN
, CAPT_CLIENT
, CAPT_SERVICE
, CAPT_REMOTE
, CAPT_FORKED
40 typedef int64_t caps_gen_t
;
43 * Note: upper 16 bits reserved for kernel use
45 #define CAPF_UFLAGS 0xFFFF
46 #define CAPF_USER 0x0001
47 #define CAPF_GROUP 0x0002
48 #define CAPF_WORLD 0x0004
49 #define CAPF_EXCL 0x0008
50 #define CAPF_ANYCLIENT (CAPF_USER|CAPF_GROUP|CAPF_WORLD)
51 #define CAPF_WCRED 0x0010 /* waiting for cred */
52 #define CAPF_NOFORK 0x0020 /* do not create a dummy entry on fork */
53 #define CAPF_WAITSVC 0x0040 /* block if service not available */
54 /* FUTURE: CAPF_ASYNC - support async services */
55 /* FUTURE: CAPF_NOGROUPS - don't bother filling in the groups[] array */
56 /* FUTURE: CAPF_TERM - send termination request to existing service */
57 /* FUTURE: CAPF_TAKE - take over existing service's connections */
58 /* FUTURE: CAPF_DISPOSE_IMM - need immediate dispose wakeups */
63 #define CAPS_ABORT_NOTIMPL 0 /* abort not implemented, no action */
64 #define CAPS_ABORT_RETURNED 1 /* already returned, no action */
65 #define CAPS_ABORT_BEFORESERVER 2 /* caught before the server got it */
66 #define CAPS_ABORT_ATSERVER 3 /* server had retrieved message */
68 #define CAPF_ABORT_HARD 0x0001 /* rip out from under server (3) */
70 #define CAPS_MAXGROUPS 16
71 #define CAPS_MAXNAMELEN 64
72 #define CAPS_MAXINPROG 128
76 typedef struct caps_port
{
77 struct lwkt_port cp_lport
;
78 int cp_portid
; /* caps port id */
79 int cp_upcallid
; /* upcall id */
82 typedef struct caps_cred
{
89 gid_t groups
[CAPS_MAXGROUPS
];
92 #if defined(_KERNEL) || defined(_KERNEL_STRUCTURES)
96 TAILQ_HEAD(caps_kmsg_queue
, caps_kmsg
);
99 * caps_kinfo - Holds a client or service registration
101 * ci_msgpendq: holds the kernel copy of the message after it has been
102 * sent to the local port. The message is matched up against
103 * replies and automatically replied if the owner closes its
106 typedef struct caps_kinfo
{
107 struct lwkt_port ci_lport
; /* embedded local port */
108 struct caps_kinfo
*ci_tdnext
; /* per-process list */
109 struct caps_kinfo
*ci_hnext
; /* registration hash table */
110 struct thread
*ci_td
; /* owner */
111 struct caps_kmsg_queue ci_msgpendq
; /* pending reply (just rcvd) */
112 struct caps_kmsg_queue ci_msguserq
; /* pending reply (user holds) */
113 struct caps_kinfo
*ci_rcaps
; /* connected to remote */
114 int ci_cmsgcount
; /* client in-progress msgs */
123 char ci_name
[4]; /* variable length */
124 /* ci_name must be last element */
127 /* note: user flags are held in the low 16 bits */
128 #define CAPKF_TDLIST 0x00010000
129 #define CAPKF_HLIST 0x00020000
130 #define CAPKF_FLUSH 0x00040000
131 #define CAPKF_RCAPS 0x00080000
132 #define CAPKF_CLOSED 0x00100000
133 #define CAPKF_MWAIT 0x00200000
136 * Kernel caps message. The kernel keepps track of messagse received,
137 * undergoing processing by the service, and returned. User-supplied data
138 * is copied on reception rather then transmission.
140 typedef struct caps_kmsg
{
141 TAILQ_ENTRY(caps_kmsg
) km_node
;
142 caps_kinfo_t km_mcaps
; /* message sender */
143 struct xio km_xio
; /* mcaps user data */
144 struct caps_cred km_ccr
; /* caps cred for msg */
145 struct caps_msgid km_msgid
;
149 #define km_state km_msgid.c_state
151 #define CAPKMF_ONUSERQ 0x0001
152 #define CAPKMF_ONPENDQ 0x0002
153 #define CAPKMF_REPLY 0x0004
154 #define CAPKMF_CDONE 0x0008
155 #define CAPKMF_PEEKED 0x0010
156 #define CAPKMF_ABORTED 0x0020
165 void caps_exit(struct thread
*td
);
166 void caps_fork(struct proc
*p1
, struct proc
*p2
, int flags
);
171 * Userland API (libcaps)
173 caps_port_t
caps_service(const char *, uid_t
, gid_t
, mode_t
, int);
174 caps_port_t
caps_client(const char *, uid_t
, gid_t
, int);
179 int caps_sys_service(const char *, uid_t
, gid_t
, int, int);
180 int caps_sys_client(const char *, uid_t
, gid_t
, int, int);
181 off_t
caps_sys_put(int, void *, int);
182 int caps_sys_reply(int, void *, int, off_t
);
183 int caps_sys_get(int, void *, int, caps_msgid_t
, caps_cred_t
);
184 int caps_sys_wait(int, void *, int, caps_msgid_t
, caps_cred_t
);
185 int caps_sys_abort(int, off_t
, int);
186 int caps_sys_setgen(int, caps_gen_t
);
187 caps_gen_t
caps_sys_getgen(int);
188 int caps_sys_close(int);