Date: Thu, 28 May 2009 08:18:13 +0000 (UTC) From: Kip Macy <kmacy@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r192971 - in head/sys: cddl/contrib/opensolaris/uts/common/rpc modules/zfs rpc xdr Message-ID: <200905280818.n4S8IDjj028328@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: kmacy Date: Thu May 28 08:18:12 2009 New Revision: 192971 URL: http://svn.freebsd.org/changeset/base/192971 Log: MFdevbranch 192944 - add FreeBSD implementation of xdrmem_control needed by zfs - have zfs define xdr_ops using FreeBSD's definition - remove solaris xdr files from zfs compile Modified: head/sys/cddl/contrib/opensolaris/uts/common/rpc/xdr.h head/sys/modules/zfs/Makefile head/sys/rpc/xdr.h head/sys/xdr/xdr_mem.c Modified: head/sys/cddl/contrib/opensolaris/uts/common/rpc/xdr.h ============================================================================== --- head/sys/cddl/contrib/opensolaris/uts/common/rpc/xdr.h Thu May 28 07:43:06 2009 (r192970) +++ head/sys/cddl/contrib/opensolaris/uts/common/rpc/xdr.h Thu May 28 08:18:12 2009 (r192971) @@ -121,6 +121,7 @@ typedef struct XDR { * Changes must be reviewed by Solaris File Sharing * Changes must be communicated to contract-2003-523@sun.com */ +#ifndef __FreeBSD__ struct xdr_ops { #ifdef __STDC__ #if !defined(_KERNEL) @@ -168,6 +169,28 @@ struct xdr_ops { #endif }; +#else /* FreeBSD */ +struct xdr_ops { + /* get a long from underlying stream */ + bool_t (*x_getint32)(struct XDR *, int32_t *); + /* put a long to " */ + bool_t (*x_putint32)(struct XDR *, const int32_t *); + /* get some bytes from " */ + bool_t (*x_getbytes)(struct XDR *, char *, u_int); + /* put some bytes to " */ + bool_t (*x_putbytes)(struct XDR *, const char *, u_int); + /* returns bytes off from beginning */ + u_int (*x_getpostn)(struct XDR *); + /* lets you reposition the stream */ + bool_t (*x_setpostn)(struct XDR *, u_int); + /* buf quick ptr to buffered data */ + int32_t *(*x_inline)(struct XDR *, u_int); + /* free privates of this xdr_stream */ + void (*x_destroy)(struct XDR *); + bool_t (*x_control)(struct XDR *, int, void *); +}; +#endif + /* * Operations defined on a XDR handle * Modified: head/sys/modules/zfs/Makefile ============================================================================== --- head/sys/modules/zfs/Makefile Thu May 28 07:43:06 2009 (r192970) +++ head/sys/modules/zfs/Makefile Thu May 28 08:18:12 2009 (r192971) @@ -44,10 +44,10 @@ SRCS+= list.c SRCS+= nvpair_alloc_system.c SRCS+= taskq.c -.PATH: ${SUNW}/uts/common/rpc -SRCS+= opensolaris_xdr.c -SRCS+= opensolaris_xdr_array.c -SRCS+= opensolaris_xdr_mem.c +#.PATH: ${SUNW}/uts/common/rpc +#SRCS+= opensolaris_xdr.c +#SRCS+= opensolaris_xdr_array.c +#SRCS+= opensolaris_xdr_mem.c .PATH: ${SUNW}/uts/common/zmod SRCS+= adler32.c Modified: head/sys/rpc/xdr.h ============================================================================== --- head/sys/rpc/xdr.h Thu May 28 07:43:06 2009 (r192970) +++ head/sys/rpc/xdr.h Thu May 28 08:18:12 2009 (r192971) @@ -338,6 +338,22 @@ typedef struct netobj netobj; extern bool_t xdr_netobj(XDR *, struct netobj *); /* + * These are XDR control operators + */ + +#define XDR_GET_BYTES_AVAIL 1 +#define XDR_PEEK 2 +#define XDR_SKIPBYTES 3 + +struct xdr_bytesrec { + bool_t xc_is_last_record; + size_t xc_num_avail; +}; + +typedef struct xdr_bytesrec xdr_bytesrec; + + +/* * These are the public routines for the various implementations of * xdr streams. */ Modified: head/sys/xdr/xdr_mem.c ============================================================================== --- head/sys/xdr/xdr_mem.c Thu May 28 07:43:06 2009 (r192970) +++ head/sys/xdr/xdr_mem.c Thu May 28 08:18:12 2009 (r192971) @@ -66,7 +66,8 @@ 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 bool_t xdrmem_control(XDR *xdrs, int request, void *info); + static const struct xdr_ops xdrmem_ops_aligned = { xdrmem_getlong_aligned, xdrmem_putlong_aligned, @@ -75,7 +76,8 @@ static const struct xdr_ops xdrmem_ops_a xdrmem_getpos, xdrmem_setpos, xdrmem_inline_aligned, - xdrmem_destroy + xdrmem_destroy, + xdrmem_control }; static const struct xdr_ops xdrmem_ops_unaligned = { @@ -86,7 +88,8 @@ static const struct xdr_ops xdrmem_ops_u xdrmem_getpos, xdrmem_setpos, xdrmem_inline_unaligned, - xdrmem_destroy + xdrmem_destroy, + xdrmem_control }; /* @@ -228,3 +231,45 @@ xdrmem_inline_unaligned(XDR *xdrs, u_int return (0); } + +static bool_t +xdrmem_control(XDR *xdrs, int request, void *info) +{ + xdr_bytesrec *xptr; + int32_t *l; + int len; + + switch (request) { + + case XDR_GET_BYTES_AVAIL: + xptr = (xdr_bytesrec *)info; + xptr->xc_is_last_record = TRUE; + xptr->xc_num_avail = xdrs->x_handy; + return (TRUE); + + case XDR_PEEK: + /* + * Return the next 4 byte unit in the XDR stream. + */ + if (xdrs->x_handy < sizeof (int32_t)) + return (FALSE); + l = (int32_t *)info; + *l = (int32_t)ntohl((uint32_t) + (*((int32_t *)(xdrs->x_private)))); + return (TRUE); + + case XDR_SKIPBYTES: + /* + * Skip the next N bytes in the XDR stream. + */ + l = (int32_t *)info; + len = RNDUP((int)(*l)); + if (xdrs->x_handy < len) + return (FALSE); + xdrs->x_handy -= len; + xdrs->x_private = (char *)xdrs->x_private + len; + return (TRUE); + + } + return (FALSE); +}
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200905280818.n4S8IDjj028328>