4 * Copyright (c) 2003 Matthew Dillon <dillon@backplane.com>
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
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.
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
28 * $DragonFly: src/lib/libcaps/caps_struct.h,v 1.1 2004/03/07 23:36:44 dillon Exp $
30 #include <sys/endian.h>
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
;
40 typedef u_int32_t caps_fid_t
;
45 int size
; /* element size for array[1] */
47 int nary
; /* can be 0 or 1 to indicate 1 element */
48 caps_struct_t csinfo
; /* if embedded structure */
53 const caps_label_t labels
;
63 #define CAPS_OPF_PTR 0x0100
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
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.
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)
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)
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)
101 caps_msgbuf_getc(caps_msgbuf_t msg
)
105 if (msg
->index
< msg
->bufsize
)
106 c
= msg
->base
[msg
->index
];
108 return(c
); /* always bumped */
113 caps_msgbuf_putc(caps_msgbuf_t msg
, u_int8_t c
)
115 if (msg
->index
< msg
->bufsize
) {
116 msg
->base
[msg
->index
] = c
;
118 ++msg
->index
; /* always bumped */
121 extern const struct caps_struct caps_passwd_struct
;
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
);
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
, ...);
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
);