1 /* 2 * SYS/CAPS.H 3 * 4 * Implements an architecture independant Capability Service API 5 * 6 * $DragonFly: src/sys/sys/caps.h,v 1.1 2003/11/24 21:15:54 dillon 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 19 #define CAPS_USER 0x00000001 20 #define CAPS_GROUP 0x00000002 21 #define CAPS_WORLD 0x00000004 22 #define CAPS_EXCL 0x00000008 23 #define CAPS_ANYCLIENT (CAPS_USER|CAPS_GROUP|CAPS_WORLD) 24 #define CAPS_WCRED 0x00000010 /* waiting for cred */ 25 26 /* 27 * caps_type associated with caps_port: 28 * 29 * CAPT_CLIENT port returned to client representing connection to 30 * service. 31 * CAPT_SERVICE port returned to service representing namespace 32 * CAPT_REMOTE temporary port used by service to represent 33 * client connections to service (set as replyport for 34 * messages) 35 * 36 */ 37 enum caps_type { CAPT_UNKNOWN, CAPT_CLIENT, CAPT_SERVICE, CAPT_REMOTE }; 38 39 #define CAPS_MAXGROUPS 16 40 41 struct thread; 42 struct caps_port; 43 44 typedef struct caps_port *caps_port_t; 45 46 struct caps_cred { 47 pid_t pid; 48 uid_t uid; 49 uid_t euid; 50 gid_t gid; 51 int ngroups; 52 gid_t groups[CAPS_MAXGROUPS]; 53 }; 54 55 struct caps_port { 56 struct lwkt_port lport; 57 caps_port_t server; /* if CAPT_REMOTE, pointer to server */ 58 enum caps_type type; 59 int kqfd; /* kqueue to collect active connects */ 60 int lfd; /* server: listening on (server) */ 61 int cfd; /* client/remote connection fd */ 62 int flags; 63 TAILQ_HEAD(, caps_port) clist; /* server: client client connections */ 64 TAILQ_ENTRY(caps_port) centry; 65 TAILQ_HEAD(, lwkt_msg) wlist; /* queue of outgoing messages */ 66 TAILQ_HEAD(, lwkt_msg) mlist; /* written message waiting for reply */ 67 struct lwkt_msg rmsg_static; 68 lwkt_msg_t rmsg; /* read message in progress */ 69 struct caps_cred cred; /* cred of owner of port */ 70 int rbytes; /* read in progress byte count */ 71 int wbytes; /* write in progress byte count */ 72 }; 73 74 #define CAPPF_WAITCRED 0x0001 75 #define CAPPF_ONLIST 0x0002 76 #define CAPPF_WREQUESTED 0x0004 /* write event requested */ 77 #define CAPPF_SHUTDOWN 0x0008 /* terminated/failed */ 78 79 #define CAPMSG_MAXSIZE (1024+64*1024) 80 81 /* 82 * API 83 */ 84 caps_port_t caps_service(const char *name, gid_t gid, mode_t modes, int flags); 85 caps_port_t caps_client(const char *name, uid_t uid, int flags); 86 87 /* 88 * Temporary hack until LWKT threading is integrated. 89 */ 90 void *caps_client_waitreply(caps_port_t port, lwkt_msg_t msg); 91 92 #endif 93 94