Annotation of src/sys/sys/caps.h, revision 1.8

1.1       dillon      1: /*
                      2:  * SYS/CAPS.H
                      3:  *
                      4:  *     Implements an architecture independant Capability Service API
                      5:  * 
                      6:  * $DragonFly$
                      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
1.7       dillon     18: #ifndef _SYS_XIO_H_
                     19: #include <sys/xio.h>
                     20: #endif
1.1       dillon     21: 
1.2       dillon     22: typedef enum caps_msg_state { 
                     23:        CAPMS_REQUEST, 
                     24:        CAPMS_REQUEST_RETRY,    /* internal / FUTURE */
                     25:        CAPMS_REPLY, 
1.6       hmp        26:        CAPMS_REPLY_RETRY,      /* internal / FUTURE */
1.2       dillon     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;
1.1       dillon     35: 
1.3       dillon     36: typedef enum caps_type { 
1.5       dillon     37:        CAPT_UNKNOWN, CAPT_CLIENT, CAPT_SERVICE, CAPT_REMOTE, CAPT_FORKED
1.3       dillon     38: } caps_type_t;
                     39: 
1.5       dillon     40: typedef int64_t        caps_gen_t;
                     41: 
1.1       dillon     42: /*
1.2       dillon     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 */
1.5       dillon     52: #define CAPF_NOFORK    0x0020  /* do not create a dummy entry on fork */
                     53: #define CAPF_WAITSVC   0x0040  /* block if service not available */
1.2       dillon     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
1.1       dillon     62:  */
1.2       dillon     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) */
1.1       dillon     69: 
                     70: #define CAPS_MAXGROUPS 16
1.2       dillon     71: #define CAPS_MAXNAMELEN        64
                     72: #define CAPS_MAXINPROG 128
1.1       dillon     73: 
                     74: struct thread;
                     75: 
1.2       dillon     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;
1.1       dillon     81: 
1.2       dillon     82: typedef struct caps_cred {
1.1       dillon     83:        pid_t                   pid;
                     84:        uid_t                   uid;
                     85:        uid_t                   euid;
                     86:        gid_t                   gid;
                     87:        int                     ngroups;
1.2       dillon     88:        int                     cacheid;
1.1       dillon     89:        gid_t                   groups[CAPS_MAXGROUPS];
1.2       dillon     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.
1.1       dillon    105:  */
1.2       dillon    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;
1.5       dillon    119:        caps_gen_t              ci_gen;
1.2       dillon    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
1.1       dillon    134: 
                    135: /*
1.2       dillon    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.
1.1       dillon    139:  */
1.2       dillon    140: typedef struct caps_kmsg {
                    141:        TAILQ_ENTRY(caps_kmsg)  km_node;
                    142:        caps_kinfo_t            km_mcaps;       /* message sender */
1.7       dillon    143:        struct xio              km_xio;         /* mcaps user data */
1.2       dillon    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);
1.5       dillon    166: void caps_fork(struct proc *p1, struct proc *p2, int flags);
1.2       dillon    167: 
                    168: #else
                    169: 
                    170: /*
                    171:  * Userland API (libcaps)
                    172:  */
1.4       joerg     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);
1.2       dillon    175: 
                    176: /*
                    177:  * Syscall API
                    178:  */
1.4       joerg     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);
1.5       dillon    186: int caps_sys_setgen(int, caps_gen_t);
                    187: caps_gen_t caps_sys_getgen(int);
1.8     ! cpressey  188: int caps_sys_close(int);
1.2       dillon    189: 
                    190: #endif
1.1       dillon    191: 
                    192: #endif
                    193: