|
Gaudi Framework, version v22r0 |
| Home | Generated: 9 Feb 2011 |
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 */