kernel - Fix read event on file for select/poll API
[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.11 2007/02/26 21:41:08 corecode 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 proc;
95 struct caps_kmsg;
96
97 TAILQ_HEAD(caps_kmsg_queue, caps_kmsg);
98
99 /*
100  * caps_kinfo - Holds a client or service registration
101  *
102  * ci_msgpendq: holds the kernel copy of the message after it has been
103  *              sent to the local port.  The message is matched up against
104  *              replies and automatically replied if the owner closes its 
105  *              connection.
106  */
107 typedef struct caps_kinfo {
108         struct lwkt_port        ci_lport;       /* embedded local port */
109         struct caps_kinfo       *ci_tdnext;     /* per-process list */
110         struct caps_kinfo       *ci_hnext;      /* registration hash table */
111         struct thread           *ci_td;         /* owner */
112         struct caps_kmsg_queue  ci_msgpendq;    /* pending reply (just rcvd) */
113         struct caps_kmsg_queue  ci_msguserq;    /* pending reply (user holds) */
114         struct caps_kinfo       *ci_rcaps;      /* connected to remote */
115         int                     ci_cmsgcount;   /* client in-progress msgs */
116         int                     ci_id;
117         int                     ci_flags;
118         int                     ci_refs;
119         caps_type_t             ci_type;
120         caps_gen_t              ci_gen;
121         uid_t                   ci_uid;
122         gid_t                   ci_gid;
123         int                     ci_namelen;
124         char                    ci_name[4];     /* variable length */
125         /* ci_name must be last element */
126 } *caps_kinfo_t;
127
128 /* note: user flags are held in the low 16 bits */
129 #define CAPKF_TDLIST    0x00010000
130 #define CAPKF_HLIST     0x00020000
131 #define CAPKF_FLUSH     0x00040000
132 #define CAPKF_RCAPS     0x00080000
133 #define CAPKF_CLOSED    0x00100000
134 #define CAPKF_MWAIT     0x00200000
135
136 /*
137  * Kernel caps message.  The kernel keepps track of messagse received,
138  * undergoing processing by the service, and returned.  User-supplied data
139  * is copied on reception rather then transmission.
140  */
141 typedef struct caps_kmsg {
142         TAILQ_ENTRY(caps_kmsg)  km_node;
143         caps_kinfo_t            km_mcaps;       /* message sender */
144         struct xio              km_xio;         /* mcaps user data */
145         struct caps_cred        km_ccr;         /* caps cred for msg */
146         struct caps_msgid       km_msgid;
147         int                     km_flags;
148 } *caps_kmsg_t;
149
150 #define km_state        km_msgid.c_state
151
152 #define CAPKMF_ONUSERQ          0x0001
153 #define CAPKMF_ONPENDQ          0x0002
154 #define CAPKMF_REPLY            0x0004
155 #define CAPKMF_CDONE            0x0008
156 #define CAPKMF_PEEKED           0x0010
157 #define CAPKMF_ABORTED          0x0020
158
159 #endif
160
161 #ifdef _KERNEL
162
163 /*
164  * kernel support
165  */
166 void caps_exit(struct thread *td);
167 void caps_fork(struct thread *td1, struct thread *td2);
168
169 #else
170
171 /*
172  * Userland API (libcaps)
173  */
174 caps_port_t caps_service(const char *, uid_t, gid_t, mode_t, int);
175 caps_port_t caps_client(const char *, uid_t, gid_t, int);
176
177 /*
178  * Syscall API
179  */
180 int caps_sys_service(const char *, uid_t, gid_t, int, int);
181 int caps_sys_client(const char *, uid_t, gid_t, int, int);
182 off_t caps_sys_put(int, void *, int);
183 int caps_sys_reply(int, void *, int, off_t);
184 int caps_sys_get(int, void *, int, caps_msgid_t, caps_cred_t);
185 int caps_sys_wait(int, void *, int, caps_msgid_t, caps_cred_t);
186 int caps_sys_abort(int, off_t, int);
187 int caps_sys_setgen(int, caps_gen_t);
188 caps_gen_t caps_sys_getgen(int);
189 int caps_sys_close(int);
190
191 #endif
192
193 #endif
194