Gaudi Framework, version v21r8

Home   Generated: 17 Mar 2010

xdr.h

Go to the documentation of this file.
00001   
00002 /*********************************************************************
00003  * RPC for the Windows NT Operating System
00004  * 1993 by Martin F. Gergeleit
00005  * Users may use, copy or modify Sun RPC for the Windows NT Operating
00006  * System according to the Sun copyright below.
00007  *
00008  * RPC for the Windows NT Operating System COMES WITH ABSOLUTELY NO
00009  * WARRANTY, NOR WILL I BE LIABLE FOR ANY DAMAGES INCURRED FROM THE
00010  * USE OF. USE ENTIRELY AT YOUR OWN RISK!!!
00011  *********************************************************************/
00012 
00013 /* @(#)xdr.h    2.2 88/07/29 4.0 RPCSRC */
00014 /*
00015  * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
00016  * unrestricted use provided that this legend is included on all tape
00017  * media and as a part of the software program in whole or part.  Users
00018  * may copy or modify Sun RPC without charge, but are not authorized
00019  * to license or distribute it to anyone else except as part of a product or
00020  * program developed by the user.
00021  *
00022  * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
00023  * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
00024  * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
00025  *
00026  * Sun RPC is provided with no support and without any obligation on the
00027  * part of Sun Microsystems, Inc. to assist in its use, correction,
00028  * modification or enhancement.
00029  *
00030  * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
00031  * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
00032  * OR ANY PART THEREOF.
00033  *
00034  * In no event will Sun Microsystems, Inc. be liable for any lost revenue
00035  * or profits or other special, indirect and consequential damages, even if
00036  * Sun has been advised of the possibility of such damages.
00037  *
00038  * Sun Microsystems, Inc.
00039  * 2550 Garcia Avenue
00040  * Mountain View, California  94043
00041  */
00042 /*      @(#)xdr.h 1.19 87/04/22 SMI      */
00043 
00044 /*
00045  * xdr.h, External Data Representation Serialization Routines.
00046  *
00047  * Copyright (C) 1984, Sun Microsystems, Inc.
00048  */
00049 
00051 #ifdef WIN32    
00052 
00053 #ifndef __XDR_HEADER__
00054 #define __XDR_HEADER__
00055 
00057 #define bool_t  int
00058 #define enum_t  int
00059 #ifndef FALSE
00060 #define FALSE   (0)
00061 #endif
00062 #ifndef TRUE
00063 #define TRUE    (1)
00064 #endif
00065 #define __dontcare__    -1
00066 #ifndef NULL
00067 #       define NULL 0
00068 #endif
00069 
00070 #ifndef WIN32
00071 extern char *malloc();
00072 #endif
00073 #define mem_alloc       malloc
00074 #define mem_free(ptr, bsize)    free(ptr)
00075 
00076 #ifndef makedev /* ie, we haven't already included it */
00077 #include <sys/types.h>
00078 #endif
00079 
00080 #ifndef WIN32
00081 #include <sys/time.h>
00082 #endif
00083 
00084 #ifndef INADDR_LOOPBACK
00085 #define       INADDR_LOOPBACK         (u_long)0x7F000001
00086 #endif
00087 #ifndef MAXHOSTNAMELEN
00088 #define        MAXHOSTNAMELEN  64
00089 #endif
00090 
00091 typedef char *caddr_t;
00092 #ifndef mingw32
00093 typedef unsigned int u_int;
00094 typedef unsigned long u_long;
00095 typedef unsigned short u_short;
00096 #else
00097 #include <winsock2.h>
00098 #endif
00099 /* end of defines in xdrtypes.h */
00100 
00101 #define _X86_
00102 /*
00103  * XDR provides a conventional way for converting between C data
00104  * types and an external bit-string representation.  Library supplied
00105  * routines provide for the conversion on built-in C data types.  These
00106  * routines and utility routines defined here are used to help implement
00107  * a type encode/decode routine for each user-defined type.
00108  *
00109  * Each data type provides a single procedure which takes two arguments:
00110  *
00111  *      bool_t
00112  *      xdrproc(xdrs, argresp)
00113  *              XDR *xdrs;
00114  *              <type> *argresp;
00115  *
00116  * xdrs is an instance of a XDR handle, to which or from which the data
00117  * type is to be converted.  argresp is a pointer to the structure to be
00118  * converted.  The XDR handle contains an operation field which indicates
00119  * which of the operations (ENCODE, DECODE * or FREE) is to be performed.
00120  *
00121  * XDR_DECODE may allocate space if the pointer argresp is null.  This
00122  * data can be freed with the XDR_FREE operation.
00123  *
00124  * We write only one procedure per data type to make it easy
00125  * to keep the encode and decode procedures for a data type consistent.
00126  * In many cases the same code performs all operations on a user defined type,
00127  * because all the hard work is done in the component type routines.
00128  * decode as a series of calls on the nested data types.
00129  */
00130 
00131 /*
00132  * Xdr operations.  XDR_ENCODE causes the type to be encoded into the
00133  * stream.  XDR_DECODE causes the type to be extracted from the stream.
00134  * XDR_FREE can be used to release the space allocated by an XDR_DECODE
00135  * request.
00136  */
00137 enum xdr_op {
00138         XDR_ENCODE=0,
00139         XDR_DECODE=1,
00140         XDR_FREE=2
00141 };
00142 
00143 /*
00144  * This is the number of bytes per unit of external data.
00145  */
00146 #define BYTES_PER_XDR_UNIT      (4)
00147 #define RNDUP(x)  ((((x) + BYTES_PER_XDR_UNIT - 1) / BYTES_PER_XDR_UNIT) \
00148                     * BYTES_PER_XDR_UNIT)
00149 
00150 /*
00151  * The XDR handle.
00152  * Contains operation which is being applied to the stream,
00153  * an operations vector for the paticular implementation (e.g. see xdr_mem.c),
00154  * and two private fields for the use of the particular impelementation.
00155  */
00156 
00157 #ifdef __cplusplus
00158 
00159 typedef struct {
00160         enum xdr_op     x_op;           /* operation; fast additional param */
00161         struct xdr_ops {
00162                 bool_t  (*x_getlong)(void *, long *);   /* get a long from underlying stream */
00163                 bool_t  (*x_putlong)(void *, long *);   /* put a long to " */
00164                 bool_t  (*x_getbytes)(void *, void *, int );/* get some bytes from " */
00165                 bool_t  (*x_putbytes)(void *, void *, int);/* put some bytes to " */
00166                 u_int   (*x_getpostn)(void *);/* returns bytes off from beginning */
00167                 bool_t  (*x_setpostn)(void *, int);/* lets you reposition the stream */
00168                 long *  (*x_inline)(void *, int);       /* buf quick ptr to buffered data */
00169                 void    (*x_destroy)(void *);   /* free privates of this xdr_stream */
00170         } *x_ops;
00171         caddr_t         x_public;       /* users' data */
00172         caddr_t         x_private;      /* pointer to private data */
00173         caddr_t         x_base;         /* private used for position info */
00174         int             x_handy;        /* extra private word */
00175 } XDR;
00176 
00177 #else
00178 
00179 typedef struct {
00180         enum xdr_op     x_op;           /* operation; fast additional param */
00181         struct xdr_ops {
00182                 bool_t  (*x_getlong)(); /* get a long from underlying stream */
00183                 bool_t  (*x_putlong)(); /* put a long to " */
00184                 bool_t  (*x_getbytes)();/* get some bytes from " */
00185                 bool_t  (*x_putbytes)();/* put some bytes to " */
00186                 u_int   (*x_getpostn)();/* returns bytes off from beginning */
00187                 bool_t  (*x_setpostn)();/* lets you reposition the stream */
00188                 long *  (*x_inline)();  /* buf quick ptr to buffered data */
00189                 void    (*x_destroy)(); /* free privates of this xdr_stream */
00190         } *x_ops;
00191         caddr_t         x_public;       /* users' data */
00192         caddr_t         x_private;      /* pointer to private data */
00193         caddr_t         x_base;         /* private used for position info */
00194         int             x_handy;        /* extra private word */
00195 } XDR;
00196 
00197 #endif
00198 
00199 
00200 /*
00201  * A xdrproc_t exists for each data type which is to be encoded or decoded.
00202  *
00203  * The second argument to the xdrproc_t is a pointer to an opaque pointer.
00204  * The opaque pointer generally points to a structure of the data type
00205  * to be decoded.  If this pointer is 0, then the type routines should
00206  * allocate dynamic storage of the appropriate size and return it.
00207  * bool_t       (*xdrproc_t)(XDR *, caddr_t *);
00208  */
00209 typedef bool_t (*xdrproc_t)(XDR *, caddr_t);
00210 
00211 
00212 /*
00213  * Operations defined on a XDR handle
00214  *
00215  * XDR          *xdrs;
00216  * long         *longp;
00217  * caddr_t       addr;
00218  * u_int         len;
00219  * u_int         pos;
00220  */
00221 #define XDR_GETLONG(xdrs, longp)                        \
00222         (*(xdrs)->x_ops->x_getlong)(xdrs, longp)
00223 #define xdr_getlong(xdrs, longp)                        \
00224         (*(xdrs)->x_ops->x_getlong)(xdrs, longp)
00225 
00226 #define XDR_PUTLONG(xdrs, longp)                        \
00227         (*(xdrs)->x_ops->x_putlong)(xdrs, longp)
00228 #define xdr_putlong(xdrs, longp)                        \
00229         (*(xdrs)->x_ops->x_putlong)(xdrs, longp)
00230 
00231 #define XDR_GETBYTES(xdrs, addr, len)                   \
00232         (*(xdrs)->x_ops->x_getbytes)(xdrs, addr, len)
00233 #define xdr_getbytes(xdrs, addr, len)                   \
00234         (*(xdrs)->x_ops->x_getbytes)(xdrs, addr, len)
00235 
00236 #define XDR_PUTBYTES(xdrs, addr, len)                   \
00237         (*(xdrs)->x_ops->x_putbytes)(xdrs, addr, len)
00238 #define xdr_putbytes(xdrs, addr, len)                   \
00239         (*(xdrs)->x_ops->x_putbytes)(xdrs, addr, len)
00240 
00241 #define XDR_GETPOS(xdrs)                                \
00242         (*(xdrs)->x_ops->x_getpostn)(xdrs)
00243 #define xdr_getpos(xdrs)                                \
00244         (*(xdrs)->x_ops->x_getpostn)(xdrs)
00245 
00246 #define XDR_SETPOS(xdrs, pos)                           \
00247         (*(xdrs)->x_ops->x_setpostn)(xdrs, pos)
00248 #define xdr_setpos(xdrs, pos)                           \
00249         (*(xdrs)->x_ops->x_setpostn)(xdrs, pos)
00250 
00251 #define XDR_INLINE(xdrs, len)                           \
00252         (*(xdrs)->x_ops->x_inline)(xdrs, len)
00253 #define xdr_inline(xdrs, len)                           \
00254         (*(xdrs)->x_ops->x_inline)(xdrs, len)
00255 
00256 #define XDR_DESTROY(xdrs)                               \
00257         if ((xdrs)->x_ops->x_destroy)                   \
00258                 (*(xdrs)->x_ops->x_destroy)(xdrs)
00259 #define xdr_destroy(xdrs)                               \
00260         if ((xdrs)->x_ops->x_destroy)                   \
00261                 (*(xdrs)->x_ops->x_destroy)(xdrs)
00262 
00263 /*
00264  * Support struct for discriminated unions.
00265  * You create an array of xdrdiscrim structures, terminated with
00266  * a entry with a null procedure pointer.  The xdr_union routine gets
00267  * the discriminant value and then searches the array of structures
00268  * for a matching value.  If a match is found the associated xdr routine
00269  * is called to handle that part of the union.  If there is
00270  * no match, then a default routine may be called.
00271  * If there is no match and no default routine it is an error.
00272  */
00273 #define NULL_xdrproc_t ((xdrproc_t)0)
00274 struct xdr_discrim {
00275         int     value;
00276         xdrproc_t proc;
00277 };
00278 
00279 /*
00280  * In-line routines for fast encode/decode of primitve data types.
00281  * Caveat emptor: these use single memory cycles to get the
00282  * data from the underlying buffer, and will fail to operate
00283  * properly if the data is not aligned.  The standard way to use these
00284  * is to say:
00285  *      if ((buf = XDR_INLINE(xdrs, count)) == NULL)
00286  *              return (FALSE);
00287  *      <<< macro calls >>>
00288  * where ``count'' is the number of bytes of data occupied
00289  * by the primitive data types.
00290  *
00291  * N.B. and frozen for all time: each data type here uses 4 bytes
00292  * of external representation.
00293  */
00294 #define IXDR_GET_LONG(buf)              ((long)ntohl((u_long)*(buf)++))
00295 #define IXDR_PUT_LONG(buf, v)           (*(buf)++ = (long)htonl((u_long)v))
00296 
00297 #define IXDR_GET_BOOL(buf)              ((bool_t)IXDR_GET_LONG(buf))
00298 #define IXDR_GET_ENUM(buf, t)           ((t)IXDR_GET_LONG(buf))
00299 #define IXDR_GET_U_LONG(buf)            ((u_long)IXDR_GET_LONG(buf))
00300 #define IXDR_GET_SHORT(buf)             ((short)IXDR_GET_LONG(buf))
00301 #define IXDR_GET_U_SHORT(buf)           ((u_short)IXDR_GET_LONG(buf))
00302 
00303 #define IXDR_PUT_BOOL(buf, v)           IXDR_PUT_LONG((buf), ((long)(v)))
00304 #define IXDR_PUT_ENUM(buf, v)           IXDR_PUT_LONG((buf), ((long)(v)))
00305 #define IXDR_PUT_U_LONG(buf, v)         IXDR_PUT_LONG((buf), ((long)(v)))
00306 #define IXDR_PUT_SHORT(buf, v)          IXDR_PUT_LONG((buf), ((long)(v)))
00307 #define IXDR_PUT_U_SHORT(buf, v)        IXDR_PUT_LONG((buf), ((long)(v)))
00308 
00309 
00310 
00311 /*
00312  * Common opaque bytes objects used by many rpc protocols;
00313  * declared here due to commonality.
00314  */
00315 #define MAX_NETOBJ_SZ 1024
00316 struct netobj {
00317         u_int   n_len;
00318         char    *n_bytes;
00319 };
00320 typedef struct netobj netobj;
00321 
00322 void xdrmem_create(XDR *xdrs, caddr_t addr, u_int size, enum xdr_op op);
00323 
00324 bool_t xdr_int(XDR *, int *);
00325 
00326 bool_t xdr_long(XDR *, long *);
00327 
00328 bool_t xdr_short(XDR *, short *);
00329 
00330 bool_t xdr_string(XDR *, char **cpp, u_int maxsize);
00331 
00332 bool_t xdr_float(XDR *, float *);
00333 
00334 bool_t xdr_double(XDR *, double *);
00335 
00336 /*
00337  * These are the public routines for the various implementations of
00338  * xdr streams.
00339  *
00340 #ifdef __cplusplus
00341 void xdrmem_create(XDR *xdrs, caddr_t addr, u_int size, enum xdr_op op);
00342 
00343 /*
00344  * These are the "generic" xdr routines.
00345  *
00346 extern bool_t   xdr_void();
00347 extern bool_t   xdr_int(XDR *, int *);
00348 extern bool_t   xdr_u_int(XDR *, unsigned int *);
00349 extern bool_t   xdr_long(XDR *, long *);
00350 extern bool_t   xdr_u_long(XDR *,unsigned long *);
00351 extern bool_t   xdr_short(XDR *, short *);
00352 extern bool_t   xdr_u_short(XDR *, unsigned short *);
00353 extern bool_t   xdr_bool();
00354 extern bool_t   xdr_enum();
00355 extern bool_t   xdr_array();
00356 extern bool_t   xdr_bytes(XDR *, char **, unsigned int *, unsigned int);
00357 extern bool_t   xdr_opaque(XDR *,char *, unsigned int );
00358 extern bool_t   xdr_string();
00359 extern bool_t   xdr_union();
00360 extern bool_t   xdr_char(XDR *, char *);
00361 extern bool_t   xdr_u_char(XDR *, unsigned char *);
00362 extern bool_t   xdr_vector(XDR *, char *, int , int, xdrproc_t);
00363 extern bool_t   xdr_float(XDR *, float *);
00364 extern bool_t   xdr_double(XDR *, double *);
00365 extern bool_t   xdr_reference();
00366 extern bool_t   xdr_pointer();
00367 extern bool_t   xdr_wrapstring();
00368 
00369 #else
00370 
00371 /*
00372  * These are the "generic" xdr routines.
00373  *
00374 extern bool_t   xdr_void();
00375 extern bool_t   xdr_int();
00376 extern bool_t   xdr_u_int();
00377 extern bool_t   xdr_long();
00378 extern bool_t   xdr_u_long();
00379 extern bool_t   xdr_short();
00380 extern bool_t   xdr_u_short();
00381 extern bool_t   xdr_bool();
00382 extern bool_t   xdr_enum();
00383 extern bool_t   xdr_array();
00384 extern bool_t   xdr_bytes();
00385 extern bool_t   xdr_opaque();
00386 extern bool_t   xdr_string();
00387 extern bool_t   xdr_union();
00388 extern bool_t   xdr_char();
00389 extern bool_t   xdr_u_char();
00390 extern bool_t   xdr_vector();
00391 extern bool_t   xdr_float();
00392 extern bool_t   xdr_double();
00393 extern bool_t   xdr_reference();
00394 extern bool_t   xdr_pointer();
00395 extern bool_t   xdr_wrapstring();
00396 
00397 extern void   xdrmem_create();          /* XDR using memory buffers *
00398 #endif
00399 
00400 extern void   xdrstdio_create();        /* XDR using stdio library *
00401 
00402 extern void   xdrrec_create();          /* XDR pseudo records for tcp *
00403 extern bool_t xdrrec_endofrecord();     /* make end of xdr record *
00404 extern bool_t xdrrec_skiprecord();      /* move to beginning of next record *
00405 extern bool_t xdrrec_eof();             /* true if no more input */
00406 
00407 #endif /* __XDR_HEADER__ */
00408 
00409 #endif /* WIN32 */

Generated at Wed Mar 17 18:06:37 2010 for Gaudi Framework, version v21r8 by Doxygen version 1.5.6 written by Dimitri van Heesch, © 1997-2004