Change sendfile() to use the new m_ext callback scheme for cleaning up after
[dragonfly.git] / sys / sys / caps.h
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
22 typedef 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
30 typedef struct caps_msgid {
31         off_t                   c_id;
32         caps_msg_state_t        c_state;
33         int                     c_reserved01;
34 } *caps_msgid_t;
35
36 typedef enum caps_type { 
37         CAPT_UNKNOWN, CAPT_CLIENT, CAPT_SERVICE, CAPT_REMOTE, CAPT_FORKED
38 } caps_type_t;
39
40 typedef 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
74 struct thread;
75
76 typedef 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
82 typedef 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
94 struct caps_kmsg;
95
96 TAILQ_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  */
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 */
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  */
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;
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  */
165 void caps_exit(struct thread *td);
166 void caps_fork(struct proc *p1, struct proc *p2, int flags);
167
168 #else
169
170 /*
171  * Userland API (libcaps)
172  */
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);
175
176 /*
177  * Syscall API
178  */
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);
189
190 #endif
191
192 #endif
193