Skip site navigation (1)Skip section navigation (2)
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>