libc/xdr: Add xdr_uint16_t() (it's just like xdr_u_int16_t()).
authorSascha Wildner <saw@online.de>
Sat, 9 Jun 2018 08:13:36 +0000 (10:13 +0200)
committerSascha Wildner <saw@online.de>
Sat, 9 Jun 2018 08:13:36 +0000 (10:13 +0200)
dports might make use of it.

While here, improve the manual page a bit and also bring in some fixes
from FreeBSD.

include/rpc/xdr.h
lib/libc/xdr/Makefile.inc
lib/libc/xdr/Symbol.map
lib/libc/xdr/xdr.3
lib/libc/xdr/xdr.c
sys/sys/param.h

index 70edbdf..7481bc3 100644 (file)
@@ -288,6 +288,7 @@ 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_u_int16_t(XDR *, uint16_t *);
+extern bool_t  xdr_uint16_t(XDR *, uint16_t *);
 extern bool_t  xdr_int32_t(XDR *, int32_t *);
 extern bool_t  xdr_u_int32_t(XDR *, uint32_t *);
 extern bool_t  xdr_uint32_t(XDR *, uint32_t *);
index 89e7175..23028c5 100644 (file)
@@ -31,6 +31,8 @@ MLINKS+=xdr.3 xdr_array.3 \
        xdr.3 xdr_hyper.3 \
        xdr.3 xdr_inline.3 \
        xdr.3 xdr_int.3 \
+       xdr.3 xdr_int16_t.3 \
+       xdr.3 xdr_int32_t.3 \
        xdr.3 xdr_int64_t.3 \
        xdr.3 xdr_long.3 \
        xdr.3 xdr_longlong_t.3 \
@@ -50,6 +52,11 @@ MLINKS+=xdr.3 xdr_array.3 \
        xdr.3 xdr_u_char.3 \
        xdr.3 xdr_u_hyper.3 \
        xdr.3 xdr_u_int.3 \
+       xdr.3 xdr_uint16_t.3 \
+       xdr.3 xdr_u_int16_t.3 \
+       xdr.3 xdr_uint32_t.3 \
+       xdr.3 xdr_u_int32_t.3 \
+       xdr.3 xdr_uint64_t.3 \
        xdr.3 xdr_u_int64_t.3 \
        xdr.3 xdr_u_long.3 \
        xdr.3 xdr_u_longlong_t.3 \
index 0810b91..1fb0fe0 100644 (file)
@@ -44,6 +44,10 @@ DF404.0 {
     xdrstdio_create;
 };
 
+DF504.0 {
+    xdr_uint16_t;
+};
+
 DFprivate_1.0 {
     __xdrrec_getrec;
     __xdrrec_setnonblock;
index 9c06516..c5958c1 100644 (file)
@@ -1,7 +1,7 @@
 .\" @(#)xdr.3n 2.2 88/08/03 4.0 RPCSRC; from 1.16 88/03/14 SMI
-.\" $FreeBSD: src/lib/libc/xdr/xdr.3,v 1.17 2005/11/24 07:12:01 ru Exp $
+.\" $FreeBSD: head/lib/libc/xdr/xdr.3 318712 2017-05-23 07:17:52Z ngie $
 .\"
-.Dd July 30, 2015
+.Dd June 9, 2018
 .Dt XDR 3
 .Os
 .Sh NAME
 .Nm xdr_hyper ,
 .Nm xdr_inline ,
 .Nm xdr_int ,
+.Nm xdr_int16_t ,
+.Nm xdr_int32_t ,
+.Nm xdr_int64_t ,
 .Nm xdr_long ,
 .Nm xdr_longlong_t ,
-.Nm xdr_int64_t ,
 .Nm xdrmem_create ,
 .Nm xdr_opaque ,
 .Nm xdr_pointer ,
 .Nm xdr_u_int ,
 .Nm xdr_u_long ,
 .Nm xdr_u_longlong_t ,
+.Nm xdr_uint16_t ,
+.Nm xdr_u_int16_t ,
+.Nm xdr_uint32_t ,
+.Nm xdr_u_int32_t ,
+.Nm xdr_uint64_t ,
 .Nm xdr_u_int64_t ,
-.Nm xdr_u_short ,
 .Nm xdr_union ,
+.Nm xdr_u_short ,
 .Nm xdr_vector ,
 .Nm xdr_void ,
 .Nm xdr_wrapstring
@@ -306,11 +313,10 @@ This routine returns one if it succeeds, zero otherwise.
 .Ft int
 .Xc
 .It Xo
-.Fn xdr_long "XDR *xdrs" "long *lp"
+.Fn xdr_int16_t "XDR *xdrs" "int16_t *llp"
 .Xc
-.Pp
-A filter primitive that translates between C
-.Vt long
+A filter primitive that translates between ANSI C
+.Vt int16_t
 integers and their external representations.
 This routine returns one if it succeeds, zero otherwise.
 .Pp
@@ -318,10 +324,10 @@ This routine returns one if it succeeds, zero otherwise.
 .Ft int
 .Xc
 .It Xo
-.Fn xdr_longlong_t "XDR *xdrs" "quad_t *llp"
+.Fn xdr_int32_t "XDR *xdrs" "int32_t *llp"
 .Xc
 A filter primitive that translates between ANSI C
-.Vt "long long"
+.Vt int32_t
 integers and their external representations.
 This routine returns one if it succeeds, zero otherwise.
 .Pp
@@ -337,6 +343,29 @@ integers and their external representations.
 This routine returns one if it succeeds, zero otherwise.
 .Pp
 .It Xo
+.Ft int
+.Xc
+.It Xo
+.Fn xdr_long "XDR *xdrs" "long *lp"
+.Xc
+.Pp
+A filter primitive that translates between C
+.Vt long
+integers and their external representations.
+This routine returns one if it succeeds, zero otherwise.
+.Pp
+.It Xo
+.Ft int
+.Xc
+.It Xo
+.Fn xdr_longlong_t "XDR *xdrs" "quad_t *llp"
+.Xc
+A filter primitive that translates between ANSI C
+.Vt "long long"
+integers and their external representations.
+This routine returns one if it succeeds, zero otherwise.
+.Pp
+.It Xo
 .Ft void
 .Xc
 .It Xo
@@ -412,8 +441,8 @@ linked lists.
 .Fa "u_int sendsize"
 .Fa "u_int recvsize"
 .Fa "void *handle"
-.Fa "int (*readit)(void)"
-.Fa "int (*writeit)(void)"
+.Fa "int \*(lp*readit\*(rp\*(lp\*(rp"
+.Fa "int \*(lp*writeit\*(rp\*(lp\*(rp"
 .Fc
 .Xc
 .Pp
@@ -685,6 +714,57 @@ This routine returns one if it succeeds, zero otherwise.
 .Ft int
 .Xc
 .It Xo
+.Fn xdr_uint16_t "XDR *xdrs" "uint16_t *llp"
+.Xc
+.It Xo
+.Ft int
+.Xc
+.It Xo
+.Fn xdr_u_int16_t "XDR *xdrs" "uint16_t *llp"
+.Xc
+Filter primitives that translate between C
+.Vt uint16_t
+integers and their external representations.
+These routines return one if they succeed, zero otherwise.
+.Pp
+.It Xo
+.Ft int
+.Xc
+.It Xo
+.Fn xdr_uint32_t "XDR *xdrs" "uint32_t *llp"
+.Xc
+.It Xo
+.Ft int
+.Xc
+.It Xo
+.Fn xdr_u_int32_t "XDR *xdrs" "uint32_t *llp"
+.Xc
+Filter primitives that translate between C
+.Vt uint32_t
+integers and their external representations.
+These routines return one if they succeed, zero otherwise.
+.Pp
+.It Xo
+.Ft int
+.Xc
+.It Xo
+.Fn xdr_uint64_t "XDR *xdrs" "uint64_t *llp"
+.Xc
+.It Xo
+.Ft int
+.Xc
+.It Xo
+.Fn xdr_u_int64_t "XDR *xdrs" "uint64_t *llp"
+.Xc
+Filter primitives that translate between C
+.Vt uint64_t
+integers and their external representations.
+These routines return one if they succeed, zero otherwise.
+.Pp
+.It Xo
+.Ft int
+.Xc
+.It Xo
 .Fn xdr_u_long "XDR *xdrs" "unsigned long *ulp"
 .Xc
 .Pp
@@ -864,3 +944,8 @@ Returns one if it succeeds, zero otherwise.
 .%O RFC 1014
 .%Q "Sun Microsystems, Inc., USC\-ISI"
 .Re
+.Sh HISTORY
+The
+.Nm xdr_sizeof
+function first appeared in
+.Fx 9.0 .
index b293c65..56223da 100644 (file)
@@ -1,42 +1,45 @@
-/*
- * 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.
+/*     $NetBSD: xdr.c,v 1.22 2000/07/06 03:10:35 christos Exp $        */
+
+/*-
+ * SPDX-License-Identifier: BSD-3-Clause
  *
- * 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.
+ * Copyright (c) 2010, Oracle America, Inc.
  *
- * 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.
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
  *
- * 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.
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of the "Oracle America, Inc." nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
  *
- * Sun Microsystems, Inc.
- * 2550 Garcia Avenue
- * Mountain View, California  94043
+ *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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
+ *   COPYRIGHT HOLDER 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.
  *
  * @(#)xdr.c 1.35 87/08/12
  * @(#)xdr.c   2.1 88/07/29 4.0 RPCSRC
- * $NetBSD: xdr.c,v 1.22 2000/07/06 03:10:35 christos Exp $
- * $FreeBSD: src/lib/libc/xdr/xdr.c,v 1.14 2004/10/16 06:32:43 obrien Exp $
+ * $FreeBSD: head/lib/libc/xdr/xdr.c 326025 2017-11-20 19:49:47Z pfg $
  */
 
 /*
  * 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.
@@ -48,6 +51,8 @@
 #include <stdlib.h>
 #include <string.h>
 
+#include <rpc/rpc.h>
+#include <rpc/rpc_com.h>
 #include <rpc/types.h>
 #include <rpc/xdr.h>
 #include "un-namespace.h"
@@ -60,7 +65,6 @@ typedef u_quad_t        u_longlong_t;   /* ANSI unsigned long long type */
  */
 #define XDR_FALSE      ((long) 0)
 #define XDR_TRUE       ((long) 1)
-#define LASTUNSIGNED   ((u_int) 0-1)
 
 /*
  * for unit alignment
@@ -387,6 +391,34 @@ xdr_u_int16_t(XDR *xdrs, uint16_t *uint16_p)
        return (FALSE);
 }
 
+/*
+ * XDR unsigned 16-bit integers
+ */
+bool_t
+xdr_uint16_t(XDR *xdrs, uint16_t *uint16_p)
+{
+       u_long l;
+
+       switch (xdrs->x_op) {
+
+       case XDR_ENCODE:
+               l = (u_long) *uint16_p;
+               return (XDR_PUTLONG(xdrs, (long *)&l));
+
+       case XDR_DECODE:
+               if (!XDR_GETLONG(xdrs, (long *)&l)) {
+                       return (FALSE);
+               }
+               *uint16_p = (uint16_t) l;
+               return (TRUE);
+
+       case XDR_FREE:
+               return (TRUE);
+       }
+       /* NOTREACHED */
+       return (FALSE);
+}
+
 
 /*
  * XDR a char
@@ -529,6 +561,7 @@ xdr_bytes(XDR *xdrs, char **cpp, u_int *sizep, u_int maxsize)
 {
        char *sp = *cpp;  /* sp is the actual string pointer */
        u_int nodesize;
+       bool_t ret, allocated = FALSE;
 
        /*
         * first deal with the length since xdr bytes are counted
@@ -552,6 +585,7 @@ xdr_bytes(XDR *xdrs, char **cpp, u_int *sizep, u_int maxsize)
                }
                if (sp == NULL) {
                        *cpp = sp = mem_alloc(nodesize);
+                       allocated = TRUE;
                }
                if (sp == NULL) {
                        warnx("xdr_bytes: out of memory");
@@ -560,7 +594,14 @@ xdr_bytes(XDR *xdrs, char **cpp, u_int *sizep, u_int maxsize)
                /* FALLTHROUGH */
 
        case XDR_ENCODE:
-               return (xdr_opaque(xdrs, sp, nodesize));
+               ret = xdr_opaque(xdrs, sp, nodesize);
+               if ((xdrs->x_op == XDR_DECODE) && (ret == FALSE)) {
+                       if (allocated == TRUE) {
+                               free(sp);
+                               *cpp = NULL;
+                       }
+               }
+               return (ret);
 
        case XDR_FREE:
                if (sp != NULL) {
@@ -650,6 +691,7 @@ xdr_string(XDR *xdrs, char **cpp, u_int maxsize)
        char *sp = *cpp;  /* sp is the actual string pointer */
        u_int size;
        u_int nodesize;
+       bool_t ret, allocated = FALSE;
 
        /*
         * first deal with the length since xdr strings are counted-strings
@@ -683,8 +725,10 @@ xdr_string(XDR *xdrs, char **cpp, u_int maxsize)
                if (nodesize == 0) {
                        return (TRUE);
                }
-               if (sp == NULL)
+               if (sp == NULL) {
                        *cpp = sp = mem_alloc(nodesize);
+                       allocated = TRUE;
+               }
                if (sp == NULL) {
                        warnx("xdr_string: out of memory");
                        return (FALSE);
@@ -693,7 +737,14 @@ xdr_string(XDR *xdrs, char **cpp, u_int maxsize)
                /* FALLTHROUGH */
 
        case XDR_ENCODE:
-               return (xdr_opaque(xdrs, sp, size));
+               ret = xdr_opaque(xdrs, sp, size);
+               if ((xdrs->x_op == XDR_DECODE) && (ret == FALSE)) {
+                       if (allocated == TRUE) {
+                               free(sp);
+                               *cpp = NULL;
+                       }
+               }
+               return (ret);
 
        case XDR_FREE:
                mem_free(sp, nodesize);
@@ -711,7 +762,7 @@ xdr_string(XDR *xdrs, char **cpp, u_int maxsize)
 bool_t
 xdr_wrapstring(XDR *xdrs, char **cpp)
 {
-       return xdr_string(xdrs, cpp, LASTUNSIGNED);
+       return xdr_string(xdrs, cpp, RPC_MAXDATASIZE);
 }
 
 /*
index de52dfc..a24d2bd 100644 (file)
  * 500305 - remove <sys/ioctl_compat.h> for good
  * 500306 - strsuftoll(), strsuftollx()
  * 500307 - tcsetsid()
+ * 500308 - xdr_uint16_t()
  */
 #undef __DragonFly_version
-#define __DragonFly_version 500307     /* propagated to newvers */
+#define __DragonFly_version 500308     /* propagated to newvers */
 
 #include <sys/_null.h>