Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 2 May 2015 18:03:47 +0000 (UTC)
From:      Mariusz Zaborski <oshogbo@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r282347 - in head: lib/libnv sys/kern sys/sys
Message-ID:  <201505021803.t42I3lcD005934@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: oshogbo
Date: Sat May  2 18:03:47 2015
New Revision: 282347
URL: https://svnweb.freebsd.org/changeset/base/282347

Log:
  Introduce the NV_FLAG_NO_UNIQUE flag. When set, it allows to store
  multiple values using the same key in a nvlist.
  
  Approved by:	pjd (mentor)
  Obtained from:	WHEEL Systems (http://www.wheelsystems.com)
  
  Update man page.
  
  Reviewed by:	AllanJude
  Approved by:	pjd (mentor)

Modified:
  head/lib/libnv/nv.3
  head/sys/kern/subr_nvlist.c
  head/sys/kern/subr_nvpair.c
  head/sys/sys/nv.h

Modified: head/lib/libnv/nv.3
==============================================================================
--- head/lib/libnv/nv.3	Sat May  2 17:45:52 2015	(r282346)
+++ head/lib/libnv/nv.3	Sat May  2 18:03:47 2015	(r282347)
@@ -232,6 +232,8 @@ The following flag can be provided:
 .Bl -tag -width "NV_FLAG_IGNORE_CASE" -compact -offset indent
 .It Dv NV_FLAG_IGNORE_CASE
 Perform case-insensitive lookups of provided names.
+.It Dv NV_FLAG_NO_UNIQUE
+Names in the nvlist do not have to be unique.
 .El
 .Pp
 The

Modified: head/sys/kern/subr_nvlist.c
==============================================================================
--- head/sys/kern/subr_nvlist.c	Sat May  2 17:45:52 2015	(r282346)
+++ head/sys/kern/subr_nvlist.c	Sat May  2 18:03:47 2015	(r282347)
@@ -88,7 +88,7 @@ __FBSDID("$FreeBSD$");
 #endif
 
 #define	NV_FLAG_PRIVATE_MASK	(NV_FLAG_BIG_ENDIAN)
-#define	NV_FLAG_PUBLIC_MASK	(NV_FLAG_IGNORE_CASE)
+#define	NV_FLAG_PUBLIC_MASK	(NV_FLAG_IGNORE_CASE | NV_FLAG_NO_UNIQUE)
 #define	NV_FLAG_ALL_MASK	(NV_FLAG_PRIVATE_MASK | NV_FLAG_PUBLIC_MASK)
 
 #define	NVLIST_MAGIC	0x6e766c	/* "nvl" */
@@ -1074,10 +1074,12 @@ nvlist_add_nvpair(nvlist_t *nvl, const n
 		ERRNO_SET(nvlist_error(nvl));
 		return;
 	}
-	if (nvlist_exists(nvl, nvpair_name(nvp))) {
-		nvl->nvl_error = EEXIST;
-		ERRNO_SET(nvlist_error(nvl));
-		return;
+	if ((nvl->nvl_flags & NV_FLAG_NO_UNIQUE) == 0) {
+		if (nvlist_exists(nvl, nvpair_name(nvp))) {
+			nvl->nvl_error = EEXIST;
+			ERRNO_SET(nvlist_error(nvl));
+			return;
+		}
 	}
 
 	newnvp = nvpair_clone(nvp);
@@ -1266,11 +1268,13 @@ nvlist_move_nvpair(nvlist_t *nvl, nvpair
 		ERRNO_SET(nvlist_error(nvl));
 		return;
 	}
-	if (nvlist_exists(nvl, nvpair_name(nvp))) {
-		nvpair_free(nvp);
-		nvl->nvl_error = EEXIST;
-		ERRNO_SET(nvl->nvl_error);
-		return;
+	if ((nvl->nvl_flags & NV_FLAG_NO_UNIQUE) == 0) {
+		if (nvlist_exists(nvl, nvpair_name(nvp))) {
+			nvpair_free(nvp);
+			nvl->nvl_error = EEXIST;
+			ERRNO_SET(nvl->nvl_error);
+			return;
+		}
 	}
 
 	nvpair_insert(&nvl->nvl_head, nvp, nvl);

Modified: head/sys/kern/subr_nvpair.c
==============================================================================
--- head/sys/kern/subr_nvpair.c	Sat May  2 17:45:52 2015	(r282346)
+++ head/sys/kern/subr_nvpair.c	Sat May  2 18:03:47 2015	(r282347)
@@ -143,7 +143,8 @@ nvpair_insert(struct nvl_head *head, nvp
 
 	NVPAIR_ASSERT(nvp);
 	PJDLOG_ASSERT(nvp->nvp_list == NULL);
-	PJDLOG_ASSERT(!nvlist_exists(nvl, nvpair_name(nvp)));
+	PJDLOG_ASSERT((nvlist_flags(nvl) & NV_FLAG_NO_UNIQUE) != 0 ||
+	    !nvlist_exists(nvl, nvpair_name(nvp)));
 
 	TAILQ_INSERT_TAIL(head, nvp, nvp_next);
 	nvp->nvp_list = nvl;

Modified: head/sys/sys/nv.h
==============================================================================
--- head/sys/sys/nv.h	Sat May  2 17:45:52 2015	(r282346)
+++ head/sys/sys/nv.h	Sat May  2 18:03:47 2015	(r282347)
@@ -64,6 +64,10 @@ typedef struct nvlist nvlist_t;
  * Perform case-insensitive lookups of provided names.
  */
 #define	NV_FLAG_IGNORE_CASE		0x01
+/*
+ * Names don't have to be unique.
+ */
+#define	NV_FLAG_NO_UNIQUE		0x02
 
 #if defined(_KERNEL) && defined(MALLOC_DECLARE)
 MALLOC_DECLARE(M_NVLIST);



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