Module Name:    src
Committed By:   bouyer
Date:           Mon Jan 31 21:14:06 UTC 2011

Modified Files:
        src/distrib/sets/lists/base [bouyer-quota2]: mi
        src/distrib/sets/lists/man [bouyer-quota2]: mi
        src/usr.sbin [bouyer-quota2]: Makefile
Added Files:
        src/usr.sbin/quotactl [bouyer-quota2]: Makefile quotactl.8 quotactl.c

Log Message:
Add quotactl(8), a tools which reads a quota command plist from stdin or file
and send it to kernel.


To generate a diff of this commit:
cvs rdiff -u -r1.915 -r1.915.2.1 src/distrib/sets/lists/base/mi
cvs rdiff -u -r1.1278 -r1.1278.2.1 src/distrib/sets/lists/man/mi
cvs rdiff -u -r1.250 -r1.250.2.1 src/usr.sbin/Makefile
cvs rdiff -u -r0 -r1.1.2.1 src/usr.sbin/quotactl/Makefile \
    src/usr.sbin/quotactl/quotactl.8 src/usr.sbin/quotactl/quotactl.c

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

Modified files:

Index: src/distrib/sets/lists/base/mi
diff -u src/distrib/sets/lists/base/mi:1.915 src/distrib/sets/lists/base/mi:1.915.2.1
--- src/distrib/sets/lists/base/mi:1.915	Thu Jan 13 22:28:36 2011
+++ src/distrib/sets/lists/base/mi	Mon Jan 31 21:14:05 2011
@@ -1,4 +1,4 @@
-# $NetBSD: mi,v 1.915 2011/01/13 22:28:36 haad Exp $
+# $NetBSD: mi,v 1.915.2.1 2011/01/31 21:14:05 bouyer Exp $
 #
 # Note:	Don't delete entries from here - mark them as "obsolete" instead,
 #	unless otherwise stated below.
@@ -1330,6 +1330,7 @@
 ./usr/sbin/pwd_mkdb				base-sysutil-bin
 ./usr/sbin/quot					base-sysutil-bin
 ./usr/sbin/quotacheck				base-sysutil-bin
+./usr/sbin/quotactl				base-sysutil-bin
 ./usr/sbin/quotaoff				base-sysutil-bin
 ./usr/sbin/quotaon				base-sysutil-bin
 ./usr/sbin/racoon				base-netutil-bin	crypto

Index: src/distrib/sets/lists/man/mi
diff -u src/distrib/sets/lists/man/mi:1.1278 src/distrib/sets/lists/man/mi:1.1278.2.1
--- src/distrib/sets/lists/man/mi:1.1278	Mon Jan 17 16:08:19 2011
+++ src/distrib/sets/lists/man/mi	Mon Jan 31 21:14:05 2011
@@ -1,4 +1,4 @@
-# $NetBSD: mi,v 1.1278 2011/01/17 16:08:19 jmcneill Exp $
+# $NetBSD: mi,v 1.1278.2.1 2011/01/31 21:14:05 bouyer Exp $
 #
 # Note: don't delete entries from here - mark them as "obsolete" instead.
 #
@@ -2578,6 +2578,7 @@
 ./usr/share/man/cat8/qmqpd.0			man-obsolete		obsolete
 ./usr/share/man/cat8/quot.0			man-sysutil-catman	.cat
 ./usr/share/man/cat8/quotacheck.0		man-sysutil-catman	.cat
+./usr/share/man/cat8/quotactl.0			man-sysutil-catman	.cat
 ./usr/share/man/cat8/quotaoff.0			man-sysutil-catman	.cat
 ./usr/share/man/cat8/quotaon.0			man-sysutil-catman	.cat
 ./usr/share/man/cat8/racoon.0			man-netutil-catman	crypto,.cat
@@ -5068,6 +5069,7 @@
 ./usr/share/man/html8/qmgr.html			man-postfix-htmlman	postfix,html
 ./usr/share/man/html8/quot.html			man-sysutil-htmlman	html
 ./usr/share/man/html8/quotacheck.html		man-sysutil-htmlman	html
+./usr/share/man/html8/quotactl.html		man-sysutil-htmlman	html
 ./usr/share/man/html8/quotaoff.html		man-sysutil-htmlman	html
 ./usr/share/man/html8/quotaon.html		man-sysutil-htmlman	html
 ./usr/share/man/html8/racoon.html		man-netutil-htmlman	crypto,html
@@ -7832,6 +7834,7 @@
 ./usr/share/man/man8/qmqpd.8			man-obsolete		obsolete
 ./usr/share/man/man8/quot.8			man-sysutil-man		.man
 ./usr/share/man/man8/quotacheck.8		man-sysutil-man		.man
+./usr/share/man/man8/quotactl.8			man-sysutil-man		.man
 ./usr/share/man/man8/quotaoff.8			man-sysutil-man		.man
 ./usr/share/man/man8/quotaon.8			man-sysutil-man		.man
 ./usr/share/man/man8/racoon.8			man-netutil-man		crypto,.man

Index: src/usr.sbin/Makefile
diff -u src/usr.sbin/Makefile:1.250 src/usr.sbin/Makefile:1.250.2.1
--- src/usr.sbin/Makefile:1.250	Thu Jan 13 22:28:35 2011
+++ src/usr.sbin/Makefile	Mon Jan 31 21:14:06 2011
@@ -1,4 +1,4 @@
-#	$NetBSD: Makefile,v 1.250 2011/01/13 22:28:35 haad Exp $
+#	$NetBSD: Makefile,v 1.250.2.1 2011/01/31 21:14:06 bouyer Exp $
 #	from: @(#)Makefile	5.20 (Berkeley) 6/12/93
 
 .include <bsd.own.mk>
@@ -16,7 +16,7 @@
 	mrinfo mrouted mscdlabel mtrace \
 	mtree ndbootd ndiscvt netgroup_mkdb nfsd ofctl paxctl pcictl \
 	pppd psrset pstat pwd_mkdb postinstall powerd puffs quot quotacheck \
-	quotaon rarpd rbootd rdate \
+	quotactl quotaon rarpd rbootd rdate \
 	repquota rmt rpc.bootparamd rpc.lockd rpc.pcnfsd \
  	rpc.statd rpcbind rwhod sa screenblank sdpd services_mkdb sesd \
 	schedctl sliplogin \

Added files:

Index: src/usr.sbin/quotactl/Makefile
diff -u /dev/null src/usr.sbin/quotactl/Makefile:1.1.2.1
--- /dev/null	Mon Jan 31 21:14:06 2011
+++ src/usr.sbin/quotactl/Makefile	Mon Jan 31 21:14:06 2011
@@ -0,0 +1,16 @@
+#	from: @(#)Makefile	8.1 (Berkeley) 6/6/93
+#	$NetBSD: Makefile,v 1.1.2.1 2011/01/31 21:14:06 bouyer Exp $
+
+.include <bsd.own.mk>
+PROG=	quotactl
+SRCS=	quotactl.c
+MAN=	quotactl.8
+
+CPPFLAGS+=-I${NETBSDSRCDIR}/sys 
+DPADD=	${LIBPROP}
+LDADD=	-lprop
+
+.PATH:	${NETBSDSRCDIR}/sys/ufs/ufs 
+SRCS+=	quota2_prop.c
+
+.include <bsd.prog.mk>
Index: src/usr.sbin/quotactl/quotactl.8
diff -u /dev/null src/usr.sbin/quotactl/quotactl.8:1.1.2.1
--- /dev/null	Mon Jan 31 21:14:06 2011
+++ src/usr.sbin/quotactl/quotactl.8	Mon Jan 31 21:14:06 2011
@@ -0,0 +1,80 @@
+.\"	$NetBSD: quotactl.8,v 1.1.2.1 2011/01/31 21:14:06 bouyer 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 AUTHOR ``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 AUTHOR 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.
+.\"
+.\"
+.Dd January 31, 2011
+.Dt QUOTACTL 8
+.Os
+.Sh NAME
+.Nm quotactl
+.Nd send commands to the kernel disk quota subsystem
+.Sh SYNOPSIS
+.Nm
+.Op Fl D
+.Op Fl x
+.Ar filesystem 
+.Op Ar plist
+.Sh DESCRIPTION
+.Nm
+reads a property list of commands from the specified file or stdin,
+and sends it to the kernel for the specified filesystem through the
+.Xr quotactl 2
+system call.
+.Pp
+Available options:
+.Bl -tag -width Ds
+.It Fl x
+Do not parse reply from kernel for errors and print it to stdout
+.It Fl D
+Debug: print plist sent to and received from kernel to stderr
+.El
+.Pp
+If
+.Fl x
+is not specified, 
+.Nm
+parses the reply from the kernel, looking at each command return value
+and reporting errors.
+.Sh EXIT STATUS
+.Nm
+exists with 0 on success. If there was problems parsing the command plist,
+or the reply from the kernel, or if the
+.Xr quotactl 2
+system call returned an error, the exist status will be 1.
+Unless
+.Fl x
+is present, a message is printed to stderr for each failed command,
+and the exit status will be 2 if any comand failed.
+.Sh SEE ALSO
+.Xr quota 1 ,
+.Xr quotactl 2 ,
+.Xr proplib 3 ,
+.Xr edquota 8 ,
+.Xr repquota 8 .
+.Sh HISTORY
+The
+.Nm
+command appeared in
+.Nx 6.0 .
Index: src/usr.sbin/quotactl/quotactl.c
diff -u /dev/null src/usr.sbin/quotactl/quotactl.c:1.1.2.1
--- /dev/null	Mon Jan 31 21:14:06 2011
+++ src/usr.sbin/quotactl/quotactl.c	Mon Jan 31 21:14:06 2011
@@ -0,0 +1,182 @@
+/* $NetBSD: quotactl.c,v 1.1.2.1 2011/01/31 21:14:06 bouyer Exp $ */
+/*-
+  * Copyright (c) 2011 Manuel Bouyer
+  * All rights reserved.
+  * This software is distributed under the following condiions
+  * compliant with the NetBSD foundation policy.
+  *
+  * 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/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: quotactl.c,v 1.1.2.1 2011/01/31 21:14:06 bouyer Exp $");
+#endif /* not lint */
+
+/*
+ * Quota report
+ */
+#include <sys/param.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <prop/proplib.h>
+#include <sys/quota.h>
+
+#include <errno.h>
+#include <err.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include <ufs/ufs/quota2_prop.h>
+
+void usage(void);
+
+#define READ_SIZE 4096
+
+int
+main(int argc, char * const argv[])
+{
+	int xflag = 0;
+	int Dflag = 0;
+	FILE *f = NULL;
+	int ch;
+	char *plist, *p;
+	size_t plistsize;
+	int status = 0, error;
+	struct plistref pref;
+	prop_dictionary_t qdict, cmd;
+	prop_array_t cmds;
+	prop_object_iterator_t cmditer;
+	const char *mp, *xmlfile = NULL;
+
+	while ((ch = getopt(argc, argv, "Dx")) != -1) {
+		switch (ch) {
+		case 'x':
+			xflag++;
+			break;
+		case 'D':
+			Dflag++;
+			break;
+		default:
+			usage();
+		}
+	}
+	argc -= optind;
+	argv += optind;
+
+	if (argc == 0 || argc > 2) {
+		usage();
+	} else if (argc == 1) {
+		xmlfile = "<stdin>";
+		f = stdin;
+	} else {
+		xmlfile = argv[1];
+		f = fopen(xmlfile, "r");
+		if (f == NULL)
+			err(1, "%s", xmlfile);
+	}
+	mp = argv[0];
+
+	plist = malloc(READ_SIZE);
+	if (plist == NULL)
+		err(1, "alloc buffer");
+	p = plist;
+	plistsize = READ_SIZE;
+	while (fread(p, sizeof(char), READ_SIZE, f) == READ_SIZE) {
+		plist = realloc(plist, plistsize + READ_SIZE);
+		if (plist == NULL)
+			err(1, "realloc buffer");
+		p += READ_SIZE;
+		plistsize += READ_SIZE;
+	}
+	if (ferror(f))
+		err(1, "error reading %s", xmlfile);
+
+	qdict = prop_dictionary_internalize(plist);
+	if (qdict == NULL)
+		err(1, "can't parse %s", xmlfile);
+	free(plist);
+	if (!prop_dictionary_send_syscall(qdict, &pref))
+		err(1, "can't externalize to syscall");
+	if (Dflag) {
+		plist = prop_dictionary_externalize(qdict);
+		fprintf(stderr, "message to kernel:\n%s\n", plist);
+		free(plist);
+	}
+	prop_object_release(qdict);
+	if (quotactl(mp,  &pref) != 0)
+		err(1, "quotactl failed");
+
+	if ((error = prop_dictionary_recv_syscall(&pref, &qdict)) != 0) {
+		errx(1, "error parsing reply from kernel: %s\n",
+		    strerror(error));
+	}
+	if (Dflag) {
+		plist = prop_dictionary_externalize(qdict);
+		fprintf(stderr, "reply from kernel:\n%s\n", plist);
+		free(plist);
+	}
+	if (xflag) {
+		plist = prop_dictionary_externalize(qdict);
+		if (plist == NULL) {
+			err(1, "can't print reply");
+		}
+		printf("%s\n", plist);
+		exit(0);
+	}
+	/* parse the reply, looking for errors */
+	if ((error = quota2_get_cmds(qdict, &cmds)) != 0) {
+		errx(1, "error parsing reply from kernel: %s\n",
+		    strerror(error));
+	}
+	cmditer = prop_array_iterator(cmds);
+	if (cmditer == NULL)
+		err(1, "prop_array_iterator(cmds)");
+
+	while ((cmd = prop_object_iterator_next(cmditer)) != NULL) {
+		const char *cmdstr;
+		int8_t error8;
+		if (!prop_dictionary_get_cstring_nocopy(cmd, "command",
+		    &cmdstr))
+			err(1, "error retrieving command");
+		if (!prop_dictionary_get_int8(cmd, "return", &error8))
+			err(1, "error retrieving return value for command %s",
+			    cmdstr);
+		if (error8) {
+			warnx("command %s failed: %s", cmdstr,
+			    strerror(error8));
+			status = 2;
+		}
+	}
+	exit(status);
+}
+
+
+void
+usage(void)
+{
+	fprintf(stderr, "usage: %s [-D] [-x] mount point [file]\n",
+	    getprogname());
+	exit(1);
+}

Reply via email to