Import proplib from NetBSD
authorFrançois Tigeot <ftigeot@wolfpond.org>
Sat, 1 Oct 2011 11:07:35 +0000 (13:07 +0200)
committerFrançois Tigeot <ftigeot@wolfpond.org>
Tue, 4 Oct 2011 07:54:59 +0000 (09:54 +0200)
- main change: fix for an implementation inconsistency with the
prop_*_send_syscall() and prop_*_recv_syscall() functions
NetBSD commit message:
http://mail-index.netbsd.org/source-changes/2011/09/30/msg027701.html

- some unrelated minor fixes

lib/libprop/prop_array.3
lib/libprop/prop_dictionary.3
lib/libprop/prop_dictionary_util.3
lib/libprop/prop_send_ioctl.3
lib/libprop/prop_send_syscall.3
sys/libprop/prop_array.h
sys/libprop/prop_dictionary.h
sys/libprop/prop_kern.c

index 4e7d1a6..63547de 100644 (file)
@@ -1,4 +1,4 @@
-.\"    $NetBSD: prop_array.3,v 1.11 2009/12/14 06:03:23 dholland Exp $
+.\"    $NetBSD: prop_array.3,v 1.13 2011/09/30 22:08:18 jym Exp $
 .\"
 .\" Copyright (c) 2006, 2009 The NetBSD Foundation, Inc.
 .\" All rights reserved.
@@ -51,6 +51,7 @@
 .Nm prop_array_externalize_to_file ,
 .Nm prop_array_internalize_from_file ,
 .Nm prop_array_externalize_to_pref ,
+.Nm prop_array_internalize_from_pref ,
 .Nm prop_array_equals
 .Nd array property collection object
 .Sh LIBRARY
 .\"
 .Ft bool
 .Fn prop_array_externalize_to_pref "prop_array_t array" "struct plistref *pref"
+.Ft bool
+.Fn prop_array_internalize_from_pref "const struct plistref *pref" \
+    "prop_array_t *arrayp"
 .\"
 .Ft bool
 .Fn prop_array_equals "prop_array_t array1" "prop_array_t array2"
@@ -266,12 +270,20 @@ Returns
 .Dv NULL
 on failure.
 .It Fn prop_array_externalize_to_pref "prop_array_t array" \
-       "struct plistref *pref"
+    "struct plistref *pref"
 Externalizes an array and packs it into the plistref specified by
 .Fa pref .
 Returns
 .Dv false
 if externalizing the array fails for any reason.
+.It Fn prop_array_internalize_from_pref "const struct plistref *pref" \
+    "prop_array_t *arrayp"
+Reads the plistref specified by
+.Fa pref ,
+internalizes it, and returns the corresponding array.
+Returns
+.Dv false
+if internalizing or writing the array fails for any reason.
 .It Fn prop_array_equals "prop_array_t array1" "prop_array_t array2"
 Returns
 .Dv true
index 771acaf..34f4423 100644 (file)
@@ -1,4 +1,4 @@
-.\"    $NetBSD: prop_dictionary.3,v 1.16 2011/02/02 16:37:27 plunky Exp $
+.\"    $NetBSD: prop_dictionary.3,v 1.18 2011/09/30 22:08:18 jym Exp $
 .\"
 .\" Copyright (c) 2006, 2009 The NetBSD Foundation, Inc.
 .\" All rights reserved.
@@ -53,6 +53,7 @@
 .Nm prop_dictionary_externalize_to_file ,
 .Nm prop_dictionary_internalize_from_file ,
 .Nm prop_dictionary_externalize_to_pref ,
+.Nm prop_dictionary_internalize_from_pref ,
 .Nm prop_dictionary_equals ,
 .Nm prop_dictionary_keysym_cstring_nocopy ,
 .Nm prop_dictionary_keysym_equals
 .Ft bool
 .Fn prop_dictionary_externalize_to_pref "prop_dictionary_t dict" \
     "struct plistref *pref"
+.Ft bool
+.Fn prop_dictionary_internalize_from_pref "const struct plistref *pref" \
+    "prop_dictionary_t *dictp"
 .\"
 .Sh DESCRIPTION
 The
@@ -324,6 +328,14 @@ Externalizes a dictionary and packs it into the plistref specified by
 Returns
 .Dv false
 if externalizing the dictionary fails for any reason.
+.It Fn prop_dictionary_internalize_from_pref "const struct plistref *pref" \
+    "prop_dictionary_t *dictp"
+Reads the plistref specified by
+.Fa pref ,
+internalizes it, and returns the corresponding dictionary.
+Returns
+.Dv false
+if internalizing or writing the dictionary fails for any reason.
 .El
 .Sh SEE ALSO
 .Xr prop_array 3 ,
index e3b705b..ad89720 100644 (file)
@@ -1,4 +1,4 @@
-.\"    $NetBSD: prop_dictionary_util.3,v 1.5 2011/03/24 17:05:39 bouyer Exp $
+.\"    $NetBSD: prop_dictionary_util.3,v 1.7 2011/08/07 11:33:03 jmcneill Exp $
 .\"
 .\" Copyright (c) 2006 The NetBSD Foundation, Inc.
 .\" All rights reserved.
@@ -27,7 +27,7 @@
 .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 .\" POSSIBILITY OF SUCH DAMAGE.
 .\"
-.Dd March 12, 2011
+.Dd August 7, 2011
 .Dt PROP_DICTIONARY_UTIL 3
 .Os
 .Sh NAME
@@ -63,7 +63,7 @@
 .\"
 .Ft bool
 .Fn prop_dictionary_get_dict "prop_dictionary_t dict" "const char *key" \
-    "bool *dictp"
+    "prop_dictionary_t *dictp"
 .Ft bool
 .Fn prop_dictionary_get_bool "prop_dictionary_t dict" "const char *key" \
     "bool *valp"
index 22019f5..7135361 100644 (file)
@@ -1,4 +1,4 @@
-.\"    $NetBSD: prop_send_ioctl.3,v 1.6 2011/01/20 10:44:42 wiz Exp $
+.\"    $NetBSD: prop_send_ioctl.3,v 1.8 2011/09/27 11:12:49 jym Exp $
 .\"
 .\" Copyright (c) 2006 The NetBSD Foundation, Inc.
 .\" All rights reserved.
@@ -51,6 +51,7 @@
 .Ft int
 .Fn prop_dictionary_recv_ioctl "int fd" "unsigned long cmd" \
     "prop_dictionary_t *dictp"
+.Ft int
 .Fn prop_dictionary_sendrecv_ioctl "prop_dictionary_t dict" "int fd" \
     "unsigned long cmd" "prop_dictionary_t *dictp"
 .Sh DESCRIPTION
index 5e2a1ba..c0d8da1 100644 (file)
@@ -1,4 +1,4 @@
-.\"    $NetBSD: prop_send_syscall.3,v 1.3 2011/01/20 10:48:37 wiz Exp $
+.\"    $NetBSD: prop_send_syscall.3,v 1.5 2011/09/30 22:08:18 jym Exp $
 .\"
 .\" Copyright (c) 2006 The NetBSD Foundation, Inc.
 .\" All rights reserved.
 .Lb libprop
 .Sh SYNOPSIS
 .In libprop/proplib.h
-.Ft bool
+.Ft int
 .Fn prop_array_send_syscall "prop_array_t array" "struct plistref *prefp"
-.Ft bool
+.Ft int
 .Fn prop_array_recv_syscall "const struct plistref *prefp" \
     "prop_array_t *arrayp"
-.Ft bool
+.Ft int
 .Fn prop_dictionary_send_syscall "prop_dictionary_t dict" \
     "struct plistref *prefp"
-.Ft bool
+.Ft int
 .Fn prop_dictionary_recv_syscall "const struct plistref *prefp" \
     "prop_dictionary_t *dictp"
 .Sh DESCRIPTION
@@ -62,7 +62,8 @@ functions implement the user space side of a protocol for sending property
 lists to and from the kernel using
 .Xr syscall 2 .
 .Sh RETURN VALUES
-If successful, the functions return true, false otherwise.
+If successful, functions return zero.
+Otherwise, an error number is returned to indicate the error.
 .Sh EXAMPLES
 The following
 .Pq simplified
@@ -89,12 +90,34 @@ foo_getprops(void)
     struct pref pref;
 
     (void) my_syscall_get(\*[Am]pref);
-    if (!prop_dictionary_recv_syscall(\*[Am]pref, \*[Am]dict))
+    if (prop_dictionary_recv_syscall(\*[Am]pref, \*[Am]dict) != 0)
         return (NULL);
 
     return (dict);
 }
 .Ed
+.Sh ERRORS
+.Fn prop_array_send_syscall
+and
+.Fn prop_dictionary_send_syscall
+will fail if:
+.Bl -tag -width Er
+.It Bq Er ENOMEM
+Cannot allocate memory
+.It Bq Er ENOTSUP
+Not supported
+.El
+.Pp
+.Fn prop_array_recv_syscall
+and
+.Fn prop_dictionary_recv_syscall
+will fail if:
+.Bl -tag -width Er
+.It Bq Er EIO
+Input/output error
+.It Bq Er ENOTSUP
+Not supported
+.El
 .Sh SEE ALSO
 .Xr prop_array 3 ,
 .Xr prop_dictionary 3 ,
index ff74dac..3b31df0 100644 (file)
@@ -1,4 +1,4 @@
-/*     $NetBSD: prop_array.h,v 1.11 2011/01/20 11:17:58 bouyer Exp $    */
+/*     $NetBSD: prop_array.h,v 1.13 2011/09/30 22:08:18 jym Exp $    */
 
 /*-
  * Copyright (c) 2006, 2009 The NetBSD Foundation, Inc.
@@ -69,10 +69,12 @@ struct plistref;
 
 #if !defined(_KERNEL) && !defined(_STANDALONE)
 bool           prop_array_externalize_to_pref(prop_array_t, struct plistref *);
+bool           prop_array_internalize_from_pref(const struct plistref *,
+                                                prop_array_t *);
 int            prop_array_send_ioctl(prop_array_t, int, unsigned long);
 int            prop_array_recv_ioctl(int, unsigned long, prop_array_t *);
-bool           prop_array_send_syscall(prop_array_t, struct plistref *);
-bool           prop_array_recv_syscall(const struct plistref *,
+int            prop_array_send_syscall(prop_array_t, struct plistref *);
+int            prop_array_recv_syscall(const struct plistref *,
                                        prop_array_t *);
 #elif defined(_KERNEL)
 int            prop_array_copyin(const struct plistref *, prop_array_t *);
index 03556dc..15d1cf6 100644 (file)
@@ -1,4 +1,4 @@
-/*     $NetBSD: prop_dictionary.h,v 1.12 2011/01/20 11:17:58 bouyer Exp $      */
+/*     $NetBSD: prop_dictionary.h,v 1.14 2011/09/30 22:08:18 jym Exp $ */
 
 /*-
  * Copyright (c) 2006, 2009 The NetBSD Foundation, Inc.
@@ -85,6 +85,8 @@ struct plistref;
 
 #if !defined(_KERNEL) && !defined(_STANDALONE)
 bool           prop_dictionary_externalize_to_pref(prop_dictionary_t, struct plistref *);
+bool           prop_dictionary_internalize_from_pref(const struct plistref *,
+                                                     prop_dictionary_t *);
 int            prop_dictionary_send_ioctl(prop_dictionary_t, int,
                                           unsigned long);
 int            prop_dictionary_recv_ioctl(int, unsigned long,
@@ -92,9 +94,9 @@ int           prop_dictionary_recv_ioctl(int, unsigned long,
 int            prop_dictionary_sendrecv_ioctl(prop_dictionary_t,
                                               int, unsigned long,
                                               prop_dictionary_t *);
-bool           prop_dictionary_send_syscall(prop_dictionary_t,
+int            prop_dictionary_send_syscall(prop_dictionary_t,
                     struct plistref *);
-bool           prop_dictionary_recv_syscall(const struct plistref *,
+int            prop_dictionary_recv_syscall(const struct plistref *,
                                           prop_dictionary_t *);
 #elif defined(_KERNEL)
 int            prop_dictionary_copyin(const struct plistref *,
index d35964a..629811a 100644 (file)
@@ -1,4 +1,4 @@
-/*     $NetBSD: prop_kern.c,v 1.15 2011/01/19 20:34:23 bouyer Exp $    */
+/*     $NetBSD: prop_kern.c,v 1.17 2011/09/30 22:08:18 jym Exp $       */
 
 /*-
  * Copyright (c) 2006, 2009 The NetBSD Foundation, Inc.
@@ -42,7 +42,8 @@
 #include <sys/ioctl.h>
 
 static int
-_prop_object_externalize_to_pref(prop_object_t obj, struct plistref *pref, char **bufp)
+_prop_object_externalize_to_pref(prop_object_t obj, struct plistref *pref,
+                                char **bufp)
 {
        char *buf;
 
@@ -68,10 +69,6 @@ _prop_object_externalize_to_pref(prop_object_t obj, struct plistref *pref, char
        return (0);
 }
 
-/*
- * prop_array_externalize_to_pref --
- *     Externalize an array into a plistref for sending to the kernel.
- */
 bool
 prop_array_externalize_to_pref(prop_array_t array, struct plistref *prefp)
 {
@@ -83,14 +80,23 @@ prop_array_externalize_to_pref(prop_array_t array, struct plistref *prefp)
                errno = rv;     /* pass up error value in errno */
        return (rv == 0);
 }
-__strong_reference(prop_array_externalize_to_pref, prop_array_send_syscall)
 
 /*
- * prop_dictionary_externalize_to_pref --
- *     Externalize an dictionary into a plistref for sending to the kernel.
+ * prop_array_externalize_to_pref --
+ *     Externalize an array into a plistref for sending to the kernel.
  */
+int
+prop_array_send_syscall(prop_array_t array, struct plistref *prefp)
+{
+       if (prop_array_externalize_to_pref(array, prefp))
+               return 0;
+       else
+               return errno;
+}
+
 bool
-prop_dictionary_externalize_to_pref(prop_dictionary_t dict, struct plistref *prefp)
+prop_dictionary_externalize_to_pref(prop_dictionary_t dict,
+                                   struct plistref *prefp)
 {
        char *buf;
        int rv;
@@ -100,8 +106,20 @@ prop_dictionary_externalize_to_pref(prop_dictionary_t dict, struct plistref *pre
                errno = rv;     /* pass up error value in errno */
        return (rv == 0);
 }
-__strong_reference(prop_dictionary_externalize_to_pref,
-    prop_dictionary_send_syscall)
+
+/*
+ * prop_dictionary_externalize_to_pref --
+ *     Externalize an dictionary into a plistref for sending to the kernel.
+ */
+int
+prop_dictionary_send_syscall(prop_dictionary_t dict,
+                            struct plistref *prefp)
+{
+       if (prop_dictionary_externalize_to_pref(dict, prefp))
+               return 0;
+       else
+               return errno;
+}
 
 static int
 _prop_object_send_ioctl(prop_object_t obj, int fd, unsigned long cmd)
@@ -131,8 +149,14 @@ _prop_object_send_ioctl(prop_object_t obj, int fd, unsigned long cmd)
 int
 prop_array_send_ioctl(prop_array_t array, int fd, unsigned long cmd)
 {
+       int rv;
 
-       return (_prop_object_send_ioctl(array, fd, cmd));
+       rv = _prop_object_send_ioctl(array, fd, cmd);
+       if (rv != 0) {
+               errno = rv;     /* pass up error value in errno */
+               return rv;
+       } else 
+               return 0;
 }
 
 /*
@@ -142,13 +166,19 @@ prop_array_send_ioctl(prop_array_t array, int fd, unsigned long cmd)
 int
 prop_dictionary_send_ioctl(prop_dictionary_t dict, int fd, unsigned long cmd)
 {
+       int rv;
 
-       return (_prop_object_send_ioctl(dict, fd, cmd));
+       rv = _prop_object_send_ioctl(dict, fd, cmd);
+       if (rv != 0) {
+               errno = rv;     /* pass up error value in errno */
+               return rv;
+       } else 
+               return 0;
 }
 
 static int
-_prop_object_internalize_from_pref(const struct plistref *pref, prop_type_t type,
-                        prop_object_t *objp)
+_prop_object_internalize_from_pref(const struct plistref *pref,
+                                  prop_type_t type, prop_object_t *objp)
 {
        prop_object_t obj = NULL;
        char *buf;
@@ -186,60 +216,112 @@ _prop_object_internalize_from_pref(const struct plistref *pref, prop_type_t type
 }
 
 /*
- * prop_array_recv_ioctl --
- *     Receive an array from the kernel using the specified ioctl.
+ * prop_array_internalize_from_pref --
+ *     Internalize a pref into a prop_array_t object.
  */
-int
-prop_array_recv_ioctl(int fd, unsigned long cmd, prop_array_t *arrayp)
+bool
+prop_array_internalize_from_pref(const struct plistref *prefp,
+                                prop_array_t *arrayp)
 {
-       struct plistref pref;
+       int rv;
 
-       if (ioctl(fd, cmd, &pref) == -1)
-               return (errno);
-       
-       return (_prop_object_internalize_from_pref(&pref, PROP_TYPE_ARRAY,
-                                        (prop_object_t *)arrayp));
+       rv = _prop_object_internalize_from_pref(prefp, PROP_TYPE_ARRAY,
+           (prop_object_t *)arrayp);
+       if (rv != 0)
+               errno = rv;     /* pass up error value in errno */
+       return (rv == 0);
 }
 
 /*
- * prop_dictionary_recv_ioctl --
- *     Receive a dictionary from the kernel using the specified ioctl.
+ * prop_array_recv_syscall --
+ *     Internalize an array received from the kernel as pref.
  */
 int
-prop_dictionary_recv_ioctl(int fd, unsigned long cmd, prop_dictionary_t *dictp)
+prop_array_recv_syscall(const struct plistref *prefp,
+                       prop_array_t *arrayp)
 {
-       struct plistref pref;
-
-       if (ioctl(fd, cmd, &pref) == -1)
-               return (errno);
-
-       return (_prop_object_internalize_from_pref(&pref, PROP_TYPE_DICTIONARY,
-                                        (prop_object_t *)dictp));
+       if (prop_array_internalize_from_pref(prefp, arrayp))
+               return 0;
+       else
+               return errno;
 }
 
 /*
- * prop_array_recv_syscall --
- *     Receive an array from the kernel as pref.
- *     Pref's buf is freed on exit
+ * prop_dictionary_internalize_from_pref --
+ *     Internalize a pref into a prop_dictionary_t object.
  */
 bool
-prop_array_recv_syscall(const struct plistref *pref, prop_array_t *arrayp)
+prop_dictionary_internalize_from_pref(const struct plistref *prefp,
+                                     prop_dictionary_t *dictp)
 {
-       return (_prop_object_internalize_from_pref(pref, PROP_TYPE_ARRAY,
-                                        (prop_object_t *)arrayp));
+       int rv;
+
+       rv = _prop_object_internalize_from_pref(prefp, PROP_TYPE_DICTIONARY,
+           (prop_object_t *)dictp);
+       if (rv != 0)
+               errno = rv;     /* pass up error value in errno */
+       return (rv == 0);
 }
 
 /*
  * prop_dictionary_recv_syscall --
- *     Receive a dictionary from the kernel as pref.
- *     Pref's buf is freed on exit
+ *     Internalize a dictionary received from the kernel as pref.
  */
-bool
-prop_dictionary_recv_syscall(const struct plistref *pref,
-    prop_dictionary_t *dictp)
+int
+prop_dictionary_recv_syscall(const struct plistref *prefp,
+                            prop_dictionary_t *dictp)
 {
-       return (_prop_object_internalize_from_pref(pref, PROP_TYPE_DICTIONARY,
-                                        (prop_object_t *)dictp));
+       if (prop_dictionary_internalize_from_pref(prefp, dictp))
+               return 0;
+       else
+               return errno;
+}
+
+
+/*
+ * prop_array_recv_ioctl --
+ *     Receive an array from the kernel using the specified ioctl.
+ */
+int
+prop_array_recv_ioctl(int fd, unsigned long cmd, prop_array_t *arrayp)
+{
+       int rv;
+       struct plistref pref;
+
+       rv = ioctl(fd, cmd, &pref);
+       if (rv == -1)
+               return errno;
+
+       rv = _prop_object_internalize_from_pref(&pref, PROP_TYPE_ARRAY,
+                           (prop_object_t *)arrayp);
+       if (rv != 0) {
+               errno = rv;     /* pass up error value in errno */
+               return rv;
+       } else
+               return 0;
+}
+
+/*
+ * prop_dictionary_recv_ioctl --
+ *     Receive a dictionary from the kernel using the specified ioctl.
+ */
+int
+prop_dictionary_recv_ioctl(int fd, unsigned long cmd, prop_dictionary_t *dictp)
+{
+       int rv;
+       struct plistref pref;
+
+       rv = ioctl(fd, cmd, &pref);
+       if (rv == -1)
+               return errno;
+
+       rv = _prop_object_internalize_from_pref(&pref, PROP_TYPE_DICTIONARY,
+                           (prop_object_t *)dictp);
+       if (rv != 0) {
+               errno = rv;     /* pass up error value in errno */
+               return rv;
+       } else
+               return 0;
 }
 
 /*
@@ -256,8 +338,10 @@ prop_dictionary_sendrecv_ioctl(prop_dictionary_t dict, int fd,
        int error;
 
        error = _prop_object_externalize_to_pref(dict, &pref, &buf);
-       if (error)
-               return (error);
+       if (error != 0) {
+               errno = error;
+               return error;
+       }
 
        if (ioctl(fd, cmd, &pref) == -1)
                error = errno;
@@ -266,11 +350,16 @@ prop_dictionary_sendrecv_ioctl(prop_dictionary_t dict, int fd,
        
        free(buf);
 
-       if (error)
-               return (error);
+       if (error != 0)
+               return error;
 
-       return (_prop_object_internalize_from_pref(&pref, PROP_TYPE_DICTIONARY,
-                           (prop_object_t *)dictp));
+       error = _prop_object_internalize_from_pref(&pref, PROP_TYPE_DICTIONARY,
+                           (prop_object_t *)dictp);
+       if (error != 0) {
+               errno = error;     /* pass up error value in errno */
+               return error;
+       } else
+               return 0;
 }
 #endif /* !_KERNEL && !_STANDALONE */