tech-userlevel archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

factoring out prop_XXX_pack_pref() and prop_XXX_copyin_pref()



I am working on code that includes a system call where the arguments
are passed into the kernel as a plistref to a proplib dictionary.

To help with that I'd like to extend the userland and kernel API of
proplib with the following two functions each:

int prop_array_pack_pref(prop_array_t, struct plistref *);
int prop_dictionary_pack_pref(prop_dictionary_t, struct plistref *);

int prop_array_copyin(const struct plistref *, prop_array_t *);
int prop_dictionary_copyin(const struct plistref *, prop_dictionary_t *);

I intend to document prop_array_pack_pref() and
prop_dictionary_pack_pref() in the man-page prop_pack.3.  And
prop_array_copyin() and prop_dictionary_copyin() in prop_copyin_ioctl.9.

While there I'll refactor a bit of common code like.

If no-one has technical objections I'd like to commit the changes soonish.

Comments?
--chris

Index: common/include/prop/prop_array.h
===================================================================
RCS file: /cvsroot/src/common/include/prop/prop_array.h,v
retrieving revision 1.8
diff -u -r1.8 prop_array.h
--- common/include/prop/prop_array.h    11 Sep 2008 13:15:13 -0000      1.8
+++ common/include/prop/prop_array.h    29 Jul 2009 22:29:29 -0000
@@ -66,12 +66,14 @@
 prop_array_t   prop_array_internalize_from_file(const char *);
 
 #if defined(__NetBSD__)
+struct plistref;
+
 #if !defined(_KERNEL) && !defined(_STANDALONE)
+int            prop_array_pack_pref(prop_array_t, struct plistref *);
 int            prop_array_send_ioctl(prop_array_t, int, unsigned long);
 int            prop_array_recv_ioctl(int, unsigned long, prop_array_t *);
 #elif defined(_KERNEL)
-struct plistref;
-
+int            prop_array_copyin(const struct plistref *, prop_array_t *);
 int            prop_array_copyin_ioctl(const struct plistref *, const u_long,
                                        prop_array_t *);
 int            prop_array_copyout_ioctl(struct plistref *, const u_long,
Index: common/include/prop/prop_dictionary.h
===================================================================
RCS file: /cvsroot/src/common/include/prop/prop_dictionary.h,v
retrieving revision 1.9
diff -u -r1.9 prop_dictionary.h
--- common/include/prop/prop_dictionary.h       28 Apr 2008 20:22:51 -0000      
1.9
+++ common/include/prop/prop_dictionary.h       29 Jul 2009 22:29:30 -0000
@@ -82,7 +82,10 @@
                                              prop_dictionary_keysym_t);
 
 #if defined(__NetBSD__)
+struct plistref;
+
 #if !defined(_KERNEL) && !defined(_STANDALONE)
+int            prop_dictionary_pack_pref(prop_dictionary_t, struct plistref *);
 int            prop_dictionary_send_ioctl(prop_dictionary_t, int,
                                           unsigned long);
 int            prop_dictionary_recv_ioctl(int, unsigned long,
@@ -91,8 +94,8 @@
                                               int, unsigned long,
                                               prop_dictionary_t *);
 #elif defined(_KERNEL)
-struct plistref;
-
+int            prop_dictionary_copyin(const struct plistref *,
+                                      prop_dictionary_t *);
 int            prop_dictionary_copyin_ioctl(const struct plistref *,
                                             const u_long,
                                             prop_dictionary_t *);
Index: common/lib/libprop/prop_kern.c
===================================================================
RCS file: /cvsroot/src/common/lib/libprop/prop_kern.c,v
retrieving revision 1.9
diff -u -r1.9 prop_kern.c
--- common/lib/libprop/prop_kern.c      28 Apr 2008 20:22:53 -0000      1.9
+++ common/lib/libprop/prop_kern.c      29 Jul 2009 22:29:30 -0000
@@ -1,7 +1,7 @@
 /*     $NetBSD: prop_kern.c,v 1.9 2008/04/28 20:22:53 martin Exp $     */
 
 /*-
- * Copyright (c) 2006 The NetBSD Foundation, Inc.
+ * Copyright (c) 2006, 2008 The NetBSD Foundation, Inc.
  * All rights reserved.
  *
  * This code is derived from software contributed to The NetBSD Foundation
@@ -70,6 +70,30 @@
        return (0);
 }
 
+/*
+ * prop_array_pack_pref --
+ *     Pack an array into a plistref for sending to the kernel.
+ */
+int
+prop_array_pack_pref(prop_array_t array, struct plistref *prefp)
+{
+       char *buf;
+
+       return _prop_object_pack_pref(array, prefp, &buf);
+}
+
+/*
+ * prop_dictionary_pack_pref --
+ *     Pack an dictionary into a plistref for sending to the kernel.
+ */
+int
+prop_dictionary_pack_pref(prop_dictionary_t dict, struct plistref *prefp)
+{
+       char *buf;
+
+       return _prop_object_pack_pref(dict, prefp, &buf);
+}
+
 static int
 _prop_object_send_ioctl(prop_object_t obj, int fd, unsigned long cmd)
 {
@@ -231,16 +255,13 @@
 unsigned int prop_object_copyin_limit = 65536;
 
 static int
-_prop_object_copyin_ioctl(const struct plistref *pref, const prop_type_t type,
-                         const u_long cmd, prop_object_t *objp)
+_prop_object_copyin(const struct plistref *pref, const prop_type_t type,
+                         prop_object_t *objp)
 {
        prop_object_t obj = NULL;
        char *buf;
        int error;
 
-       if ((cmd & IOC_IN) == 0)
-               return (EFAULT);
-
        /*
         * Allocate an extra byte so we can guarantee NUL-termination.
         *
@@ -277,6 +298,40 @@
        return (error);
 }
 
+
+static int
+_prop_object_copyin_ioctl(const struct plistref *pref, const prop_type_t type,
+                         const u_long cmd, prop_object_t *objp)
+{
+       if ((cmd & IOC_IN) == 0)
+               return (EFAULT);
+
+       return _prop_object_copyin(pref, type, objp);
+}
+
+/*
+ * prop_array_copyin --
+ *     Copy in an array passed as a syscall arg.
+ */
+int
+prop_array_copyin(const struct plistref *pref, prop_array_t *arrayp)
+{
+       return (_prop_object_copyin(pref, PROP_TYPE_ARRAY,
+                                         (prop_object_t *)arrayp));
+}
+
+/*
+ * prop_dictionary_copyin --
+ *     Copy in a dictionary passed as a syscall arg.
+ */
+int
+prop_dictionary_copyin(const struct plistref *pref, prop_dictionary_t *dictp)
+{
+       return (_prop_object_copyin(pref, PROP_TYPE_DICTIONARY,
+                                         (prop_object_t *)dictp));
+}
+
+
 /*
  * prop_array_copyin_ioctl --
  *     Copy in an array send with an ioctl.



Home | Main Index | Thread Index | Old Index