1 /* PortableXDR - a free, portable XDR implementation.
2 * Copyright (C) 2009 Red Hat Inc.
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19 /* xdr_int8_t, xdr_uint8_t, xdr_int16_t, xdr_uint16_t, xdr_int32_t,
20 * xdr_uint32_t, xdr_int64_t and xdr_uint64_t functions:
22 * Copyright (c) 1998, 1999, 2000, 2004, 2005 Free Software Foundation, Inc.
23 * This file is part of the GNU C Library.
24 * Contributed by Thorsten Kukuk <kukuk@vt.uni-paderborn.de>, 1998.
26 * (Under the same license as above).
29 #ifndef PORTABLEXDR_XDR_H
30 #define PORTABLEXDR_XDR_H
32 #include <rpc/types.h>
33 #include <rpc/xdr_internal.h>
40 /* Please read the documentation that comes with PortableXDR,
41 * otherwise you won't understand how to use the xdr_* conversion
44 typedef bool_t (*xdrproc_t) ();
45 #define NULL_xdrproc_t NULL
47 /* XDR procedures for the basic types. */
49 xdr_void (XDR *xdrs ATTRIBUTE_UNUSED, void *vp ATTRIBUTE_UNUSED)
55 xdr_bool (XDR *xdrs, bool_t *p)
60 i = *p ? TRUE : FALSE;
61 return xdr_putlong (xdrs, &i);
63 if (!xdr_getlong (xdrs, &i)) return FALSE;
64 *p = i ? TRUE : FALSE;
73 /* XDR 64bit integers */
75 xdr_int64_t (XDR *xdrs, int64_t *ip)
82 t1 = (int32_t) ((*ip) >> 32);
84 return (XDR_PUTINT32(xdrs, &t1) && XDR_PUTINT32(xdrs, &t2));
86 if (!XDR_GETINT32(xdrs, &t1) || !XDR_GETINT32(xdrs, &t2))
88 *ip = ((int64_t) t1) << 32;
89 *ip |= (uint32_t) t2; /* Avoid sign extension. */
98 /* XDR 64bit unsigned integers */
100 xdr_uint64_t (XDR *xdrs, uint64_t *uip)
108 t1 = (uint32_t) ((*uip) >> 32);
109 t2 = (uint32_t) (*uip);
110 return (XDR_PUTINT32 (xdrs, (int32_t *) &t1) &&
111 XDR_PUTINT32(xdrs, (int32_t *) &t2));
113 if (!XDR_GETINT32(xdrs, (int32_t *) &t1) ||
114 !XDR_GETINT32(xdrs, (int32_t *) &t2))
116 *uip = ((uint64_t) t1) << 32;
126 /* XDR 32bit integers */
128 xdr_int32_t (XDR *xdrs, int32_t *lp)
133 return XDR_PUTINT32 (xdrs, lp);
135 return XDR_GETINT32 (xdrs, lp);
143 /* XDR 32bit unsigned integers */
145 xdr_uint32_t (XDR *xdrs, uint32_t *ulp)
150 return XDR_PUTINT32 (xdrs, (int32_t *) ulp);
152 return XDR_GETINT32 (xdrs, (int32_t *) ulp);
160 /* XDR 16bit integers */
162 xdr_int16_t (XDR *xdrs, int16_t *ip)
170 return XDR_PUTINT32 (xdrs, &t);
172 if (!XDR_GETINT32 (xdrs, &t))
183 /* XDR 16bit unsigned integers */
185 xdr_uint16_t (XDR *xdrs, uint16_t *uip)
192 ut = (uint32_t) *uip;
193 return XDR_PUTINT32 (xdrs, (int32_t *) &ut);
195 if (!XDR_GETINT32 (xdrs, (int32_t *) &ut))
197 *uip = (uint16_t) ut;
206 /* XDR 8bit integers */
208 xdr_int8_t (XDR *xdrs, int8_t *ip)
216 return XDR_PUTINT32 (xdrs, &t);
218 if (!XDR_GETINT32 (xdrs, &t))
229 /* XDR 8bit unsigned integers */
231 xdr_uint8_t (XDR *xdrs, uint8_t *uip)
238 ut = (uint32_t) *uip;
239 return XDR_PUTINT32 (xdrs, (int32_t *) &ut);
241 if (!XDR_GETINT32 (xdrs, (int32_t *) &ut))
254 xdr_float (XDR *xdrs, float *p)
260 xdr_double (XDR *xdrs, double *p)
266 /* Some very common aliases for the basic integer functions. */
267 #define xdr_int xdr_int32_t
268 #define xdr_u_int xdr_uint32_t
269 #define xdr_long xdr_int32_t
270 #define xdr_u_long xdr_uint32_t
272 #define xdr_short xdr_int16_t
273 #define xdr_u_short xdr_uint16_t
275 /* NB: In PortableXDR, char is ALWAYS treated as signed octet. */
276 #define xdr_char xdr_int8_t
277 #define xdr_u_char xdr_uint8_t
280 #define xdr_hyper xdr_int64_t
281 #define xdr_u_hyper xdr_uint64_t
282 #define xdr_quad xdr_int64_t
283 #define xdr_u_quad xdr_uint64_t
288 xdr_enum (XDR *xdrs, enum_t *ep)
290 return xdr_int32_t (xdrs, ep);
293 /* Union with discriminator. */
294 extern bool_t xdr_union (XDR *xdrs, enum_t *discrim, void *p, struct xdr_discrim *choices, xdrproc_t default_proc);
296 /* Variable-size array of arbitrary elements. */
297 extern bool_t xdr_array (XDR *xdrs, void *p, size_t num_elements, size_t max_elements, size_t element_size, xdrproc_t element_proc);
299 /* Fixed-size array of arbitrary elements. */
300 extern bool_t xdr_vector (XDR *xdrs, void *p, size_t num_elements, size_t element_size, xdrproc_t element_size);
302 /* Variable-size array of bytes. */
303 extern bool_t xdr_bytes (XDR *xdrs, char **bytes, size_t num_bytes, size_t max_bytes);
305 /* Fixed-size array of bytes. */
306 extern bool_t xdr_opaque (XDR *xdrs, void *p, size_t num_bytes);
308 /* Variable-size string (handled as normal C string in the program, but
309 * serialized as length + bytes).
311 extern bool_t xdr_string (XDR *xdrs, char **str, size_t max_bytes);
313 #define xdr_wrapstring(xdrs,str) (xdr_string ((xdrs),(str),~0))
316 /* A reference is a pointer which cannot be NULL. */
318 xdr_reference (XDR *xdrs, void **p, size_t size, xdrproc_t proc)
323 /* A pointer is a pointer to an object that can be NULL. It is
324 * serialized as a boolean (TRUE = not null, FALSE = null), followed
328 xdr_pointer (XDR *xdrs, void **p, size_t size, xdrproc_t proc)
334 /* Free an XDR object (recursively). */
335 extern void xdr_free (xdrproc_t, void *);
337 /* Construct an XDR stream from an in-memory buffer. */
338 extern void xdrmem_create (XDR *xdrs, void *p, size_t size, enum xdr_op);
340 /* Construct an XDR stream from a FILE* or file descriptor. Note
341 * that neither of these will close the underlying file.
343 extern void xdrstdio_create (XDR *xdrs, FILE *, enum xdr_op);
344 extern void xdrfd_create (XDR *xdrs, int fd, enum xdr_op);
346 /* PortableXDR variations which allow you to close the underlying
349 #define XDR_CLOSE_FILE 1
351 extern void xdrstdio_create2 (XDR *xdrs, FILE *, enum xdr_op, uint32_t flags);
352 extern void xdrfd_create2 (XDR *xdrs, int fd, enum xdr_op, uint32_t flags);
355 Does anyone ever use these? Contributions welcome.
356 extern void xdrrec_create (...);
357 extern bool_t xdrrec_endofrecord (...);
358 extern bool_t xdrrec_skiprecord (...);
359 extern bool_t xdrrec_eof (...);
366 #endif /* PORTABLEXDR_XDR_H */