Index: user/kmacy/releng_7_2_fcs/sys/rpc/xdr.h =================================================================== --- user/kmacy/releng_7_2_fcs/sys/rpc/xdr.h (revision 192877) +++ user/kmacy/releng_7_2_fcs/sys/rpc/xdr.h (revision 192878) @@ -1,368 +1,368 @@ /* $NetBSD: xdr.h,v 1.19 2000/07/17 05:00:45 matt Exp $ */ /* * Sun RPC is a product of Sun Microsystems, Inc. and is provided for * unrestricted use provided that this legend is included on all tape * media and as a part of the software program in whole or part. Users * may copy or modify Sun RPC without charge, but are not authorized * to license or distribute it to anyone else except as part of a product or * program developed by the user. * * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE * WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. * * Sun RPC is provided with no support and without any obligation on the * part of Sun Microsystems, Inc. to assist in its use, correction, * modification or enhancement. * * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC * OR ANY PART THEREOF. * * In no event will Sun Microsystems, Inc. be liable for any lost revenue * or profits or other special, indirect and consequential damages, even if * Sun has been advised of the possibility of such damages. * * Sun Microsystems, Inc. * 2550 Garcia Avenue * Mountain View, California 94043 * * from: @(#)xdr.h 1.19 87/04/22 SMI * from: @(#)xdr.h 2.2 88/07/29 4.0 RPCSRC * $FreeBSD$ */ /* * xdr.h, External Data Representation Serialization Routines. * * Copyright (C) 1984, Sun Microsystems, Inc. */ #ifndef _KRPC_XDR_H #define _KRPC_XDR_H #include /* * XDR provides a conventional way for converting between C data * types and an external bit-string representation. Library supplied * routines provide for the conversion on built-in C data types. These * routines and utility routines defined here are used to help implement * a type encode/decode routine for each user-defined type. * * Each data type provides a single procedure which takes two arguments: * * bool_t * xdrproc(xdrs, argresp) * XDR *xdrs; * *argresp; * * xdrs is an instance of a XDR handle, to which or from which the data * type is to be converted. argresp is a pointer to the structure to be * converted. The XDR handle contains an operation field which indicates * which of the operations (ENCODE, DECODE * or FREE) is to be performed. * * XDR_DECODE may allocate space if the pointer argresp is null. This * data can be freed with the XDR_FREE operation. * * We write only one procedure per data type to make it easy * to keep the encode and decode procedures for a data type consistent. * In many cases the same code performs all operations on a user defined type, * because all the hard work is done in the component type routines. * decode as a series of calls on the nested data types. */ /* * Xdr operations. XDR_ENCODE causes the type to be encoded into the * stream. XDR_DECODE causes the type to be extracted from the stream. * XDR_FREE can be used to release the space allocated by an XDR_DECODE * request. */ enum xdr_op { XDR_ENCODE=0, XDR_DECODE=1, XDR_FREE=2 }; /* * This is the number of bytes per unit of external data. */ #define BYTES_PER_XDR_UNIT (4) #define RNDUP(x) ((((x) + BYTES_PER_XDR_UNIT - 1) / BYTES_PER_XDR_UNIT) \ * BYTES_PER_XDR_UNIT) /* * The XDR handle. * Contains operation which is being applied to the stream, * an operations vector for the particular implementation (e.g. see xdr_mem.c), * and two private fields for the use of the particular implementation. */ typedef struct __rpc_xdr { enum xdr_op x_op; /* operation; fast additional param */ const struct xdr_ops { /* get a long from underlying stream */ - bool_t (*x_getlong)(struct __rpc_xdr *, long *); + bool_t (*x_getint32)(struct __rpc_xdr *, int32_t *); /* put a long to " */ - bool_t (*x_putlong)(struct __rpc_xdr *, const long *); + bool_t (*x_putint32)(struct __rpc_xdr *, const int32_t *); /* get some bytes from " */ bool_t (*x_getbytes)(struct __rpc_xdr *, char *, u_int); /* put some bytes to " */ bool_t (*x_putbytes)(struct __rpc_xdr *, const char *, u_int); /* returns bytes off from beginning */ u_int (*x_getpostn)(struct __rpc_xdr *); /* lets you reposition the stream */ bool_t (*x_setpostn)(struct __rpc_xdr *, u_int); /* buf quick ptr to buffered data */ int32_t *(*x_inline)(struct __rpc_xdr *, u_int); /* free privates of this xdr_stream */ void (*x_destroy)(struct __rpc_xdr *); bool_t (*x_control)(struct __rpc_xdr *, int, void *); } *x_ops; char * x_public; /* users' data */ void * x_private; /* pointer to private data */ char * x_base; /* private used for position info */ u_int x_handy; /* extra private word */ } XDR; /* * A xdrproc_t exists for each data type which is to be encoded or decoded. * * The second argument to the xdrproc_t is a pointer to an opaque pointer. * The opaque pointer generally points to a structure of the data type * to be decoded. If this pointer is 0, then the type routines should * allocate dynamic storage of the appropriate size and return it. */ #ifdef _KERNEL typedef bool_t (*xdrproc_t)(XDR *, void *, ...); #else /* * XXX can't actually prototype it, because some take three args!!! */ typedef bool_t (*xdrproc_t)(XDR *, ...); #endif /* * Operations defined on a XDR handle * * XDR *xdrs; - * long *longp; + * int32_t *int32p; * char * addr; * u_int len; * u_int pos; */ -#define XDR_GETLONG(xdrs, longp) \ - (*(xdrs)->x_ops->x_getlong)(xdrs, longp) -#define xdr_getlong(xdrs, longp) \ - (*(xdrs)->x_ops->x_getlong)(xdrs, longp) +#define XDR_GETINT32(xdrs, int32p) \ + (*(xdrs)->x_ops->x_getint32)(xdrs, int32p) +#define xdr_getint32(xdrs, int32p) \ + (*(xdrs)->x_ops->x_getint32)(xdrs, int32p) -#define XDR_PUTLONG(xdrs, longp) \ - (*(xdrs)->x_ops->x_putlong)(xdrs, longp) -#define xdr_putlong(xdrs, longp) \ - (*(xdrs)->x_ops->x_putlong)(xdrs, longp) +#define XDR_PUTINT32(xdrs, int32p) \ + (*(xdrs)->x_ops->x_putint32)(xdrs, int32p) +#define xdr_putint32(xdrs, int32p) \ + (*(xdrs)->x_ops->x_putint32)(xdrs, int32p) static __inline int -xdr_getint32(XDR *xdrs, int32_t *ip) +xdr_getlong(XDR *xdrs, long *lp) { - long l; + int32_t i; - if (!xdr_getlong(xdrs, &l)) + if (!xdr_getint32(xdrs, &i)) return (FALSE); - *ip = (int32_t)l; + *lp = (long) i; return (TRUE); } static __inline int -xdr_putint32(XDR *xdrs, int32_t *ip) +xdr_putlong(XDR *xdrs, long *lp) { - long l; + int32_t i; - l = (long)*ip; - return xdr_putlong(xdrs, &l); + i = (int32_t) *lp; + return xdr_putint32(xdrs, &i); } -#define XDR_GETINT32(xdrs, int32p) xdr_getint32(xdrs, int32p) -#define XDR_PUTINT32(xdrs, int32p) xdr_putint32(xdrs, int32p) +#define XDR_GETLONG(xdrs, longp) xdr_getlong(xdrs, longp) +#define XDR_PUTLONG(xdrs, longp) xdr_putlong(xdrs, longp) #define XDR_GETBYTES(xdrs, addr, len) \ (*(xdrs)->x_ops->x_getbytes)(xdrs, addr, len) #define xdr_getbytes(xdrs, addr, len) \ (*(xdrs)->x_ops->x_getbytes)(xdrs, addr, len) #define XDR_PUTBYTES(xdrs, addr, len) \ (*(xdrs)->x_ops->x_putbytes)(xdrs, addr, len) #define xdr_putbytes(xdrs, addr, len) \ (*(xdrs)->x_ops->x_putbytes)(xdrs, addr, len) #define XDR_GETPOS(xdrs) \ (*(xdrs)->x_ops->x_getpostn)(xdrs) #define xdr_getpos(xdrs) \ (*(xdrs)->x_ops->x_getpostn)(xdrs) #define XDR_SETPOS(xdrs, pos) \ (*(xdrs)->x_ops->x_setpostn)(xdrs, pos) #define xdr_setpos(xdrs, pos) \ (*(xdrs)->x_ops->x_setpostn)(xdrs, pos) #define XDR_INLINE(xdrs, len) \ (*(xdrs)->x_ops->x_inline)(xdrs, len) #define xdr_inline(xdrs, len) \ (*(xdrs)->x_ops->x_inline)(xdrs, len) #define XDR_DESTROY(xdrs) \ if ((xdrs)->x_ops->x_destroy) \ (*(xdrs)->x_ops->x_destroy)(xdrs) #define xdr_destroy(xdrs) \ if ((xdrs)->x_ops->x_destroy) \ (*(xdrs)->x_ops->x_destroy)(xdrs) #define XDR_CONTROL(xdrs, req, op) \ if ((xdrs)->x_ops->x_control) \ (*(xdrs)->x_ops->x_control)(xdrs, req, op) #define xdr_control(xdrs, req, op) XDR_CONTROL(xdrs, req, op) /* * Solaris strips the '_t' from these types -- not sure why. * But, let's be compatible. */ #define xdr_rpcvers(xdrs, versp) xdr_uint32_t(xdrs, versp) #define xdr_rpcprog(xdrs, progp) xdr_uint32_t(xdrs, progp) #define xdr_rpcproc(xdrs, procp) xdr_uint32_t(xdrs, procp) #define xdr_rpcprot(xdrs, protp) xdr_uint32_t(xdrs, protp) #define xdr_rpcport(xdrs, portp) xdr_uint32_t(xdrs, portp) /* * Support struct for discriminated unions. * You create an array of xdrdiscrim structures, terminated with * an entry with a null procedure pointer. The xdr_union routine gets * the discriminant value and then searches the array of structures * for a matching value. If a match is found the associated xdr routine * is called to handle that part of the union. If there is * no match, then a default routine may be called. * If there is no match and no default routine it is an error. */ #define NULL_xdrproc_t ((xdrproc_t)0) struct xdr_discrim { int value; xdrproc_t proc; }; /* * In-line routines for fast encode/decode of primitive data types. * Caveat emptor: these use single memory cycles to get the * data from the underlying buffer, and will fail to operate * properly if the data is not aligned. The standard way to use these * is to say: * if ((buf = XDR_INLINE(xdrs, count)) == NULL) * return (FALSE); * <<< macro calls >>> * where ``count'' is the number of bytes of data occupied * by the primitive data types. * * N.B. and frozen for all time: each data type here uses 4 bytes * of external representation. */ #define IXDR_GET_INT32(buf) ((int32_t)__ntohl((uint32_t)*(buf)++)) #define IXDR_PUT_INT32(buf, v) (*(buf)++ =(int32_t)__htonl((uint32_t)v)) #define IXDR_GET_U_INT32(buf) ((uint32_t)IXDR_GET_INT32(buf)) #define IXDR_PUT_U_INT32(buf, v) IXDR_PUT_INT32((buf), ((int32_t)(v))) #define IXDR_GET_UINT32(buf) ((uint32_t)IXDR_GET_INT32(buf)) #define IXDR_PUT_UINT32(buf, v) IXDR_PUT_INT32((buf), ((int32_t)(v))) #define IXDR_GET_LONG(buf) ((long)__ntohl((uint32_t)*(buf)++)) #define IXDR_PUT_LONG(buf, v) (*(buf)++ =(int32_t)__htonl((uint32_t)v)) #define IXDR_GET_BOOL(buf) ((bool_t)IXDR_GET_LONG(buf)) #define IXDR_GET_ENUM(buf, t) ((t)IXDR_GET_LONG(buf)) #define IXDR_GET_U_LONG(buf) ((u_long)IXDR_GET_LONG(buf)) #define IXDR_GET_SHORT(buf) ((short)IXDR_GET_LONG(buf)) #define IXDR_GET_U_SHORT(buf) ((u_short)IXDR_GET_LONG(buf)) #define IXDR_PUT_BOOL(buf, v) IXDR_PUT_LONG((buf), (v)) #define IXDR_PUT_ENUM(buf, v) IXDR_PUT_LONG((buf), (v)) #define IXDR_PUT_U_LONG(buf, v) IXDR_PUT_LONG((buf), (v)) #define IXDR_PUT_SHORT(buf, v) IXDR_PUT_LONG((buf), (v)) #define IXDR_PUT_U_SHORT(buf, v) IXDR_PUT_LONG((buf), (v)) /* * These are the "generic" xdr routines. */ __BEGIN_DECLS extern bool_t xdr_void(void); extern bool_t xdr_int(XDR *, int *); extern bool_t xdr_u_int(XDR *, u_int *); extern bool_t xdr_long(XDR *, long *); extern bool_t xdr_u_long(XDR *, u_long *); extern bool_t xdr_short(XDR *, short *); extern bool_t xdr_u_short(XDR *, u_short *); extern bool_t xdr_int16_t(XDR *, int16_t *); extern bool_t xdr_uint16_t(XDR *, uint16_t *); extern bool_t xdr_int32_t(XDR *, int32_t *); extern bool_t xdr_uint32_t(XDR *, uint32_t *); extern bool_t xdr_int64_t(XDR *, int64_t *); extern bool_t xdr_uint64_t(XDR *, uint64_t *); extern bool_t xdr_bool(XDR *, bool_t *); extern bool_t xdr_enum(XDR *, enum_t *); extern bool_t xdr_array(XDR *, char **, u_int *, u_int, u_int, xdrproc_t); extern bool_t xdr_bytes(XDR *, char **, u_int *, u_int); extern bool_t xdr_opaque(XDR *, char *, u_int); extern bool_t xdr_string(XDR *, char **, u_int); extern bool_t xdr_union(XDR *, enum_t *, char *, const struct xdr_discrim *, xdrproc_t); extern bool_t xdr_char(XDR *, char *); extern bool_t xdr_u_char(XDR *, u_char *); extern bool_t xdr_vector(XDR *, char *, u_int, u_int, xdrproc_t); extern bool_t xdr_float(XDR *, float *); extern bool_t xdr_double(XDR *, double *); extern bool_t xdr_quadruple(XDR *, long double *); extern bool_t xdr_reference(XDR *, char **, u_int, xdrproc_t); extern bool_t xdr_pointer(XDR *, char **, u_int, xdrproc_t); extern bool_t xdr_wrapstring(XDR *, char **); extern void xdr_free(xdrproc_t, void *); extern bool_t xdr_hyper(XDR *, quad_t *); extern bool_t xdr_u_hyper(XDR *, u_quad_t *); extern bool_t xdr_longlong_t(XDR *, quad_t *); extern bool_t xdr_u_longlong_t(XDR *, u_quad_t *); extern unsigned long xdr_sizeof(xdrproc_t func, void *data); __END_DECLS /* * Common opaque bytes objects used by many rpc protocols; * declared here due to commonality. */ #define MAX_NETOBJ_SZ 1024 struct netobj { u_int n_len; char *n_bytes; }; typedef struct netobj netobj; extern bool_t xdr_netobj(XDR *, struct netobj *); /* * These are the public routines for the various implementations of * xdr streams. */ __BEGIN_DECLS /* XDR using memory buffers */ extern void xdrmem_create(XDR *, char *, u_int, enum xdr_op); /* XDR using mbufs */ struct mbuf; extern void xdrmbuf_create(XDR *, struct mbuf *, enum xdr_op); /* XDR pseudo records for tcp */ extern void xdrrec_create(XDR *, u_int, u_int, void *, int (*)(void *, void *, int), int (*)(void *, void *, int)); /* make end of xdr record */ extern bool_t xdrrec_endofrecord(XDR *, int); /* move to beginning of next record */ extern bool_t xdrrec_skiprecord(XDR *); /* true if no more input */ extern bool_t xdrrec_eof(XDR *); extern u_int xdrrec_readbytes(XDR *, caddr_t, u_int); __END_DECLS #endif /* !_KRPC_XDR_H */ Index: user/kmacy/releng_7_2_fcs/sys/xdr/xdr.c =================================================================== --- user/kmacy/releng_7_2_fcs/sys/xdr/xdr.c (revision 192877) +++ user/kmacy/releng_7_2_fcs/sys/xdr/xdr.c (revision 192878) @@ -1,816 +1,799 @@ /* $NetBSD: xdr.c,v 1.22 2000/07/06 03:10:35 christos Exp $ */ /* * Sun RPC is a product of Sun Microsystems, Inc. and is provided for * unrestricted use provided that this legend is included on all tape * media and as a part of the software program in whole or part. Users * may copy or modify Sun RPC without charge, but are not authorized * to license or distribute it to anyone else except as part of a product or * program developed by the user. * * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. * * Sun RPC is provided with no support and without any obligation on the * part of Sun Microsystems, Inc. to assist in its use, correction, * modification or enhancement. * * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC * OR ANY PART THEREOF. * * In no event will Sun Microsystems, Inc. be liable for any lost revenue * or profits or other special, indirect and consequential damages, even if * Sun has been advised of the possibility of such damages. * * Sun Microsystems, Inc. * 2550 Garcia Avenue * Mountain View, California 94043 */ #if defined(LIBC_SCCS) && !defined(lint) static char *sccsid2 = "@(#)xdr.c 1.35 87/08/12"; static char *sccsid = "@(#)xdr.c 2.1 88/07/29 4.0 RPCSRC"; #endif #include __FBSDID("$FreeBSD$"); /* * xdr.c, Generic XDR routines implementation. * * Copyright (C) 1986, Sun Microsystems, Inc. * * These are the "generic" xdr routines used to serialize and de-serialize * most common data items. See xdr.h for more info on the interface to * xdr. */ #include #include #include #include #include #include typedef quad_t longlong_t; /* ANSI long long type */ typedef u_quad_t u_longlong_t; /* ANSI unsigned long long type */ /* * constants specific to the xdr "protocol" */ #define XDR_FALSE ((long) 0) #define XDR_TRUE ((long) 1) #define LASTUNSIGNED ((u_int) 0-1) /* * for unit alignment */ static const char xdr_zero[BYTES_PER_XDR_UNIT] = { 0, 0, 0, 0 }; /* * Free a data structure using XDR * Not a filter, but a convenient utility nonetheless */ void xdr_free(xdrproc_t proc, void *objp) { XDR x; x.x_op = XDR_FREE; (*proc)(&x, objp); } /* * XDR nothing */ bool_t xdr_void(void) { return (TRUE); } /* * XDR integers */ bool_t xdr_int(XDR *xdrs, int *ip) { - long l; + int32_t i32; switch (xdrs->x_op) { case XDR_ENCODE: - l = (long) *ip; - return (XDR_PUTLONG(xdrs, &l)); + i32 = (int32_t) *ip; + return (XDR_PUTINT32(xdrs, &i32)); case XDR_DECODE: - if (!XDR_GETLONG(xdrs, &l)) { + if (!XDR_GETINT32(xdrs, &i32)) { return (FALSE); } - *ip = (int) l; + *ip = (int) i32; return (TRUE); case XDR_FREE: return (TRUE); } /* NOTREACHED */ return (FALSE); } /* * XDR unsigned integers */ bool_t xdr_u_int(XDR *xdrs, u_int *up) { - u_long l; + uint32_t u32; switch (xdrs->x_op) { case XDR_ENCODE: - l = (u_long) *up; - return (XDR_PUTLONG(xdrs, (long *)&l)); + u32 = (uint32_t) *up; + return (XDR_PUTINT32(xdrs, (int32_t *)&u32)); case XDR_DECODE: - if (!XDR_GETLONG(xdrs, (long *)&l)) { + if (!XDR_GETINT32(xdrs, (int32_t *)&u32)) { return (FALSE); } - *up = (u_int) l; + *up = (u_int) u32; return (TRUE); case XDR_FREE: return (TRUE); } /* NOTREACHED */ return (FALSE); } /* * XDR long integers * same as xdr_u_long - open coded to save a proc call! */ bool_t xdr_long(XDR *xdrs, long *lp) { switch (xdrs->x_op) { case XDR_ENCODE: return (XDR_PUTLONG(xdrs, lp)); case XDR_DECODE: return (XDR_GETLONG(xdrs, lp)); case XDR_FREE: return (TRUE); } /* NOTREACHED */ return (FALSE); } /* * XDR unsigned long integers * same as xdr_long - open coded to save a proc call! */ bool_t xdr_u_long(XDR *xdrs, u_long *ulp) { switch (xdrs->x_op) { case XDR_ENCODE: return (XDR_PUTLONG(xdrs, (long *)ulp)); case XDR_DECODE: return (XDR_GETLONG(xdrs, (long *)ulp)); case XDR_FREE: return (TRUE); } /* NOTREACHED */ return (FALSE); } /* * XDR 32-bit integers * same as xdr_uint32_t - open coded to save a proc call! */ bool_t -xdr_int32_t(XDR *xdrs, int32_t *int32_p) +xdr_int32_t(XDR *xdrs, int32_t *i32p) { - long l; switch (xdrs->x_op) { case XDR_ENCODE: - l = (long) *int32_p; - return (XDR_PUTLONG(xdrs, &l)); - + return (XDR_PUTINT32(xdrs, i32p)); case XDR_DECODE: - if (!XDR_GETLONG(xdrs, &l)) { - return (FALSE); - } - *int32_p = (int32_t) l; - return (TRUE); - + return (XDR_GETINT32(xdrs, i32p)); case XDR_FREE: return (TRUE); } /* NOTREACHED */ return (FALSE); } /* * XDR unsigned 32-bit integers * same as xdr_int32_t - open coded to save a proc call! */ bool_t -xdr_uint32_t(XDR *xdrs, uint32_t *uint32_p) +xdr_uint32_t(XDR *xdrs, uint32_t *u32p) { - u_long l; - switch (xdrs->x_op) { case XDR_ENCODE: - l = (u_long) *uint32_p; - return (XDR_PUTLONG(xdrs, (long *)&l)); - + return (XDR_PUTINT32(xdrs, (const int32_t *) u32p)); case XDR_DECODE: - if (!XDR_GETLONG(xdrs, (long *)&l)) { - return (FALSE); - } - *uint32_p = (uint32_t) l; - return (TRUE); - + return (XDR_GETINT32(xdrs, (int32_t *) u32p)); case XDR_FREE: return (TRUE); } /* NOTREACHED */ return (FALSE); } /* * XDR short integers */ bool_t xdr_short(XDR *xdrs, short *sp) { - long l; + int32_t i; switch (xdrs->x_op) { case XDR_ENCODE: - l = (long) *sp; - return (XDR_PUTLONG(xdrs, &l)); + i = (int32_t) *sp; + return (XDR_PUTINT32(xdrs, &i)); case XDR_DECODE: - if (!XDR_GETLONG(xdrs, &l)) { + if (!XDR_GETINT32(xdrs, &i)) { return (FALSE); } - *sp = (short) l; + *sp = (short) i; return (TRUE); case XDR_FREE: return (TRUE); } /* NOTREACHED */ return (FALSE); } /* * XDR unsigned short integers */ bool_t xdr_u_short(XDR *xdrs, u_short *usp) { - u_long l; + uint32_t u; switch (xdrs->x_op) { case XDR_ENCODE: - l = (u_long) *usp; - return (XDR_PUTLONG(xdrs, (long *)&l)); + u = (uint32_t) *usp; + return (XDR_PUTINT32(xdrs, (const int32_t *)&u)); case XDR_DECODE: - if (!XDR_GETLONG(xdrs, (long *)&l)) { + if (!XDR_GETINT32(xdrs, (int32_t *)&u)) { return (FALSE); } - *usp = (u_short) l; + *usp = (u_short) u; return (TRUE); case XDR_FREE: return (TRUE); } /* NOTREACHED */ return (FALSE); } /* * XDR 16-bit integers */ bool_t -xdr_int16_t(XDR *xdrs, int16_t *int16_p) +xdr_int16_t(XDR *xdrs, int16_t *i16p) { - long l; + int32_t i; switch (xdrs->x_op) { case XDR_ENCODE: - l = (long) *int16_p; - return (XDR_PUTLONG(xdrs, &l)); + i = (int32_t) *i16p; + return (XDR_PUTINT32(xdrs, &i)); case XDR_DECODE: - if (!XDR_GETLONG(xdrs, &l)) { + if (!XDR_GETINT32(xdrs, &i)) { return (FALSE); } - *int16_p = (int16_t) l; + *i16p = (int16_t) i; return (TRUE); case XDR_FREE: return (TRUE); } /* NOTREACHED */ return (FALSE); } /* * XDR unsigned 16-bit integers */ bool_t -xdr_uint16_t(XDR *xdrs, uint16_t *uint16_p) +xdr_uint16_t(XDR *xdrs, uint16_t *u16p) { - u_long l; + uint32_t u; switch (xdrs->x_op) { case XDR_ENCODE: - l = (u_long) *uint16_p; - return (XDR_PUTLONG(xdrs, (long *)&l)); + u = (uint32_t) *u16p; + return (XDR_PUTINT32(xdrs, &u)); case XDR_DECODE: - if (!XDR_GETLONG(xdrs, (long *)&l)) { + if (!XDR_GETINT32(xdrs, &u)) { return (FALSE); } - *uint16_p = (uint16_t) l; + *u16p = (uint16_t) u; return (TRUE); case XDR_FREE: return (TRUE); } /* NOTREACHED */ return (FALSE); } /* * XDR a char */ bool_t xdr_char(XDR *xdrs, char *cp) { int i; i = (*cp); if (!xdr_int(xdrs, &i)) { return (FALSE); } *cp = i; return (TRUE); } /* * XDR an unsigned char */ bool_t xdr_u_char(XDR *xdrs, u_char *cp) { u_int u; u = (*cp); if (!xdr_u_int(xdrs, &u)) { return (FALSE); } *cp = u; return (TRUE); } /* * XDR booleans */ bool_t xdr_bool(XDR *xdrs, bool_t *bp) { - long lb; + int32_t ib; switch (xdrs->x_op) { case XDR_ENCODE: - lb = *bp ? XDR_TRUE : XDR_FALSE; - return (XDR_PUTLONG(xdrs, &lb)); + ib = *bp ? XDR_TRUE : XDR_FALSE; + return (XDR_PUTINT32(xdrs, &ib)); case XDR_DECODE: - if (!XDR_GETLONG(xdrs, &lb)) { + if (!XDR_GETINT32(xdrs, &ib)) { return (FALSE); } - *bp = (lb == XDR_FALSE) ? FALSE : TRUE; + *bp = (ib == XDR_FALSE) ? FALSE : TRUE; return (TRUE); case XDR_FREE: return (TRUE); } /* NOTREACHED */ return (FALSE); } /* * XDR enumerations */ bool_t xdr_enum(XDR *xdrs, enum_t *ep) { enum sizecheck { SIZEVAL }; /* used to find the size of an enum */ /* * enums are treated as ints */ /* LINTED */ if (sizeof (enum sizecheck) == sizeof (long)) { return (xdr_long(xdrs, (long *)(void *)ep)); } else /* LINTED */ if (sizeof (enum sizecheck) == sizeof (int)) { return (xdr_int(xdrs, (int *)(void *)ep)); } else /* LINTED */ if (sizeof (enum sizecheck) == sizeof (short)) { return (xdr_short(xdrs, (short *)(void *)ep)); } else { return (FALSE); } } /* * XDR opaque data * Allows the specification of a fixed size sequence of opaque bytes. * cp points to the opaque object and cnt gives the byte length. */ bool_t xdr_opaque(XDR *xdrs, caddr_t cp, u_int cnt) { u_int rndup; static int crud[BYTES_PER_XDR_UNIT]; /* * if no data we are done */ if (cnt == 0) return (TRUE); /* * round byte count to full xdr units */ rndup = cnt % BYTES_PER_XDR_UNIT; if (rndup > 0) rndup = BYTES_PER_XDR_UNIT - rndup; if (xdrs->x_op == XDR_DECODE) { if (!XDR_GETBYTES(xdrs, cp, cnt)) { return (FALSE); } if (rndup == 0) return (TRUE); return (XDR_GETBYTES(xdrs, (caddr_t)(void *)crud, rndup)); } if (xdrs->x_op == XDR_ENCODE) { if (!XDR_PUTBYTES(xdrs, cp, cnt)) { return (FALSE); } if (rndup == 0) return (TRUE); return (XDR_PUTBYTES(xdrs, xdr_zero, rndup)); } if (xdrs->x_op == XDR_FREE) { return (TRUE); } return (FALSE); } /* * XDR counted bytes * *cpp is a pointer to the bytes, *sizep is the count. * If *cpp is NULL maxsize bytes are allocated */ bool_t xdr_bytes(XDR *xdrs, char **cpp, u_int *sizep, u_int maxsize) { char *sp = *cpp; /* sp is the actual string pointer */ u_int nodesize; /* * first deal with the length since xdr bytes are counted */ if (! xdr_u_int(xdrs, sizep)) { return (FALSE); } nodesize = *sizep; if ((nodesize > maxsize) && (xdrs->x_op != XDR_FREE)) { return (FALSE); } /* * now deal with the actual bytes */ switch (xdrs->x_op) { case XDR_DECODE: if (nodesize == 0) { return (TRUE); } if (sp == NULL) { *cpp = sp = mem_alloc(nodesize); } if (sp == NULL) { printf("xdr_bytes: out of memory"); return (FALSE); } /* FALLTHROUGH */ case XDR_ENCODE: return (xdr_opaque(xdrs, sp, nodesize)); case XDR_FREE: if (sp != NULL) { mem_free(sp, nodesize); *cpp = NULL; } return (TRUE); } /* NOTREACHED */ return (FALSE); } /* * Implemented here due to commonality of the object. */ bool_t xdr_netobj(XDR *xdrs, struct netobj *np) { return (xdr_bytes(xdrs, &np->n_bytes, &np->n_len, MAX_NETOBJ_SZ)); } /* * XDR a descriminated union * Support routine for discriminated unions. * You create an array of xdrdiscrim structures, terminated with * an entry with a null procedure pointer. The routine gets * the discriminant value and then searches the array of xdrdiscrims * looking for that value. It calls the procedure given in the xdrdiscrim * to handle the discriminant. If there is no specific routine a default * routine may be called. * If there is no specific or default routine an error is returned. */ bool_t xdr_union(XDR *xdrs, enum_t *dscmp, /* enum to decide which arm to work on */ char *unp, /* the union itself */ const struct xdr_discrim *choices, /* [value, xdr proc] for each arm */ xdrproc_t dfault) /* default xdr routine */ { enum_t dscm; /* * we deal with the discriminator; it's an enum */ if (! xdr_enum(xdrs, dscmp)) { return (FALSE); } dscm = *dscmp; /* * search choices for a value that matches the discriminator. * if we find one, execute the xdr routine for that value. */ for (; choices->proc != NULL_xdrproc_t; choices++) { if (choices->value == dscm) return ((*(choices->proc))(xdrs, unp)); } /* * no match - execute the default xdr routine if there is one */ return ((dfault == NULL_xdrproc_t) ? FALSE : (*dfault)(xdrs, unp)); } /* * Non-portable xdr primitives. * Care should be taken when moving these routines to new architectures. */ /* * XDR null terminated ASCII strings * xdr_string deals with "C strings" - arrays of bytes that are * terminated by a NULL character. The parameter cpp references a * pointer to storage; If the pointer is null, then the necessary * storage is allocated. The last parameter is the max allowed length * of the string as specified by a protocol. */ bool_t xdr_string(XDR *xdrs, char **cpp, u_int maxsize) { char *sp = *cpp; /* sp is the actual string pointer */ u_int size; u_int nodesize; /* * first deal with the length since xdr strings are counted-strings */ switch (xdrs->x_op) { case XDR_FREE: if (sp == NULL) { return(TRUE); /* already free */ } /* FALLTHROUGH */ case XDR_ENCODE: size = strlen(sp); break; case XDR_DECODE: break; } if (! xdr_u_int(xdrs, &size)) { return (FALSE); } if (size > maxsize) { return (FALSE); } nodesize = size + 1; /* * now deal with the actual bytes */ switch (xdrs->x_op) { case XDR_DECODE: if (nodesize == 0) { return (TRUE); } if (sp == NULL) *cpp = sp = mem_alloc(nodesize); if (sp == NULL) { printf("xdr_string: out of memory"); return (FALSE); } sp[size] = 0; /* FALLTHROUGH */ case XDR_ENCODE: return (xdr_opaque(xdrs, sp, size)); case XDR_FREE: mem_free(sp, nodesize); *cpp = NULL; return (TRUE); } /* NOTREACHED */ return (FALSE); } /* * Wrapper for xdr_string that can be called directly from * routines like clnt_call */ bool_t xdr_wrapstring(XDR *xdrs, char **cpp) { return xdr_string(xdrs, cpp, LASTUNSIGNED); } /* * NOTE: xdr_hyper(), xdr_u_hyper(), xdr_longlong_t(), and xdr_u_longlong_t() * are in the "non-portable" section because they require that a `long long' * be a 64-bit type. * * --thorpej@netbsd.org, November 30, 1999 */ /* * XDR 64-bit integers */ bool_t xdr_int64_t(XDR *xdrs, int64_t *llp) { - u_long ul[2]; + uint32_t u32[2]; switch (xdrs->x_op) { case XDR_ENCODE: - ul[0] = (u_long)((uint64_t)*llp >> 32) & 0xffffffff; - ul[1] = (u_long)((uint64_t)*llp) & 0xffffffff; - if (XDR_PUTLONG(xdrs, (long *)&ul[0]) == FALSE) + u32[0] = (uint32_t)((uint64_t)*llp >> 32) & 0xffffffff; + u32[1] = (uint32_t)((uint64_t)*llp) & 0xffffffff; + if (XDR_PUTINT32(xdrs, (int32_t *)&u32[0]) == FALSE) return (FALSE); - return (XDR_PUTLONG(xdrs, (long *)&ul[1])); + return (XDR_PUTINT32(xdrs, (int32_t *)&u32[1])); case XDR_DECODE: - if (XDR_GETLONG(xdrs, (long *)&ul[0]) == FALSE) + if (XDR_GETINT32(xdrs, (int32_t *)&u32[0]) == FALSE) return (FALSE); - if (XDR_GETLONG(xdrs, (long *)&ul[1]) == FALSE) + if (XDR_GETINT32(xdrs, (int32_t *)&u32[1]) == FALSE) return (FALSE); *llp = (int64_t) - (((uint64_t)ul[0] << 32) | ((uint64_t)ul[1])); + (((uint64_t)u32[0] << 32) | ((uint64_t)u32[1])); return (TRUE); case XDR_FREE: return (TRUE); } /* NOTREACHED */ return (FALSE); } /* * XDR unsigned 64-bit integers */ bool_t xdr_uint64_t(XDR *xdrs, uint64_t *ullp) { - u_long ul[2]; + uint32_t u32[2]; switch (xdrs->x_op) { case XDR_ENCODE: - ul[0] = (u_long)(*ullp >> 32) & 0xffffffff; - ul[1] = (u_long)(*ullp) & 0xffffffff; - if (XDR_PUTLONG(xdrs, (long *)&ul[0]) == FALSE) + u32[0] = (uint32_t)(*ullp >> 32) & 0xffffffff; + u32[1] = (uint32_t)(*ullp) & 0xffffffff; + if (XDR_PUTINT32(xdrs, (int32_t *)&u32[0]) == FALSE) return (FALSE); - return (XDR_PUTLONG(xdrs, (long *)&ul[1])); + return (XDR_PUTINT32(xdrs, (int32_t *)&u32[1])); case XDR_DECODE: - if (XDR_GETLONG(xdrs, (long *)&ul[0]) == FALSE) + if (XDR_GETINT32(xdrs, (int32_t *)&u32[0]) == FALSE) return (FALSE); - if (XDR_GETLONG(xdrs, (long *)&ul[1]) == FALSE) + if (XDR_GETINT32(xdrs, (int32_t *)&u32[1]) == FALSE) return (FALSE); *ullp = (uint64_t) - (((uint64_t)ul[0] << 32) | ((uint64_t)ul[1])); + (((uint64_t)u32[0] << 32) | ((uint64_t)u32[1])); return (TRUE); case XDR_FREE: return (TRUE); } /* NOTREACHED */ return (FALSE); } /* * XDR hypers */ bool_t xdr_hyper(XDR *xdrs, longlong_t *llp) { /* * Don't bother open-coding this; it's a fair amount of code. Just * call xdr_int64_t(). */ return (xdr_int64_t(xdrs, (int64_t *)llp)); } /* * XDR unsigned hypers */ bool_t xdr_u_hyper(XDR *xdrs, u_longlong_t *ullp) { /* * Don't bother open-coding this; it's a fair amount of code. Just * call xdr_uint64_t(). */ return (xdr_uint64_t(xdrs, (uint64_t *)ullp)); } /* * XDR longlong_t's */ bool_t xdr_longlong_t(XDR *xdrs, longlong_t *llp) { /* * Don't bother open-coding this; it's a fair amount of code. Just * call xdr_int64_t(). */ return (xdr_int64_t(xdrs, (int64_t *)llp)); } /* * XDR u_longlong_t's */ bool_t xdr_u_longlong_t(XDR *xdrs, u_longlong_t *ullp) { /* * Don't bother open-coding this; it's a fair amount of code. Just * call xdr_uint64_t(). */ return (xdr_uint64_t(xdrs, (uint64_t *)ullp)); } Index: user/kmacy/releng_7_2_fcs/sys/xdr/xdr_mbuf.c =================================================================== --- user/kmacy/releng_7_2_fcs/sys/xdr/xdr_mbuf.c (revision 192877) +++ user/kmacy/releng_7_2_fcs/sys/xdr/xdr_mbuf.c (revision 192878) @@ -1,238 +1,236 @@ /*- * Copyright (c) 2008 Isilon Inc http://www.isilon.com/ * Authors: Doug Rabson * Developed with Red Inc: Alfred Perlstein * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #include __FBSDID("$FreeBSD$"); #include #include #include #include #include #include static void xdrmbuf_destroy(XDR *); -static bool_t xdrmbuf_getlong(XDR *, long *); -static bool_t xdrmbuf_putlong(XDR *, const long *); +static bool_t xdrmbuf_getint32(XDR *, int32_t *); +static bool_t xdrmbuf_putint32(XDR *, const int32_t *); static bool_t xdrmbuf_getbytes(XDR *, char *, u_int); static bool_t xdrmbuf_putbytes(XDR *, const char *, u_int); /* XXX: w/64-bit pointers, u_int not enough! */ static u_int xdrmbuf_getpos(XDR *); static bool_t xdrmbuf_setpos(XDR *, u_int); static int32_t *xdrmbuf_inline(XDR *, u_int); static const struct xdr_ops xdrmbuf_ops = { - xdrmbuf_getlong, - xdrmbuf_putlong, + xdrmbuf_getint32, + xdrmbuf_putint32, xdrmbuf_getbytes, xdrmbuf_putbytes, xdrmbuf_getpos, xdrmbuf_setpos, xdrmbuf_inline, xdrmbuf_destroy }; /* * The procedure xdrmbuf_create initializes a stream descriptor for a * mbuf. */ void xdrmbuf_create(XDR *xdrs, struct mbuf *m, enum xdr_op op) { xdrs->x_op = op; xdrs->x_ops = &xdrmbuf_ops; xdrs->x_base = (char *) m; if (op == XDR_ENCODE) { m = m_last(m); xdrs->x_private = m; xdrs->x_handy = m->m_len; } else { xdrs->x_private = m; xdrs->x_handy = 0; } } static void xdrmbuf_destroy(XDR *xdrs) { if (xdrs->x_op == XDR_DECODE && xdrs->x_base) { m_freem((struct mbuf *) xdrs->x_base); xdrs->x_base = NULL; xdrs->x_private = NULL; } } static bool_t -xdrmbuf_getlong(XDR *xdrs, long *lp) +xdrmbuf_getint32(XDR *xdrs, int32_t *lp) { int32_t t; xdrmbuf_getbytes(xdrs, (char *) &t, sizeof(int32_t)); *lp = ntohl(t); return (TRUE); } static bool_t -xdrmbuf_putlong(xdrs, lp) - XDR *xdrs; - const long *lp; +xdrmbuf_putint32(XDR *xdrs, const int32_t *lp) { int32_t t = htonl(*lp); xdrmbuf_putbytes(xdrs, (char *) &t, sizeof(int32_t)); return (TRUE); } static bool_t xdrmbuf_getbytes(XDR *xdrs, char *addr, u_int len) { struct mbuf *m = (struct mbuf *) xdrs->x_private; size_t sz; while (len > 0) { /* * Make sure we haven't hit the end. */ if (!m) { return (FALSE); } /* * See how much we can get from this mbuf. */ sz = m->m_len - xdrs->x_handy; if (sz > len) sz = len; memcpy(addr, mtod(m, const char *) + xdrs->x_handy, sz); addr += sz; xdrs->x_handy += sz; len -= sz; if (xdrs->x_handy == m->m_len) { m = m->m_next; xdrs->x_private = (void *) m; xdrs->x_handy = 0; } } return (TRUE); } static bool_t xdrmbuf_putbytes(XDR *xdrs, const char *addr, u_int len) { struct mbuf *m = (struct mbuf *) xdrs->x_private; struct mbuf *n; size_t sz; while (len > 0) { sz = M_TRAILINGSPACE(m) + (m->m_len - xdrs->x_handy); if (sz > len) sz = len; memcpy(mtod(m, char *) + xdrs->x_handy, addr, sz); addr += sz; xdrs->x_handy += sz; if (xdrs->x_handy > m->m_len) m->m_len = xdrs->x_handy; len -= sz; if (xdrs->x_handy == m->m_len && M_TRAILINGSPACE(m) == 0) { if (!m->m_next) { MGET(n, M_TRYWAIT, m->m_type); m->m_next = n; } m = m->m_next; xdrs->x_private = (void *) m; xdrs->x_handy = 0; } } return (TRUE); } static u_int xdrmbuf_getpos(XDR *xdrs) { struct mbuf *m0 = (struct mbuf *) xdrs->x_base; struct mbuf *m = (struct mbuf *) xdrs->x_private; u_int pos = 0; while (m0 && m0 != m) { pos += m0->m_len; m0 = m0->m_next; } KASSERT(m0, ("Corrupted mbuf chain")); return (pos + xdrs->x_handy); } static bool_t xdrmbuf_setpos(XDR *xdrs, u_int pos) { struct mbuf *m = (struct mbuf *) xdrs->x_base; while (m && pos > m->m_len) { pos -= m->m_len; m = m->m_next; } KASSERT(m, ("Corrupted mbuf chain")); xdrs->x_private = (void *) m; xdrs->x_handy = pos; return (TRUE); } static int32_t * xdrmbuf_inline(XDR *xdrs, u_int len) { struct mbuf *m = (struct mbuf *) xdrs->x_private; size_t available; char *p; if (xdrs->x_op == XDR_ENCODE) { available = M_TRAILINGSPACE(m) + (m->m_len - xdrs->x_handy); } else { available = m->m_len - xdrs->x_handy; } if (available >= len) { p = mtod(m, char *) + xdrs->x_handy; if (((uintptr_t) p) & (sizeof(int32_t) - 1)) return (0); xdrs->x_handy += len; if (xdrs->x_handy > m->m_len) m->m_len = xdrs->x_handy; return ((int32_t *) p); } return (0); } Index: user/kmacy/releng_7_2_fcs/sys/xdr/xdr_mem.c =================================================================== --- user/kmacy/releng_7_2_fcs/sys/xdr/xdr_mem.c (revision 192877) +++ user/kmacy/releng_7_2_fcs/sys/xdr/xdr_mem.c (revision 192878) @@ -1,232 +1,232 @@ /* $NetBSD: xdr_mem.c,v 1.15 2000/01/22 22:19:18 mycroft Exp $ */ /* * Sun RPC is a product of Sun Microsystems, Inc. and is provided for * unrestricted use provided that this legend is included on all tape * media and as a part of the software program in whole or part. Users * may copy or modify Sun RPC without charge, but are not authorized * to license or distribute it to anyone else except as part of a product or * program developed by the user. * * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. * * Sun RPC is provided with no support and without any obligation on the * part of Sun Microsystems, Inc. to assist in its use, correction, * modification or enhancement. * * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC * OR ANY PART THEREOF. * * In no event will Sun Microsystems, Inc. be liable for any lost revenue * or profits or other special, indirect and consequential damages, even if * Sun has been advised of the possibility of such damages. * * Sun Microsystems, Inc. * 2550 Garcia Avenue * Mountain View, California 94043 */ #if defined(LIBC_SCCS) && !defined(lint) static char *sccsid2 = "@(#)xdr_mem.c 1.19 87/08/11 Copyr 1984 Sun Micro"; static char *sccsid = "@(#)xdr_mem.c 2.1 88/07/29 4.0 RPCSRC"; #endif #include __FBSDID("$FreeBSD$"); /* * xdr_mem.h, XDR implementation using memory buffers. * * Copyright (C) 1984, Sun Microsystems, Inc. * * If you have some data to be interpreted as external data representation * or to be converted to external data representation in a memory buffer, * then this is the package for you. * */ #include #include #include #include #include #define memmove(dst, src, len) bcopy(src, dst, len) static void xdrmem_destroy(XDR *); -static bool_t xdrmem_getlong_aligned(XDR *, long *); -static bool_t xdrmem_putlong_aligned(XDR *, const long *); -static bool_t xdrmem_getlong_unaligned(XDR *, long *); -static bool_t xdrmem_putlong_unaligned(XDR *, const long *); +static bool_t xdrmem_getint32_aligned(XDR *, int32_t *); +static bool_t xdrmem_putint32_aligned(XDR *, const int32_t *); +static bool_t xdrmem_getint32_unaligned(XDR *, int32_t *); +static bool_t xdrmem_putint32_unaligned(XDR *, const int32_t *); static bool_t xdrmem_getbytes(XDR *, char *, u_int); static bool_t xdrmem_putbytes(XDR *, const char *, u_int); /* XXX: w/64-bit pointers, u_int not enough! */ static u_int xdrmem_getpos(XDR *); static bool_t xdrmem_setpos(XDR *, u_int); static int32_t *xdrmem_inline_aligned(XDR *, u_int); static int32_t *xdrmem_inline_unaligned(XDR *, u_int); static const struct xdr_ops xdrmem_ops_aligned = { - xdrmem_getlong_aligned, - xdrmem_putlong_aligned, + xdrmem_getint32_aligned, + xdrmem_putint32_aligned, xdrmem_getbytes, xdrmem_putbytes, xdrmem_getpos, xdrmem_setpos, xdrmem_inline_aligned, xdrmem_destroy }; static const struct xdr_ops xdrmem_ops_unaligned = { - xdrmem_getlong_unaligned, - xdrmem_putlong_unaligned, + xdrmem_getint32_unaligned, + xdrmem_putint32_unaligned, xdrmem_getbytes, xdrmem_putbytes, xdrmem_getpos, xdrmem_setpos, xdrmem_inline_unaligned, xdrmem_destroy }; /* * The procedure xdrmem_create initializes a stream descriptor for a * memory buffer. */ void xdrmem_create(XDR *xdrs, char *addr, u_int size, enum xdr_op op) { xdrs->x_op = op; - xdrs->x_ops = ((unsigned long)addr & (sizeof(int32_t) - 1)) + xdrs->x_ops = ((uintptr_t)addr & (sizeof(int32_t) - 1)) ? &xdrmem_ops_unaligned : &xdrmem_ops_aligned; xdrs->x_private = xdrs->x_base = addr; xdrs->x_handy = size; } /*ARGSUSED*/ static void xdrmem_destroy(XDR *xdrs) { } static bool_t -xdrmem_getlong_aligned(XDR *xdrs, long *lp) +xdrmem_getint32_aligned(XDR *xdrs, int32_t *lp) { if (xdrs->x_handy < sizeof(int32_t)) return (FALSE); xdrs->x_handy -= sizeof(int32_t); *lp = ntohl(*(u_int32_t *)xdrs->x_private); xdrs->x_private = (char *)xdrs->x_private + sizeof(int32_t); return (TRUE); } static bool_t -xdrmem_putlong_aligned(XDR *xdrs, const long *lp) +xdrmem_putint32_aligned(XDR *xdrs, const int32_t *lp) { if (xdrs->x_handy < sizeof(int32_t)) return (FALSE); xdrs->x_handy -= sizeof(int32_t); *(u_int32_t *)xdrs->x_private = htonl((u_int32_t)*lp); xdrs->x_private = (char *)xdrs->x_private + sizeof(int32_t); return (TRUE); } static bool_t -xdrmem_getlong_unaligned(XDR *xdrs, long *lp) +xdrmem_getint32_unaligned(XDR *xdrs, int32_t *lp) { u_int32_t l; if (xdrs->x_handy < sizeof(int32_t)) return (FALSE); xdrs->x_handy -= sizeof(int32_t); memmove(&l, xdrs->x_private, sizeof(int32_t)); *lp = ntohl(l); xdrs->x_private = (char *)xdrs->x_private + sizeof(int32_t); return (TRUE); } static bool_t -xdrmem_putlong_unaligned(XDR *xdrs, const long *lp) +xdrmem_putint32_unaligned(XDR *xdrs, const int32_t *lp) { u_int32_t l; if (xdrs->x_handy < sizeof(int32_t)) return (FALSE); xdrs->x_handy -= sizeof(int32_t); l = htonl((u_int32_t)*lp); memmove(xdrs->x_private, &l, sizeof(int32_t)); xdrs->x_private = (char *)xdrs->x_private + sizeof(int32_t); return (TRUE); } static bool_t xdrmem_getbytes(XDR *xdrs, char *addr, u_int len) { if (xdrs->x_handy < len) return (FALSE); xdrs->x_handy -= len; memmove(addr, xdrs->x_private, len); xdrs->x_private = (char *)xdrs->x_private + len; return (TRUE); } static bool_t xdrmem_putbytes(XDR *xdrs, const char *addr, u_int len) { if (xdrs->x_handy < len) return (FALSE); xdrs->x_handy -= len; memmove(xdrs->x_private, addr, len); xdrs->x_private = (char *)xdrs->x_private + len; return (TRUE); } static u_int xdrmem_getpos(XDR *xdrs) { /* XXX w/64-bit pointers, u_int not enough! */ return (u_int)((u_long)xdrs->x_private - (u_long)xdrs->x_base); } static bool_t xdrmem_setpos(XDR *xdrs, u_int pos) { char *newaddr = xdrs->x_base + pos; char *lastaddr = (char *)xdrs->x_private + xdrs->x_handy; if (newaddr > lastaddr) return (FALSE); xdrs->x_private = newaddr; xdrs->x_handy = (u_int)(lastaddr - newaddr); /* XXX sizeof(u_int) x_handy >= len) { xdrs->x_handy -= len; buf = (int32_t *)xdrs->x_private; xdrs->x_private = (char *)xdrs->x_private + len; } return (buf); } /* ARGSUSED */ static int32_t * xdrmem_inline_unaligned(XDR *xdrs, u_int len) { return (0); } Index: user/kmacy/releng_7_2_fcs/sys/xdr/xdr_sizeof.c =================================================================== --- user/kmacy/releng_7_2_fcs/sys/xdr/xdr_sizeof.c (revision 192877) +++ user/kmacy/releng_7_2_fcs/sys/xdr/xdr_sizeof.c (revision 192878) @@ -1,162 +1,162 @@ /* * Sun RPC is a product of Sun Microsystems, Inc. and is provided for * unrestricted use provided that this legend is included on all tape * media and as a part of the software program in whole or part. Users * may copy or modify Sun RPC without charge, but are not authorized * to license or distribute it to anyone else except as part of a product or * program developed by the user. * * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. * * Sun RPC is provided with no support and without any obligation on the * part of Sun Microsystems, Inc. to assist in its use, correction, * modification or enhancement. * * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC * OR ANY PART THEREOF. * * In no event will Sun Microsystems, Inc. be liable for any lost revenue * or profits or other special, indirect and consequential damages, even if * Sun has been advised of the possibility of such damages. * * Sun Microsystems, Inc. * 2550 Garcia Avenue * Mountain View, California 94043 */ /* * xdr_sizeof.c * * Copyright 1990 Sun Microsystems, Inc. * * General purpose routine to see how much space something will use * when serialized using XDR. */ #include __FBSDID("$FreeBSD$"); #include #include #include #include #include /* ARGSUSED */ static bool_t -x_putlong(XDR *xdrs, const long *longp) +x_putint32(XDR *xdrs, const int32_t *longp) { xdrs->x_handy += BYTES_PER_XDR_UNIT; return (TRUE); } /* ARGSUSED */ static bool_t x_putbytes(XDR *xdrs, const char *bp, u_int len) { xdrs->x_handy += len; return (TRUE); } static u_int x_getpostn(XDR *xdrs) { return (xdrs->x_handy); } /* ARGSUSED */ static bool_t x_setpostn(XDR *xdrs, u_int pos) { /* This is not allowed */ return (FALSE); } static int32_t * x_inline(XDR *xdrs, u_int len) { if (len == 0) { return (NULL); } if (xdrs->x_op != XDR_ENCODE) { return (NULL); } if (len < (u_int)(uintptr_t)xdrs->x_base) { /* x_private was already allocated */ xdrs->x_handy += len; return ((int32_t *) xdrs->x_private); } else { /* Free the earlier space and allocate new area */ if (xdrs->x_private) free(xdrs->x_private, M_RPC); if ((xdrs->x_private = (caddr_t) malloc(len, M_RPC, M_WAITOK)) == NULL) { xdrs->x_base = 0; return (NULL); } xdrs->x_base = (caddr_t)(uintptr_t) len; xdrs->x_handy += len; return ((int32_t *) xdrs->x_private); } } static int harmless(void) { /* Always return FALSE/NULL, as the case may be */ return (0); } static void x_destroy(XDR *xdrs) { xdrs->x_handy = 0; xdrs->x_base = 0; if (xdrs->x_private) { free(xdrs->x_private, M_RPC); xdrs->x_private = NULL; } return; } unsigned long xdr_sizeof(xdrproc_t func, void *data) { XDR x; struct xdr_ops ops; bool_t stat; /* to stop ANSI-C compiler from complaining */ - typedef bool_t (* dummyfunc1)(XDR *, long *); + typedef bool_t (* dummyfunc1)(XDR *, int32_t *); typedef bool_t (* dummyfunc2)(XDR *, caddr_t, u_int); - ops.x_putlong = x_putlong; + ops.x_putint32 = x_putint32; ops.x_putbytes = x_putbytes; ops.x_inline = x_inline; ops.x_getpostn = x_getpostn; ops.x_setpostn = x_setpostn; ops.x_destroy = x_destroy; /* the other harmless ones */ - ops.x_getlong = (dummyfunc1) harmless; + ops.x_getint32 = (dummyfunc1) harmless; ops.x_getbytes = (dummyfunc2) harmless; x.x_op = XDR_ENCODE; x.x_ops = &ops; x.x_handy = 0; x.x_private = (caddr_t) NULL; x.x_base = (caddr_t) 0; stat = func(&x, data); if (x.x_private) free(x.x_private, M_RPC); return (stat == TRUE ? (unsigned) x.x_handy: 0); }