Module Name:    src
Committed By:   dholland
Date:           Mon Jan 30 19:31:31 UTC 2012

Modified Files:
        src/usr.sbin/quotactl: Makefile proplib-interpreter.c quotactl.c
Added Files:
        src/usr.sbin/quotactl: quotaprop.c quotaprop.h

Log Message:
Needs its own copy of quotaprop.[ch] too.


To generate a diff of this commit:
cvs rdiff -u -r1.4 -r1.5 src/usr.sbin/quotactl/Makefile
cvs rdiff -u -r1.2 -r1.3 src/usr.sbin/quotactl/proplib-interpreter.c
cvs rdiff -u -r1.6 -r1.7 src/usr.sbin/quotactl/quotactl.c
cvs rdiff -u -r0 -r1.1 src/usr.sbin/quotactl/quotaprop.c \
    src/usr.sbin/quotactl/quotaprop.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/usr.sbin/quotactl/Makefile
diff -u src/usr.sbin/quotactl/Makefile:1.4 src/usr.sbin/quotactl/Makefile:1.5
--- src/usr.sbin/quotactl/Makefile:1.4	Mon Jan 30 19:28:11 2012
+++ src/usr.sbin/quotactl/Makefile	Mon Jan 30 19:31:31 2012
@@ -1,9 +1,9 @@
 #	from: @(#)Makefile	8.1 (Berkeley) 6/6/93
-#	$NetBSD: Makefile,v 1.4 2012/01/30 19:28:11 dholland Exp $
+#	$NetBSD: Makefile,v 1.5 2012/01/30 19:31:31 dholland Exp $
 
 .include <bsd.own.mk>
 PROG=	quotactl
-SRCS=	quotactl.c proplib-interpreter.c
+SRCS=	quotactl.c proplib-interpreter.c quotaprop.c
 MAN=	quotactl.8
 
 DPADD=	${LIBQUOTA} ${LIBRPCSVC} ${LIBPROP}

Index: src/usr.sbin/quotactl/proplib-interpreter.c
diff -u src/usr.sbin/quotactl/proplib-interpreter.c:1.2 src/usr.sbin/quotactl/proplib-interpreter.c:1.3
--- src/usr.sbin/quotactl/proplib-interpreter.c:1.2	Mon Jan 30 19:28:11 2012
+++ src/usr.sbin/quotactl/proplib-interpreter.c	Mon Jan 30 19:31:31 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: proplib-interpreter.c,v 1.2 2012/01/30 19:28:11 dholland Exp $	*/
+/*	$NetBSD: proplib-interpreter.c,v 1.3 2012/01/30 19:31:31 dholland Exp $	*/
 
 /*
  * Copyright (c) 1991, 1993, 1994
@@ -84,7 +84,7 @@
  */
 
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: proplib-interpreter.c,v 1.2 2012/01/30 19:28:11 dholland Exp $");
+__RCSID("$NetBSD: proplib-interpreter.c,v 1.3 2012/01/30 19:31:31 dholland Exp $");
 
 #include <stdlib.h>
 #include <string.h>
@@ -93,8 +93,8 @@ __RCSID("$NetBSD: proplib-interpreter.c,
 #include <assert.h>
 
 #include <quota.h>
-#include <quota/quotaprop.h>
 
+#include "quotaprop.h"
 #include "proplib-interpreter.h"
 
 static int

Index: src/usr.sbin/quotactl/quotactl.c
diff -u src/usr.sbin/quotactl/quotactl.c:1.6 src/usr.sbin/quotactl/quotactl.c:1.7
--- src/usr.sbin/quotactl/quotactl.c:1.6	Mon Jan 30 19:28:11 2012
+++ src/usr.sbin/quotactl/quotactl.c	Mon Jan 30 19:31:31 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: quotactl.c,v 1.6 2012/01/30 19:28:11 dholland Exp $ */
+/* $NetBSD: quotactl.c,v 1.7 2012/01/30 19:31:31 dholland Exp $ */
 /*-
   * Copyright (c) 2011 Manuel Bouyer
   * All rights reserved.
@@ -27,7 +27,7 @@
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: quotactl.c,v 1.6 2012/01/30 19:28:11 dholland Exp $");
+__RCSID("$NetBSD: quotactl.c,v 1.7 2012/01/30 19:31:31 dholland Exp $");
 #endif /* not lint */
 
 /*
@@ -46,8 +46,7 @@ __RCSID("$NetBSD: quotactl.c,v 1.6 2012/
 #include <string.h>
 #include <unistd.h>
 
-#include <quota/quotaprop.h>
-
+#include "quotaprop.h"
 #include "proplib-interpreter.h"
 
 __dead static void usage(void);

Added files:

Index: src/usr.sbin/quotactl/quotaprop.c
diff -u /dev/null src/usr.sbin/quotactl/quotaprop.c:1.1
--- /dev/null	Mon Jan 30 19:31:32 2012
+++ src/usr.sbin/quotactl/quotaprop.c	Mon Jan 30 19:31:31 2012
@@ -0,0 +1,214 @@
+/* $NetBSD: quotaprop.c,v 1.1 2012/01/30 19:31:31 dholland Exp $ */
+/*-
+  * Copyright (c) 2011 Manuel Bouyer
+  * All rights reserved.
+  *
+  * Redistribution and use in source and binary forms, with or without
+  * modification, are permitted provided that the following conditions
+  * are met:
+  * 1. Redistributions of source code must retain the above copyright
+  *    notice, this list of conditions and the following disclaimer.
+  * 2. 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.
+  *
+  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. 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 FOUNDATION 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.
+  */
+
+#include <sys/param.h>
+#include <sys/time.h>
+#include <sys/inttypes.h>
+#include <sys/errno.h>
+
+#include "quotaprop.h"
+
+/*
+ * update values from value[] using dict entries whose key is stored
+ * in name[]. Unknown keys are ignored. If update is false,
+ * a key in name[] but not in dict is an error.
+ * name[] may have NULL pointers to skip a value[]
+ */
+int
+quotaprop_dict_get_uint64(prop_dictionary_t dict, uint64_t value[],
+    const char *name[], int nvalues, bool update)
+{
+	int i;
+	uint64_t v;
+
+	for (i = 0; i < nvalues; i++) {
+		if (name[i] == NULL)
+			continue;
+		if (!prop_dictionary_get_uint64(dict, name[i], &v)) {
+			if (!update)
+				return EINVAL;
+		}
+		value[i] = v;
+	}
+	return 0;
+}
+
+/*
+ * convert a quota entry dictionary to in-memory array of uint64_t's
+ */
+int
+proptoquota64(prop_dictionary_t data, uint64_t *values[], const char *valname[],
+    int nvalues, const char *limname[], int nlimits)
+{
+	int i, error;
+	prop_dictionary_t val;
+
+	for (i = 0; i < nlimits; i++) {
+		if (limname[i] == NULL)
+			continue;
+		if (!prop_dictionary_get_dict(data, limname[i], &val))
+			return EINVAL;
+		error = quotaprop_dict_get_uint64(val, values[i],
+		    valname, nvalues, false);
+		if (error)
+			return error;
+	}
+	return 0;
+}
+
+int
+quota_get_cmds(prop_dictionary_t qdict, prop_array_t *cmds)
+{
+	prop_number_t pn;
+	prop_object_t o;
+
+	pn = prop_dictionary_get(qdict, "interface version");
+	if (pn == NULL)
+		return EINVAL;
+	if (prop_number_integer_value(pn) != 1)
+		return EINVAL;
+
+	o = prop_dictionary_get(qdict, "commands");
+	if (o == NULL)
+		return ENOMEM;
+	 if(prop_object_type(o) != PROP_TYPE_ARRAY)
+		return EINVAL;
+	*cmds = o;
+	return 0;
+}
+
+
+prop_dictionary_t
+quota_prop_create(void)
+{
+	prop_dictionary_t dict = prop_dictionary_create();
+
+	if (dict == NULL)
+		return NULL;
+
+	if (!prop_dictionary_set_uint8(dict, "interface version", 1)) {
+		goto err;
+	}
+	return dict;
+err:
+	prop_object_release(dict);
+	return NULL;
+}
+
+bool
+quota_prop_add_command(prop_array_t arrcmd, const char *cmd, const char *type,
+    prop_array_t data)
+{
+	prop_dictionary_t dict;
+
+	dict = prop_dictionary_create();
+	if (dict == NULL) {
+		return false;
+	}
+	if (!prop_dictionary_set_cstring(dict, "type", type)) {
+		goto err;
+	}
+	if (!prop_dictionary_set_cstring(dict, "command", cmd)) {
+		goto err;
+	}
+	if (!prop_dictionary_set_and_rel(dict, "data", data)) {
+		goto err;
+	}
+	if (!prop_array_add(arrcmd, dict)) {
+		goto err;
+	}
+	prop_object_release(dict);
+	return true;
+err:
+	prop_object_release(dict);
+	return false;
+}
+
+/* construct a dictionary using array of values and corresponding keys */
+prop_dictionary_t
+limits64toprop(uint64_t value[], const char *name[], int nvalues)
+{
+	int i;
+	prop_dictionary_t dict1 = prop_dictionary_create();
+	if (dict1 == NULL)
+		return NULL;
+
+	for (i = 0;  i < nvalues; i++) {
+		if (name[i] == NULL)
+			continue;
+		if (!prop_dictionary_set_uint64(dict1, name[i], value[i])) {
+			prop_object_release(dict1);
+			return NULL;
+		}
+	}
+	return dict1;
+}
+
+/*
+ * construct a quota entry using provided array of values, array of values
+ * names
+ */
+prop_dictionary_t
+quota64toprop(uid_t uid, int def, uint64_t *values[], const char *valname[],
+    int nvalues, const char *limname[], int nlimits)
+{
+	prop_dictionary_t dict1 = prop_dictionary_create();
+	prop_dictionary_t dict2;
+	int i;
+
+	if (dict1 == NULL)
+		return NULL;
+	if (def) {
+		if (!prop_dictionary_set_cstring_nocopy(dict1, "id",
+		    "default")) {
+			goto err;
+		}
+	} else {
+		if (!prop_dictionary_set_uint32(dict1, "id", uid)) {
+			goto err;
+		}
+	}
+	for (i = 0; i < nlimits; i++) {
+		if (limname[i] == NULL)
+			continue;
+		dict2 = limits64toprop(values[i], valname, nvalues);
+		if (dict2 == NULL)
+			goto err;
+		if (!prop_dictionary_set_and_rel(dict1, limname[i],
+		    dict2))
+			goto err;
+	}
+
+	return dict1;
+err:
+	prop_object_release(dict1);
+	return NULL;
+}
+
+const char *ufs_quota_entry_names[] = UFS_QUOTA_ENTRY_NAMES;
+const char *ufs_quota_limit_names[] = QUOTA_LIMIT_NAMES;
+const char *ufs_quota_class_names[] = QUOTA_CLASS_NAMES;
Index: src/usr.sbin/quotactl/quotaprop.h
diff -u /dev/null src/usr.sbin/quotactl/quotaprop.h:1.1
--- /dev/null	Mon Jan 30 19:31:32 2012
+++ src/usr.sbin/quotactl/quotaprop.h	Mon Jan 30 19:31:31 2012
@@ -0,0 +1,93 @@
+/* $NetBSD: quotaprop.h,v 1.1 2012/01/30 19:31:31 dholland Exp $ */
+/*-
+  * Copyright (c) 2010 Manuel Bouyer
+  * All rights reserved.
+  *
+  * Redistribution and use in source and binary forms, with or without
+  * modification, are permitted provided that the following conditions
+  * are met:
+  * 1. Redistributions of source code must retain the above copyright
+  *    notice, this list of conditions and the following disclaimer.
+  * 2. 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.
+  *
+  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. 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 FOUNDATION 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.
+  */
+
+#ifndef _QUOTA_QUOTAPROP_H_
+#define _QUOTA_QUOTAPROP_H_
+
+#include <prop/proplib.h>
+
+/* strings used in dictionary for the different quota class */
+#define QUOTADICT_CLASS_USER "user"
+#define QUOTADICT_CLASS_GROUP "group"
+
+/* strings used in dictionary for the different limit types */
+#define QUOTADICT_LTYPE_BLOCK "block"
+#define QUOTADICT_LTYPE_FILE "file"
+
+/* strings used in dictionary for the different limit and usage values */
+#define QUOTADICT_LIMIT_SOFT "soft"
+#define QUOTADICT_LIMIT_HARD "hard"
+#define QUOTADICT_LIMIT_GTIME "grace time"
+#define QUOTADICT_LIMIT_USAGE "usage"
+#define QUOTADICT_LIMIT_ETIME "expire time"
+
+/* array of strings for the above */
+#define UFS_QUOTA_ENTRY_NAMES \
+    {QUOTADICT_LIMIT_HARD, \
+     QUOTADICT_LIMIT_SOFT, \
+     QUOTADICT_LIMIT_USAGE, \
+     QUOTADICT_LIMIT_ETIME, \
+     QUOTADICT_LIMIT_GTIME \
+    }
+#define UFS_QUOTA_NENTRIES 5
+extern const char *ufs_quota_entry_names[];
+
+/* array of strings for limit types and associated #define */
+extern const char *ufs_quota_limit_names[];
+#define QUOTA_LIMIT_BLOCK 0
+#define QUOTA_LIMIT_FILE 1
+#define QUOTA_NLIMITS 2
+#define QUOTA_LIMIT_NAMES { QUOTADICT_LTYPE_BLOCK, QUOTADICT_LTYPE_FILE }
+
+/* array of strings for quota class and associated #define */
+extern const char *ufs_quota_class_names[];
+#define QUOTA_CLASS_USER 0
+#define QUOTA_CLASS_GROUP 1
+#define QUOTA_NCLASS 2
+#define QUOTA_CLASS_NAMES { QUOTADICT_CLASS_USER, QUOTADICT_CLASS_GROUP }
+
+int quotaprop_dict_get_uint64(prop_dictionary_t, uint64_t[],
+    const char *[], int, bool);
+int proptoquota64(prop_dictionary_t, uint64_t *[], const char *[], int,
+    const char *[], int);
+
+int quota_get_cmds(prop_dictionary_t, prop_array_t *);
+prop_dictionary_t quota_prop_create(void);
+bool quota_prop_add_command(prop_array_t, const char *, const char *,
+    prop_array_t);
+
+prop_dictionary_t limits64toprop(uint64_t[], const char *[], int);
+prop_dictionary_t quota64toprop(uid_t, int, uint64_t *[], const char *[], int,
+    const char *[], int);
+
+#if !defined(_KERNEL) && !defined(_STANDALONE)
+__BEGIN_DECLS
+int quotactl(const char *, struct plistref *) __RENAME(__quotactl50);
+__END_DECLS
+#endif
+
+#endif /* _QUOTA_QUOTAPROP_H_ */

Reply via email to