Change sendfile() to use the new m_ext callback scheme for cleaning up after
[dragonfly.git] / sys / sys / caps.h
... / ...
CommitLineData
1/*
2 * SYS/CAPS.H
3 *
4 * Implements an architecture independant Capability Service API
5 *
6 * $DragonFly: src/sys/sys/caps.h,v 1.8 2004/04/25 18:54:32 cpressey Exp $
7 */
8
9#ifndef _SYS_CAPS_H_
10#define _SYS_CAPS_H_
11
12#ifndef _SYS_TYPES_H_
13#include <sys/types.h>
14#endif
15#ifndef _SYS_MSGPORT_H_
16#include <sys/msgport.h>
17#endif
18#ifndef _SYS_XIO_H_
19#include <sys/xio.h>
20#endif
21
22typedef enum caps_msg_state {
23 CAPMS_REQUEST,
24 CAPMS_REQUEST_RETRY, /* internal / FUTURE */
25 CAPMS_REPLY,
26 CAPMS_REPLY_RETRY, /* internal / FUTURE */
27 CAPMS_DISPOSE
28} caps_msg_state_t;
29
30typedef struct caps_msgid {
31 off_t c_id;
32 caps_msg_state_t c_state;
33 int c_reserved01;
34} *caps_msgid_t;
35
36typedef enum caps_type {
37 CAPT_UNKNOWN, CAPT_CLIENT, CAPT_SERVICE, CAPT_REMOTE, CAPT_FORKED
38} caps_type_t;
39
40typedef int64_t caps_gen_t;
41
42/*
43 * Note: upper 16 bits reserved for kernel use
44 */
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 */
59
60/*
61 * Abort codes
62 */
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 */
67
68#define CAPF_ABORT_HARD 0x0001 /* rip out from under server (3) */
69
70#define CAPS_MAXGROUPS 16
71#define CAPS_MAXNAMELEN 64
72#define CAPS_MAXINPROG 128
73
74struct thread;
75
76typedef struct caps_port {
77 struct lwkt_port cp_lport;
78 int cp_portid; /* caps port id */
79 int cp_upcallid; /* upcall id */
80} *caps_port_t;
81
82typedef struct caps_cred {
83 pid_t pid;
84 uid_t uid;
85 uid_t euid;
86 gid_t gid;
87 int ngroups;
88 int cacheid;
89 gid_t groups[CAPS_MAXGROUPS];
90} *caps_cred_t;
91
92#if defined(_KERNEL) || defined(_KERNEL_STRUCTURES)
93
94struct caps_kmsg;
95
96TAILQ_HEAD(caps_kmsg_queue, caps_kmsg);
97
98/*
99 * caps_kinfo - Holds a client or service registration
100 *
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
104 * connection.
105 */
106typedef 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 */
115 int ci_id;
116 int ci_flags;
117 int ci_refs;
118 caps_type_t ci_type;
119 caps_gen_t ci_gen;
120 uid_t ci_uid;
121 gid_t ci_gid;
122 int ci_namelen;
123 char ci_name[4]; /* variable length */
124 /* ci_name must be last element */
125} *caps_kinfo_t;
126
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
134
135/*
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.
139 */
140typedef 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;
146 int km_flags;
147} *caps_kmsg_t;
148
149#define km_state km_msgid.c_state
150
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
157
158#endif
159
160#ifdef _KERNEL
161
162/*
163 * kernel support
164 */
165void caps_exit(struct thread *td);
166void caps_fork(struct proc *p1, struct proc *p2, int flags);
167
168#else
169
170/*
171 * Userland API (libcaps)
172 */
173caps_port_t caps_service(const char *, uid_t, gid_t, mode_t, int);
174caps_port_t caps_client(const char *, uid_t, gid_t, int);
175
176/*
177 * Syscall API
178 */
179int caps_sys_service(const char *, uid_t, gid_t, int, int);
180int caps_sys_client(const char *, uid_t, gid_t, int, int);
181off_t caps_sys_put(int, void *, int);
182int caps_sys_reply(int, void *, int, off_t);
183int caps_sys_get(int, void *, int, caps_msgid_t, caps_cred_t);
184int caps_sys_wait(int, void *, int, caps_msgid_t, caps_cred_t);
185int caps_sys_abort(int, off_t, int);
186int caps_sys_setgen(int, caps_gen_t);
187caps_gen_t caps_sys_getgen(int);
188int caps_sys_close(int);
189
190#endif
191
192#endif
193