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_ */