The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/rpc/xdr.h

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*      $NetBSD: xdr.h,v 1.19 2000/07/17 05:00:45 matt Exp $    */
    2 
    3 /*-
    4  * Copyright (c) 2009, Sun Microsystems, Inc.
    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 are met:
    9  * - Redistributions of source code must retain the above copyright notice, 
   10  *   this list of conditions and the following disclaimer.
   11  * - Redistributions in binary form must reproduce the above copyright notice, 
   12  *   this list of conditions and the following disclaimer in the documentation 
   13  *   and/or other materials provided with the distribution.
   14  * - Neither the name of Sun Microsystems, Inc. nor the names of its 
   15  *   contributors may be used to endorse or promote products derived 
   16  *   from this software without specific prior written permission.
   17  * 
   18  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
   19  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
   20  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
   21  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 
   22  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
   23  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
   24  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
   25  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
   26  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
   27  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
   28  * POSSIBILITY OF SUCH DAMAGE.
   29  *
   30  *      from: @(#)xdr.h 1.19 87/04/22 SMI
   31  *      from: @(#)xdr.h 2.2 88/07/29 4.0 RPCSRC
   32  * $FreeBSD$
   33  */
   34 
   35 /*
   36  * xdr.h, External Data Representation Serialization Routines.
   37  *
   38  * Copyright (C) 1984, Sun Microsystems, Inc.
   39  */
   40 
   41 #ifndef _KRPC_XDR_H
   42 #define _KRPC_XDR_H
   43 #include <sys/cdefs.h>
   44 
   45 /*
   46  * XDR provides a conventional way for converting between C data
   47  * types and an external bit-string representation.  Library supplied
   48  * routines provide for the conversion on built-in C data types.  These
   49  * routines and utility routines defined here are used to help implement
   50  * a type encode/decode routine for each user-defined type.
   51  *
   52  * Each data type provides a single procedure which takes two arguments:
   53  *
   54  *      bool_t
   55  *      xdrproc(xdrs, argresp)
   56  *              XDR *xdrs;
   57  *              <type> *argresp;
   58  *
   59  * xdrs is an instance of a XDR handle, to which or from which the data
   60  * type is to be converted.  argresp is a pointer to the structure to be
   61  * converted.  The XDR handle contains an operation field which indicates
   62  * which of the operations (ENCODE, DECODE * or FREE) is to be performed.
   63  *
   64  * XDR_DECODE may allocate space if the pointer argresp is null.  This
   65  * data can be freed with the XDR_FREE operation.
   66  *
   67  * We write only one procedure per data type to make it easy
   68  * to keep the encode and decode procedures for a data type consistent.
   69  * In many cases the same code performs all operations on a user defined type,
   70  * because all the hard work is done in the component type routines.
   71  * decode as a series of calls on the nested data types.
   72  */
   73 
   74 /*
   75  * Xdr operations.  XDR_ENCODE causes the type to be encoded into the
   76  * stream.  XDR_DECODE causes the type to be extracted from the stream.
   77  * XDR_FREE can be used to release the space allocated by an XDR_DECODE
   78  * request.
   79  */
   80 enum xdr_op {
   81         XDR_ENCODE=0,
   82         XDR_DECODE=1,
   83         XDR_FREE=2
   84 };
   85 
   86 /*
   87  * This is the number of bytes per unit of external data.
   88  */
   89 #define BYTES_PER_XDR_UNIT      (4)
   90 #define RNDUP(x)  ((((x) + BYTES_PER_XDR_UNIT - 1) / BYTES_PER_XDR_UNIT) \
   91                     * BYTES_PER_XDR_UNIT)
   92 
   93 /*
   94  * The XDR handle.
   95  * Contains operation which is being applied to the stream,
   96  * an operations vector for the particular implementation (e.g. see xdr_mem.c),
   97  * and two private fields for the use of the particular implementation.
   98  */
   99 typedef struct XDR {
  100         enum xdr_op     x_op;           /* operation; fast additional param */
  101         const struct xdr_ops {
  102                 /* get a long from underlying stream */
  103                 bool_t  (*x_getlong)(struct XDR *, long *);
  104                 /* put a long to " */
  105                 bool_t  (*x_putlong)(struct XDR *, const long *);
  106                 /* get some bytes from " */
  107                 bool_t  (*x_getbytes)(struct XDR *, char *, u_int);
  108                 /* put some bytes to " */
  109                 bool_t  (*x_putbytes)(struct XDR *, const char *, u_int);
  110                 /* returns bytes off from beginning */
  111                 u_int   (*x_getpostn)(struct XDR *);
  112                 /* lets you reposition the stream */
  113                 bool_t  (*x_setpostn)(struct XDR *, u_int);
  114                 /* buf quick ptr to buffered data */
  115                 int32_t *(*x_inline)(struct XDR *, u_int);
  116                 /* free privates of this xdr_stream */
  117                 void    (*x_destroy)(struct XDR *);
  118                 bool_t  (*x_control)(struct XDR *, int, void *);
  119         } *x_ops;
  120         char *          x_public;       /* users' data */
  121         void *          x_private;      /* pointer to private data */
  122         char *          x_base;         /* private used for position info */
  123         u_int           x_handy;        /* extra private word */
  124 } XDR;
  125 
  126 /*
  127  * A xdrproc_t exists for each data type which is to be encoded or decoded.
  128  *
  129  * The second argument to the xdrproc_t is a pointer to an opaque pointer.
  130  * The opaque pointer generally points to a structure of the data type
  131  * to be decoded.  If this pointer is 0, then the type routines should
  132  * allocate dynamic storage of the appropriate size and return it.
  133  */
  134 #ifdef _KERNEL
  135 typedef bool_t (*xdrproc_t)(XDR *, void *, ...);
  136 #else
  137 /*
  138  * XXX can't actually prototype it, because some take three args!!!
  139  */
  140 typedef bool_t (*xdrproc_t)(XDR *, ...);
  141 #endif
  142 
  143 /*
  144  * Operations defined on a XDR handle
  145  *
  146  * XDR          *xdrs;
  147  * long         *longp;
  148  * char *        addr;
  149  * u_int         len;
  150  * u_int         pos;
  151  */
  152 #define XDR_GETLONG(xdrs, longp)                        \
  153         (*(xdrs)->x_ops->x_getlong)(xdrs, longp)
  154 #define xdr_getlong(xdrs, longp)                        \
  155         (*(xdrs)->x_ops->x_getlong)(xdrs, longp)
  156 
  157 #define XDR_PUTLONG(xdrs, longp)                        \
  158         (*(xdrs)->x_ops->x_putlong)(xdrs, longp)
  159 #define xdr_putlong(xdrs, longp)                        \
  160         (*(xdrs)->x_ops->x_putlong)(xdrs, longp)
  161 
  162 static __inline int
  163 xdr_getint32(XDR *xdrs, int32_t *ip)
  164 {
  165         long l;
  166 
  167         if (!xdr_getlong(xdrs, &l))
  168                 return (FALSE);
  169         *ip = (int32_t)l;
  170         return (TRUE);
  171 }
  172 
  173 static __inline int
  174 xdr_putint32(XDR *xdrs, int32_t *ip)
  175 {
  176         long l;
  177 
  178         l = (long)*ip;
  179         return xdr_putlong(xdrs, &l);
  180 }
  181 
  182 #define XDR_GETINT32(xdrs, int32p)      xdr_getint32(xdrs, int32p)
  183 #define XDR_PUTINT32(xdrs, int32p)      xdr_putint32(xdrs, int32p)
  184 
  185 #define XDR_GETBYTES(xdrs, addr, len)                   \
  186         (*(xdrs)->x_ops->x_getbytes)(xdrs, addr, len)
  187 #define xdr_getbytes(xdrs, addr, len)                   \
  188         (*(xdrs)->x_ops->x_getbytes)(xdrs, addr, len)
  189 
  190 #define XDR_PUTBYTES(xdrs, addr, len)                   \
  191         (*(xdrs)->x_ops->x_putbytes)(xdrs, addr, len)
  192 #define xdr_putbytes(xdrs, addr, len)                   \
  193         (*(xdrs)->x_ops->x_putbytes)(xdrs, addr, len)
  194 
  195 #define XDR_GETPOS(xdrs)                                \
  196         (*(xdrs)->x_ops->x_getpostn)(xdrs)
  197 #define xdr_getpos(xdrs)                                \
  198         (*(xdrs)->x_ops->x_getpostn)(xdrs)
  199 
  200 #define XDR_SETPOS(xdrs, pos)                           \
  201         (*(xdrs)->x_ops->x_setpostn)(xdrs, pos)
  202 #define xdr_setpos(xdrs, pos)                           \
  203         (*(xdrs)->x_ops->x_setpostn)(xdrs, pos)
  204 
  205 #define XDR_INLINE(xdrs, len)                           \
  206         (*(xdrs)->x_ops->x_inline)(xdrs, len)
  207 #define xdr_inline(xdrs, len)                           \
  208         (*(xdrs)->x_ops->x_inline)(xdrs, len)
  209 
  210 #define XDR_DESTROY(xdrs)                               \
  211         if ((xdrs)->x_ops->x_destroy)                   \
  212                 (*(xdrs)->x_ops->x_destroy)(xdrs)
  213 #define xdr_destroy(xdrs)                               \
  214         if ((xdrs)->x_ops->x_destroy)                   \
  215                 (*(xdrs)->x_ops->x_destroy)(xdrs)
  216 
  217 #define XDR_CONTROL(xdrs, req, op)                      \
  218         (((xdrs)->x_ops->x_control == NULL) ? (FALSE) : \
  219                 (*(xdrs)->x_ops->x_control)(xdrs, req, op))
  220 #define xdr_control(xdrs, req, op) XDR_CONTROL(xdrs, req, op)
  221 
  222 /*
  223  * Solaris strips the '_t' from these types -- not sure why.
  224  * But, let's be compatible.
  225  */
  226 #define xdr_rpcvers(xdrs, versp) xdr_uint32_t(xdrs, versp)
  227 #define xdr_rpcprog(xdrs, progp) xdr_uint32_t(xdrs, progp)
  228 #define xdr_rpcproc(xdrs, procp) xdr_uint32_t(xdrs, procp)
  229 #define xdr_rpcprot(xdrs, protp) xdr_uint32_t(xdrs, protp)
  230 #define xdr_rpcport(xdrs, portp) xdr_uint32_t(xdrs, portp)
  231 
  232 /*
  233  * Support struct for discriminated unions.
  234  * You create an array of xdrdiscrim structures, terminated with
  235  * an entry with a null procedure pointer.  The xdr_union routine gets
  236  * the discriminant value and then searches the array of structures
  237  * for a matching value.  If a match is found the associated xdr routine
  238  * is called to handle that part of the union.  If there is
  239  * no match, then a default routine may be called.
  240  * If there is no match and no default routine it is an error.
  241  */
  242 #define NULL_xdrproc_t ((xdrproc_t)0)
  243 struct xdr_discrim {
  244         int     value;
  245         xdrproc_t proc;
  246 };
  247 
  248 /*
  249  * In-line routines for fast encode/decode of primitive data types.
  250  * Caveat emptor: these use single memory cycles to get the
  251  * data from the underlying buffer, and will fail to operate
  252  * properly if the data is not aligned.  The standard way to use these
  253  * is to say:
  254  *      if ((buf = XDR_INLINE(xdrs, count)) == NULL)
  255  *              return (FALSE);
  256  *      <<< macro calls >>>
  257  * where ``count'' is the number of bytes of data occupied
  258  * by the primitive data types.
  259  *
  260  * N.B. and frozen for all time: each data type here uses 4 bytes
  261  * of external representation.
  262  */
  263 #define IXDR_GET_INT32(buf)             ((int32_t)__ntohl((uint32_t)*(buf)++))
  264 #define IXDR_PUT_INT32(buf, v)          (*(buf)++ =(int32_t)__htonl((uint32_t)v))
  265 #define IXDR_GET_U_INT32(buf)           ((uint32_t)IXDR_GET_INT32(buf))
  266 #define IXDR_PUT_U_INT32(buf, v)        IXDR_PUT_INT32((buf), ((int32_t)(v)))
  267 
  268 #define IXDR_GET_UINT32(buf)            ((uint32_t)IXDR_GET_INT32(buf))
  269 #define IXDR_PUT_UINT32(buf, v)         IXDR_PUT_INT32((buf), ((int32_t)(v)))
  270 
  271 #define IXDR_GET_LONG(buf)              ((long)__ntohl((uint32_t)*(buf)++))
  272 #define IXDR_PUT_LONG(buf, v)           (*(buf)++ =(int32_t)__htonl((uint32_t)v))
  273 
  274 #define IXDR_GET_BOOL(buf)              ((bool_t)IXDR_GET_LONG(buf))
  275 #define IXDR_GET_ENUM(buf, t)           ((t)IXDR_GET_LONG(buf))
  276 #define IXDR_GET_U_LONG(buf)            ((u_long)IXDR_GET_LONG(buf))
  277 #define IXDR_GET_SHORT(buf)             ((short)IXDR_GET_LONG(buf))
  278 #define IXDR_GET_U_SHORT(buf)           ((u_short)IXDR_GET_LONG(buf))
  279 
  280 #define IXDR_PUT_BOOL(buf, v)           IXDR_PUT_LONG((buf), (v))
  281 #define IXDR_PUT_ENUM(buf, v)           IXDR_PUT_LONG((buf), (v))
  282 #define IXDR_PUT_U_LONG(buf, v)         IXDR_PUT_LONG((buf), (v))
  283 #define IXDR_PUT_SHORT(buf, v)          IXDR_PUT_LONG((buf), (v))
  284 #define IXDR_PUT_U_SHORT(buf, v)        IXDR_PUT_LONG((buf), (v))
  285 
  286 /*
  287  * These are the "generic" xdr routines.
  288  */
  289 __BEGIN_DECLS
  290 extern bool_t   xdr_void(void);
  291 extern bool_t   xdr_int(XDR *, int *);
  292 extern bool_t   xdr_u_int(XDR *, u_int *);
  293 extern bool_t   xdr_long(XDR *, long *);
  294 extern bool_t   xdr_u_long(XDR *, u_long *);
  295 extern bool_t   xdr_short(XDR *, short *);
  296 extern bool_t   xdr_u_short(XDR *, u_short *);
  297 extern bool_t   xdr_int16_t(XDR *, int16_t *);
  298 extern bool_t   xdr_uint16_t(XDR *, uint16_t *);
  299 extern bool_t   xdr_int32_t(XDR *, int32_t *);
  300 extern bool_t   xdr_uint32_t(XDR *, uint32_t *);
  301 extern bool_t   xdr_int64_t(XDR *, int64_t *);
  302 extern bool_t   xdr_uint64_t(XDR *, uint64_t *);
  303 extern bool_t   xdr_bool(XDR *, bool_t *);
  304 extern bool_t   xdr_enum(XDR *, enum_t *);
  305 extern bool_t   xdr_array(XDR *, char **, u_int *, u_int, u_int, xdrproc_t);
  306 extern bool_t   xdr_bytes(XDR *, char **, u_int *, u_int);
  307 extern bool_t   xdr_opaque(XDR *, char *, u_int);
  308 extern bool_t   xdr_string(XDR *, char **, u_int);
  309 extern bool_t   xdr_union(XDR *, enum_t *, char *, const struct xdr_discrim *, xdrproc_t);
  310 extern bool_t   xdr_char(XDR *, char *);
  311 extern bool_t   xdr_u_char(XDR *, u_char *);
  312 extern bool_t   xdr_vector(XDR *, char *, u_int, u_int, xdrproc_t);
  313 extern bool_t   xdr_float(XDR *, float *);
  314 extern bool_t   xdr_double(XDR *, double *);
  315 extern bool_t   xdr_quadruple(XDR *, long double *);
  316 extern bool_t   xdr_reference(XDR *, char **, u_int, xdrproc_t);
  317 extern bool_t   xdr_pointer(XDR *, char **, u_int, xdrproc_t);
  318 extern bool_t   xdr_wrapstring(XDR *, char **);
  319 extern void     xdr_free(xdrproc_t, void *);
  320 extern bool_t   xdr_hyper(XDR *, quad_t *);
  321 extern bool_t   xdr_u_hyper(XDR *, u_quad_t *);
  322 extern bool_t   xdr_longlong_t(XDR *, quad_t *);
  323 extern bool_t   xdr_u_longlong_t(XDR *, u_quad_t *);
  324 extern unsigned long xdr_sizeof(xdrproc_t func, void *data);
  325 __END_DECLS
  326 
  327 /*
  328  * Common opaque bytes objects used by many rpc protocols;
  329  * declared here due to commonality.
  330  */
  331 #define MAX_NETOBJ_SZ 1024
  332 struct netobj {
  333         u_int   n_len;
  334         char    *n_bytes;
  335 };
  336 typedef struct netobj netobj;
  337 extern bool_t   xdr_netobj(XDR *, struct netobj *);
  338 
  339 /*
  340  * These are XDR control operators
  341  */
  342 
  343 #define XDR_GET_BYTES_AVAIL     1
  344 #define XDR_PEEK                2
  345 #define XDR_SKIPBYTES           3
  346 
  347 struct xdr_bytesrec {
  348         bool_t xc_is_last_record;
  349         size_t xc_num_avail;
  350 };
  351 
  352 typedef struct xdr_bytesrec xdr_bytesrec;
  353 
  354 
  355 /*
  356  * These are the public routines for the various implementations of
  357  * xdr streams.
  358  */
  359 __BEGIN_DECLS
  360 /* XDR using memory buffers */
  361 extern void   xdrmem_create(XDR *, char *, u_int, enum xdr_op);
  362 
  363 /* XDR using mbufs */
  364 struct mbuf;
  365 extern void   xdrmbuf_create(XDR *, struct mbuf *, enum xdr_op);
  366 extern void   xdrmbuf_append(XDR *, struct mbuf *);
  367 extern struct mbuf * xdrmbuf_getall(XDR *);
  368 
  369 /* XDR pseudo records for tcp */
  370 extern void   xdrrec_create(XDR *, u_int, u_int, void *,
  371                             int (*)(void *, void *, int),
  372                             int (*)(void *, void *, int));
  373 
  374 /* make end of xdr record */
  375 extern bool_t xdrrec_endofrecord(XDR *, int);
  376 
  377 /* move to beginning of next record */
  378 extern bool_t xdrrec_skiprecord(XDR *);
  379 
  380 /* true if no more input */
  381 extern bool_t xdrrec_eof(XDR *);
  382 extern u_int xdrrec_readbytes(XDR *, caddr_t, u_int);
  383 __END_DECLS
  384 
  385 #endif /* !_KRPC_XDR_H */

Cache object: 9c6a427e2e8b0ae8859d1993bef32638


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.