regen
[dragonfly.git] / lib / libcaps / caps_struct.h
1 /*
2  * CAPS_STRUCT.H
3  *
4  * Copyright (c) 2003 Matthew Dillon <dillon@backplane.com>
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26  * SUCH DAMAGE.
27  *
28  * $DragonFly: src/lib/libcaps/caps_struct.h,v 1.1 2004/03/07 23:36:44 dillon Exp $
29  */
30 #include <sys/endian.h>
31
32 struct caps_label;
33 struct caps_struct;
34 struct caps_msgbuf;
35
36 typedef const struct caps_label *caps_label_t;
37 typedef const struct caps_struct *caps_struct_t;
38 typedef struct caps_msgbuf *caps_msgbuf_t;
39
40 typedef u_int32_t caps_fid_t;
41
42 struct caps_label {
43     int offset;
44     int type;
45     int size;                   /* element size for array[1] */
46     caps_fid_t fid;
47     int nary;                   /* can be 0 or 1 to indicate 1 element */
48     caps_struct_t csinfo;       /* if embedded structure */
49 };
50
51 struct caps_struct {
52     char *name;
53     const caps_label_t labels;
54 };
55
56 struct caps_msgbuf {
57     u_int8_t *base;
58     int index;
59     int bufsize;
60     int error;
61 };
62
63 #define CAPS_OPF_PTR            0x0100
64
65 #define CAPS_OP_INT_T           1
66 #define CAPS_OP_UINT_T          2
67 #define CAPS_OP_STRBUF_T        3
68 #define CAPS_OP_STRPTR_T        (3|CAPS_OPF_PTR)
69 #define CAPS_OP_OPAQUE_T        4
70
71 /*
72  * Note: signed/unsignedness may not reflect the actual type.  Instead it
73  * reflects our casting policy if the client and server are using different
74  * integer sizes for any given field.
75  */
76 #define CAPS_IN_INT_T           CAPS_OP_INT_T, sizeof(int)
77 #define CAPS_IN_INT8_T          CAPS_OP_INT_T, sizeof(int8_t)
78 #define CAPS_IN_INT16_T         CAPS_OP_INT_T, sizeof(int16_t)
79 #define CAPS_IN_INT32_T         CAPS_OP_INT_T, sizeof(int32_t)
80 #define CAPS_IN_LONG_T          CAPS_OP_INT_T, sizeof(long)
81 #define CAPS_IN_INT64_T         CAPS_OP_INT_T, sizeof(int64_t)
82
83 #define CAPS_IN_UINT_T          CAPS_OP_INT_T, sizeof(u_int)
84 #define CAPS_IN_UINT8_T         CAPS_OP_INT_T, sizeof(u_int8_t)
85 #define CAPS_IN_UINT16_T        CAPS_OP_INT_T, sizeof(u_int16_t)
86 #define CAPS_IN_UINT32_T        CAPS_OP_INT_T, sizeof(u_int32_t)
87 #define CAPS_IN_ULONG_T         CAPS_OP_INT_T, sizeof(u_long)
88 #define CAPS_IN_UINT64_T        CAPS_OP_INT_T, sizeof(u_int64_t)
89
90 #define CAPS_IN_STRPTR_T        CAPS_OP_STRPTR_T, 0
91 #define CAPS_IN_STRBUF_T(n)     CAPS_OP_STRBUF_T, (n)
92 #define CAPS_IN_UID_T           CAPS_OP_INT_T, sizeof(uid_t)
93 #define CAPS_IN_GID_T           CAPS_OP_INT_T, sizeof(gid_t)
94 #define CAPS_IN_TIME_T          CAPS_OP_UINT_T, sizeof(time_t)
95 #define CAPS_IN_OFF_T           CAPS_OP_INT_T, sizeof(off_t)
96 #define CAPS_IN_SIZE_T          CAPS_OP_UINT_T, sizeof(size_t)
97 #define CAPS_IN_SSIZE_T         CAPS_OP_INT_T, sizeof(ssize_t)
98
99 static __inline
100 u_int8_t
101 caps_msgbuf_getc(caps_msgbuf_t msg)
102 {
103     u_int8_t c = 0;
104
105     if (msg->index < msg->bufsize)
106         c = msg->base[msg->index];
107     ++msg->index;
108     return(c);          /* always bumped */
109 }
110
111 static __inline
112 void
113 caps_msgbuf_putc(caps_msgbuf_t msg, u_int8_t c)
114 {
115     if (msg->index < msg->bufsize) {
116         msg->base[msg->index] = c;
117     }
118     ++msg->index;       /* always bumped */
119 }
120
121 extern const struct caps_struct caps_passwd_struct;
122
123 int caps_encode(void *buf, int bytes, void *data, caps_struct_t cs);
124 int caps_decode(const void *buf, int bytes, void *data, caps_struct_t cs, int *error);
125 void caps_struct_free_pointers(void *data, caps_struct_t cs);
126 void caps_array_free_pointers(void *data, caps_label_t label);
127
128 void caps_init_msgbuf(caps_msgbuf_t msg, void *data, int size);
129 void caps_msgbuf_error(caps_msgbuf_t msg, int eno, int undo);
130 u_int8_t caps_msgbuf_getclass(caps_msgbuf_t msg, u_int8_t **pptr, int *plen);
131 void caps_msgbuf_printf(caps_msgbuf_t msg, const char *ctl, ...);
132
133 void caps_msg_encode_structure(caps_msgbuf_t msg, void *data, caps_struct_t cs);
134 void caps_msg_encode_array(caps_msgbuf_t msg, void *data, caps_label_t label);
135 void caps_msg_encode_data(caps_msgbuf_t msg, void *data, int type, int size);
136 void caps_msg_decode_structure(caps_msgbuf_t msg, void *data, caps_struct_t cs);
137 void caps_msg_decode_array(caps_msgbuf_t msg, void *data, int nary, caps_label_t label);
138 void caps_msg_decode_data(char *ptr, int len, void *data, int type, int size);
139