Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 1 Mar 2015 00:22:53 +0000 (UTC)
From:      Ryan Stone <rstone@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r279438 - head/lib/libnv
Message-ID:  <201503010022.t210MrC3083899@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: rstone
Date: Sun Mar  1 00:22:53 2015
New Revision: 279438
URL: https://svnweb.freebsd.org/changeset/base/279438

Log:
  Add macros to make code compile in kernel
  
  Make it possible to compile libnv in the kernel.  Mostly this
  involves wrapping functions that have a different signature in
  the kernel and in userland (e.g. malloc()) in a macro that will
  conditionally expand to the right API depending on whether the
  code is being compiled for the kernel or not.
  
  I have also #ifdef'ed out all of file descriptor-handling code,
  as well as the unsafe varargs functions.
  
  Differential Revision:		https://reviews.freebsd.org/D1882
  Reviewed by:			jfv
  MFC after:			1 month
  Sponsored by:			Sandvine Inc

Modified:
  head/lib/libnv/dnv.h
  head/lib/libnv/dnvlist.c
  head/lib/libnv/nv.h
  head/lib/libnv/nv_impl.h
  head/lib/libnv/nvlist.c
  head/lib/libnv/nvlist_impl.h
  head/lib/libnv/nvpair.c
  head/lib/libnv/nvpair_impl.h

Modified: head/lib/libnv/dnv.h
==============================================================================
--- head/lib/libnv/dnv.h	Sun Mar  1 00:22:45 2015	(r279437)
+++ head/lib/libnv/dnv.h	Sun Mar  1 00:22:53 2015	(r279438)
@@ -34,9 +34,11 @@
 
 #include <sys/cdefs.h>
 
+#ifndef _KERNEL
 #include <stdarg.h>
 #include <stdbool.h>
 #include <stdint.h>
+#endif
 
 #ifndef	_NVLIST_T_DECLARED
 #define	_NVLIST_T_DECLARED
@@ -62,6 +64,7 @@ const nvlist_t *dnvlist_get_nvlist(const
 int dnvlist_get_descriptor(const nvlist_t *nvl, const char *name, int defval);
 const void *dnvlist_get_binary(const nvlist_t *nvl, const char *name, size_t *sizep, const void *defval, size_t defsize);
 
+#ifndef _KERNEL
 bool dnvlist_getf_bool(const nvlist_t *nvl, bool defval, const char *namefmt, ...) __printflike(3, 4);
 uint64_t dnvlist_getf_number(const nvlist_t *nvl, uint64_t defval, const char *namefmt, ...) __printflike(3, 4);
 const char *dnvlist_getf_string(const nvlist_t *nvl, const char *defval, const char *namefmt, ...) __printflike(3, 4);
@@ -75,6 +78,7 @@ const char *dnvlist_getv_string(const nv
 const nvlist_t *dnvlist_getv_nvlist(const nvlist_t *nvl, const nvlist_t *defval, const char *namefmt, va_list nameap) __printflike(3, 0);
 int dnvlist_getv_descriptor(const nvlist_t *nvl, int defval, const char *namefmt, va_list nameap) __printflike(3, 0);
 const void *dnvlist_getv_binary(const nvlist_t *nvl, size_t *sizep, const void *defval, size_t defsize, const char *namefmt, va_list nameap) __printflike(5, 0);
+#endif
 
 /*
  * The dnvlist_take functions returns value associated with the given name and
@@ -91,6 +95,7 @@ nvlist_t *dnvlist_take_nvlist(nvlist_t *
 int dnvlist_take_descriptor(nvlist_t *nvl, const char *name, int defval);
 void *dnvlist_take_binary(nvlist_t *nvl, const char *name, size_t *sizep, void *defval, size_t defsize);
 
+#ifndef _KERNEL
 bool dnvlist_takef_bool(nvlist_t *nvl, bool defval, const char *namefmt, ...) __printflike(3, 4);
 uint64_t dnvlist_takef_number(nvlist_t *nvl, uint64_t defval, const char *namefmt, ...) __printflike(3, 4);
 char *dnvlist_takef_string(nvlist_t *nvl, char *defval, const char *namefmt, ...) __printflike(3, 4);
@@ -104,6 +109,7 @@ char *dnvlist_takev_string(nvlist_t *nvl
 nvlist_t *dnvlist_takev_nvlist(nvlist_t *nvl, nvlist_t *defval, const char *namefmt, va_list nameap) __printflike(3, 0);
 int dnvlist_takev_descriptor(nvlist_t *nvl, int defval, const char *namefmt, va_list nameap) __printflike(3, 0);
 void *dnvlist_takev_binary(nvlist_t *nvl, size_t *sizep, void *defval, size_t defsize, const char *namefmt, va_list nameap) __printflike(5, 0);
+#endif
 
 __END_DECLS
 

Modified: head/lib/libnv/dnvlist.c
==============================================================================
--- head/lib/libnv/dnvlist.c	Sun Mar  1 00:22:45 2015	(r279437)
+++ head/lib/libnv/dnvlist.c	Sun Mar  1 00:22:53 2015	(r279438)
@@ -30,10 +30,22 @@
 #include <sys/cdefs.h>
 __FBSDID("$FreeBSD$");
 
+#ifdef _KERNEL
+
+#include <sys/types.h>
+#include <sys/param.h>
+#include <sys/kernel.h>
+#include <sys/systm.h>
+#include <sys/malloc.h>
+
+#include <machine/stdarg.h>
+
+#else
 #include <stdarg.h>
 #include <stdbool.h>
 #include <stdint.h>
 #include <stdlib.h>
+#endif
 
 #include "nv.h"
 #include "nv_impl.h"
@@ -55,7 +67,9 @@ DNVLIST_GET(bool, bool)
 DNVLIST_GET(uint64_t, number)
 DNVLIST_GET(const char *, string)
 DNVLIST_GET(const nvlist_t *, nvlist)
+#ifndef _KERNEL
 DNVLIST_GET(int, descriptor)
+#endif
 
 #undef	DNVLIST_GET
 
@@ -75,6 +89,7 @@ dnvlist_get_binary(const nvlist_t *nvl, 
 	return (value);
 }
 
+#ifndef _KERNEL
 #define	DNVLIST_GETF(ftype, type)					\
 ftype									\
 dnvlist_getf_##type(const nvlist_t *nvl, ftype defval,			\
@@ -144,10 +159,10 @@ dnvlist_getv_binary(const nvlist_t *nvl,
 	char *name;
 	const void *value;
 
-	vasprintf(&name, namefmt, nameap);
+	nv_vasprintf(&name, namefmt, nameap);
 	if (name != NULL) {
 		value = dnvlist_get_binary(nvl, name, sizep, defval, defsize);
-		free(name);
+		nv_free(name);
 	} else {
 		if (sizep != NULL)
 			*sizep = defsize;
@@ -155,6 +170,7 @@ dnvlist_getv_binary(const nvlist_t *nvl,
 	}
 	return (value);
 }
+#endif
 
 #define	DNVLIST_TAKE(ftype, type)					\
 ftype									\
@@ -171,7 +187,9 @@ DNVLIST_TAKE(bool, bool)
 DNVLIST_TAKE(uint64_t, number)
 DNVLIST_TAKE(char *, string)
 DNVLIST_TAKE(nvlist_t *, nvlist)
+#ifndef _KERNEL
 DNVLIST_TAKE(int, descriptor)
+#endif
 
 #undef	DNVLIST_TAKE
 
@@ -191,6 +209,7 @@ dnvlist_take_binary(nvlist_t *nvl, const
 	return (value);
 }
 
+#ifndef _KERNEL
 #define	DNVLIST_TAKEF(ftype, type)					\
 ftype									\
 dnvlist_takef_##type(nvlist_t *nvl, ftype defval,			\
@@ -260,10 +279,10 @@ dnvlist_takev_binary(nvlist_t *nvl, size
 	char *name;
 	void *value;
 
-	vasprintf(&name, namefmt, nameap);
+	nv_vasprintf(&name, namefmt, nameap);
 	if (name != NULL) {
 		value = dnvlist_take_binary(nvl, name, sizep, defval, defsize);
-		free(name);
+		nv_free(name);
 	} else {
 		if (sizep != NULL)
 			*sizep = defsize;
@@ -272,3 +291,4 @@ dnvlist_takev_binary(nvlist_t *nvl, size
 
 	return (value);
 }
+#endif

Modified: head/lib/libnv/nv.h
==============================================================================
--- head/lib/libnv/nv.h	Sun Mar  1 00:22:45 2015	(r279437)
+++ head/lib/libnv/nv.h	Sun Mar  1 00:22:53 2015	(r279438)
@@ -34,10 +34,12 @@
 
 #include <sys/cdefs.h>
 
+#ifndef _KERNEL
 #include <stdarg.h>
 #include <stdbool.h>
 #include <stdint.h>
 #include <stdio.h>
+#endif
 
 #ifndef	_NVLIST_T_DECLARED
 #define	_NVLIST_T_DECLARED
@@ -63,6 +65,10 @@ typedef struct nvlist nvlist_t;
  */
 #define	NV_FLAG_IGNORE_CASE		0x01
 
+#if defined(_KERNEL) && defined(MALLOC_DECLARE)
+MALLOC_DECLARE(M_NVLIST);
+#endif
+
 __BEGIN_DECLS
 
 nvlist_t	*nvlist_create(int flags);
@@ -73,8 +79,10 @@ void		 nvlist_set_error(nvlist_t *nvl, i
 
 nvlist_t *nvlist_clone(const nvlist_t *nvl);
 
+#ifndef _KERNEL
 void nvlist_dump(const nvlist_t *nvl, int fd);
 void nvlist_fdump(const nvlist_t *nvl, FILE *fp);
+#endif
 
 size_t		 nvlist_size(const nvlist_t *nvl);
 void		*nvlist_pack(const nvlist_t *nvl, size_t *sizep);
@@ -101,7 +109,9 @@ bool nvlist_exists_bool(const nvlist_t *
 bool nvlist_exists_number(const nvlist_t *nvl, const char *name);
 bool nvlist_exists_string(const nvlist_t *nvl, const char *name);
 bool nvlist_exists_nvlist(const nvlist_t *nvl, const char *name);
+#ifndef _KERNEL
 bool nvlist_exists_descriptor(const nvlist_t *nvl, const char *name);
+#endif
 bool nvlist_exists_binary(const nvlist_t *nvl, const char *name);
 
 /*
@@ -115,9 +125,13 @@ void nvlist_add_bool(nvlist_t *nvl, cons
 void nvlist_add_number(nvlist_t *nvl, const char *name, uint64_t value);
 void nvlist_add_string(nvlist_t *nvl, const char *name, const char *value);
 void nvlist_add_stringf(nvlist_t *nvl, const char *name, const char *valuefmt, ...) __printflike(3, 4);
+#ifdef _VA_LIST_DECLARED
 void nvlist_add_stringv(nvlist_t *nvl, const char *name, const char *valuefmt, va_list valueap) __printflike(3, 0);
+#endif
 void nvlist_add_nvlist(nvlist_t *nvl, const char *name, const nvlist_t *value);
+#ifndef _KERNEL
 void nvlist_add_descriptor(nvlist_t *nvl, const char *name, int value);
+#endif
 void nvlist_add_binary(nvlist_t *nvl, const char *name, const void *value, size_t size);
 
 /*
@@ -127,7 +141,9 @@ void nvlist_add_binary(nvlist_t *nvl, co
 
 void nvlist_move_string(nvlist_t *nvl, const char *name, char *value);
 void nvlist_move_nvlist(nvlist_t *nvl, const char *name, nvlist_t *value);
+#ifndef _KERNEL
 void nvlist_move_descriptor(nvlist_t *nvl, const char *name, int value);
+#endif
 void nvlist_move_binary(nvlist_t *nvl, const char *name, void *value, size_t size);
 
 /*
@@ -140,7 +156,9 @@ bool		 nvlist_get_bool(const nvlist_t *n
 uint64_t	 nvlist_get_number(const nvlist_t *nvl, const char *name);
 const char	*nvlist_get_string(const nvlist_t *nvl, const char *name);
 const nvlist_t	*nvlist_get_nvlist(const nvlist_t *nvl, const char *name);
+#ifndef _KERNEL
 int		 nvlist_get_descriptor(const nvlist_t *nvl, const char *name);
+#endif
 const void	*nvlist_get_binary(const nvlist_t *nvl, const char *name, size_t *sizep);
 
 /*
@@ -153,7 +171,9 @@ bool		 nvlist_take_bool(nvlist_t *nvl, c
 uint64_t	 nvlist_take_number(nvlist_t *nvl, const char *name);
 char		*nvlist_take_string(nvlist_t *nvl, const char *name);
 nvlist_t	*nvlist_take_nvlist(nvlist_t *nvl, const char *name);
+#ifndef _KERNEL
 int		 nvlist_take_descriptor(nvlist_t *nvl, const char *name);
+#endif
 void		*nvlist_take_binary(nvlist_t *nvl, const char *name, size_t *sizep);
 
 /*
@@ -169,14 +189,21 @@ void nvlist_free_bool(nvlist_t *nvl, con
 void nvlist_free_number(nvlist_t *nvl, const char *name);
 void nvlist_free_string(nvlist_t *nvl, const char *name);
 void nvlist_free_nvlist(nvlist_t *nvl, const char *name);
+#ifndef _KERNEL
 void nvlist_free_descriptor(nvlist_t *nvl, const char *name);
+#endif
 void nvlist_free_binary(nvlist_t *nvl, const char *name);
 
 /*
  * Below are the same functions, but which operate on format strings and
  * variable argument lists.
+ *
+ * Functions that are not inserting a new pair into the nvlist cannot handle
+ * a failure to allocate the memory to hold the new name.  Therefore these
+ * functions are not provided in the kernel.
  */
 
+#ifndef _KERNEL
 bool nvlist_existsf(const nvlist_t *nvl, const char *namefmt, ...) __printflike(2, 3);
 bool nvlist_existsf_type(const nvlist_t *nvl, int type, const char *namefmt, ...) __printflike(3, 4);
 
@@ -198,33 +225,47 @@ bool nvlist_existsv_string(const nvlist_
 bool nvlist_existsv_nvlist(const nvlist_t *nvl, const char *namefmt, va_list nameap) __printflike(2, 0);
 bool nvlist_existsv_descriptor(const nvlist_t *nvl, const char *namefmt, va_list nameap) __printflike(2, 0);
 bool nvlist_existsv_binary(const nvlist_t *nvl, const char *namefmt, va_list nameap) __printflike(2, 0);
+#endif
 
 void nvlist_addf_null(nvlist_t *nvl, const char *namefmt, ...) __printflike(2, 3);
 void nvlist_addf_bool(nvlist_t *nvl, bool value, const char *namefmt, ...) __printflike(3, 4);
 void nvlist_addf_number(nvlist_t *nvl, uint64_t value, const char *namefmt, ...) __printflike(3, 4);
 void nvlist_addf_string(nvlist_t *nvl, const char *value, const char *namefmt, ...) __printflike(3, 4);
 void nvlist_addf_nvlist(nvlist_t *nvl, const nvlist_t *value, const char *namefmt, ...) __printflike(3, 4);
+#ifndef _KERNEL
 void nvlist_addf_descriptor(nvlist_t *nvl, int value, const char *namefmt, ...) __printflike(3, 4);
+#endif
 void nvlist_addf_binary(nvlist_t *nvl, const void *value, size_t size, const char *namefmt, ...) __printflike(4, 5);
 
+#if !defined(_KERNEL) || defined(_VA_LIST_DECLARED)
 void nvlist_addv_null(nvlist_t *nvl, const char *namefmt, va_list nameap) __printflike(2, 0);
 void nvlist_addv_bool(nvlist_t *nvl, bool value, const char *namefmt, va_list nameap) __printflike(3, 0);
 void nvlist_addv_number(nvlist_t *nvl, uint64_t value, const char *namefmt, va_list nameap) __printflike(3, 0);
 void nvlist_addv_string(nvlist_t *nvl, const char *value, const char *namefmt, va_list nameap) __printflike(3, 0);
 void nvlist_addv_nvlist(nvlist_t *nvl, const nvlist_t *value, const char *namefmt, va_list nameap) __printflike(3, 0);
+#ifndef _KERNEL
 void nvlist_addv_descriptor(nvlist_t *nvl, int value, const char *namefmt, va_list nameap) __printflike(3, 0);
+#endif
 void nvlist_addv_binary(nvlist_t *nvl, const void *value, size_t size, const char *namefmt, va_list nameap) __printflike(4, 0);
+#endif
 
 void nvlist_movef_string(nvlist_t *nvl, char *value, const char *namefmt, ...) __printflike(3, 4);
 void nvlist_movef_nvlist(nvlist_t *nvl, nvlist_t *value, const char *namefmt, ...) __printflike(3, 4);
+#ifndef _KERNEL
 void nvlist_movef_descriptor(nvlist_t *nvl, int value, const char *namefmt, ...) __printflike(3, 4);
+#endif
 void nvlist_movef_binary(nvlist_t *nvl, void *value, size_t size, const char *namefmt, ...) __printflike(4, 5);
 
+#if !defined(_KERNEL) || defined(_VA_LIST_DECLARED)
 void nvlist_movev_string(nvlist_t *nvl, char *value, const char *namefmt, va_list nameap) __printflike(3, 0);
 void nvlist_movev_nvlist(nvlist_t *nvl, nvlist_t *value, const char *namefmt, va_list nameap) __printflike(3, 0);
+#ifndef _KERNEL
 void nvlist_movev_descriptor(nvlist_t *nvl, int value, const char *namefmt, va_list nameap) __printflike(3, 0);
+#endif
 void nvlist_movev_binary(nvlist_t *nvl, void *value, size_t size, const char *namefmt, va_list nameap) __printflike(4, 0);
+#endif
 
+#ifndef _KERNEL
 bool		 nvlist_getf_bool(const nvlist_t *nvl, const char *namefmt, ...) __printflike(2, 3);
 uint64_t	 nvlist_getf_number(const nvlist_t *nvl, const char *namefmt, ...) __printflike(2, 3);
 const char	*nvlist_getf_string(const nvlist_t *nvl, const char *namefmt, ...) __printflike(2, 3);
@@ -274,6 +315,7 @@ void nvlist_freev_string(nvlist_t *nvl, 
 void nvlist_freev_nvlist(nvlist_t *nvl, const char *namefmt, va_list nameap) __printflike(2, 0);
 void nvlist_freev_descriptor(nvlist_t *nvl, const char *namefmt, va_list nameap) __printflike(2, 0);
 void nvlist_freev_binary(nvlist_t *nvl, const char *namefmt, va_list nameap) __printflike(2, 0);
+#endif /* _KERNEL */
 
 __END_DECLS
 

Modified: head/lib/libnv/nv_impl.h
==============================================================================
--- head/lib/libnv/nv_impl.h	Sun Mar  1 00:22:45 2015	(r279437)
+++ head/lib/libnv/nv_impl.h	Sun Mar  1 00:22:53 2015	(r279438)
@@ -46,6 +46,37 @@ typedef struct nvpair nvpair_t;
 
 #define	NV_FLAG_BIG_ENDIAN		0x80
 
+#ifdef _KERNEL
+#define	nv_malloc(size)			malloc((size), M_NVLIST, M_NOWAIT)
+#define	nv_calloc(n, size)		malloc((n) * (size), M_NVLIST, \
+					    M_NOWAIT | M_ZERO)
+#define	nv_realloc(buf, size)		realloc((buf), (size), M_NVLIST, \
+					    M_NOWAIT)
+#define	nv_free(buf)			free((buf), M_NVLIST)
+#define	nv_strdup(buf)			strdup((buf), M_NVLIST)
+#define	nv_vasprintf(ptr, ...)		vasprintf(ptr, M_NVLIST, __VA_ARGS__)
+
+#define	SAVE_ERRNO(var)			((void)(var))
+#define	RESTORE_ERRNO(var)		((void)(var))
+
+#define	ERRNO_OR_DEFAULT(default)	(default)
+
+#else
+
+#define	nv_malloc(size)			malloc((size))
+#define	nv_calloc(n, size)		calloc((n), (size))
+#define	nv_realloc(buf, size)		realloc((buf), (size))
+#define	nv_free(buf)			free((buf))
+#define	nv_strdup(buf)			strdup((buf))
+#define	nv_vasprintf(ptr, ...)		vasprintf(ptr, __VA_ARGS__)
+
+#define	SAVE_ERRNO(var) 		(var) = errno
+#define	RESTORE_ERRNO(var) 		errno = (var)
+
+#define	ERRNO_OR_DEFAULT(default)	(errno == 0 ? (default) : errno)
+
+#endif
+
 int	*nvlist_descriptors(const nvlist_t *nvl, size_t *nitemsp);
 size_t	 nvlist_ndescriptors(const nvlist_t *nvl);
 

Modified: head/lib/libnv/nvlist.c
==============================================================================
--- head/lib/libnv/nvlist.c	Sun Mar  1 00:22:45 2015	(r279437)
+++ head/lib/libnv/nvlist.c	Sun Mar  1 00:22:53 2015	(r279438)
@@ -33,6 +33,18 @@ __FBSDID("$FreeBSD$");
 #include <sys/param.h>
 #include <sys/endian.h>
 #include <sys/queue.h>
+
+#ifdef _KERNEL
+
+#include <sys/errno.h>
+#include <sys/kernel.h>
+#include <sys/lock.h>
+#include <sys/malloc.h>
+#include <sys/systm.h>
+
+#include <machine/stdarg.h>
+
+#else
 #include <sys/socket.h>
 
 #include <errno.h>
@@ -44,6 +56,7 @@ __FBSDID("$FreeBSD$");
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
+#endif
 
 #ifdef HAVE_PJDLOG
 #include <pjdlog.h>
@@ -56,6 +69,11 @@ __FBSDID("$FreeBSD$");
 #include "nvpair_impl.h"
 
 #ifndef	HAVE_PJDLOG
+#ifdef _KERNEL
+#define	PJDLOG_ASSERT(...)		MPASS(__VA_ARGS__)
+#define	PJDLOG_RASSERT(expr, ...)	KASSERT(expr, (__VA_ARGS__))
+#define	PJDLOG_ABORT(...)		panic(__VA_ARGS__)
+#else
 #include <assert.h>
 #define	PJDLOG_ASSERT(...)		assert(__VA_ARGS__)
 #define	PJDLOG_RASSERT(expr, ...)	assert(expr)
@@ -66,6 +84,7 @@ __FBSDID("$FreeBSD$");
 	abort();							\
 } while (0)
 #endif
+#endif
 
 #define	NV_FLAG_PRIVATE_MASK	(NV_FLAG_BIG_ENDIAN)
 #define	NV_FLAG_PUBLIC_MASK	(NV_FLAG_IGNORE_CASE)
@@ -85,6 +104,10 @@ struct nvlist {
 	PJDLOG_ASSERT((nvl)->nvl_magic == NVLIST_MAGIC);		\
 } while (0)
 
+#ifdef _KERNEL
+MALLOC_DEFINE(M_NVLIST, "nvlist", "kernel nvlist");
+#endif
+
 #define	NVPAIR_ASSERT(nvp)	nvpair_assert(nvp)
 
 #define	NVLIST_HEADER_MAGIC	0x6c
@@ -104,7 +127,7 @@ nvlist_create(int flags)
 
 	PJDLOG_ASSERT((flags & ~(NV_FLAG_PUBLIC_MASK)) == 0);
 
-	nvl = malloc(sizeof(*nvl));
+	nvl = nv_malloc(sizeof(*nvl));
 	nvl->nvl_error = 0;
 	nvl->nvl_flags = flags;
 	nvl->nvl_parent = NULL;
@@ -123,7 +146,7 @@ nvlist_destroy(nvlist_t *nvl)
 	if (nvl == NULL)
 		return;
 
-	serrno = errno;
+	SAVE_ERRNO(serrno);
 
 	NVLIST_ASSERT(nvl);
 
@@ -132,9 +155,9 @@ nvlist_destroy(nvlist_t *nvl)
 		nvpair_free(nvp);
 	}
 	nvl->nvl_magic = 0;
-	free(nvl);
+	nv_free(nvl);
 
-	errno = serrno;
+	RESTORE_ERRNO(serrno);
 }
 
 void
@@ -240,7 +263,7 @@ nvlist_find(const nvlist_t *nvl, int typ
 	}
 
 	if (nvp == NULL)
-		errno = ENOENT;
+		RESTORE_ERRNO(ENOENT);
 
 	return (nvp);
 }
@@ -257,6 +280,7 @@ nvlist_exists_type(const nvlist_t *nvl, 
 	return (nvlist_find(nvl, type, name) != NULL);
 }
 
+#ifndef _KERNEL
 bool
 nvlist_existsf_type(const nvlist_t *nvl, int type, const char *namefmt, ...)
 {
@@ -277,14 +301,15 @@ nvlist_existsv_type(const nvlist_t *nvl,
 	char *name;
 	bool exists;
 
-	vasprintf(&name, namefmt, nameap);
+	nv_vasprintf(&name, namefmt, nameap);
 	if (name == NULL)
 		return (false);
 
 	exists = nvlist_exists_type(nvl, name, type);
-	free(name);
+	nv_free(name);
 	return (exists);
 }
+#endif
 
 void
 nvlist_free_type(nvlist_t *nvl, const char *name, int type)
@@ -303,6 +328,7 @@ nvlist_free_type(nvlist_t *nvl, const ch
 		nvlist_report_missing(type, name);
 }
 
+#ifndef _KERNEL
 void
 nvlist_freef_type(nvlist_t *nvl, int type, const char *namefmt, ...)
 {
@@ -318,12 +344,13 @@ nvlist_freev_type(nvlist_t *nvl, int typ
 {
 	char *name;
 
-	vasprintf(&name, namefmt, nameap);
+	nv_vasprintf(&name, namefmt, nameap);
 	if (name == NULL)
 		nvlist_report_missing(type, "<unknown>");
 	nvlist_free_type(nvl, name, type);
-	free(name);
+	nv_free(name);
 }
+#endif
 
 nvlist_t *
 nvlist_clone(const nvlist_t *nvl)
@@ -334,7 +361,7 @@ nvlist_clone(const nvlist_t *nvl)
 	NVLIST_ASSERT(nvl);
 
 	if (nvl->nvl_error != 0) {
-		errno = nvl->nvl_error;
+		RESTORE_ERRNO(nvl->nvl_error);
 		return (NULL);
 	}
 
@@ -353,6 +380,7 @@ nvlist_clone(const nvlist_t *nvl)
 	return (newnvl);
 }
 
+#ifndef _KERNEL
 static bool
 nvlist_dump_error_check(const nvlist_t *nvl, int fd, int level)
 {
@@ -453,6 +481,7 @@ nvlist_fdump(const nvlist_t *nvl, FILE *
 	fflush(fp);
 	nvlist_dump(nvl, fileno(fp));
 }
+#endif
 
 /*
  * The function obtains size of the nvlist after nvlist_pack().
@@ -501,6 +530,7 @@ out:
 	return (size);
 }
 
+#ifndef _KERNEL
 static int *
 nvlist_xdescriptors(const nvlist_t *nvl, int *descs, int level)
 {
@@ -526,7 +556,9 @@ nvlist_xdescriptors(const nvlist_t *nvl,
 
 	return (descs);
 }
+#endif
 
+#ifndef _KERNEL
 int *
 nvlist_descriptors(const nvlist_t *nvl, size_t *nitemsp)
 {
@@ -534,7 +566,7 @@ nvlist_descriptors(const nvlist_t *nvl, 
 	int *fds;
 
 	nitems = nvlist_ndescriptors(nvl);
-	fds = malloc(sizeof(fds[0]) * (nitems + 1));
+	fds = nv_malloc(sizeof(fds[0]) * (nitems + 1));
 	if (fds == NULL)
 		return (NULL);
 	if (nitems > 0)
@@ -544,10 +576,12 @@ nvlist_descriptors(const nvlist_t *nvl, 
 		*nitemsp = nitems;
 	return (fds);
 }
+#endif
 
 static size_t
 nvlist_xndescriptors(const nvlist_t *nvl, int level)
 {
+#ifndef _KERNEL
 	const nvpair_t *nvp;
 	size_t ndescs;
 
@@ -570,6 +604,9 @@ nvlist_xndescriptors(const nvlist_t *nvl
 	}
 
 	return (ndescs);
+#else
+	return (0);
+#endif
 }
 
 size_t
@@ -614,12 +651,12 @@ nvlist_xpack(const nvlist_t *nvl, int64_
 	NVLIST_ASSERT(nvl);
 
 	if (nvl->nvl_error != 0) {
-		errno = nvl->nvl_error;
+		RESTORE_ERRNO(nvl->nvl_error);
 		return (NULL);
 	}
 
 	size = nvlist_size(nvl);
-	buf = malloc(size);
+	buf = nv_malloc(size);
 	if (buf == NULL)
 		return (NULL);
 
@@ -635,7 +672,7 @@ nvlist_xpack(const nvlist_t *nvl, int64_
 		nvpair_init_datasize(nvp);
 		ptr = nvpair_pack_header(nvp, ptr, &left);
 		if (ptr == NULL) {
-			free(buf);
+			nv_free(buf);
 			return (NULL);
 		}
 		switch (nvpair_type(nvp)) {
@@ -664,9 +701,11 @@ nvlist_xpack(const nvlist_t *nvl, int64_
 			}
 			ptr = nvpair_pack_nvlist_up(ptr, &left);
 			break;
+#ifndef _KERNEL
 		case NV_TYPE_DESCRIPTOR:
 			ptr = nvpair_pack_descriptor(nvp, ptr, fdidxp, &left);
 			break;
+#endif
 		case NV_TYPE_BINARY:
 			ptr = nvpair_pack_binary(nvp, ptr, &left);
 			break;
@@ -674,7 +713,7 @@ nvlist_xpack(const nvlist_t *nvl, int64_
 			PJDLOG_ABORT("Invalid type (%d).", nvpair_type(nvp));
 		}
 		if (ptr == NULL) {
-			free(buf);
+			nv_free(buf);
 			return (NULL);
 		}
 		while ((nvp = nvlist_next_nvpair(nvl, nvp)) == NULL) {
@@ -702,12 +741,12 @@ nvlist_pack(const nvlist_t *nvl, size_t 
 	NVLIST_ASSERT(nvl);
 
 	if (nvl->nvl_error != 0) {
-		errno = nvl->nvl_error;
+		RESTORE_ERRNO(nvl->nvl_error);
 		return (NULL);
 	}
 
 	if (nvlist_ndescriptors(nvl) > 0) {
-		errno = EOPNOTSUPP;
+		RESTORE_ERRNO(EOPNOTSUPP);
 		return (NULL);
 	}
 
@@ -719,11 +758,11 @@ nvlist_check_header(struct nvlist_header
 {
 
 	if (nvlhdrp->nvlh_magic != NVLIST_HEADER_MAGIC) {
-		errno = EINVAL;
+		RESTORE_ERRNO(EINVAL);
 		return (false);
 	}
 	if ((nvlhdrp->nvlh_flags & ~NV_FLAG_ALL_MASK) != 0) {
-		errno = EINVAL;
+		RESTORE_ERRNO(EINVAL);
 		return (false);
 	}
 #if BYTE_ORDER == BIG_ENDIAN
@@ -775,7 +814,7 @@ nvlist_unpack_header(nvlist_t *nvl, cons
 
 	return (ptr);
 failed:
-	errno = EINVAL;
+	RESTORE_ERRNO(EINVAL);
 	return (NULL);
 }
 
@@ -822,10 +861,12 @@ nvlist_xunpack(const void *buf, size_t s
 			    &tmpnvl);
 			nvlist_set_parent(tmpnvl, nvp);
 			break;
+#ifndef _KERNEL
 		case NV_TYPE_DESCRIPTOR:
 			ptr = nvpair_unpack_descriptor(isbe, nvp, ptr, &left,
 			    fds, nfds);
 			break;
+#endif
 		case NV_TYPE_BINARY:
 			ptr = nvpair_unpack_binary(isbe, nvp, ptr, &left);
 			break;
@@ -859,6 +900,7 @@ nvlist_unpack(const void *buf, size_t si
 	return (nvlist_xunpack(buf, size, NULL, 0));
 }
 
+#ifndef _KERNEL
 int
 nvlist_send(int sock, const nvlist_t *nvl)
 {
@@ -968,6 +1010,7 @@ nvlist_xfer(int sock, nvlist_t *nvl)
 	nvlist_destroy(nvl);
 	return (nvlist_recv(sock));
 }
+#endif
 
 nvpair_t *
 nvlist_first_nvpair(const nvlist_t *nvl)
@@ -1049,11 +1092,14 @@ NVLIST_EXISTS(bool, BOOL)
 NVLIST_EXISTS(number, NUMBER)
 NVLIST_EXISTS(string, STRING)
 NVLIST_EXISTS(nvlist, NVLIST)
+#ifndef _KERNEL
 NVLIST_EXISTS(descriptor, DESCRIPTOR)
+#endif
 NVLIST_EXISTS(binary, BINARY)
 
 #undef	NVLIST_EXISTS
 
+#ifndef _KERNEL
 bool
 nvlist_existsf(const nvlist_t *nvl, const char *namefmt, ...)
 {
@@ -1084,7 +1130,9 @@ NVLIST_EXISTSF(bool)
 NVLIST_EXISTSF(number)
 NVLIST_EXISTSF(string)
 NVLIST_EXISTSF(nvlist)
+#ifndef _KERNEL
 NVLIST_EXISTSF(descriptor)
+#endif
 NVLIST_EXISTSF(binary)
 
 #undef	NVLIST_EXISTSF
@@ -1095,12 +1143,12 @@ nvlist_existsv(const nvlist_t *nvl, cons
 	char *name;
 	bool exists;
 
-	vasprintf(&name, namefmt, nameap);
+	nv_vasprintf(&name, namefmt, nameap);
 	if (name == NULL)
 		return (false);
 
 	exists = nvlist_exists(nvl, name);
-	free(name);
+	nv_free(name);
 	return (exists);
 }
 
@@ -1129,6 +1177,7 @@ NVLIST_EXISTSV(descriptor)
 NVLIST_EXISTSV(binary)
 
 #undef	NVLIST_EXISTSV
+#endif
 
 void
 nvlist_add_nvpair(nvlist_t *nvl, const nvpair_t *nvp)
@@ -1138,17 +1187,19 @@ nvlist_add_nvpair(nvlist_t *nvl, const n
 	NVPAIR_ASSERT(nvp);
 
 	if (nvlist_error(nvl) != 0) {
-		errno = nvlist_error(nvl);
+		RESTORE_ERRNO(nvlist_error(nvl));
 		return;
 	}
 	if (nvlist_exists(nvl, nvpair_name(nvp))) {
-		nvl->nvl_error = errno = EEXIST;
+		nvl->nvl_error = EEXIST;
+		RESTORE_ERRNO(nvlist_error(nvl));
 		return;
 	}
 
 	newnvp = nvpair_clone(nvp);
 	if (newnvp == NULL) {
-		nvl->nvl_error = errno = (errno != 0 ? errno : ENOMEM);
+		nvl->nvl_error = ERRNO_OR_DEFAULT(ENOMEM);
+		RESTORE_ERRNO(nvlist_error(nvl));
 		return;
 	}
 
@@ -1200,14 +1251,15 @@ nvlist_add_stringv(nvlist_t *nvl, const 
 	nvpair_t *nvp;
 
 	if (nvlist_error(nvl) != 0) {
-		errno = nvlist_error(nvl);
+		RESTORE_ERRNO(nvlist_error(nvl));
 		return;
 	}
 
 	nvp = nvpair_create_stringv(name, valuefmt, valueap);
-	if (nvp == NULL)
-		nvl->nvl_error = errno = (errno != 0 ? errno : ENOMEM);
-	else
+	if (nvp == NULL) {
+		nvl->nvl_error = ERRNO_OR_DEFAULT(ENOMEM);
+		RESTORE_ERRNO(nvl->nvl_error);
+	} else
 		nvlist_move_nvpair(nvl, nvp);
 }
 
@@ -1218,12 +1270,14 @@ nvlist_add_nvlist(nvlist_t *nvl, const c
 	nvlist_addf_nvlist(nvl, value, "%s", name);
 }
 
+#ifndef _KERNEL
 void
 nvlist_add_descriptor(nvlist_t *nvl, const char *name, int value)
 {
 
 	nvlist_addf_descriptor(nvl, value, "%s", name);
 }
+#endif
 
 void
 nvlist_add_binary(nvlist_t *nvl, const char *name, const void *value,
@@ -1284,6 +1338,7 @@ nvlist_addf_nvlist(nvlist_t *nvl, const 
 	va_end(nameap);
 }
 
+#ifndef _KERNEL
 void
 nvlist_addf_descriptor(nvlist_t *nvl, int value, const char *namefmt, ...)
 {
@@ -1293,6 +1348,7 @@ nvlist_addf_descriptor(nvlist_t *nvl, in
 	nvlist_addv_descriptor(nvl, value, namefmt, nameap);
 	va_end(nameap);
 }
+#endif
 
 void
 nvlist_addf_binary(nvlist_t *nvl, const void *value, size_t size,
@@ -1311,14 +1367,15 @@ nvlist_addv_null(nvlist_t *nvl, const ch
 	nvpair_t *nvp;
 
 	if (nvlist_error(nvl) != 0) {
-		errno = nvlist_error(nvl);
+		RESTORE_ERRNO(nvlist_error(nvl));
 		return;
 	}
 
 	nvp = nvpair_createv_null(namefmt, nameap);
-	if (nvp == NULL)
-		nvl->nvl_error = errno = (errno != 0 ? errno : ENOMEM);
-	else
+	if (nvp == NULL) {
+		nvl->nvl_error = ERRNO_OR_DEFAULT(ENOMEM);
+		RESTORE_ERRNO(nvl->nvl_error);
+	} else
 		nvlist_move_nvpair(nvl, nvp);
 }
 
@@ -1328,14 +1385,15 @@ nvlist_addv_bool(nvlist_t *nvl, bool val
 	nvpair_t *nvp;
 
 	if (nvlist_error(nvl) != 0) {
-		errno = nvlist_error(nvl);
+		RESTORE_ERRNO(nvlist_error(nvl));
 		return;
 	}
 
 	nvp = nvpair_createv_bool(value, namefmt, nameap);
-	if (nvp == NULL)
-		nvl->nvl_error = errno = (errno != 0 ? errno : ENOMEM);
-	else
+	if (nvp == NULL) {
+		nvl->nvl_error = ERRNO_OR_DEFAULT(ENOMEM);
+		RESTORE_ERRNO(nvl->nvl_error);
+	} else
 		nvlist_move_nvpair(nvl, nvp);
 }
 
@@ -1346,14 +1404,15 @@ nvlist_addv_number(nvlist_t *nvl, uint64
 	nvpair_t *nvp;
 
 	if (nvlist_error(nvl) != 0) {
-		errno = nvlist_error(nvl);
+		RESTORE_ERRNO(nvlist_error(nvl));
 		return;
 	}
 
 	nvp = nvpair_createv_number(value, namefmt, nameap);
-	if (nvp == NULL)
-		nvl->nvl_error = errno = (errno != 0 ? errno : ENOMEM);
-	else
+	if (nvp == NULL) {
+		nvl->nvl_error = ERRNO_OR_DEFAULT(ENOMEM);
+		RESTORE_ERRNO(nvl->nvl_error);
+	} else
 		nvlist_move_nvpair(nvl, nvp);
 }
 
@@ -1364,14 +1423,15 @@ nvlist_addv_string(nvlist_t *nvl, const 
 	nvpair_t *nvp;
 
 	if (nvlist_error(nvl) != 0) {
-		errno = nvlist_error(nvl);
+		RESTORE_ERRNO(nvlist_error(nvl));
 		return;
 	}
 
 	nvp = nvpair_createv_string(value, namefmt, nameap);
-	if (nvp == NULL)
-		nvl->nvl_error = errno = (errno != 0 ? errno : ENOMEM);
-	else
+	if (nvp == NULL) {
+		nvl->nvl_error = ERRNO_OR_DEFAULT(ENOMEM);
+		RESTORE_ERRNO(nvl->nvl_error);
+	} else
 		nvlist_move_nvpair(nvl, nvp);
 }
 
@@ -1382,17 +1442,19 @@ nvlist_addv_nvlist(nvlist_t *nvl, const 
 	nvpair_t *nvp;
 
 	if (nvlist_error(nvl) != 0) {
-		errno = nvlist_error(nvl);
+		RESTORE_ERRNO(nvlist_error(nvl));
 		return;
 	}
 
 	nvp = nvpair_createv_nvlist(value, namefmt, nameap);
-	if (nvp == NULL)
-		nvl->nvl_error = errno = (errno != 0 ? errno : ENOMEM);
-	else
+	if (nvp == NULL) {
+		nvl->nvl_error = ERRNO_OR_DEFAULT(ENOMEM);
+		RESTORE_ERRNO(nvl->nvl_error);
+	} else
 		nvlist_move_nvpair(nvl, nvp);
 }
 
+#ifndef _KERNEL
 void
 nvlist_addv_descriptor(nvlist_t *nvl, int value, const char *namefmt,
     va_list nameap)
@@ -1410,6 +1472,7 @@ nvlist_addv_descriptor(nvlist_t *nvl, in
 	else
 		nvlist_move_nvpair(nvl, nvp);
 }
+#endif
 
 void
 nvlist_addv_binary(nvlist_t *nvl, const void *value, size_t size,
@@ -1418,14 +1481,15 @@ nvlist_addv_binary(nvlist_t *nvl, const 
 	nvpair_t *nvp;
 
 	if (nvlist_error(nvl) != 0) {
-		errno = nvlist_error(nvl);
+		RESTORE_ERRNO(nvlist_error(nvl));
 		return;
 	}
 
 	nvp = nvpair_createv_binary(value, size, namefmt, nameap);
-	if (nvp == NULL)
-		nvl->nvl_error = errno = (errno != 0 ? errno : ENOMEM);
-	else
+	if (nvp == NULL) {
+		nvl->nvl_error = ERRNO_OR_DEFAULT(ENOMEM);
+		RESTORE_ERRNO(nvl->nvl_error);
+	} else
 		nvlist_move_nvpair(nvl, nvp);
 }
 
@@ -1438,12 +1502,13 @@ nvlist_move_nvpair(nvlist_t *nvl, nvpair
 
 	if (nvlist_error(nvl) != 0) {
 		nvpair_free(nvp);
-		errno = nvlist_error(nvl);
+		RESTORE_ERRNO(nvlist_error(nvl));
 		return;
 	}
 	if (nvlist_exists(nvl, nvpair_name(nvp))) {
 		nvpair_free(nvp);
-		nvl->nvl_error = errno = EEXIST;
+		nvl->nvl_error = EEXIST;
+		RESTORE_ERRNO(nvl->nvl_error);
 		return;
 	}
 
@@ -1460,7 +1525,9 @@ nvlist_move_##type(nvlist_t *nvl, const 
 
 NVLIST_MOVE(char *, string)
 NVLIST_MOVE(nvlist_t *, nvlist)
+#ifndef _KERNEL
 NVLIST_MOVE(int, descriptor)
+#endif
 
 #undef	NVLIST_MOVE
 
@@ -1485,7 +1552,9 @@ nvlist_movef_##type(nvlist_t *nvl, vtype
 
 NVLIST_MOVEF(char *, string)
 NVLIST_MOVEF(nvlist_t *, nvlist)
+#ifndef _KERNEL
 NVLIST_MOVEF(int, descriptor)
+#endif
 
 #undef	NVLIST_MOVEF
 
@@ -1507,15 +1576,16 @@ nvlist_movev_string(nvlist_t *nvl, char 
 	nvpair_t *nvp;
 
 	if (nvlist_error(nvl) != 0) {
-		free(value);
-		errno = nvlist_error(nvl);
+		nv_free(value);
+		RESTORE_ERRNO(nvlist_error(nvl));
 		return;
 	}
 
 	nvp = nvpair_movev_string(value, namefmt, nameap);
-	if (nvp == NULL)
-		nvl->nvl_error = errno = (errno != 0 ? errno : ENOMEM);
-	else
+	if (nvp == NULL) {
+		nvl->nvl_error = ERRNO_OR_DEFAULT(ENOMEM);
+		RESTORE_ERRNO(nvl->nvl_error);
+	} else

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201503010022.t210MrC3083899>