Initial commit to Gerrit 1.0 1.0_branch tizen/20120530.1
authorYang Lin <lin.a.yang@intel.com>
Wed, 30 May 2012 11:43:21 +0000 (19:43 +0800)
committerYang Lin <lin.a.yang@intel.com>
Wed, 30 May 2012 11:43:21 +0000 (19:43 +0800)
122 files changed:
CVS/Entries [new file with mode: 0644]
CVS/Repository [new file with mode: 0644]
CVS/Root [new file with mode: 0644]
Changelog [new file with mode: 0644]
Makefile.in [new file with mode: 0644]
README.gettext [new file with mode: 0644]
README.ldap-support [new file with mode: 0644]
README.mailserver [new file with mode: 0644]
aclocal.m4 [new file with mode: 0644]
autom4te.cache/output.0 [new file with mode: 0644]
autom4te.cache/output.1 [new file with mode: 0644]
autom4te.cache/output.2 [new file with mode: 0644]
autom4te.cache/requests [new file with mode: 0644]
autom4te.cache/traces.0 [new file with mode: 0644]
autom4te.cache/traces.1 [new file with mode: 0644]
autom4te.cache/traces.2 [new file with mode: 0644]
bylabel.c [new file with mode: 0644]
bylabel.h [new file with mode: 0644]
common.c [new file with mode: 0644]
common.h [new file with mode: 0644]
config.h.in [new file with mode: 0644]
configure [new file with mode: 0755]
configure.in [new file with mode: 0644]
convertquota.8 [new file with mode: 0644]
convertquota.c [new file with mode: 0644]
doc/CVS/Entries [new file with mode: 0644]
doc/CVS/Repository [new file with mode: 0644]
doc/CVS/Root [new file with mode: 0644]
doc/quotadoc.sgml [new file with mode: 0644]
doc/quotas-1.eps [new file with mode: 0644]
doc/quotas.ms [new file with mode: 0644]
doc/quotas.preformated [new file with mode: 0644]
dqblk_rpc.h [new file with mode: 0644]
dqblk_v1.h [new file with mode: 0644]
dqblk_v2.h [new file with mode: 0644]
dqblk_xfs.h [new file with mode: 0644]
edquota.8 [new file with mode: 0644]
edquota.c [new file with mode: 0644]
install-sh [new file with mode: 0755]
ldap-scripts/CVS/Entries [new file with mode: 0644]
ldap-scripts/CVS/Repository [new file with mode: 0644]
ldap-scripts/CVS/Root [new file with mode: 0644]
ldap-scripts/applySystemQuotas.pl [new file with mode: 0755]
ldap-scripts/edquota_editor [new file with mode: 0755]
ldap-scripts/quota.schema [new file with mode: 0644]
ldap-scripts/setSystemQuotas.pl [new file with mode: 0755]
ldap-scripts/setquota-ldap.pl [new file with mode: 0644]
mntopt.h [new file with mode: 0644]
packaging/quota-4.0.pre1.tar [new file with mode: 0644]
packaging/quota-4.0.pre1.tar.bz2 [new file with mode: 0644]
packaging/quota.changes [new file with mode: 0644]
packaging/quota.spec [new file with mode: 0644]
po/CVS/Entries [new file with mode: 0644]
po/CVS/Repository [new file with mode: 0644]
po/CVS/Root [new file with mode: 0644]
po/fr.po [new file with mode: 0644]
po/pl.po [new file with mode: 0644]
po/pl.po.orig [new file with mode: 0644]
po/pl.po.rej [new file with mode: 0644]
pot.c [new file with mode: 0644]
pot.h [new file with mode: 0644]
quot.8 [new file with mode: 0644]
quot.c [new file with mode: 0644]
quot.h [new file with mode: 0644]
quota.1 [new file with mode: 0644]
quota.c [new file with mode: 0644]
quota.h [new file with mode: 0644]
quota_nld.8 [new file with mode: 0644]
quota_nld.c [new file with mode: 0644]
quota_tree.h [new file with mode: 0644]
quotacheck.8 [new file with mode: 0644]
quotacheck.c [new file with mode: 0644]
quotacheck.h [new file with mode: 0644]
quotacheck_v1.c [new file with mode: 0644]
quotacheck_v2.c [new file with mode: 0644]
quotactl.2 [new file with mode: 0644]
quotadebug [new file with mode: 0755]
quotadebug.c [new file with mode: 0644]
quotagrpadmins [new file with mode: 0644]
quotaio.c [new file with mode: 0644]
quotaio.h [new file with mode: 0644]
quotaio_generic.c [new file with mode: 0644]
quotaio_generic.h [new file with mode: 0644]
quotaio_meta.c [new file with mode: 0644]
quotaio_rpc.c [new file with mode: 0644]
quotaio_tree.c [new file with mode: 0644]
quotaio_v1.c [new file with mode: 0644]
quotaio_v1.h [new file with mode: 0644]
quotaio_v2.c [new file with mode: 0644]
quotaio_v2.h [new file with mode: 0644]
quotaio_xfs.c [new file with mode: 0644]
quotaio_xfs.h [new file with mode: 0644]
quotaon.8 [new file with mode: 0644]
quotaon.c [new file with mode: 0644]
quotaon.h [new file with mode: 0644]
quotaon_xfs.c [new file with mode: 0644]
quotaops.c [new file with mode: 0644]
quotaops.h [new file with mode: 0644]
quotastats.8 [new file with mode: 0644]
quotastats.c [new file with mode: 0644]
quotasys.c [new file with mode: 0644]
quotasys.h [new file with mode: 0644]
quotatab [new file with mode: 0644]
repquota.8 [new file with mode: 0644]
repquota.c [new file with mode: 0644]
rquota.3 [new file with mode: 0644]
rquota.x [new file with mode: 0644]
rquota_client.c [new file with mode: 0644]
rquota_client.h [new file with mode: 0644]
rquota_server.c [new file with mode: 0644]
rquota_svc.c [new file with mode: 0644]
rquotad.8 [new file with mode: 0644]
set_limits_example.c [new file with mode: 0644]
setquota.8 [new file with mode: 0644]
setquota.c [new file with mode: 0644]
setup_quota_group [new file with mode: 0755]
svc_socket.c [new file with mode: 0644]
warnquota.8 [new file with mode: 0644]
warnquota.c [new file with mode: 0644]
warnquota.conf [new file with mode: 0644]
xqmstats.8 [new file with mode: 0644]
xqmstats.c [new file with mode: 0644]

diff --git a/CVS/Entries b/CVS/Entries
new file mode 100644 (file)
index 0000000..ba84bb3
--- /dev/null
@@ -0,0 +1,84 @@
+D/doc////
+D/ldap-scripts////
+D/po////
+/rquotad.8/1.10/Wed Dec 17 12:30:20 2008//
+/README.gettext/1.1.1.1/Mon Oct 13 17:29:18 2008//
+/README.ldap-support/1.2/Mon Oct 13 17:29:19 2008//
+/README.mailserver/1.2/Mon Oct 13 17:29:19 2008//
+/install-sh/1.1.1.1/Mon Oct 13 17:29:18 2008//
+/quot.8/1.5/Mon Oct 13 17:29:18 2008//
+/quot.h/1.3/Mon Oct 13 17:29:19 2008//
+/quotagrpadmins/1.1/Mon Oct 13 17:29:19 2008//
+/quotastats.8/1.1/Mon Oct 13 17:29:19 2008//
+/quotatab/1.1/Mon Oct 13 17:29:19 2008//
+/rquota.3/1.1.1.1/Mon Oct 13 17:29:18 2008//
+/rquota.x/1.1.1.1/Mon Oct 13 17:29:18 2008//
+/setup_quota_group/1.1.1.1/Mon Oct 13 17:29:18 2008//
+/warnquota.conf/1.9/Mon Oct 13 17:29:18 2008//
+/xqmstats.8/1.1/Mon Oct 13 17:29:19 2008//
+/quotactl.2/1.8/Tue Sep 22 12:18:55 2009//
+/convertquota.8/1.7/Tue Nov 24 19:03:15 2009//
+/edquota.8/1.14/Tue Nov 24 18:53:24 2009//
+/quota.1/1.15/Tue Nov 24 18:55:05 2009//
+/quotacheck.8/1.10/Tue Nov 24 18:53:57 2009//
+/quotaon.8/1.9/Tue Nov 24 18:54:15 2009//
+/quotaon.h/1.3/Mon Nov 30 22:45:45 2009//
+/repquota.8/1.16/Tue Nov 24 18:54:34 2009//
+/setquota.8/1.12/Tue Nov 24 18:54:46 2009//
+/warnquota.8/1.11/Tue Nov 24 18:54:58 2009//
+/bylabel.c/1.5/Tue Jan  5 15:37:16 2010//
+/bylabel.h/1.2/Tue Jan  5 12:12:20 2010//
+/common.c/1.9/Tue Jan  5 15:38:20 2010//
+/convertquota.c/1.21/Tue Jan  5 15:38:24 2010//
+/edquota.c/1.25/Tue Jan  5 15:38:33 2010//
+/pot.c/1.2/Tue Jan  5 15:38:39 2010//
+/quot.c/1.14/Tue Jan  5 15:40:14 2010//
+/quota.c/1.30/Tue Jan  5 15:38:47 2010//
+/quota_nld.8/1.4/Tue Jan  5 13:51:58 2010//
+/quota_nld.c/1.10/Tue Jan  5 15:39:45 2010//
+/quotacheck_v1.c/1.6/Tue Jan  5 15:38:57 2010//
+/quotacheck_v2.c/1.12/Tue Jan  5 16:00:26 2010//
+/quotaio.c/1.22/Tue Jan  5 15:39:08 2010//
+/quotaio_generic.c/1.2/Tue Jan  5 15:39:12 2010//
+/quotaio_meta.c/1.2/Tue Jan  5 15:39:16 2010//
+/quotaio_rpc.c/1.7/Tue Jan  5 15:39:19 2010//
+/quotaio_tree.c/1.2/Tue Jan  5 15:39:23 2010//
+/quotaio_v1.c/1.17/Tue Jan  5 15:39:27 2010//
+/quotaio_v2.c/1.20/Tue Jan  5 15:39:32 2010//
+/quotaio_xfs.c/1.10/Tue Jan  5 15:39:40 2010//
+/quotaon.c/1.28/Tue Jan  5 15:39:50 2010//
+/quotaon_xfs.c/1.9/Tue Jan  5 15:39:54 2010//
+/quotaops.c/1.24/Tue Jan  5 15:40:00 2010//
+/quotastats.c/1.12/Tue Jan  5 16:04:57 2010//
+/quotasys.c/1.64/Tue Jan  5 15:49:18 2010//
+/repquota.c/1.28/Tue Jan  5 15:40:19 2010//
+/rquota_client.c/1.13/Tue Jan  5 16:04:57 2010//
+/rquota_server.c/1.22/Tue Jan  5 16:04:57 2010//
+/rquota_svc.c/1.22/Tue Jan  5 16:04:57 2010//
+/set_limits_example.c/1.3/Tue Jan  5 15:41:17 2010//
+/setquota.c/1.25/Tue Jan  5 15:41:33 2010//
+/svc_socket.c/1.5/Tue Jan  5 15:41:43 2010//
+/warnquota.c/1.33/Tue Jan  5 16:04:57 2010//
+/xqmstats.c/1.6/Tue Jan  5 15:41:57 2010//
+/common.h/1.12/Wed Jan  6 10:58:04 2010//
+/dqblk_rpc.h/1.3/Wed Jan  6 10:58:04 2010//
+/dqblk_v1.h/1.4/Wed Jan  6 11:01:11 2010//
+/dqblk_v2.h/1.6/Wed Jan  6 11:01:16 2010//
+/dqblk_xfs.h/1.3/Wed Jan  6 10:58:04 2010//
+/mntopt.h/1.13/Wed Jan  6 10:58:04 2010//
+/pot.h/1.4/Wed Jan  6 10:58:04 2010//
+/quota.h/1.12/Wed Jan  6 10:58:04 2010//
+/quota_tree.h/1.3/Wed Jan  6 10:58:04 2010//
+/quotacheck.h/1.8/Wed Jan  6 10:58:04 2010//
+/quotaio.h/1.16/Wed Jan  6 10:58:04 2010//
+/quotaio_generic.h/1.3/Wed Jan  6 10:58:04 2010//
+/quotaio_v1.h/1.6/Wed Jan  6 11:00:38 2010//
+/quotaio_v2.h/1.6/Wed Jan  6 11:00:54 2010//
+/quotaio_xfs.h/1.5/Wed Jan  6 10:58:04 2010//
+/quotaops.h/1.6/Wed Jan  6 10:58:04 2010//
+/quotasys.h/1.29/Wed Jan  6 10:58:04 2010//
+/rquota_client.h/1.4/Wed Jan  6 10:58:04 2010//
+/configure.in/1.31/Wed Jan  6 14:47:27 2010//
+/Changelog/1.152/Wed Feb 17 11:50:20 2010//
+/quotacheck.c/1.60/Wed Feb 17 11:49:17 2010//
+/Makefile.in/1.47/Wed Feb 17 12:00:04 2010//
diff --git a/CVS/Repository b/CVS/Repository
new file mode 100644 (file)
index 0000000..2dc33ce
--- /dev/null
@@ -0,0 +1 @@
+quota-tools
diff --git a/CVS/Root b/CVS/Root
new file mode 100644 (file)
index 0000000..3d66810
--- /dev/null
+++ b/CVS/Root
@@ -0,0 +1 @@
+jkar8572@linuxquota.cvs.sf.net:/cvsroot/linuxquota/
diff --git a/Changelog b/Changelog
new file mode 100644 (file)
index 0000000..c2931a6
--- /dev/null
+++ b/Changelog
@@ -0,0 +1,850 @@
+Changes in quota-tools from 3.17 to 4.00-pre1
+* don't try to set inode flags when getting them failed (Michalski Wojciech)
+* added liblber to the list of libraries needed for LDAP support (Michael Meskes)
+* Rewritten configuration script to create config.h (Jan Kara)
+* Use /proc/mounts for mountpoint scanning (Jan Kara)
+* Removed use of reserved identifiers (Jan Kara)
+* Improved manpage of quota_nld (Eddie Eyles)
+* Fixed long option handling of quota_nld (Jan Kara)
+* Fixed error reporting when rpc format specified on command line (Jan Kara)
+* Convert quota limits using rq_bsize from RPC request (Jan Kara)
+* Added noreturn attribute to die to avoid false warnings (Jan Kara)
+* 64-bit quota support, rewritten some code to allow clean integration (Jan Kara)
+* Improved header of quota an repquota output when -s option is used (Jan Kara)
+* Fixed mountpoint scanning when NFS mountpoint is specified on command line (Jan Kara)
+* Updated manpage of quotactl(2) (Jan Kara)
+
+Changes in quota-tools from 3.16 to 3.17
+* Updated quotactl(2) manpage to mention possible ERANGE error (Jan Kara)
+* Fix hostname checking of rpc.rquotad. It could allow access even though hostname was in /etc/hosts.deny (Jan Kara)
+* do not allow setting of user's grace time when softlimit is not exceeded (Jan Kara)
+* fix reference to rpc manpage (anonymous reporter)
+* add EXT4 (not only EXT4DEV) to the list of supported filesystems (Mingming Cao)
+* fix setting of more than 31-bit block and inode limits (Gui Xiaohua)
+* fixed bug in error reporting when quota reading fails (Jan Kara)
+* added support for quota formats with hidden quota files (Jan Kara)
+* remove IMMUTABLE flag from quota file in quotacheck (Jan Kara)
+* fix bug in warnquota which could result in bogus hostname and domainname (anonymous reporter)
+* implemented writing of messages that user got below hard/soft limits to quota_nld (Jan Kara)
+* use PKG_CHECK_MODULES to check for DBUS (Ladislav Michnovic)
+* Implement setting of charset for emails sent by warnquota (Michael Meskes)
+* Added quota_nld to the list of installed programs (Jan Kara)
+* some typos fixes (Matthew Boyle)
+* fixed possible segfault when unpriviledged user run edquota (Matthew Boyle)
+* fixed format strings to use "%llu" and "%lld" instead of "%Lu" and "%Ld" (Ladislav Michnovic)
+* removed ssl, resolv, lber from the list of LDAP libraries since we don't need them directly (Jan Kara)
+* added limits.h include to quota_nld (Jan Kara)
+* fixed repquota to work with limits over 4 TB (Jan Kara, Michael Meier)
+
+Changes in quota-tools from 3.15 to 3.16
+* added information message about journaled quota to quotacheck (Jan Kara, Alex Tomas)
+* added pointers to quota_nld and warnquota to some manpages (Jan Kara)
+* ported quota_nld to libnl-1.1 (Jan Kara)
+* let setquota batch mode accept comments and blank lines, add -c option (Jacky Bruno, Jan Kara)
+* print more verbose list of compile options when --version specified (Jan Kara)
+* quotaon(8) should work only on local filesystems (Ladislav Michnovic)
+* made possible to use quota rpc in mixed NFSv3 and NFSv4 environments (Jan Kara) 
+* fixed compilation with openLDAP library versions 2.1 and 2.2 (Jan Kara)
+* always define allow_severity and deny_severity for older versions of libwrap (Martin Jacobs)
+* cleaned up host_access() handling (Jan Kara)
+* configure script now correctly reports checking of libwrap (Jan Kara)
+* added MPFS to the list of supported filesystems (Dave Boone)
+* all binaries are now stripped during installation (Jan Kara)
+* updated Polish translations (Jakub Bogusz)
+* fixed typo in a quotaon message (Jakub Bogusz)
+* fixed warnquota to check URI only if LDAP enabled (Michael Meskes)
+
+Changes in quota-tools from 3.14 to 3.15
+* added a wrapper script around setquota which also updates LDAP (Stefan Adams)
+* implemented quota netlink daemon to listen to kernel netlink messages and send them
+  to DBUS and / or write them to the console (Jan Kara)
+* modified configure scripts and warnquota to check for new LDAP library and allow use of URI (Jan Kara)
+* fix LDAP scripts to set VISUAL instead of EDITOR (Michael Meskes)
+* added ext4 filesystem to the list of supported filesystems (Jan Kara)
+* pot.o is now compiled with CFLAGS (Ladislav Michnovic)
+* use -fPIE for compilation when available (Jan Kara, Ladislav Michnovic)
+* fixed some more problems XFS quotaon (Kouta Ooizumi, Jan Kara)
+* fixed two mistakes in quotaon(8) manpage (Utako Kusaka)
+* added option -A to quota(1) to report all NFS mountpoints (Jan Kara)
+* fixed XFS handling to work with loopback mounted devices (Jan Kara)
+* fixed mountpoints scanning to make XFS -x delete command work (Jan Kara)
+* fixes of signed vs unsigned int issues (Jan Kara)
+* fixed a format string bug in reporting of raw grace times in repquota (Jan Kara)
+* added repquota(8) and quota(1) option for better parsable output (Jan Kara)
+* fixed error handling in edquota(8) when creating tmp file (Jan Kara)
+
+Changes in quota-tools from 3.13 to 3.14
+* updated Polish translations (Jakub Bogusz)
+* print user/group names in error messages when cannot get quota information (Michal Marek, Jan Kara)
+* added option --always-resolve to force resolving even names with digits only (Jan Kara)
+* minor language corrections in manpages (Jan Kara)
+* implemented long options parsing for all quota tools (Jan Kara)
+* quota(1) has -f option to specify filesystem list (Jan Kara)
+* corrected some informal language in messages (Jan Kara)
+* we cannot even stat NFS mounts in local mode as server may be unreachable (Jan Kara)
+* fixed error messages in getprivs() (Jan Kara, Brian Morris)
+* made UID/GID prints unsigned (Matthew Kent)
+* fixed very verbose printing for quotacheck (Jan Kara)
+* fixed off-by-one bug in mount options parsing (Jan Kara)
+* implemented nicer message formatting for warnquota(8) (Jan Kara)
+* quota(1) has -w option to supress line wrapping for long device names (Jan Kara)
+* quota(1) prints grace time even if hard limit is reached (Jan Kara)
+* fixed journaled quota format detection in quotacheck (Jan Kara)
+
+Changes in quota-tools from 3.12 to 3.13
+* fixed mistakes in several error messages, improved error reporting functions
+  (Dmitry V. Levin)
+* volume label and UUID support for reiserfs (Jan Kara)
+* support for LABEL= and UUID= on a command line (Jan Kara)
+* parse NFSD export table to find pseudofilesystem root for NFSv4 (Jan Kara)
+* handle better when quota file should become empty (Niu YaWei)
+* minor manpage and help-text fixes (Jan Kara)
+* fixed quotacheck(8) to check each block only once (Jan Kara)
+* fixed quotacheck(8) messages about corrupted blocks (Jan Kara)
+* fixed quotacheck(8) to rename quota files after turning quotas off (Jan Kara)
+* added sanity check to quota reporting (Jan Kara)
+* fixed check for illegal references in quotacheck(8) (Jan Kara)
+* added NFSv4 to the list of supported fs types (Jan Kara)
+* updating of progress is now less frequent - should speedup quotacheck -v a bit (Jan Kara)
+* added printing of directories to quotacheck(8) (Jan Kara, Jan Engelhardt)
+* added dynamic mountpoint array allocation (Jan Kara)
+* made quotacheck(8) more friendly to journaled quota (Jan Kara)
+* changed configure to detect whether nls is needed (Tomasz Kloczko, Jan Kara)
+* added JFS into a set of supported filesystems (David Kleikamp)
+* added French translation (Jerome Schell)
+* fixed quota tools to set of grace time only after exceeding soft limit, not
+  at reaching (Jan Kara)
+* fixed exit codes of setquota(8) and edquota(8) (Jan Kara)
+* updated Polish translations (Jakub Bogusz)
+* fixed "bashism" is Makefile (Michael Meskes)
+
+Changes in quota-tools from 3.11 to 3.12
+* fixed bug in quotaon(8) reporting (Paul Szabo)
+* added manpages for xqmstats & quotastats (Max Vozeler)
+* fixed a few memleaks (Jan Kara)
+* fixed bug when root had no usage and limits (Jan Kara)
+* added a few perl wrappers for LDAP (Stefan Adams)
+* added note about availability of -r option to manpages (Jan Kara)
+* maximal number of groups is now got via sysconf (Nathan Scott)
+* added batch mode to the setquota(8) (Jan Kara)
+* added reference to setquota(8) to manpages of other tools (Jan Kara)
+* fixed bug in --port option of rquotad (Max Kalika)
+* updated quota documentation (Jan Kara)
+* disabling nls via configure (Jan Kara)
+* fixed warning when gettext not used (Peter Breitenlohner)
+* fixed typo in rquotad.8 (Peter Breitenlohner)
+* fixed compiler warning in quotacheck.c (Peter Breitenlohner)
+* added config option for putting some important binaries to /sbin regardless
+  $(prefix) (Jan Kara)
+* added config option to warnquota(8) for CCing admin only specified amount of
+  time before grace time runs out (Jan Kara)
+
+Changes in quota-tools from 3.10 to 3.11
+* quota-tools should again use old RPC protocol when needed (Jan Kara)
+* add FIOQSIZE for x84_64 architecture (Jan Kara)
+* quotacheck(8) does not count quota files to usage (Jan Kara)
+* tools now honor journalled quota mount options (Jan Kara)
+* manpage of repquota(8) stated falsely that repquota works over RPC (Jan Kara)
+* added -T flag to quot(8) to avoid truncation of names (Andre Nathan)
+* added -q flag to quot(8) to avoid sorting of names (Andre Nathan)
+* added #include <paths.h> in quotasys.c to avoid compile problems on some systems (Jan Kara)
+* changed detection of filesystem to be able to parse comma separated list (Jan Kara)
+* fixed bug in quotacheck(8) which counted wrongly files larger than 2GB (Posta Zoltan)
+* fixed compile problem with quotacheck and new kernels (Michael Meskes, Jan Kara)
+* fixed typo in quotacheck manpage (Noel Koethe)
+* warnquota(8) can get mail addresses via LDAP (James Bourne)
+* warnquota(8) can avoid sending e-mail when user is over quota on mail partition (James Bourne)
+* fixed bug in quotacheck(8) which counted directories twice sometimes (Jan Kara)
+* edquota(8) now allows parameters in VISUAL/EDITOR env. params (Jan Kara)
+* reverted changes in detection of kernel from 3.10 - interface obsoleted in 2.6 kernel (Jan Kara)
+
+Changes in quota-tools from 3.09 to 3.10
+* alternative port can be specified to rpc.rquotad by -p option (Jan Kara)
+* Fixed processing of device-backed loop mounts (Jari Ruusu)
+* Fixed fake error messages from rpc.rquotad (Jan Kara)
+* quota(1) now does not print info for NFS filesystems without quotas (Jan Kara)
+* XFS roothack option disabled by default (Nathan Scott)
+* added option to warnquota(8) to supress details of report (Marco van Wieringen)
+* fixed problems with multiple lines values in warnquota(8) (F. Depke)
+* changed detection of kernel interface so that it works even without /proc (Jan Kara, Johan Ekenberg)
+* updated Polish messages (Jakub Bogusz)
+* updated quotactl(2) manpage (Jan Kara)
+* fixed bug in -f option of edquota(8) (Jan Kara)
+* fixed formatting bug in warnquota(8) (Jan Kara)
+* added option -s (choice of more appropriate units) to warnquota(8) (Jan Kara)
+
+Changes in quota-tools from 3.08 to 3.09
+* minor update of quota(1) manpage (Jan Kara)
+* quotacheck(8) now remembers only hardlinked files and not all inodes with
+  n_link > 1 (Jan Kara, Jan Kasprzak)
+* quotacheck(8) doesn't store structures for all users in old quota format  (Jan Kasprzak)
+* fixed minor bug in documentation (Jan Kara, Lucas Brasilino)
+* repquota(8) handles multiple entries in /etc/passwd better (Jan Kara)
+* made tools not to touch mountpoints mounted without quota options (Jan Kara)
+* added option for ignoring autofs mountpoints to quota(1), quot(8), repquota(8) and rpc.rquotad(8) (Jan Kara, Paul Szabo)
+* updated xqmstats (Nathan Scott)
+
+Changes in quota-tools from 3.07 to 3.08
+* Fixed infinite loop in quotacheck under RH7.1 (?)
+* Made quota tools aware of /etc/services (H. J. Lu)
+* Updated edquota(8) and setquota(8) to allow setting of individual grace time (Jan Kara)
+* Fixed bug in convertquota(8) when quota was turned on during converting (Jan Kara)
+* Add support for XFS filesystems without root special casing (Christoph Hellwig)
+* XFS documentation updates (Nathan Scott)
+
+Changes in quota-tools from 3.06 to 3.07
+* Added creation of bin and sbin dir during make install; removed hardcoded 
+  /sbin directory for some utilities. (Jan Kara)
+* Add support for 32 bit uid's and gid's when using EXT2_DIRECT. (Michael Meskes)
+* updated manpage of rpc.rquotad (Jan Kara)
+* setquota is disabled by default in rpc.rquotad (Jan Kara)
+* setquota using RPC is disabled by default in configure (Jan Kara)
+* rised maximal number of mountpoint to 256 (Jan Kara)
+* small fix in configure (Nathan Scott)
+* small fix in quotacheck(8) docs (Jan Kara)
+* fixed quotacheck(8) to continue when old quota files were not found (Jan Kara)
+* quota(1) now doesn't report failure to connect to rpc.rquotad server when -Q specified (Jan Kara)
+* add quota(1) option -l (report only local filesystems) (Jan Kara)
+* warnquota(8) now also mails specified member of the group about violation of the group quotas
+  when -g option is specified (Jan Kara)
+* added options by which user can specify whether repquota(8) should translate names in
+  big chunks by scanning all users or individually. Added automagic detection using nsswitch.conf
+  which behaviour should lead to faster translating. (Jan Kara)
+
+Changes in quota-tools from 3.05 to 3.06
+* fixed caching of libwrap configure result (Jan Kara)
+* fixed copying of quotafile name from mtab (?)
+* warnquota.conf is now installed in config dir (Jan Kara)
+* updated format detection to reflect changes in kernel interface in 2.5.18 (Jan Kara)
+* fixed scanning of non-mountpoint directories (Jan Kara)
+* fixed detection of XFS format (Jan Kara)
+* fixed printing of 'over softlimit sign' in quota(1) (Jan Kara)
+
+Changes in quota-tools from 3.04 to 3.05
+* quota tools should honour 'noquota' mount option (Jan Kara)
+* fixes in manpages (Arkadiusz Miskiewicz)
+* fixed detection of libwrap in configure (Arkadiusz Miskiewicz)
+* added forgotten ROOTDIR to path to gettext catalogs (Arkadiusz Miskiewicz)
+* quotacheck uses newest format supported by kernel when creating new quota files (Jan Kara)
+* fixed bug in IO initialization when -F xfs was given (Jan Kara)
+* added support for quota 6.5.1 (Jan Kara)
+* quotaon(8) now can get format parameter (Jan Kara)
+* fixed bad return value of quota(1) (Jan Kara)
+* fixed bug in quota format format detection (Jan Kara)
+
+Changes in quota-tools from 3.03 to 3.04
+* added -D_FILE_OFFSET_BITS=64 to Makefile - fixes problems with large files with some libcs (Michael Meskes)
+* added -p (print state) to quotaon (Vladimir Linek, Jan Kara)
+* made quotaon(8) write better error messages (Jan Kara)
+* make install now creates man directories (Jan Kara)
+* added -q <quotatab> and -c <configfile> options to warnquota(8) (Jan Kara)
+* added some notes about quotatab to warnquota manpage (Jan Kara) 
+* fixed bug in options parsing of warnquota(8) (Michael Meskes)
+* ignore automount mountpoints (Philippe Troin)
+* fixed minor bug in printing grace times (Jan Kara)
+* fixed quotaon(8) behaviour when it sees newer kernel then it's able to handle (Jan Kara)
+* minor formatting change in quotactl(2) manpage (Nathan Scott)
+* init_io() is now more paranoid about quota turned on in kernel (Jan Kara)
+
+Changes in quota-tools from 3.02 to 3.03
+
+* added -f <filesystem> option (perform operation only for given filesystem) for edquota (Jan Kara)
+* quotacheck now skips quota file scanning when file not found (Jan Kara)
+* repquota shouldn't show grace times when softlimit is not exceeded (Jan Kara)
+* removed bogus error message in mountpoint scanning (Jan Kara)
+* fixed mountpoint scanning initialization (solved rpc.rquotad SEGFAULT) (Jan Kara)
+* rpc.rquotad now doesn't need mountpoint for quota operations (Jan Kara)
+* fixed compilation on sparc (Michael Meskes, Jan Kara)
+
+Changes in quota-tools from 3.01 to 3.02
+
+* added -n option (don't resolve names) to repquota (Jan Kara)
+* quota tools now correctly handle zero grace times in old format (Jan Kara)
+* edquota, setquota commit just grace times and flags - fixed possible races
+  when used on live filesystem (Jan Kara)
+* another fix to quotastats (Jan Kara)
+* added check to format detection for bad endianity (Jan Kara)
+* implemented conversion of files with bad endianity (Jan Kara)
+* fixes in warnquota, warnquota now allows line splitting by '\', text of mail
+  can be specified in config file (Jan Kara)
+
+Changes in quota-tools from 3.01-final to 3.01
+
+* quotastats should now work better on old kernels (Jan Kara)
+* quotacheck is more strict in checking it's arguments (Jan Kara)
+* edquota and setquota should be now save to run for working user
+  (number of used blocks and inodes could be wrong in previous versions)
+  (Jan Kara)
+
+Changes in quota-tools from 3.01-pre9 to 3.01-final
+
+* quotacheck is using ext2_ino_t if defined (Jani Jaakkola, Jan Kara)
+* rpc.rquotad now closes stdin, stdout unless run on foreground (Jani Jaakkola)
+* setquota can be disabled in rpc.rquotad by commandline option (Jani Jaakkola)
+* quota-tools should now work well also on RH 7.1 (Anders Blomdell, Jan Kara)
+* quotacheck makes backup files only when told by option (Preston Brown)
+* quotacheck now uses vfsv0 format when no quotafile is found (Jan Kara)
+* fixed mountpoint scanning bug when bad mountpoint was specified (Jan Kara)
+* fixed bug when device was specified instead of mountpoint (Preston Brown)
+* fixed bug when scanning mountpoint NFS mounted filesystem (Jan Kara)
+* repquota now resolves more names at once which makes it
+  a lot faster (Jan Kara)
+
+
+Changes in quota-tools from 3.01-pre8 to 3.01-pre9
+
+* Improved host access handling (Jan Kara)
+* Improved RPC error reporting (Jan Kara)
+* Fixed bug in quotaon when run of kernel with XFS (Jan Kara)
+* Implemented new mtab scanning with fallback to fstab when mtab not 
+  found (Jan Kara)
+* Improved speed of repquota for old quota format (Jan Kara)
+* New Makefile style (Jan Kara)
+* Fixed bug in configure in detecting of e2fslib (Jan Kara)
+* Implemented automatic choice of units in quota(1) and repquota(8) (Jan Kara)
+
+
+Changes in quota-tools from 3.01-pre7 to 3.01-pre8
+
+* Fixed typo in option in convertquota. (Jan Kara)
+* Grace times are updated when quota limits are set. (Jan Kara)
+* Fixed possible segfault in rpc.rquotad when no filesystems with quota
+  were found. (Jan Kara)
+
+
+Changes in quota-tools from 3.01-pre6 to 3.01-pre7
+
+* Fixed a bug in quotacheck (SEGFAULT on -aR) (Jan Kara)
+* Fixed bug in rquota (grace times) (Jan Kara)
+
+
+Changes in quota-tools from 3.01-pre5 to 3.01-pre6
+
+* Fixed bug in quotacheck for new quota format (it created corrupted quota
+  files). (Jan Kara)
+* Fixed bug in version reporting for quot. (Jan Kara)
+* repquota now has -t option - when specified it will be truncating names so
+  output will be nicer (Jan Kara)
+
+
+Changes in quota-tools from 3.01-pre2 to 3.01-pre5
+
+* Fixed endian bug in the ext2 mount by LABEL or by UUID handling code, and
+  added XFS support to this code also.  (Nathan Scott)
+
+* Fix bug in handling of multiple mount points sharing the same device.
+  (Jan Kara)
+
+* Fix warnquota output for devices with long names.  (Jan Kara)
+
+* Updated man pages.  (Jan Kara, Nathan Scott)
+
+* Added a port of the BSD quot(8) utility, with XFS support.  (Nathan Scott)
+
+* Added xqmstats(8) utility for reporting activity statistics for the XFS
+  Quota Manager - XQM.  (Nathan Scott)
+
+* Fix up numerous compiler warnings and all the minor problems that revealed -
+  package now compiled with -Wall by default.  (Jan Kara, Nathan Scott)
+
+* Rewrote the error output handler (now uses errstr function) which also
+  displays the correct programname of the program issueing the error.
+
+* Additional configure option BSD_BEHAVIOUR for more the old BSD behaviour
+  as wanted by some people.
+
+* EOF -> -1, sprintf -> snprintf fixes
+
+* Don't turn quotas on on NFS
+
+* Fixed quota format detection, related bugs in quotaon
+
+* IO code now allows readonly access, doesn't open quotafile when not needed
+
+* Fixed bug in old quotaformat initialization
+
+* quota(1) now exits with nonzero exitcode when over quota
+
+* Manpage cleanup
+
+
+Changes in quota-tools from 2.00 to 3.01-pre2
+
+* This is a complete rewrite of the quota package, most importantly adding
+  support for the new Linux quota format and also support for XFS quota.
+
+* The internal data structures and algorithms were redesigned and rewritten by
+  Jan Kara (jack@ucw.cz) so that different versions and different types of
+  quota can be used with these tools.
+
+* Support for XFS quota has been added by Nathan Scott (nathans@sgi.com).
+  
+* Add options like RPC, ALT_FORMAT, RPC_SETQUOTA, EXT2_DIRECT to configure.
+  (Jan Kara)
+
+* Fix atoi() -> strtol() and detect mistakes in numeric input.  (Jan Kara)
+
+* Add '-V' option to all tools to display the version.  (Jan Kara)
+
+* Reworked time conversion routines.  (Jan Kara)
+
+* setquota - added -t parameter and allow variable number of filesystems to
+  be specified.  (Jan Kara)
+
+
+Changes in quota-tools from 1.70 to 2.00
+
+* Added patches from Steven Walker <smw8923@cmsu2.cmsu.edu> for supporting
+  rpc_setquota call and tcp-wrappers check in rquotad.
+
+* Splited quota manipulation from setquota, edquota, quota etc. to quotaops.c
+  so things are coded only once. Also added support for remote quota editing
+  and setting using rquota extensions.
+
+* Fixed problems with parsing of /etc/fstab in hasquota.c (incorrectly
+  assumed that it was the only option followed by an '='). Patch by
+  Simon Huggins <huggie@earth.li>.
+
+* Extracted quota-io into quotaio.c so we only need to update repquota.c and
+  quotaio.c when we change the way quotas are stored in the quotafile for bigger
+  uids and gids.
+
+* Added prototype user copying to setquota ala edquota -p only this
+  time only for a specific filesystem.
+
+* Fixed quota tools for quotas bigger then 4 Gb.
+  Patch by Stephen C. Tweedie <sct@redhat.com>
+
+* Changed rpc.rquotad to scan all device entries in /dev to support also devfs
+  systems and systems with special hardware RAID controllers.
+
+* Added autoconf support to the quota-utils.
+  Patches by Andreas Gruenbacher <a.gruenbacher@bestbits.at>
+
+* Added extra filesystem types to mntent to reflect the current linux filesystems
+
+* Rewrote hasquota.c to check for the MNTOPT_QUOTA option.
+  (Request from Phil Stracchino <alaric@babcom.com>)
+
+* Removed searching of /dev dir from rquota_server. Only lookup mounted filesystems.
+  (Patch by Roman Kagan <Roman.Kagan@itep.ru>)
+
+* Added gettext NLS support all credits go to the guys named in the
+  README.gettext.
+
+* Added the redhat patches to the standard tree.
+       * blocksize patch
+       * fhs patch
+       * hjl patch
+       * label patch
+       * SPARC patch
+
+* Changed Q_SETQUOTA to Q_SETQLIM in quotaops.c for the putprivs function. This fixed
+  a problem where we restore bogos usage info by edquota etc. when a user resets its
+  quota usage while running for example edquota. We should only change the limits
+  because thats the only things we can change using these kind of tools.
+  (Bug report by Dr. Michael Meskes <michael@fam-meskes.de> from the Debian bug-archive)
+
+* Added numeric option to quota and setquota to allow to set quota for users/groups not
+  in the localy known through name-services.
+  (Modified the patches send by Oscar Martín <oscar@cdrtcampos.es>)
+
+Changes in quota-tools from 1.65 to 1.70
+
+* Fixed problems when turning off one type of quota taking offline the
+  other type too.
+
+* Fixed bugs as reported on bugtraq for negative ids and problems
+  with usernames with only digits.
+
+* Added setquota (to se quotas from the commandline) as send to me by
+  Martin Bene <mb@sime.com>
+
+Changes in quota-tools from 1.60 to 1.65
+
+* Created new diffs again for the newer kernel (2.1.[78]x).
+
+* Added sample program that copies quota-settings from one user
+  to an other.
+
+* Added /etc/quotatab support as developed by Jon Lewis
+ <jlewis@inorganic5.fdt.net>
+
+* Added some changes to /usr/src/linux/fs/nfsd/vfs.c to support quotas
+  for the kernel-nfsd too. (Most other filesystems are gone and the ones
+  remaining either don't need quotas or are not used by big groups of users.)
+
+Changes in quota-tools from 1.55 to 1.60
+
+* Added new option to kernel root_squash which means when that option is
+  set the kernel system treats root as any normal user and he cannot
+  write to any file anymore without obeing the quota limits.
+
+* Added support for root_squash to quotaon and quotaoff using the new
+  rsquash option in mntent. In the run also rewrote the hasquota function.
+
+* Added patches to Makefile.std which should make it more FSSTND compliant.
+
+* Added extra check to rpc.rquotad to check the special device type when
+  scanning the /dev dir for the right device.
+
+Changes in quota-tools from 1.52 to 1.55
+
+* Added all patches and enhancements I collected the last few months.
+  (As always some have undergone some rewriting and are only a special
+   option. But they are in)
+
+* Changed check on ruid in edquota to an access-check on the quota-files.
+  If you have write permissions on the quota-files as a group its probably
+  ok to allow you to change the quotas. If not the system operator should
+  take apropriate actions. Install edquota SUID-root if you want people
+  who are able to write to your quotafiles to change quotas. If you don't
+  install it SUID root it will only update the files which can give strange
+  problems with the kernel overwriting your updates.
+
+* Added the EPS-file of the sheets from Remy Card which he used at the
+  Berlin Linux seminar. And because they describe everything in detail
+  its a nice enhancement to the current HTML docs.
+
+Changes in quota-tools from 1.50 to 1.52
+
+* Hopefully fixed some problems with makefiles and the like.
+
+* Did some rewrite on the mountlist handling, removed limit on number of
+  superblocks by allocating them within the mountlist.
+  (This code is not available within the standard kernel. Until I find the
+   time and feel like it I will put all my new enhancements in my very own
+   (just a bit different) kernel sourcetree back into the mainstream kernels.)
+
+Changes in quota-tools from 1.34 to 1.50
+
+* Wrote some new docs, right into html use Mosaic, Netscape or lynx or
+  whatever HTML-browser to see whats in. Also did the manual-pages,
+  its just a quick hack hope this helps people using quota.
+
+* Added DIRECT EXT2 access to quotacheck which should make scanning ext2
+  disks quite some faster. On the other hand you now need the ext2fs
+  libs to compile the quotacheck program. (Enhancement by Edvard Tuinder)
+
+* Added dquot_operations to include/linux/fs.h
+
+* Changed include/linux/quota.h according to new standard.
+
+* Changed fs/dquot.c according to new standard.
+
+* Added support to quotaon-systemcall for initializing the superblock
+  with a pointer to the dquot operations.
+
+* Remove fs/fileio.c and include/linux/fileio.h including all references to it.
+
+* Added support to the different filesystems to call the new dquot_alloc and
+  dquot_free functions on block/inode allocation or freeing. (currently ext2)
+
+* People can add support to any filesystem if they want, for now I have been
+  lazy and only implemented it for ext2-fs. Which by the way is probably
+  the most difficult of all the filesystems. If one feels up to it you can
+  try adding it to your favorit filesystem. I will accept patches, and
+  include them with or without changes.
+
+* Added some patches for dynamic allocation of quotafilenames in hasquota.
+  (patches by Remy Card)
+
+* Rewrote quota_transfer again, as a never ending story...
+
+* A new run off cleanups have been taking place, removed the QF_OPENING and
+  QF_CLOSING flags because we don't need them anymore. The new code uses dquot
+  pointers. If we initialize the dquot pointer after we have setup everything
+  we don't have do be afraid that we get dqget calls while we don't want them.
+
+* Fixed some bugs with not dropping dquot pointers which lead to memory leaks
+  in the long run because dquots kept being hold because the kernel thought
+  it was still being used.
+
+* Added some stats to the code which can be viewed with quotastats. Not real
+  interesting at the user level but quite handy debugging the quota system.
+
+Changes in quota-tooles from 1.33 to 1.34
+
+* Changed hasquota.c to not insert a slash when the mnt->mnt_dir already ends
+  with a slash. So something like //quota.user shouldn't happen anymore.
+
+* Cleaned up fs/fileio.c, removed some unneeded dummy_inodes in unlink and
+  rmdir vfs functions. Now rely on incrementing i_count when deleting a 
+  dir or file and release it when I iput the inode. Should work because when
+  a executable is running when it gets deleted this also happens. Also
+  renamed and cleanup the rest of the funtions. vfs_rename function should
+  now also work for a hardlinked file.
+
+* Changed vfs_chown functions to reset SUID and SGID on a chown because the
+  new kernel wants that.
+
+* Changed locking on I/O to use semaphores instead off the mnt_flags
+  used before. The old stuff could lock quota easily probably because
+  the operation wasn't atomic. This should now be fixed.
+
+* Fixed check_bdq to only give back a available blocks when the current
+  number of blocks are below the hardlimit. There was a bugfix for this
+  one so I applied that.
+
+* Changed has_quota funtion to use a static buffer instead of mallocing
+  one everytime it needs one. Hope this helps with the reported memory
+  leak on the rquotad.
+
+* Fixed some little bugs in dquot.c with the setting of the QF_OPENING
+  flag and not resseting it on failure of opening the quotafile.
+
+* Added changes needed because the VFS-layer changed to use iattr structs
+  for the notify_change function.
+
+* Fixed quota_transfer to work again with the new iattr structs, hopefully
+  it works ok now. It was brought to my attension that it wasn't working
+  the way it should in the old version. So I first checked out the fix that
+  I received, but that didn't solve the problem either so I fixed it myself.
+
+* Combined the new writeaccess stuff with the stuff I already had. Also
+  cleaned up vfs layer some more because of the use of the new
+  vfs_getwriteaccess and vfs_putwriteaccess functions. This also involved
+  the quotaon function that should now return a propper errno on failure and
+  not the standard EIO that it was in earlier versions.
+
+Changes in quota-tools from 1.32 to 1.33
+
+* Ported the stuff back to the normal kernel to make a diff-file quite easy. 
+
+* Fixed some typos that could trigger a kernel panic because the locking gets
+  killed when a quota is exeeded.
+
+* Fixed the stuff to work with the the new-tty-drivers.
+
+* This patches aren't that well tested on the machines I use because I use a
+  complete different kernel over here. But thats why this is called BETA
+  software. The bigfiles in this package are copies of the files used in my
+  kernel so some thing are tested more then others.
+
+* Fixed quotacheck not to memset the whole quota when there are no blocks
+  allocated by this user.
+
+Changes in quota-tools from 1.31 to 1.32
+
+* Fixed diff-files, the are now made as unified diffs.
+
+* Checked the specifications for the rquota service, I was correct we only need
+  to respond to udp connections. 
+
+Changes in quota-tools from 1.3 to 1.31
+
+* Changed quotacheck program to stuff directories it encounters on a 
+  directory stack and check them later on. This way there is at any
+  time one directory opened for reading. In the old situation it could
+  happen that more then one directory were open at the same time and
+  with nasty directory structures this could give to much open directories
+  at ones, leading to an error by the O.S.
+
+* Added some hooks for debugging the memory usage by the program, and make
+  the stdout used for the -v flag non-buffered for more speed.
+
+* Added variabele to mountstruct for flags, now we can mask when we are 
+  opening or closeing a quotafile, when we are we may not give out
+  pointers with the dq_get function, otherwise we run into problems
+  later on.
+
+* Ok updated fs/*.c missed patch to fs/inode.c that solves a race condition.
+
+* Added vfs_rename function that takes care of renaming files on top of already
+  existing files.  We were missing those ones, thanks to David Black for
+  reporting this. If there are still problems I will hear so and try to fix them
+  as soon as I can.
+
+Changes in quota-tools from 1.2 to 1.3
+
+* We only reply to rpc_quota_request made to the udp port of the
+  rquotad, I just removed support for the TCP service, I don't
+  think it's needed to have the TCP service for just exchanging
+  about 40 bytes of data. Too much overhead setting up a TCP connection.
+
+* Changed vfs_write function within fileio.h to be a bit smarter. If
+  the fileposition + number of bytes to be written is less then the
+  current size of the file we should even bother checking it. And if
+  the number of wanted_blocks equals to 0 why even bother checking
+  the quota no changes are made anyway.
+
+* Rewrote the quota stuff to be much more flexible, we now use pointers
+  that are located within the inode for fast lookup. This is a bit more
+  to setup but is much faster when used over and over again. Its based 
+  on the setup used for inode caching and is mostly rewritten code with
+  some extensions that were needed for the dquot structs. And of course
+  a lot extra because dquot aren't exactly inodes.
+
+* Ok file is called dquot.c again because it specific to diskquotas. If
+  we ever get process quota, we have to move the system-call interface to
+  the kernel dir.
+
+* splitted fileio header into fileio.c and fileio.h. Fileio.c contains 
+  the code for all the functions, fileio.h contains the prototypes for
+  the functions when quota is enabled and defines to the the default 
+  inode operations if it is disabled.
+
+* Moved device management code to the file fs/super.c and made it a
+  bit more general. The stuff now can also be used for other purposes.
+  For now it contains the devicename, the directory the filesystem is
+  mounted on, a pointer to the superblock and the quota expire times 
+  and filepointers, this can be extended in the future and this can be 
+  used for other purposes then only quota. Its in super.c because it
+  is related to mounting a filesystem. The rootfilesystem is a special
+  case for which I don't have a nice solution right now.
+
+* Cleaned up the file file_table.c and renamed it to file.c, otherwise 
+  we should call inode.c inode_table.c etc. More is static now, the
+  file_table isn't accesable anymore from everywhere, and the functions
+  that need the info within file.c should be located within that file.
+  A good example is the function used by the vhangup code, it now calls
+  a routine within file.c and so we don't have export any data anymore.
+
+* changed decrement quota to reset the DQ_INODES and DQ_BLKS flag on
+  a decrement of a quota. It seems that we should bark again when one
+  goes over his quota after he removed something, ok should work this
+  way.
+
+* changed set_dqblk to set the grace period when a new usage is set
+  and one exceeds his softlimit by that operation. Better then just
+  setting the graceperiod when he allocates any more inodes or blocks.
+  Only can give surprises when logging in but who cares they can ask
+  the sysadmin to give them a hand with cleaning there dirs. 
+
+* quotaoff is very simple now just reset all the pointers that point
+  to a dquot and trash the cache for all dquots that are related to
+  the device being turned of. This way the next time you put it on the
+  stuff get read again from disk and not from the cache.
+
+* changed most of the file structs to be a filepointer and request it
+  with get_empty_filp. This way we allocate it from the file_table which
+  is more the way it should be, Ok I know the dummy_inodes isn't that
+  nice either, but for that we don't have an other choice. Also it makes
+  live much easier this way. See the core dump stuff.
+
+* used some more constants for setting up the file pointers, this should
+  make it easier to read. So ok Edvard ?
+
+* rewrote most functions such as quota_alloc, quota_remove and quota_transfer
+  to use a for loop which counts from 0 to the number of quotas -1. This way
+  it should be easy to extend the quota stuff to maintain even more types of
+  quota. (At the moment I can think of one more, what about quotas for a
+  processgroups) :-)
+
+* rewrote quota_transfer, its still the most complicated function of the
+  three manipulate functions, but it looks much cleaner then the one we
+  had.
+
+* changed the system-call interface again this should be the last time, 
+  hope to have it made more intelligent now, most of the calls are quite
+  the same, so just set flags and call one functions. Saves some functions.
+
+* And more cleanups to the vfs-layer. Did a kind of indent on all the sources
+  in the fs-dir by hand. All references to file pointers are now done by a
+  variable that is called filp. This is done to be a bit more consistent all
+  through the code. Before is was called file, filp, f etc.
+
+* As of the indent I changed all tabs to be 3 spaces this makes it a bit
+  larger but much better to read.
+
+* Someone reported that there are problems with fstab when you use something
+  like usrquota=/usr/adm/quota.user,grpquota=/usr/adm/quota.grp. I don't know
+  if the problems is also in the new libs, if so I have a replacement here for
+  the entire mntent stuff. I wrote this way back and it work ok so if you
+  have problems mail me and I will send you the sources. For now I didn't
+  include it yet in the standard mainline distribution.
+
+* Ok added hooks to the fork code forgot that, ok this has cost me some
+  searching. We must doe an vfs_open_filp when a process forks and the
+  filepointers are copied or incremented.
+
+Changes in quota-tools from 1.1 to 1.2
+
+* Changed repquota.c to display at max 8 chars of username.
+
+* Changed rquota_svc.c and rquota_server.c to handle both version 1 
+  and 2 requests. Now we should be able to communicate with sun systems.
+  SUN systems send out version 1 request which we can handle now.
+
+* Changed quota.c to first send out a version 2 rquota request and if
+  that fails to try it with a version 1 request. Now we should be able to
+  query a rquotad on a sun-server exporting a NFS disk.
+
+* Changed kernel diffs, now use a header file fileio.h with vfs functions
+  for writing, truncating, creating files/nodes. This cleaned up the
+  kernel diffs quite a bit. (Should have done this way back, but it is
+  done now)
+
+* Fixed some small bugs with handling graceperiods again. Changed the code
+  in the systemcall interface all bugs should be gone now there.
+
+* Wrote a new program warnquota. No manpage yet but it has no flags so
+  that's simple. You can run this from your crontab just like you run
+  quotacheck every night from cron. This program mails a message to all
+  users that violated the quota system.
+
+* Changed fileio.h with unlinking and rmdir to make a copy of the inode.
+  Hope this fixes some problems we have seen with xiafs. It isn't to bad
+  either should have been this way from the beginning. A pointer to a
+  inode that is removed is a bit to tricky a copy in local memory is much
+  saver.
+
+* Changed fs/quota.c to not check if the quotafile is on the same device
+  as the device for which it contains info. Found that in a document but
+  it's silly and so it's removed now. Who cares where you put it as long
+  the kernel can find it and it is the right format.
+  (Now something like usrquota="/var/adm/quota_src.user" should work :-))
+
+* Changed edquota behaviour with -p flag. It now copies the current
+  usage to the new situation.
+
+Changes in quota-tools from 1.0 to 1.1
+
+* Moved check to test on quota on a certain filesystem to seperate file
+  hasquota.c
+
+* Changed hasquota.c to use quotafile given in fstab file instead
+  of the default name of a quotafile. We now can define ourself where
+  to put our quotafile. Something like "usrquota=/usr/adm/quotasrc.user"
+
+* Changed graceperiod counting was doing it the wrong way around. Now we
+  add the expiretime to the current time and that is the grace-period a user
+  has before we see a softlimit as a hardlimit.
+
+* Changed allocation when not enough blocks can be allocated from ones quota.
+  Now you get as many blocks as you can affort yourself and not as in the 
+  earlier version, nothing. This was a bit of a bitch to tackle but it seems
+  to work ok now for regular files and core-files.
+
+* Changed the quota.h file to include a prototype for a new function
+  blocks_to_isize that calculates the maximum isize for a file when allocating
+  less blocks than requested. Also included macro's for min() and max().
+
+* Added rquotad program for own convinience, this was build from scratch with
+  only the rquota.x file. It seems to work quite nice between LINUX machines
+  don't have the resources to test it with other then LINUX machines.
+  We probably need a new version number for this type of rquota.
+  Something like rquota version 2 or something like that.
+
+* Changed quota program to use a rpc-call to the rquotad on one of you
+  disk server machines. See #ifdef RPC in quota.c. Use small timeout because
+  I don't wanna wait to long when a machine is down. Increase it when you have
+  problems with slow hosts.
+
+* Rewrite of quotacheck program. This one is much faster, about 60%. Thanks
+  to Edvard for this big improvement.
+
+* Changed namei.c to iput the inode of a dir when doing a remove of a dir.
+  I never had problems with it but it seems that ext2 doesn't care to much when
+  you unlink a dir while you have the inode still open. Fixed it and it works
+  now ok also on xiafs which had problems with it, and of course the fragment
+  should have give this error because you have to iput the dir before you remove
+  it.
+
+* Changed source of quotacheck to create new quotafile with at least the
+  gracetimes. Now there should never be a problem when turning on quota with
+  the quotactl systemcall after one has run quotacheck to create the correct
+  quotafiles.
+  
+* Changed code of quota.c to read MOUNTED(mtab) instead of FSTAB(fstab) when
+  showing quotainfo.
diff --git a/Makefile.in b/Makefile.in
new file mode 100644 (file)
index 0000000..107f373
--- /dev/null
@@ -0,0 +1,152 @@
+PROGS         = quotacheck quotaon quota quot repquota warnquota quotastats xqmstats edquota setquota convertquota rpc.rquotad @QUOTA_NETLINK_PROG@
+SOURCES       = bylabel.c common.c convertquota.c edquota.c pot.c quot.c quota.c quotacheck.c quotacheck_v1.c quotacheck_v2.c quotaio.c quotaio_rpc.c quotaio_v1.c quotaio_v2.c quotaio_tree.c quotaio_xfs.c quotaio_meta.c quotaio_generic.c quotaon.c quotaon_xfs.c quotaops.c quotastats.c quotasys.c repquota.c rquota_client.c rquota_server.c rquota_svc.c setquota.c warnquota.c xqmstats.c svc_socket.c
+CFLAGS        = @CFLAGS@ -D_GNU_SOURCE -Wall -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64
+CPPFLAGS      = @CPPFLAGS@
+EXT2LIBS      = @EXT2LIBS@
+NETLINKLIBS   = @NETLINKLIBS@
+RPCSRC        = rquota.h rquota_xdr.c rquota_clnt.c
+LIBS          = @LIBS@
+LDFLAGS       = @LDFLAGS@
+LDAPLIBS      = @LDAPLIBS@
+
+INSTALL       = @INSTALL@
+LN            = ln -sf
+ROOTDIR       =
+SUPER_OWNER   = root
+BIN_OWNER     = bin
+BIN_GROUP     = bin
+DEF_SUID_MODE = 4511
+DEF_BIN_MODE = 555
+DEF_SBIN_MODE = 555
+DEF_MAN_MODE  = 444
+DEF_CONF_MODE = 644
+RPCGEN        = rpcgen
+
+prefix        = @prefix@
+bindir        = $(prefix)/bin
+sbindir       = $(prefix)/sbin
+root_sbindir  = @ROOTSBIN@
+mandir        = @mandir@
+includedir    = $(prefix)/include
+locale_dir    = $(prefix)/share/locale
+sysconfdir    = @sysconfdir@
+datarootdir   = @datarootdir@
+
+RPCCLNTOBJS = rquota_xdr.o rquota_client.o rquota_clnt.o
+IOOBJS = quotaio.o quotaio_v1.o quotaio_v2.o quotaio_tree.o quotaio_rpc.o quotaio_xfs.o quotaio_meta.o quotaio_generic.o
+IOOBJS += $(RPCCLNTOBJS)
+LIBOBJS = bylabel.o common.o quotasys.o pot.o $(IOOBJS)
+LIBOBJS += @LIBMALLOC@
+
+.PHONY: all clean clobber realclean pot mo inst_mo
+
+.%.d: %.c
+       set -e; $(CC) -MM -MG $(CPPFLAGS) $(CFLAGS) $< | \
+               sed 's/\($*\)\.o[ :]*/\1.o $@ : /g' > $@; \
+               [ -s $@ ] || rm -f $@
+all: $(PROGS)
+
+clean:
+       -rm -f core *.o .*.d
+
+clobber: clean
+       -rm -f $(PROGS) Makefile config.status config.cache config.log config.h
+
+realclean: clobber
+       -rm -f $(RPCSRC) po/*.mo
+
+pot:
+       xgettext -k_ -d pot *.c
+
+mo: po
+       for n in $(shell ls po/*.po); do \
+       msgfmt -o po/`basename $$n .po`.mo $$n; \
+       done
+
+inst_mo: mo
+       mkdir -p $(ROOTDIR)$(locale_dir)
+       for n in $(shell ls po/*.po | sed 's/\.po/\.mo/'); do \
+       l=`basename $$n .mo`; \
+       $(INSTALL) -m 755 -d $(ROOTDIR)$(locale_dir)/$$l; \
+       $(INSTALL) -m 755 -d $(ROOTDIR)$(locale_dir)/$$l/LC_MESSAGES; \
+       $(INSTALL) -m 644 $$n $(ROOTDIR)$(locale_dir)/$$l/LC_MESSAGES/quota.mo; \
+       done
+
+install: all @INSTMO@
+       -mkdir -p $(ROOTDIR)$(sbindir)
+       -mkdir -p $(ROOTDIR)$(bindir)
+       -mkdir -p $(ROOTDIR)$(root_sbindir)
+       -$(INSTALL) -m $(DEF_SBIN_MODE) \
+       quotacheck quotaon $(ROOTDIR)$(root_sbindir)
+       -$(LN) quotaon $(ROOTDIR)$(root_sbindir)/quotaoff
+       -$(INSTALL) -m $(DEF_SBIN_MODE) \
+       edquota repquota warnquota quotastats setquota quot xqmstats \
+       convertquota $(ROOTDIR)$(sbindir)
+       -mkdir -p $(ROOTDIR)$(sysconfdir)
+       -$(INSTALL) -m $(DEF_CONF_MODE) warnquota.conf $(ROOTDIR)$(sysconfdir)
+       -$(INSTALL) -m $(DEF_CONF_MODE) quotatab $(ROOTDIR)$(sysconfdir)
+       -$(INSTALL) -m $(DEF_CONF_MODE) quotagrpadmins $(ROOTDIR)$(sysconfdir)
+       -mkdir -p $(ROOTDIR)$(mandir)/man1
+       -mkdir -p $(ROOTDIR)$(mandir)/man2
+       -mkdir -p $(ROOTDIR)$(mandir)/man3
+       -mkdir -p $(ROOTDIR)$(mandir)/man8
+       -$(INSTALL) -m 755 -d $(ROOTDIR)$(includedir)/rpcsvc
+       -$(INSTALL) -m 644 rquota.h rquota.x $(ROOTDIR)$(includedir)/rpcsvc
+       -$(INSTALL) -m $(DEF_SBIN_MODE) quota $(ROOTDIR)$(bindir)
+       -$(INSTALL) -m $(DEF_SBIN_MODE) rpc.rquotad $(ROOTDIR)$(sbindir)
+ifneq ($(NETLINKLIBS),)
+       -$(INSTALL) -m $(DEF_SBIN_MODE) quota_nld $(ROOTDIR)$(sbindir)
+endif
+       -$(INSTALL) -m $(DEF_MAN_MODE) *.1 $(ROOTDIR)$(mandir)/man1
+       -$(INSTALL) -m $(DEF_MAN_MODE) *.2 $(ROOTDIR)$(mandir)/man2
+       -$(INSTALL) -m $(DEF_MAN_MODE) *.3 $(ROOTDIR)$(mandir)/man3
+       -$(INSTALL) -m $(DEF_MAN_MODE) *.8 $(ROOTDIR)$(mandir)/man8
+
+quotaon: quotaon.o quotaon_xfs.o $(LIBOBJS)
+
+quotacheck: quotacheck.o quotacheck_v1.o quotacheck_v2.o quotaops.o $(LIBOBJS)
+       $(CC) $(LDFLAGS) -o $@ $^ $(EXT2LIBS)
+
+quota: quota.o quotaops.o $(LIBOBJS)
+
+quot: quot.o $(LIBOBJS)
+
+repquota: repquota.o $(LIBOBJS)
+
+warnquota: warnquota.o $(LIBOBJS)
+       $(CC) $(LDFLAGS) -o $@ $^ $(LDAPLIBS)
+
+quotastats: quotastats.o common.o pot.o
+
+xqmstats: xqmstats.o common.o pot.o
+
+edquota: edquota.o quotaops.o $(LIBOBJS)
+
+setquota: setquota.o quotaops.o $(LIBOBJS)
+
+convertquota: convertquota.o $(LIBOBJS)
+
+rpc.rquotad: rquota_server.o rquota_svc.o svc_socket.o $(LIBOBJS)
+       $(CC) $(LDFLAGS) -o $@ $^ $(LIBS)
+
+ifneq ($(NETLINKLIBS),)
+quota_nld: quota_nld.o $(LIBOBJS)
+       $(CC) $(LDFLAGS) -o $@ $^ $(NETLINKLIBS)
+endif
+
+pot.o: pot.c pot.h
+
+rquota.h: rquota.x
+       $(RPCGEN) -h -o $@ $<
+
+rquota_xdr.c: rquota.x
+       $(RPCGEN) -c -o $@ $<
+
+rquota_xdr.o: rquota_xdr.c rquota.h
+       $(CC) $(CFLAGS) -Wno-unused -c $<
+
+rquota_clnt.c: rquota.x
+       $(RPCGEN) -l -o $@ $<
+
+-include $(SOURCES:%.c=.%.d)
diff --git a/README.gettext b/README.gettext
new file mode 100644 (file)
index 0000000..6bcb14f
--- /dev/null
@@ -0,0 +1,21 @@
+If you want to generate new po file: "make pot" and look for a file named 
+pot.po. To generate mo files from po files: "make mo", it's also done when 
+you "make install", if you want to install only mo files ( no programs ) 
+"make inst_mo", mo files will be copied to:
+/usr/share/locale/'languages names'/LC_MESSAGES/quota.mo.
+
+warnquota
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+this program was modifiated to be more configurable - you can now specify
+new warning message ( also sender, cc, etc. ) without recompiling the
+program. all you need is to edit pot.po ( make pot ), you will find
+in it mail message, and etc. - create new strings, make mo with msgfmt, and copy
+mo file to /usr/share/locale/'lang'/LC_MESSAGES/quota.mo. now you have new
+warning mail message.
+
+gettext support was added by Paul Niewiadomski <lilo@free.poltronic.net>, any
+questions, suggestions are welcome.
+
+thanks to
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Roman_Kaminski@saba.com.pl
\ No newline at end of file
diff --git a/README.ldap-support b/README.ldap-support
new file mode 100644 (file)
index 0000000..0804677
--- /dev/null
@@ -0,0 +1,42 @@
+LDAP support for warnquota by James Bourne <jbourne@hardrock.org>
+
+The LDAP support added to warnquota allows you to retreive mail routing
+information from an LDAP server so that you can send mail to the correct
+addresses.  So for example if usera has the email address usera@foo.bar.com
+and userb has userb@baz.bar.com you can have the attributes as follows
+(obvious things missing here):
+
+dn: uid=usera,ou=People,dc=bar,dc=com
+uid: usera
+mail: usera@foo.bar.com
+
+dn: uid=userb,ou=People,dc=bar,dc=com
+uid: userb
+mail: userb@baz.bar.com
+
+warnquota.conf should be set like this (if you allow anonymous binds and
+reads of the mail attribute:
+
+LDAP_MAIL = true
+LDAP_HOST = ldap.bar.com
+LDAP_PORT = 389
+LDAP_BASEDN = ou=People,dc=bar,dc=com
+LDAP_SEARCH_ATTRIBUTE = uid
+LDAP_MAIL_ATTRIBUTE = mail
+LDAP_DEFAULT_MAIL_DOMAIN = bar.com
+
+If not, just add:
+
+LDAP_BINDDN = uid=readonly,dc=bar,dc=com
+LDAP_BINDPW = it'sapasswd
+
+and you will bind as the user readonly and search that way.
+
+If you need to do lookups using a different attribute (Novell eDir for
+example uses cn=username) change the LDAP_SEARCH_ATTRIBUTE to cn.  
+
+Same with LDAP_MAIL_ATTRIBUTE.  If you use mail routing in LDAP (roughly
+following the Laser Draft) you can set this to mailLocalAddress and
+warnquota will send to that address.  This will guarentee that your quota
+mail will be delivered to the correct address.
+
diff --git a/README.mailserver b/README.mailserver
new file mode 100644 (file)
index 0000000..9882435
--- /dev/null
@@ -0,0 +1,14 @@
+Mail server support by James Bourne <jbourne@hardrock.org>
+
+If you are running warnquota on a mail server you need to be able to tell
+warnquota not to send mail when the users quota is either over the hard
+limit or past the grace period.  So, to do this add the value:
+MAILDEV = any
+into /etc/warnquota.conf and warnquota will not send mail to those users.
+
+If you have only a single partition you wish to apply this rule to, use the
+device name as the argument to the MAILSERV configuration variable list
+this:
+MAILDEV = /dev/sdb1
+Please note that specifying checking of mail device may slow down things
+considerably...
diff --git a/aclocal.m4 b/aclocal.m4
new file mode 100644 (file)
index 0000000..d55ff05
--- /dev/null
@@ -0,0 +1,171 @@
+# generated automatically by aclocal 1.10 -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+# 2005, 2006  Free Software Foundation, Inc.
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+# pkg.m4 - Macros to locate and utilise pkg-config.            -*- Autoconf -*-
+# 
+# Copyright Â© 2004 Scott James Remnant <scott@netsplit.com>.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# PKG_PROG_PKG_CONFIG([MIN-VERSION])
+# ----------------------------------
+AC_DEFUN([PKG_PROG_PKG_CONFIG],
+[m4_pattern_forbid([^_?PKG_[A-Z_]+$])
+m4_pattern_allow([^PKG_CONFIG(_PATH)?$])
+AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility])dnl
+if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
+       AC_PATH_TOOL([PKG_CONFIG], [pkg-config])
+fi
+if test -n "$PKG_CONFIG"; then
+       _pkg_min_version=m4_default([$1], [0.9.0])
+       AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version])
+       if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then
+               AC_MSG_RESULT([yes])
+       else
+               AC_MSG_RESULT([no])
+               PKG_CONFIG=""
+       fi
+               
+fi[]dnl
+])# PKG_PROG_PKG_CONFIG
+
+# PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
+#
+# Check to see whether a particular set of modules exists.  Similar
+# to PKG_CHECK_MODULES(), but does not set variables or print errors.
+#
+#
+# Similar to PKG_CHECK_MODULES, make sure that the first instance of
+# this or PKG_CHECK_MODULES is called, or make sure to call
+# PKG_CHECK_EXISTS manually
+# --------------------------------------------------------------
+AC_DEFUN([PKG_CHECK_EXISTS],
+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
+if test -n "$PKG_CONFIG" && \
+    AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then
+  m4_ifval([$2], [$2], [:])
+m4_ifvaln([$3], [else
+  $3])dnl
+fi])
+
+
+# _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES])
+# ---------------------------------------------
+m4_define([_PKG_CONFIG],
+[if test -n "$PKG_CONFIG"; then
+    if test -n "$$1"; then
+        pkg_cv_[]$1="$$1"
+    else
+        PKG_CHECK_EXISTS([$3],
+                         [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null`],
+                        [pkg_failed=yes])
+    fi
+else
+       pkg_failed=untried
+fi[]dnl
+])# _PKG_CONFIG
+
+# _PKG_SHORT_ERRORS_SUPPORTED
+# -----------------------------
+AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED],
+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi[]dnl
+])# _PKG_SHORT_ERRORS_SUPPORTED
+
+
+# PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND],
+# [ACTION-IF-NOT-FOUND])
+#
+#
+# Note that if there is a possibility the first call to
+# PKG_CHECK_MODULES might not happen, you should be sure to include an
+# explicit call to PKG_PROG_PKG_CONFIG in your configure.ac
+#
+#
+# --------------------------------------------------------------
+AC_DEFUN([PKG_CHECK_MODULES],
+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
+AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl
+AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl
+
+pkg_failed=no
+AC_MSG_CHECKING([for $1])
+
+_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2])
+_PKG_CONFIG([$1][_LIBS], [libs], [$2])
+
+m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS
+and $1[]_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details.])
+
+if test $pkg_failed = yes; then
+        _PKG_SHORT_ERRORS_SUPPORTED
+        if test $_pkg_short_errors_supported = yes; then
+               $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$2"`
+        else 
+               $1[]_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$2"`
+        fi
+       # Put the nasty error message in config.log where it belongs
+       echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD
+
+       ifelse([$4], , [AC_MSG_ERROR(dnl
+[Package requirements ($2) were not met:
+
+$$1_PKG_ERRORS
+
+Consider adjusting the PKG_CONFIG_PATH environment variable if you
+installed software in a non-standard prefix.
+
+_PKG_TEXT
+])],
+               [AC_MSG_RESULT([no])
+                $4])
+elif test $pkg_failed = untried; then
+       ifelse([$4], , [AC_MSG_FAILURE(dnl
+[The pkg-config script could not be found or is too old.  Make sure it
+is in your PATH or set the PKG_CONFIG environment variable to the full
+path to pkg-config.
+
+_PKG_TEXT
+
+To get pkg-config, see <http://www.freedesktop.org/software/pkgconfig>.])],
+               [$4])
+else
+       $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS
+       $1[]_LIBS=$pkg_cv_[]$1[]_LIBS
+        AC_MSG_RESULT([yes])
+       ifelse([$3], , :, [$3])
+fi[]dnl
+])# PKG_CHECK_MODULES
+
diff --git a/autom4te.cache/output.0 b/autom4te.cache/output.0
new file mode 100644 (file)
index 0000000..4dd508b
--- /dev/null
@@ -0,0 +1,5682 @@
+@%:@! /bin/sh
+@%:@ Guess values for system-dependent variables and create Makefiles.
+@%:@ Generated by GNU Autoconf 2.61.
+@%:@ 
+@%:@ Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
+@%:@ 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+@%:@ This configure script is free software; the Free Software Foundation
+@%:@ gives unlimited permission to copy, distribute and modify it.
+## --------------------- ##
+## M4sh Initialization.  ##
+## --------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in
+  *posix*) set -o posix ;;
+esac
+
+fi
+
+
+
+
+# PATH needs CR
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  echo "#! /bin/sh" >conf$$.sh
+  echo  "exit 0"   >>conf$$.sh
+  chmod +x conf$$.sh
+  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+    PATH_SEPARATOR=';'
+  else
+    PATH_SEPARATOR=:
+  fi
+  rm -f conf$$.sh
+fi
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  as_unset=unset
+else
+  as_unset=false
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+as_nl='
+'
+IFS=" ""       $as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+case $0 in
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+IFS=$as_save_IFS
+
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  { (exit 1); exit 1; }
+fi
+
+# Work around bugs in pre-3.0 UWIN ksh.
+for as_var in ENV MAIL MAILPATH
+do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+  LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+  LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+  LC_TELEPHONE LC_TIME
+do
+  if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+    eval $as_var=C; export $as_var
+  else
+    ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+  fi
+done
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+        X"$0" : 'X\(//\)$' \| \
+        X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+           s//\1/
+           q
+         }
+         /^X\/\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\/\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+
+# CDPATH.
+$as_unset CDPATH
+
+
+if test "x$CONFIG_SHELL" = x; then
+  if (eval ":") 2>/dev/null; then
+  as_have_required=yes
+else
+  as_have_required=no
+fi
+
+  if test $as_have_required = yes &&    (eval ":
+(as_func_return () {
+  (exit \$1)
+}
+as_func_success () {
+  as_func_return 0
+}
+as_func_failure () {
+  as_func_return 1
+}
+as_func_ret_success () {
+  return 0
+}
+as_func_ret_failure () {
+  return 1
+}
+
+exitcode=0
+if as_func_success; then
+  :
+else
+  exitcode=1
+  echo as_func_success failed.
+fi
+
+if as_func_failure; then
+  exitcode=1
+  echo as_func_failure succeeded.
+fi
+
+if as_func_ret_success; then
+  :
+else
+  exitcode=1
+  echo as_func_ret_success failed.
+fi
+
+if as_func_ret_failure; then
+  exitcode=1
+  echo as_func_ret_failure succeeded.
+fi
+
+if ( set x; as_func_ret_success y && test x = \"\$1\" ); then
+  :
+else
+  exitcode=1
+  echo positional parameters were not saved.
+fi
+
+test \$exitcode = 0) || { (exit 1); exit 1; }
+
+(
+  as_lineno_1=\$LINENO
+  as_lineno_2=\$LINENO
+  test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" &&
+  test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; }
+") 2> /dev/null; then
+  :
+else
+  as_candidate_shells=
+    as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  case $as_dir in
+        /*)
+          for as_base in sh bash ksh sh5; do
+            as_candidate_shells="$as_candidate_shells $as_dir/$as_base"
+          done;;
+       esac
+done
+IFS=$as_save_IFS
+
+
+      for as_shell in $as_candidate_shells $SHELL; do
+        # Try only shells that exist, to save several forks.
+        if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
+               { ("$as_shell") 2> /dev/null <<\_ASEOF
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in
+  *posix*) set -o posix ;;
+esac
+
+fi
+
+
+:
+_ASEOF
+}; then
+  CONFIG_SHELL=$as_shell
+              as_have_required=yes
+              if { "$as_shell" 2> /dev/null <<\_ASEOF
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in
+  *posix*) set -o posix ;;
+esac
+
+fi
+
+
+:
+(as_func_return () {
+  (exit $1)
+}
+as_func_success () {
+  as_func_return 0
+}
+as_func_failure () {
+  as_func_return 1
+}
+as_func_ret_success () {
+  return 0
+}
+as_func_ret_failure () {
+  return 1
+}
+
+exitcode=0
+if as_func_success; then
+  :
+else
+  exitcode=1
+  echo as_func_success failed.
+fi
+
+if as_func_failure; then
+  exitcode=1
+  echo as_func_failure succeeded.
+fi
+
+if as_func_ret_success; then
+  :
+else
+  exitcode=1
+  echo as_func_ret_success failed.
+fi
+
+if as_func_ret_failure; then
+  exitcode=1
+  echo as_func_ret_failure succeeded.
+fi
+
+if ( set x; as_func_ret_success y && test x = "$1" ); then
+  :
+else
+  exitcode=1
+  echo positional parameters were not saved.
+fi
+
+test $exitcode = 0) || { (exit 1); exit 1; }
+
+(
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; }
+
+_ASEOF
+}; then
+  break
+fi
+
+fi
+
+      done
+
+      if test "x$CONFIG_SHELL" != x; then
+  for as_var in BASH_ENV ENV
+        do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+        done
+        export CONFIG_SHELL
+        exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"}
+fi
+
+
+    if test $as_have_required = no; then
+  echo This script requires a shell more modern than all the
+      echo shells that I found on your system.  Please install a
+      echo modern shell, or manually run the script under such a
+      echo shell if you do have one.
+      { (exit 1); exit 1; }
+fi
+
+    
+fi
+
+fi
+
+
+
+(eval "as_func_return () {
+  (exit \$1)
+}
+as_func_success () {
+  as_func_return 0
+}
+as_func_failure () {
+  as_func_return 1
+}
+as_func_ret_success () {
+  return 0
+}
+as_func_ret_failure () {
+  return 1
+}
+
+exitcode=0
+if as_func_success; then
+  :
+else
+  exitcode=1
+  echo as_func_success failed.
+fi
+
+if as_func_failure; then
+  exitcode=1
+  echo as_func_failure succeeded.
+fi
+
+if as_func_ret_success; then
+  :
+else
+  exitcode=1
+  echo as_func_ret_success failed.
+fi
+
+if as_func_ret_failure; then
+  exitcode=1
+  echo as_func_ret_failure succeeded.
+fi
+
+if ( set x; as_func_ret_success y && test x = \"\$1\" ); then
+  :
+else
+  exitcode=1
+  echo positional parameters were not saved.
+fi
+
+test \$exitcode = 0") || {
+  echo No shell found that supports shell functions.
+  echo Please tell autoconf@gnu.org about your system,
+  echo including any error possibly output before this
+  echo message
+}
+
+
+
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || {
+
+  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+  # uniformly replaced by the line number.  The first 'sed' inserts a
+  # line-number line after each line using $LINENO; the second 'sed'
+  # does the real work.  The second script uses 'N' to pair each
+  # line-number line with the line containing $LINENO, and appends
+  # trailing '-' during substitution so that $LINENO is not a special
+  # case at line end.
+  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+  # scripts with optimization help from Paolo Bonzini.  Blame Lee
+  # E. McMahon (1931-1989) for sed's syntax.  :-)
+  sed -n '
+    p
+    /[$]LINENO/=
+  ' <$as_myself |
+    sed '
+      s/[$]LINENO.*/&-/
+      t lineno
+      b
+      :lineno
+      N
+      :loop
+      s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
+      t loop
+      s/-\n.*//
+    ' >$as_me.lineno &&
+  chmod +x "$as_me.lineno" ||
+    { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
+   { (exit 1); exit 1; }; }
+
+  # Don't try to exec as it changes $[0], causing all sort of problems
+  # (the dirname of $[0] is not the place where we might find the
+  # original and so on.  Autoconf is especially sensitive to this).
+  . "./$as_me.lineno"
+  # Exit status is that of the last command.
+  exit
+}
+
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in
+-n*)
+  case `echo 'x\c'` in
+  *c*) ECHO_T='        ';;     # ECHO_T is single tab character.
+  *)   ECHO_C='\c';;
+  esac;;
+*)
+  ECHO_N='-n';;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir
+fi
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+  as_ln_s='ln -s'
+  # ... but there are two gotchas:
+  # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+  # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+  # In both cases, we have to default to `cp -p'.
+  ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+    as_ln_s='cp -p'
+elif ln conf$$.file conf$$ 2>/dev/null; then
+  as_ln_s=ln
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p=:
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+if test -x / >/dev/null 2>&1; then
+  as_test_x='test -x'
+else
+  if ls -dL / >/dev/null 2>&1; then
+    as_ls_L_option=L
+  else
+    as_ls_L_option=
+  fi
+  as_test_x='
+    eval sh -c '\''
+      if test -d "$1"; then
+        test -d "$1/.";
+      else
+       case $1 in
+        -*)set "./$1";;
+       esac;
+       case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in
+       ???[sx]*):;;*)false;;esac;fi
+    '\'' sh
+  '
+fi
+as_executable_p=$as_test_x
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+
+exec 7<&0 </dev/null 6>&1
+
+# Name of the host.
+# hostname on some systems (SVR3.2, Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+ac_clean_files=
+ac_config_libobj_dir=.
+LIB@&t@OBJS=
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+# Identity of this package.
+PACKAGE_NAME=
+PACKAGE_TARNAME=
+PACKAGE_VERSION=
+PACKAGE_STRING=
+PACKAGE_BUGREPORT=
+
+ac_unique_file="quota.c"
+# Factoring default headers for most tests.
+ac_includes_default="\
+#include <stdio.h>
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+#ifdef STDC_HEADERS
+# include <stdlib.h>
+# include <stddef.h>
+#else
+# ifdef HAVE_STDLIB_H
+#  include <stdlib.h>
+# endif
+#endif
+#ifdef HAVE_STRING_H
+# if !defined STDC_HEADERS && defined HAVE_MEMORY_H
+#  include <memory.h>
+# endif
+# include <string.h>
+#endif
+#ifdef HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+# include <inttypes.h>
+#endif
+#ifdef HAVE_STDINT_H
+# include <stdint.h>
+#endif
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif"
+
+ac_subst_vars='SHELL
+PATH_SEPARATOR
+PACKAGE_NAME
+PACKAGE_TARNAME
+PACKAGE_VERSION
+PACKAGE_STRING
+PACKAGE_BUGREPORT
+exec_prefix
+prefix
+program_transform_name
+bindir
+sbindir
+libexecdir
+datarootdir
+datadir
+sysconfdir
+sharedstatedir
+localstatedir
+includedir
+oldincludedir
+docdir
+infodir
+htmldir
+dvidir
+pdfdir
+psdir
+libdir
+localedir
+mandir
+DEFS
+ECHO_C
+ECHO_N
+ECHO_T
+LIBS
+build_alias
+host_alias
+target_alias
+CC
+CFLAGS
+LDFLAGS
+CPPFLAGS
+ac_ct_CC
+EXEEXT
+OBJEXT
+CPP
+GREP
+EGREP
+INSTALL_PROGRAM
+INSTALL_SCRIPT
+INSTALL_DATA
+LDAPLIBS
+EXT2_DIRECT
+EXT2LIBS
+QUOTA_NETLINK_PROG
+NETLINKLIBS
+HOSTS_ACCESS
+COMPILE_OPTS
+LIBMALLOC
+INSTMO
+ROOTSBIN
+LIB@&t@OBJS
+LTLIBOBJS'
+ac_subst_files=''
+      ac_precious_vars='build_alias
+host_alias
+target_alias
+CC
+CFLAGS
+LDFLAGS
+LIBS
+CPPFLAGS
+CPP'
+
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+# (The list follows the same order as the GNU Coding Standards.)
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datarootdir='${prefix}/share'
+datadir='${datarootdir}'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+docdir='${datarootdir}/doc/${PACKAGE}'
+infodir='${datarootdir}/info'
+htmldir='${docdir}'
+dvidir='${docdir}'
+pdfdir='${docdir}'
+psdir='${docdir}'
+libdir='${exec_prefix}/lib'
+localedir='${datarootdir}/locale'
+mandir='${datarootdir}/man'
+
+ac_prev=
+ac_dashdash=
+for ac_option
+do
+  # If the previous option needs an argument, assign it.
+  if test -n "$ac_prev"; then
+    eval $ac_prev=\$ac_option
+    ac_prev=
+    continue
+  fi
+
+  case $ac_option in
+  *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
+  *)   ac_optarg=yes ;;
+  esac
+
+  # Accept the important Cygnus configure options, so we can diagnose typos.
+
+  case $ac_dashdash$ac_option in
+  --)
+    ac_dashdash=yes ;;
+
+  -bindir | --bindir | --bindi | --bind | --bin | --bi)
+    ac_prev=bindir ;;
+  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+    bindir=$ac_optarg ;;
+
+  -build | --build | --buil | --bui | --bu)
+    ac_prev=build_alias ;;
+  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+    build_alias=$ac_optarg ;;
+
+  -cache-file | --cache-file | --cache-fil | --cache-fi \
+  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+    ac_prev=cache_file ;;
+  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+    cache_file=$ac_optarg ;;
+
+  --config-cache | -C)
+    cache_file=config.cache ;;
+
+  -datadir | --datadir | --datadi | --datad)
+    ac_prev=datadir ;;
+  -datadir=* | --datadir=* | --datadi=* | --datad=*)
+    datadir=$ac_optarg ;;
+
+  -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
+  | --dataroo | --dataro | --datar)
+    ac_prev=datarootdir ;;
+  -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
+  | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
+    datarootdir=$ac_optarg ;;
+
+  -disable-* | --disable-*)
+    ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+   { (exit 1); exit 1; }; }
+    ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'`
+    eval enable_$ac_feature=no ;;
+
+  -docdir | --docdir | --docdi | --doc | --do)
+    ac_prev=docdir ;;
+  -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
+    docdir=$ac_optarg ;;
+
+  -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
+    ac_prev=dvidir ;;
+  -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
+    dvidir=$ac_optarg ;;
+
+  -enable-* | --enable-*)
+    ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+   { (exit 1); exit 1; }; }
+    ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'`
+    eval enable_$ac_feature=\$ac_optarg ;;
+
+  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+  | --exec | --exe | --ex)
+    ac_prev=exec_prefix ;;
+  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+  | --exec=* | --exe=* | --ex=*)
+    exec_prefix=$ac_optarg ;;
+
+  -gas | --gas | --ga | --g)
+    # Obsolete; use --with-gas.
+    with_gas=yes ;;
+
+  -help | --help | --hel | --he | -h)
+    ac_init_help=long ;;
+  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+    ac_init_help=recursive ;;
+  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+    ac_init_help=short ;;
+
+  -host | --host | --hos | --ho)
+    ac_prev=host_alias ;;
+  -host=* | --host=* | --hos=* | --ho=*)
+    host_alias=$ac_optarg ;;
+
+  -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
+    ac_prev=htmldir ;;
+  -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
+  | --ht=*)
+    htmldir=$ac_optarg ;;
+
+  -includedir | --includedir | --includedi | --included | --include \
+  | --includ | --inclu | --incl | --inc)
+    ac_prev=includedir ;;
+  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+  | --includ=* | --inclu=* | --incl=* | --inc=*)
+    includedir=$ac_optarg ;;
+
+  -infodir | --infodir | --infodi | --infod | --info | --inf)
+    ac_prev=infodir ;;
+  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+    infodir=$ac_optarg ;;
+
+  -libdir | --libdir | --libdi | --libd)
+    ac_prev=libdir ;;
+  -libdir=* | --libdir=* | --libdi=* | --libd=*)
+    libdir=$ac_optarg ;;
+
+  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+  | --libexe | --libex | --libe)
+    ac_prev=libexecdir ;;
+  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+  | --libexe=* | --libex=* | --libe=*)
+    libexecdir=$ac_optarg ;;
+
+  -localedir | --localedir | --localedi | --localed | --locale)
+    ac_prev=localedir ;;
+  -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
+    localedir=$ac_optarg ;;
+
+  -localstatedir | --localstatedir | --localstatedi | --localstated \
+  | --localstate | --localstat | --localsta | --localst | --locals)
+    ac_prev=localstatedir ;;
+  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+  | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
+    localstatedir=$ac_optarg ;;
+
+  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+    ac_prev=mandir ;;
+  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+    mandir=$ac_optarg ;;
+
+  -nfp | --nfp | --nf)
+    # Obsolete; use --without-fp.
+    with_fp=no ;;
+
+  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+  | --no-cr | --no-c | -n)
+    no_create=yes ;;
+
+  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+    no_recursion=yes ;;
+
+  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+  | --oldin | --oldi | --old | --ol | --o)
+    ac_prev=oldincludedir ;;
+  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+    oldincludedir=$ac_optarg ;;
+
+  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+    ac_prev=prefix ;;
+  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+    prefix=$ac_optarg ;;
+
+  -program-prefix | --program-prefix | --program-prefi | --program-pref \
+  | --program-pre | --program-pr | --program-p)
+    ac_prev=program_prefix ;;
+  -program-prefix=* | --program-prefix=* | --program-prefi=* \
+  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+    program_prefix=$ac_optarg ;;
+
+  -program-suffix | --program-suffix | --program-suffi | --program-suff \
+  | --program-suf | --program-su | --program-s)
+    ac_prev=program_suffix ;;
+  -program-suffix=* | --program-suffix=* | --program-suffi=* \
+  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+    program_suffix=$ac_optarg ;;
+
+  -program-transform-name | --program-transform-name \
+  | --program-transform-nam | --program-transform-na \
+  | --program-transform-n | --program-transform- \
+  | --program-transform | --program-transfor \
+  | --program-transfo | --program-transf \
+  | --program-trans | --program-tran \
+  | --progr-tra | --program-tr | --program-t)
+    ac_prev=program_transform_name ;;
+  -program-transform-name=* | --program-transform-name=* \
+  | --program-transform-nam=* | --program-transform-na=* \
+  | --program-transform-n=* | --program-transform-=* \
+  | --program-transform=* | --program-transfor=* \
+  | --program-transfo=* | --program-transf=* \
+  | --program-trans=* | --program-tran=* \
+  | --progr-tra=* | --program-tr=* | --program-t=*)
+    program_transform_name=$ac_optarg ;;
+
+  -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
+    ac_prev=pdfdir ;;
+  -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
+    pdfdir=$ac_optarg ;;
+
+  -psdir | --psdir | --psdi | --psd | --ps)
+    ac_prev=psdir ;;
+  -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
+    psdir=$ac_optarg ;;
+
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil)
+    silent=yes ;;
+
+  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+    ac_prev=sbindir ;;
+  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+  | --sbi=* | --sb=*)
+    sbindir=$ac_optarg ;;
+
+  -sharedstatedir | --sharedstatedir | --sharedstatedi \
+  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+  | --sharedst | --shareds | --shared | --share | --shar \
+  | --sha | --sh)
+    ac_prev=sharedstatedir ;;
+  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+  | --sha=* | --sh=*)
+    sharedstatedir=$ac_optarg ;;
+
+  -site | --site | --sit)
+    ac_prev=site ;;
+  -site=* | --site=* | --sit=*)
+    site=$ac_optarg ;;
+
+  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+    ac_prev=srcdir ;;
+  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+    srcdir=$ac_optarg ;;
+
+  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+  | --syscon | --sysco | --sysc | --sys | --sy)
+    ac_prev=sysconfdir ;;
+  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+    sysconfdir=$ac_optarg ;;
+
+  -target | --target | --targe | --targ | --tar | --ta | --t)
+    ac_prev=target_alias ;;
+  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+    target_alias=$ac_optarg ;;
+
+  -v | -verbose | --verbose | --verbos | --verbo | --verb)
+    verbose=yes ;;
+
+  -version | --version | --versio | --versi | --vers | -V)
+    ac_init_version=: ;;
+
+  -with-* | --with-*)
+    ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid package name: $ac_package" >&2
+   { (exit 1); exit 1; }; }
+    ac_package=`echo $ac_package | sed 's/[-.]/_/g'`
+    eval with_$ac_package=\$ac_optarg ;;
+
+  -without-* | --without-*)
+    ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid package name: $ac_package" >&2
+   { (exit 1); exit 1; }; }
+    ac_package=`echo $ac_package | sed 's/[-.]/_/g'`
+    eval with_$ac_package=no ;;
+
+  --x)
+    # Obsolete; use --with-x.
+    with_x=yes ;;
+
+  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+  | --x-incl | --x-inc | --x-in | --x-i)
+    ac_prev=x_includes ;;
+  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+    x_includes=$ac_optarg ;;
+
+  -x-libraries | --x-libraries | --x-librarie | --x-librari \
+  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+    ac_prev=x_libraries ;;
+  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+    x_libraries=$ac_optarg ;;
+
+  -*) { echo "$as_me: error: unrecognized option: $ac_option
+Try \`$0 --help' for more information." >&2
+   { (exit 1); exit 1; }; }
+    ;;
+
+  *=*)
+    ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid variable name: $ac_envvar" >&2
+   { (exit 1); exit 1; }; }
+    eval $ac_envvar=\$ac_optarg
+    export $ac_envvar ;;
+
+  *)
+    # FIXME: should be removed in autoconf 3.0.
+    echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+    expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+    : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}
+    ;;
+
+  esac
+done
+
+if test -n "$ac_prev"; then
+  ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+  { echo "$as_me: error: missing argument to $ac_option" >&2
+   { (exit 1); exit 1; }; }
+fi
+
+# Be sure to have absolute directory names.
+for ac_var in  exec_prefix prefix bindir sbindir libexecdir datarootdir \
+               datadir sysconfdir sharedstatedir localstatedir includedir \
+               oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
+               libdir localedir mandir
+do
+  eval ac_val=\$$ac_var
+  case $ac_val in
+    [\\/$]* | ?:[\\/]* )  continue;;
+    NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
+  esac
+  { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+   { (exit 1); exit 1; }; }
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+  if test "x$build_alias" = x; then
+    cross_compiling=maybe
+    echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host.
+    If a cross compiler is detected then cross compile mode will be used." >&2
+  elif test "x$build_alias" != "x$host_alias"; then
+    cross_compiling=yes
+  fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+ac_pwd=`pwd` && test -n "$ac_pwd" &&
+ac_ls_di=`ls -di .` &&
+ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
+  { echo "$as_me: error: Working directory cannot be determined" >&2
+   { (exit 1); exit 1; }; }
+test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
+  { echo "$as_me: error: pwd does not report name of working directory" >&2
+   { (exit 1); exit 1; }; }
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+  ac_srcdir_defaulted=yes
+  # Try the directory containing this script, then the parent directory.
+  ac_confdir=`$as_dirname -- "$0" ||
+$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$0" : 'X\(//\)[^/]' \| \
+        X"$0" : 'X\(//\)$' \| \
+        X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+echo X"$0" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)[^/].*/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+  srcdir=$ac_confdir
+  if test ! -r "$srcdir/$ac_unique_file"; then
+    srcdir=..
+  fi
+else
+  ac_srcdir_defaulted=no
+fi
+if test ! -r "$srcdir/$ac_unique_file"; then
+  test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
+  { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2
+   { (exit 1); exit 1; }; }
+fi
+ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
+ac_abs_confdir=`(
+       cd "$srcdir" && test -r "./$ac_unique_file" || { echo "$as_me: error: $ac_msg" >&2
+   { (exit 1); exit 1; }; }
+       pwd)`
+# When building in place, set srcdir=.
+if test "$ac_abs_confdir" = "$ac_pwd"; then
+  srcdir=.
+fi
+# Remove unnecessary trailing slashes from srcdir.
+# Double slashes in file names in object file debugging info
+# mess up M-x gdb in Emacs.
+case $srcdir in
+*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
+esac
+for ac_var in $ac_precious_vars; do
+  eval ac_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_env_${ac_var}_value=\$${ac_var}
+  eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_cv_env_${ac_var}_value=\$${ac_var}
+done
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+  # Omit some internal or obsolete options to make the list less imposing.
+  # This message is too long to be a string in the A/UX 3.1 sh.
+  cat <<_ACEOF
+\`configure' configures this package to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE.  See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+  -h, --help              display this help and exit
+      --help=short        display options specific to this package
+      --help=recursive    display the short help of all the included packages
+  -V, --version           display version information and exit
+  -q, --quiet, --silent   do not print \`checking...' messages
+      --cache-file=FILE   cache test results in FILE [disabled]
+  -C, --config-cache      alias for \`--cache-file=config.cache'
+  -n, --no-create         do not create output files
+      --srcdir=DIR        find the sources in DIR [configure dir or \`..']
+
+Installation directories:
+  --prefix=PREFIX         install architecture-independent files in PREFIX
+                         [$ac_default_prefix]
+  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
+                         [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc.  You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+  --bindir=DIR           user executables [EPREFIX/bin]
+  --sbindir=DIR          system admin executables [EPREFIX/sbin]
+  --libexecdir=DIR       program executables [EPREFIX/libexec]
+  --sysconfdir=DIR       read-only single-machine data [PREFIX/etc]
+  --sharedstatedir=DIR   modifiable architecture-independent data [PREFIX/com]
+  --localstatedir=DIR    modifiable single-machine data [PREFIX/var]
+  --libdir=DIR           object code libraries [EPREFIX/lib]
+  --includedir=DIR       C header files [PREFIX/include]
+  --oldincludedir=DIR    C header files for non-gcc [/usr/include]
+  --datarootdir=DIR      read-only arch.-independent data root [PREFIX/share]
+  --datadir=DIR          read-only architecture-independent data [DATAROOTDIR]
+  --infodir=DIR          info documentation [DATAROOTDIR/info]
+  --localedir=DIR        locale-dependent data [DATAROOTDIR/locale]
+  --mandir=DIR           man documentation [DATAROOTDIR/man]
+  --docdir=DIR           documentation root @<:@DATAROOTDIR/doc/PACKAGE@:>@
+  --htmldir=DIR          html documentation [DOCDIR]
+  --dvidir=DIR           dvi documentation [DOCDIR]
+  --pdfdir=DIR           pdf documentation [DOCDIR]
+  --psdir=DIR            ps documentation [DOCDIR]
+_ACEOF
+
+  cat <<\_ACEOF
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+
+  cat <<\_ACEOF
+
+Optional Features:
+  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
+  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
+  --enable-ldapmail=yes/no/try       Enable ldap mail address lookups default=no.
+  --enable-ext2direct=yes/no/try     Enable scanning of EXT2/EXT3 filesystem using e2fslib default=try.
+  --enable-netlink=yes/no/try   Compile daemon receiving quota messages via netlink default=no.
+  --enable-altformat=yes/no     Enable alternative format used by edquota default=yes.
+  --enable-rpc=yes/no           Enable RPC support default=yes.
+  --enable-rpcsetquota=yes/no   Use RPC for setting quotas default=no.
+  --enable-xfs_roothack=yes/no  Support old XFS root filesystems default=no.
+  --enable-bsd_behaviour=yes/no Mimic BSD behaviour default=yes.
+  --enable-libefence=yes/no     Use Electric Fence memory checks default=no.
+  --enable-nls=yes/no           Enable gettext dafault=yes.
+  --enable-rootsbin=yes/no      Use /sbin for some important binaries regardless $prefix default=no.
+
+Some influential environment variables:
+  CC          C compiler command
+  CFLAGS      C compiler flags
+  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
+              nonstandard directory <lib dir>
+  LIBS        libraries to pass to the linker, e.g. -l<library>
+  CPPFLAGS    C/C++/Objective C preprocessor flags, e.g. -I<include dir> if
+              you have headers in a nonstandard directory <include dir>
+  CPP         C preprocessor
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+_ACEOF
+ac_status=$?
+fi
+
+if test "$ac_init_help" = "recursive"; then
+  # If there are subdirs, report their specific --help.
+  for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+    test -d "$ac_dir" || continue
+    ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+  .)  # We are building in place.
+    ac_srcdir=.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+    cd "$ac_dir" || { ac_status=$?; continue; }
+    # Check for guested configure.
+    if test -f "$ac_srcdir/configure.gnu"; then
+      echo &&
+      $SHELL "$ac_srcdir/configure.gnu" --help=recursive
+    elif test -f "$ac_srcdir/configure"; then
+      echo &&
+      $SHELL "$ac_srcdir/configure" --help=recursive
+    else
+      echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+    fi || ac_status=$?
+    cd "$ac_pwd" || { ac_status=$?; break; }
+  done
+fi
+
+test -n "$ac_init_help" && exit $ac_status
+if $ac_init_version; then
+  cat <<\_ACEOF
+configure
+generated by GNU Autoconf 2.61
+
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
+2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+  exit
+fi
+cat >config.log <<_ACEOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by $as_me, which was
+generated by GNU Autoconf 2.61.  Invocation command line was
+
+  $ $0 $@
+
+_ACEOF
+exec 5>>config.log
+{
+cat <<_ASUNAME
+@%:@@%:@ --------- @%:@@%:@
+@%:@@%:@ Platform. @%:@@%:@
+@%:@@%:@ --------- @%:@@%:@
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`
+
+/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+/usr/bin/hostinfo      = `(/usr/bin/hostinfo) 2>/dev/null      || echo unknown`
+/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`
+/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  echo "PATH: $as_dir"
+done
+IFS=$as_save_IFS
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+@%:@@%:@ ----------- @%:@@%:@
+@%:@@%:@ Core tests. @%:@@%:@
+@%:@@%:@ ----------- @%:@@%:@
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+  for ac_arg
+  do
+    case $ac_arg in
+    -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+    -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+    | -silent | --silent | --silen | --sile | --sil)
+      continue ;;
+    *\'*)
+      ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    esac
+    case $ac_pass in
+    1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;;
+    2)
+      ac_configure_args1="$ac_configure_args1 '$ac_arg'"
+      if test $ac_must_keep_next = true; then
+       ac_must_keep_next=false # Got value, back to normal.
+      else
+       case $ac_arg in
+         *=* | --config-cache | -C | -disable-* | --disable-* \
+         | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+         | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+         | -with-* | --with-* | -without-* | --without-* | --x)
+           case "$ac_configure_args0 " in
+             "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+           esac
+           ;;
+         -* ) ac_must_keep_next=true ;;
+       esac
+      fi
+      ac_configure_args="$ac_configure_args '$ac_arg'"
+      ;;
+    esac
+  done
+done
+$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; }
+$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; }
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log.  We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Use '\'' to represent an apostrophe within the trap.
+# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
+trap 'exit_status=$?
+  # Save into config.log some information that might help in debugging.
+  {
+    echo
+
+    cat <<\_ASBOX
+@%:@@%:@ ---------------- @%:@@%:@
+@%:@@%:@ Cache variables. @%:@@%:@
+@%:@@%:@ ---------------- @%:@@%:@
+_ASBOX
+    echo
+    # The following way of writing the cache mishandles newlines in values,
+(
+  for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
+    eval ac_val=\$$ac_var
+    case $ac_val in #(
+    *${as_nl}*)
+      case $ac_var in #(
+      *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5
+echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      *) $as_unset $ac_var ;;
+      esac ;;
+    esac
+  done
+  (set) 2>&1 |
+    case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
+    *${as_nl}ac_space=\ *)
+      sed -n \
+       "s/'\''/'\''\\\\'\'''\''/g;
+         s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
+      ;; #(
+    *)
+      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+      ;;
+    esac |
+    sort
+)
+    echo
+
+    cat <<\_ASBOX
+@%:@@%:@ ----------------- @%:@@%:@
+@%:@@%:@ Output variables. @%:@@%:@
+@%:@@%:@ ----------------- @%:@@%:@
+_ASBOX
+    echo
+    for ac_var in $ac_subst_vars
+    do
+      eval ac_val=\$$ac_var
+      case $ac_val in
+      *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+      esac
+      echo "$ac_var='\''$ac_val'\''"
+    done | sort
+    echo
+
+    if test -n "$ac_subst_files"; then
+      cat <<\_ASBOX
+@%:@@%:@ ------------------- @%:@@%:@
+@%:@@%:@ File substitutions. @%:@@%:@
+@%:@@%:@ ------------------- @%:@@%:@
+_ASBOX
+      echo
+      for ac_var in $ac_subst_files
+      do
+       eval ac_val=\$$ac_var
+       case $ac_val in
+       *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+       esac
+       echo "$ac_var='\''$ac_val'\''"
+      done | sort
+      echo
+    fi
+
+    if test -s confdefs.h; then
+      cat <<\_ASBOX
+@%:@@%:@ ----------- @%:@@%:@
+@%:@@%:@ confdefs.h. @%:@@%:@
+@%:@@%:@ ----------- @%:@@%:@
+_ASBOX
+      echo
+      cat confdefs.h
+      echo
+    fi
+    test "$ac_signal" != 0 &&
+      echo "$as_me: caught signal $ac_signal"
+    echo "$as_me: exit $exit_status"
+  } >&5
+  rm -f core *.core core.conftest.* &&
+    rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
+    exit $exit_status
+' 0
+for ac_signal in 1 2 13 15; do
+  trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -f -r conftest* confdefs.h
+
+# Predefined preprocessor variables.
+
+cat >>confdefs.h <<_ACEOF
+@%:@define PACKAGE_NAME "$PACKAGE_NAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+@%:@define PACKAGE_TARNAME "$PACKAGE_TARNAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+@%:@define PACKAGE_VERSION "$PACKAGE_VERSION"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+@%:@define PACKAGE_STRING "$PACKAGE_STRING"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+@%:@define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
+_ACEOF
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer explicitly selected file to automatically selected ones.
+if test -n "$CONFIG_SITE"; then
+  set x "$CONFIG_SITE"
+elif test "x$prefix" != xNONE; then
+  set x "$prefix/share/config.site" "$prefix/etc/config.site"
+else
+  set x "$ac_default_prefix/share/config.site" \
+       "$ac_default_prefix/etc/config.site"
+fi
+shift
+for ac_site_file
+do
+  if test -r "$ac_site_file"; then
+    { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5
+echo "$as_me: loading site script $ac_site_file" >&6;}
+    sed 's/^/| /' "$ac_site_file" >&5
+    . "$ac_site_file"
+  fi
+done
+
+if test -r "$cache_file"; then
+  # Some versions of bash will fail to source /dev/null (special
+  # files actually), so we avoid doing that.
+  if test -f "$cache_file"; then
+    { echo "$as_me:$LINENO: loading cache $cache_file" >&5
+echo "$as_me: loading cache $cache_file" >&6;}
+    case $cache_file in
+      [\\/]* | ?:[\\/]* ) . "$cache_file";;
+      *)                      . "./$cache_file";;
+    esac
+  fi
+else
+  { echo "$as_me:$LINENO: creating cache $cache_file" >&5
+echo "$as_me: creating cache $cache_file" >&6;}
+  >$cache_file
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in $ac_precious_vars; do
+  eval ac_old_set=\$ac_cv_env_${ac_var}_set
+  eval ac_new_set=\$ac_env_${ac_var}_set
+  eval ac_old_val=\$ac_cv_env_${ac_var}_value
+  eval ac_new_val=\$ac_env_${ac_var}_value
+  case $ac_old_set,$ac_new_set in
+    set,)
+      { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,set)
+      { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,);;
+    *)
+      if test "x$ac_old_val" != "x$ac_new_val"; then
+       { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5
+echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+       { echo "$as_me:$LINENO:   former value:  $ac_old_val" >&5
+echo "$as_me:   former value:  $ac_old_val" >&2;}
+       { echo "$as_me:$LINENO:   current value: $ac_new_val" >&5
+echo "$as_me:   current value: $ac_new_val" >&2;}
+       ac_cache_corrupted=:
+      fi;;
+  esac
+  # Pass precious variables to config.status.
+  if test "$ac_new_set" = set; then
+    case $ac_new_val in
+    *\'*) ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+    *) ac_arg=$ac_var=$ac_new_val ;;
+    esac
+    case " $ac_configure_args " in
+      *" '$ac_arg' "*) ;; # Avoid dups.  Use of quotes ensures accuracy.
+      *) ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+    esac
+  fi
+done
+if $ac_cache_corrupted; then
+  { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5
+echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+  { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5
+echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="${ac_tool_prefix}gcc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+  ac_ct_CC=$CC
+  # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_CC="gcc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+else
+  CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+          if test -n "$ac_tool_prefix"; then
+    # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="${ac_tool_prefix}cc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+  fi
+fi
+if test -z "$CC"; then
+  # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+       ac_prog_rejected=yes
+       continue
+     fi
+    ac_cv_prog_CC="cc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+if test $ac_prog_rejected = yes; then
+  # We found a bogon in the path, so make sure we never use it.
+  set dummy $ac_cv_prog_CC
+  shift
+  if test $@%:@ != 0; then
+    # We chose a different compiler from the bogus one.
+    # However, it has the same basename, so the bogon will be chosen
+    # first if we set CC to just the basename; use the full file name.
+    shift
+    ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+  fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+fi
+if test -z "$CC"; then
+  if test -n "$ac_tool_prefix"; then
+  for ac_prog in cl.exe
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+    test -n "$CC" && break
+  done
+fi
+if test -z "$CC"; then
+  ac_ct_CC=$CC
+  for ac_prog in cl.exe
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_CC="$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+  test -n "$ac_ct_CC" && break
+done
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+fi
+
+fi
+
+
+test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&5
+echo "$as_me: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+
+# Provide some information about the compiler.
+echo "$as_me:$LINENO: checking for C compiler version" >&5
+ac_compiler=`set X $ac_compile; echo $2`
+{ (ac_try="$ac_compiler --version >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compiler --version >&5") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (ac_try="$ac_compiler -v >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compiler -v >&5") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (ac_try="$ac_compiler -V >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compiler -V >&5") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.exe b.out"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+{ echo "$as_me:$LINENO: checking for C compiler default output file name" >&5
+echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6; }
+ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+#
+# List of possible output files, starting from the most likely.
+# The algorithm is not robust to junk in `.', hence go to wildcards (a.*)
+# only as a last resort.  b.out is created by i960 compilers.
+ac_files='a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out'
+#
+# The IRIX 6 linker writes into existing files which may not be
+# executable, retaining their permissions.  Remove them first so a
+# subsequent execution test works.
+ac_rmfiles=
+for ac_file in $ac_files
+do
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;;
+    * ) ac_rmfiles="$ac_rmfiles $ac_file";;
+  esac
+done
+rm -f $ac_rmfiles
+
+if { (ac_try="$ac_link_default"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link_default") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
+# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
+# in a Makefile.  We should not override ac_cv_exeext if it was cached,
+# so that the user can short-circuit this test for compilers unknown to
+# Autoconf.
+for ac_file in $ac_files ''
+do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj )
+       ;;
+    [ab].out )
+       # We found the default executable, but exeext='' is most
+       # certainly right.
+       break;;
+    *.* )
+        if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
+       then :; else
+          ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+       fi
+       # We set ac_cv_exeext here because the later test for it is not
+       # safe: cross compilers may not add the suffix if given an `-o'
+       # argument, so we may need to know it at that point already.
+       # Even if this section looks crufty: it has the advantage of
+       # actually working.
+       break;;
+    * )
+       break;;
+  esac
+done
+test "$ac_cv_exeext" = no && ac_cv_exeext=
+
+else
+  ac_file=''
+fi
+
+{ echo "$as_me:$LINENO: result: $ac_file" >&5
+echo "${ECHO_T}$ac_file" >&6; }
+if test -z "$ac_file"; then
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { echo "$as_me:$LINENO: error: C compiler cannot create executables
+See \`config.log' for more details." >&5
+echo "$as_me: error: C compiler cannot create executables
+See \`config.log' for more details." >&2;}
+   { (exit 77); exit 77; }; }
+fi
+
+ac_exeext=$ac_cv_exeext
+
+# Check that the compiler produces executables we can run.  If not, either
+# the compiler is broken, or we cross compile.
+{ echo "$as_me:$LINENO: checking whether the C compiler works" >&5
+echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6; }
+# FIXME: These cross compiler hacks should be removed for Autoconf 3.0
+# If not cross compiling, check that we can run a simple program.
+if test "$cross_compiling" != yes; then
+  if { ac_try='./$ac_file'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+    cross_compiling=no
+  else
+    if test "$cross_compiling" = maybe; then
+       cross_compiling=yes
+    else
+       { { echo "$as_me:$LINENO: error: cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+    fi
+  fi
+fi
+{ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+
+rm -f a.out a.exe conftest$ac_cv_exeext b.out
+ac_clean_files=$ac_clean_files_save
+# Check that the compiler produces executables we can run.  If not, either
+# the compiler is broken, or we cross compile.
+{ echo "$as_me:$LINENO: checking whether we are cross compiling" >&5
+echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6; }
+{ echo "$as_me:$LINENO: result: $cross_compiling" >&5
+echo "${ECHO_T}$cross_compiling" >&6; }
+
+{ echo "$as_me:$LINENO: checking for suffix of executables" >&5
+echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6; }
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in conftest.exe conftest conftest.*; do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;;
+    *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+         break;;
+    * ) break;;
+  esac
+done
+else
+  { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+rm -f conftest$ac_cv_exeext
+{ echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5
+echo "${ECHO_T}$ac_cv_exeext" >&6; }
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+{ echo "$as_me:$LINENO: checking for suffix of object files" >&5
+echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6; }
+if test "${ac_cv_objext+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  for ac_file in conftest.o conftest.obj conftest.*; do
+  test -f "$ac_file" || continue;
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf ) ;;
+    *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+       break;;
+  esac
+done
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute suffix of object files: cannot compile
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_objext" >&5
+echo "${ECHO_T}$ac_cv_objext" >&6; }
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+{ echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6; }
+if test "${ac_cv_c_compiler_gnu+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_compiler_gnu=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_compiler_gnu=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6; }
+GCC=`test $ac_compiler_gnu = yes && echo yes`
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+{ echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5
+echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6; }
+if test "${ac_cv_prog_cc_g+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_save_c_werror_flag=$ac_c_werror_flag
+   ac_c_werror_flag=yes
+   ac_cv_prog_cc_g=no
+   CFLAGS="-g"
+   cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_prog_cc_g=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       CFLAGS=""
+      cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_c_werror_flag=$ac_save_c_werror_flag
+        CFLAGS="-g"
+        cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_prog_cc_g=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   ac_c_werror_flag=$ac_save_c_werror_flag
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_g" >&6; }
+if test "$ac_test_CFLAGS" = set; then
+  CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+  if test "$GCC" = yes; then
+    CFLAGS="-g -O2"
+  else
+    CFLAGS="-g"
+  fi
+else
+  if test "$GCC" = yes; then
+    CFLAGS="-O2"
+  else
+    CFLAGS=
+  fi
+fi
+{ echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5
+echo $ECHO_N "checking for $CC option to accept ISO C89... $ECHO_C" >&6; }
+if test "${ac_cv_prog_cc_c89+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_prog_cc_c89=no
+ac_save_CC=$CC
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stdarg.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+     char **p;
+     int i;
+{
+  return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+  char *s;
+  va_list v;
+  va_start (v,p);
+  s = g (p, va_arg (v,int));
+  va_end (v);
+  return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
+   function prototypes and stuff, but not '\xHH' hex character constants.
+   These don't provoke an error unfortunately, instead are silently treated
+   as 'x'.  The following induces an error, until -std is added to get
+   proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
+   array size at least.  It's necessary to write '\x00'==0 to get something
+   that's true only with -std.  */
+int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+   inside strings and character constants.  */
+#define FOO(x) 'x'
+int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
+  ;
+  return 0;
+}
+_ACEOF
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
+       -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+  CC="$ac_save_CC $ac_arg"
+  rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_prog_cc_c89=$ac_arg
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       
+fi
+
+rm -f core conftest.err conftest.$ac_objext 
+  test "x$ac_cv_prog_cc_c89" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+
+fi
+# AC_CACHE_VAL
+case "x$ac_cv_prog_cc_c89" in
+  x)
+    { echo "$as_me:$LINENO: result: none needed" >&5
+echo "${ECHO_T}none needed" >&6; } ;;
+  xno)
+    { echo "$as_me:$LINENO: result: unsupported" >&5
+echo "${ECHO_T}unsupported" >&6; } ;;
+  *)
+    CC="$CC $ac_cv_prog_cc_c89"
+    { echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_c89" >&6; } ;;
+esac
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+{ echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5
+echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6; }
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+  CPP=
+fi
+if test -z "$CPP"; then
+  if test "${ac_cv_prog_CPP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+      # Double quotes because CPP needs to be expanded
+    for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
+    do
+      ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+@%:@ifdef __STDC__
+@%:@ include <limits.h>
+@%:@else
+@%:@ include <assert.h>
+@%:@endif
+                    Syntax error
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+        test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Broken: fails on valid input.
+continue
+fi
+
+rm -f conftest.err conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+@%:@include <ac_nonexistent.h>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+        test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       }; then
+  # Broken: success on invalid input.
+continue
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+  break
+fi
+
+    done
+    ac_cv_prog_CPP=$CPP
+  
+fi
+  CPP=$ac_cv_prog_CPP
+else
+  ac_cv_prog_CPP=$CPP
+fi
+{ echo "$as_me:$LINENO: result: $CPP" >&5
+echo "${ECHO_T}$CPP" >&6; }
+ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+@%:@ifdef __STDC__
+@%:@ include <limits.h>
+@%:@else
+@%:@ include <assert.h>
+@%:@endif
+                    Syntax error
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+        test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Broken: fails on valid input.
+continue
+fi
+
+rm -f conftest.err conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+@%:@include <ac_nonexistent.h>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+        test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       }; then
+  # Broken: success on invalid input.
+continue
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+  :
+else
+  { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details." >&5
+echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+{ echo "$as_me:$LINENO: checking for grep that handles long lines and -e" >&5
+echo $ECHO_N "checking for grep that handles long lines and -e... $ECHO_C" >&6; }
+if test "${ac_cv_path_GREP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  # Extract the first word of "grep ggrep" to use in msg output
+if test -z "$GREP"; then
+set dummy grep ggrep; ac_prog_name=$2
+if test "${ac_cv_path_GREP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_path_GREP_found=false
+# Loop through the user's path and test for each of PROGNAME-LIST
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_prog in grep ggrep; do
+  for ac_exec_ext in '' $ac_executable_extensions; do
+    ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
+    { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue
+    # Check for GNU ac_path_GREP and select it if it is found.
+  # Check for GNU $ac_path_GREP
+case `"$ac_path_GREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
+*)
+  ac_count=0
+  echo $ECHO_N "0123456789$ECHO_C" >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    echo 'GREP' >> "conftest.nl"
+    "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    ac_count=`expr $ac_count + 1`
+    if test $ac_count -gt ${ac_path_GREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_GREP="$ac_path_GREP"
+      ac_path_GREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+
+    $ac_path_GREP_found && break 3
+  done
+done
+
+done
+IFS=$as_save_IFS
+
+
+fi
+
+GREP="$ac_cv_path_GREP"
+if test -z "$GREP"; then
+  { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5
+echo "$as_me: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+else
+  ac_cv_path_GREP=$GREP
+fi
+
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_path_GREP" >&5
+echo "${ECHO_T}$ac_cv_path_GREP" >&6; }
+ GREP="$ac_cv_path_GREP"
+
+{ echo "$as_me:$LINENO: checking for egrep" >&5
+echo $ECHO_N "checking for egrep... $ECHO_C" >&6; }
+if test "${ac_cv_path_EGREP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
+   then ac_cv_path_EGREP="$GREP -E"
+   else
+     # Extract the first word of "egrep" to use in msg output
+if test -z "$EGREP"; then
+set dummy egrep; ac_prog_name=$2
+if test "${ac_cv_path_EGREP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_path_EGREP_found=false
+# Loop through the user's path and test for each of PROGNAME-LIST
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_prog in egrep; do
+  for ac_exec_ext in '' $ac_executable_extensions; do
+    ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
+    { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue
+    # Check for GNU ac_path_EGREP and select it if it is found.
+  # Check for GNU $ac_path_EGREP
+case `"$ac_path_EGREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
+*)
+  ac_count=0
+  echo $ECHO_N "0123456789$ECHO_C" >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    echo 'EGREP' >> "conftest.nl"
+    "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    ac_count=`expr $ac_count + 1`
+    if test $ac_count -gt ${ac_path_EGREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_EGREP="$ac_path_EGREP"
+      ac_path_EGREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+
+    $ac_path_EGREP_found && break 3
+  done
+done
+
+done
+IFS=$as_save_IFS
+
+
+fi
+
+EGREP="$ac_cv_path_EGREP"
+if test -z "$EGREP"; then
+  { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5
+echo "$as_me: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+else
+  ac_cv_path_EGREP=$EGREP
+fi
+
+
+   fi
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_path_EGREP" >&5
+echo "${ECHO_T}$ac_cv_path_EGREP" >&6; }
+ EGREP="$ac_cv_path_EGREP"
+
+{ echo "$as_me:$LINENO: checking for ANSI C header files" >&5
+echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6; }
+if test "${ac_cv_header_stdc+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_header_stdc=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_header_stdc=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+if test $ac_cv_header_stdc = yes; then
+  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <string.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "memchr" >/dev/null 2>&1; then
+  :
+else
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stdlib.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "free" >/dev/null 2>&1; then
+  :
+else
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+  if test "$cross_compiling" = yes; then
+  :
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <ctype.h>
+#include <stdlib.h>
+#if ((' ' & 0x0FF) == 0x020)
+# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#else
+# define ISLOWER(c) \
+                  (('a' <= (c) && (c) <= 'i') \
+                    || ('j' <= (c) && (c) <= 'r') \
+                    || ('s' <= (c) && (c) <= 'z'))
+# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
+#endif
+
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int
+main ()
+{
+  int i;
+  for (i = 0; i < 256; i++)
+    if (XOR (islower (i), ISLOWER (i))
+       || toupper (i) != TOUPPER (i))
+      return 2;
+  return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  :
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+ac_cv_header_stdc=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+
+
+fi
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5
+echo "${ECHO_T}$ac_cv_header_stdc" >&6; }
+if test $ac_cv_header_stdc = yes; then
+  
+cat >>confdefs.h <<\_ACEOF
+@%:@define STDC_HEADERS 1
+_ACEOF
+
+fi
+
+ac_aux_dir=
+for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do
+  if test -f "$ac_dir/install-sh"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install-sh -c"
+    break
+  elif test -f "$ac_dir/install.sh"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install.sh -c"
+    break
+  elif test -f "$ac_dir/shtool"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/shtool install -c"
+    break
+  fi
+done
+if test -z "$ac_aux_dir"; then
+  { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&5
+echo "$as_me: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+# These three variables are undocumented and unsupported,
+# and are intended to be withdrawn in a future Autoconf release.
+# They can cause serious problems if a builder's source tree is in a directory
+# whose full name contains unusual characters.
+ac_config_guess="$SHELL $ac_aux_dir/config.guess"  # Please don't use this var.
+ac_config_sub="$SHELL $ac_aux_dir/config.sub"  # Please don't use this var.
+ac_configure="$SHELL $ac_aux_dir/configure"  # Please don't use this var.
+
+
+# Find a good install program.  We prefer a C program (faster),
+# so one script is as good as another.  But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# OS/2's system install, which has a completely different semantic
+# ./install, which can be erroneously created by make from ./install.sh.
+{ echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5
+echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6; }
+if test -z "$INSTALL"; then
+if test "${ac_cv_path_install+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  # Account for people who put trailing slashes in PATH elements.
+case $as_dir/ in
+  ./ | .// | /cC/* | \
+  /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+  ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \
+  /usr/ucb/* ) ;;
+  *)
+    # OSF1 and SCO ODT 3.0 have their own names for install.
+    # Don't use installbsd from OSF since it installs stuff as root
+    # by default.
+    for ac_prog in ginstall scoinst install; do
+      for ac_exec_ext in '' $ac_executable_extensions; do
+       if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then
+         if test $ac_prog = install &&
+           grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+           # AIX install.  It has an incompatible calling convention.
+           :
+         elif test $ac_prog = install &&
+           grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+           # program-specific install script used by HP pwplus--don't use.
+           :
+         else
+           ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+           break 3
+         fi
+       fi
+      done
+    done
+    ;;
+esac
+done
+IFS=$as_save_IFS
+
+
+fi
+  if test "${ac_cv_path_install+set}" = set; then
+    INSTALL=$ac_cv_path_install
+  else
+    # As a last resort, use the slow shell script.  Don't cache a
+    # value for INSTALL within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the value is a relative name.
+    INSTALL=$ac_install_sh
+  fi
+fi
+{ echo "$as_me:$LINENO: result: $INSTALL" >&5
+echo "${ECHO_T}$INSTALL" >&6; }
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+
+{ echo "$as_me:$LINENO: checking whether compiler supports PIE" >&5
+echo $ECHO_N "checking whether compiler supports PIE... $ECHO_C" >&6; }
+oldCFLAGS="$CFLAGS"
+CFLAGS="$CFLAGS -fPIE"
+oldLDFLAGS="$LDFLAGS"
+LDFLAGS="$LDFLAGS -pie"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  compilepie="yes"
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+if test "x$compilepie" != "xyes"; then
+       CFLAGS="$oldCFLAGS"
+       LDFLAGS="$oldLDFLAGS"
+       { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+else
+       { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+fi
+
+# Check whether --enable-ldapmail was given.
+if test "${enable_ldapmail+set}" = set; then
+  enableval=$enable_ldapmail; 
+else
+  enable_ldapmail="no"
+fi
+
+if test "x$enable_ldapmail" != "xno"; then
+       have_new_ldap="no"
+       have_old_ldap="no"
+       { echo "$as_me:$LINENO: checking for ldap_initialize in -lldap" >&5
+echo $ECHO_N "checking for ldap_initialize in -lldap... $ECHO_C" >&6; }
+if test "${ac_cv_lib_ldap_ldap_initialize+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lldap  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldap_initialize ();
+int
+main ()
+{
+return ldap_initialize ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  ac_cv_lib_ldap_ldap_initialize=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_lib_ldap_ldap_initialize=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_lib_ldap_ldap_initialize" >&5
+echo "${ECHO_T}$ac_cv_lib_ldap_ldap_initialize" >&6; }
+if test $ac_cv_lib_ldap_ldap_initialize = yes; then
+  have_new_ldap="yes"
+else
+  { echo "$as_me:$LINENO: checking for ldap_init in -lldap" >&5
+echo $ECHO_N "checking for ldap_init in -lldap... $ECHO_C" >&6; }
+if test "${ac_cv_lib_ldap_ldap_init+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lldap  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldap_init ();
+int
+main ()
+{
+return ldap_init ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  ac_cv_lib_ldap_ldap_init=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_lib_ldap_ldap_init=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_lib_ldap_ldap_init" >&5
+echo "${ECHO_T}$ac_cv_lib_ldap_ldap_init" >&6; }
+if test $ac_cv_lib_ldap_ldap_init = yes; then
+  have_old_ldap="yes"
+fi
+
+fi
+
+       if test "x$have_new_ldap" != "xno" -o "x$have_old_ldap" != "xno"; then
+               LDAPLIBS="-L/usr/lib -lldap"
+               CFLAGS="$CFLAGS -DUSE_LDAP_MAIL_LOOKUP"
+               COMPILE_OPTS="$COMPILE_OPTS USE_LDAP_MAIL_LOOKUP"
+               if test "x$have_new_ldap" = "xyes"; then
+                       CFLAGS="$CFLAGS -DUSE_LDAP_23"
+                       { echo "$as_me:$LINENO: checking whether ldap_perror is declared" >&5
+echo $ECHO_N "checking whether ldap_perror is declared... $ECHO_C" >&6; }
+if test "${ac_cv_have_decl_ldap_perror+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <ldap.h>
+
+int
+main ()
+{
+#ifndef ldap_perror
+  (void) ldap_perror;
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_have_decl_ldap_perror=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_have_decl_ldap_perror=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_ldap_perror" >&5
+echo "${ECHO_T}$ac_cv_have_decl_ldap_perror" >&6; }
+if test $ac_cv_have_decl_ldap_perror = yes; then
+  :
+else
+  CFLAGS="$CFLAGS -DNEED_LDAP_PERROR"
+fi
+
+               fi
+       else
+               if test "x$enable_ldapmail" = "xyes"; then
+                       { { echo "$as_me:$LINENO: error: LDAP support required but library not found." >&5
+echo "$as_me: error: LDAP support required but library not found." >&2;}
+   { (exit 1); exit 1; }; };
+               fi
+       fi
+fi
+
+
+       
+# On IRIX 5.3, sys/types and inttypes.h are conflicting.
+
+
+
+
+
+
+
+
+
+for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
+                 inttypes.h stdint.h unistd.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+
+@%:@include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  eval "$as_ac_Header=yes"
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       eval "$as_ac_Header=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+              { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+  cat >>confdefs.h <<_ACEOF
+@%:@define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+fi
+
+done
+
+
+if test "${ac_cv_header_ext2fs_ext2fs_h+set}" = set; then
+  { echo "$as_me:$LINENO: checking for ext2fs/ext2fs.h" >&5
+echo $ECHO_N "checking for ext2fs/ext2fs.h... $ECHO_C" >&6; }
+if test "${ac_cv_header_ext2fs_ext2fs_h+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_header_ext2fs_ext2fs_h" >&5
+echo "${ECHO_T}$ac_cv_header_ext2fs_ext2fs_h" >&6; }
+else
+  # Is the header compilable?
+{ echo "$as_me:$LINENO: checking ext2fs/ext2fs.h usability" >&5
+echo $ECHO_N "checking ext2fs/ext2fs.h usability... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+@%:@include <ext2fs/ext2fs.h>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_header_compiler=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_header_compiler=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ echo "$as_me:$LINENO: checking ext2fs/ext2fs.h presence" >&5
+echo $ECHO_N "checking ext2fs/ext2fs.h presence... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+@%:@include <ext2fs/ext2fs.h>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+        test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       }; then
+  ac_header_preproc=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  ac_header_preproc=no
+fi
+
+rm -f conftest.err conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6; }
+
+# So?  What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+  yes:no: )
+    { echo "$as_me:$LINENO: WARNING: ext2fs/ext2fs.h: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: ext2fs/ext2fs.h: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { echo "$as_me:$LINENO: WARNING: ext2fs/ext2fs.h: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: ext2fs/ext2fs.h: proceeding with the compiler's result" >&2;}
+    ac_header_preproc=yes
+    ;;
+  no:yes:* )
+    { echo "$as_me:$LINENO: WARNING: ext2fs/ext2fs.h: present but cannot be compiled" >&5
+echo "$as_me: WARNING: ext2fs/ext2fs.h: present but cannot be compiled" >&2;}
+    { echo "$as_me:$LINENO: WARNING: ext2fs/ext2fs.h:     check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: ext2fs/ext2fs.h:     check for missing prerequisite headers?" >&2;}
+    { echo "$as_me:$LINENO: WARNING: ext2fs/ext2fs.h: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: ext2fs/ext2fs.h: see the Autoconf documentation" >&2;}
+    { echo "$as_me:$LINENO: WARNING: ext2fs/ext2fs.h:     section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: ext2fs/ext2fs.h:     section \"Present But Cannot Be Compiled\"" >&2;}
+    { echo "$as_me:$LINENO: WARNING: ext2fs/ext2fs.h: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: ext2fs/ext2fs.h: proceeding with the preprocessor's result" >&2;}
+    { echo "$as_me:$LINENO: WARNING: ext2fs/ext2fs.h: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: ext2fs/ext2fs.h: in the future, the compiler will take precedence" >&2;}
+    
+    ;;
+esac
+{ echo "$as_me:$LINENO: checking for ext2fs/ext2fs.h" >&5
+echo $ECHO_N "checking for ext2fs/ext2fs.h... $ECHO_C" >&6; }
+if test "${ac_cv_header_ext2fs_ext2fs_h+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_header_ext2fs_ext2fs_h=$ac_header_preproc
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_header_ext2fs_ext2fs_h" >&5
+echo "${ECHO_T}$ac_cv_header_ext2fs_ext2fs_h" >&6; }
+
+fi
+if test $ac_cv_header_ext2fs_ext2fs_h = yes; then
+  ext2fshead="yes"
+fi
+
+
+if test "x$ext2fshead" = "xyes"; then
+       CFLAGS="-DHAVE_EXT2_INCLUDE $CFLAGS"
+       { echo "$as_me:$LINENO: checking for ext2_ino_t" >&5
+echo $ECHO_N "checking for ext2_ino_t... $ECHO_C" >&6; }
+       have_ext2_ino_t="no"
+       cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <ext2fs/ext2fs.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "ext2_ino_t" >/dev/null 2>&1; then
+  have_ext2_ino_t="yes"
+fi
+rm -f conftest*
+
+       if test "x$have_ext2_ino_t" != "xyes"; then
+               { echo "$as_me:$LINENO: result: not found" >&5
+echo "${ECHO_T}not found" >&6; }
+       else
+               { echo "$as_me:$LINENO: result: found" >&5
+echo "${ECHO_T}found" >&6; }
+               CFLAGS="-DHAVE_EXT2_INO_T $CFLAGS"
+       fi
+fi
+
+# Check whether --enable-ext2direct was given.
+if test "${enable_ext2direct+set}" = set; then
+  enableval=$enable_ext2direct; 
+else
+  enable_ext2direct="try"
+fi
+
+if test "x$enable_ext2direct" != "xno"; then
+       { echo "$as_me:$LINENO: checking for com_err in -lcom_err" >&5
+echo $ECHO_N "checking for com_err in -lcom_err... $ECHO_C" >&6; }
+if test "${ac_cv_lib_com_err_com_err+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lcom_err  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char com_err ();
+int
+main ()
+{
+return com_err ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  ac_cv_lib_com_err_com_err=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_lib_com_err_com_err=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_lib_com_err_com_err" >&5
+echo "${ECHO_T}$ac_cv_lib_com_err_com_err" >&6; }
+if test $ac_cv_lib_com_err_com_err = yes; then
+  EXT2LIBS="-lcom_err $EXT2LIBS"
+fi
+
+       { echo "$as_me:$LINENO: checking for ext2fs_initialize in -lext2fs" >&5
+echo $ECHO_N "checking for ext2fs_initialize in -lext2fs... $ECHO_C" >&6; }
+if test "${ac_cv_lib_ext2fs_ext2fs_initialize+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lext2fs "-lcom_err" $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ext2fs_initialize ();
+int
+main ()
+{
+return ext2fs_initialize ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  ac_cv_lib_ext2fs_ext2fs_initialize=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_lib_ext2fs_ext2fs_initialize=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_lib_ext2fs_ext2fs_initialize" >&5
+echo "${ECHO_T}$ac_cv_lib_ext2fs_ext2fs_initialize" >&6; }
+if test $ac_cv_lib_ext2fs_ext2fs_initialize = yes; then
+  EXT2LIBS="-lext2fs $EXT2LIBS"
+fi
+
+       if test "${ac_cv_lib_com_err_com_err}" != "yes" -o "${ac_cv_lib_ext2fs_ext2fs_initialize}" != "yes"; then
+               if test "x$enable_ext2direct" = "xyes"; then
+                       { { echo "$as_me:$LINENO: error: Ext2 direct support required but libraries not found." >&5
+echo "$as_me: error: Ext2 direct support required but libraries not found." >&2;}
+   { (exit 1); exit 1; }; }
+               else
+                       { echo "$as_me:$LINENO: WARNING: Ext2 direct support won't be compiled. Libraries not found." >&5
+echo "$as_me: WARNING: Ext2 direct support won't be compiled. Libraries not found." >&2;}
+               fi
+               enable_ext2direct="no"
+               EXT2LIBS=""
+       else
+               if test "x$ext2fshead" != "xyes"; then
+                       if test "x$enable_ext2direct" = "xyes"; then
+                               { { echo "$as_me:$LINENO: error: Ext2 direct support required but header files not found." >&5
+echo "$as_me: error: Ext2 direct support required but header files not found." >&2;}
+   { (exit 1); exit 1; }; }
+                       else
+                               { echo "$as_me:$LINENO: WARNING: Ext2 direct support won't be compiled. Header files not found." >&5
+echo "$as_me: WARNING: Ext2 direct support won't be compiled. Header files not found." >&2;}
+                       fi
+                       enable_ext2direct="no"
+                       EXT2LIBS=""
+               else
+                       enable_ext2direct="yes"
+               fi
+       fi
+       if test "x$enable_ext2direct" = "xyes"; then
+               EXT2_DIRECT="-DEXT2_DIRECT"
+               COMPILE_OPTS="$COMPILE_OPTS EXT2_DIRECT"
+               
+       fi
+fi
+
+
+#AC_ARG_WITH(dbus_include,
+#      [  --with-dbus_include=path        Path to directory with dbus include directory [default=/usr/include/dbus-1.0/]],
+#      DBUS_INCLUDE="$with_dbus_include",
+#      DBUS_INCLUDE="/usr/include/dbus-1.0/")
+#AC_ARG_WITH(dbus_arch_include,
+#      [  --with-dbus_arch_include=path   Path to directory with dbus arch-dependent include directory [default=/usr/lib/dbus-1.0/include/]],
+#      DBUS_ARCH_INCLUDE="$with_dbus_arch_include",
+#      DBUS_ARCH_INCLUDE="/usr/lib/dbus-1.0/include/")
+
+# Check whether --enable-netlink was given.
+if test "${enable_netlink+set}" = set; then
+  enableval=$enable_netlink; 
+else
+  enable_netlink="no"
+fi
+
+if test "x$enable_netlink" != "xno"; then
+       PKG_CHECK_MODULES(DBUS, dbus-1)
+       NETLINKLIBS="$DBUS_LIBS"
+
+       { echo "$as_me:$LINENO: checking for genl_register in -lnl" >&5
+echo $ECHO_N "checking for genl_register in -lnl... $ECHO_C" >&6; }
+if test "${ac_cv_lib_nl_genl_register+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lnl  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char genl_register ();
+int
+main ()
+{
+return genl_register ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  ac_cv_lib_nl_genl_register=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_lib_nl_genl_register=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_lib_nl_genl_register" >&5
+echo "${ECHO_T}$ac_cv_lib_nl_genl_register" >&6; }
+if test $ac_cv_lib_nl_genl_register = yes; then
+  NETLINKLIBS="-lnl $NETLINKLIBS"
+fi
+
+       if test -z "$NETLINKLIBS" -o -z "$DBUS_LIBS"; then
+               if test "x$enable_netlink" = "xyes"; then
+                       { { echo "$as_me:$LINENO: error: Required libraries for quota netlink daemon not found." >&5
+echo "$as_me: error: Required libraries for quota netlink daemon not found." >&2;}
+   { (exit 1); exit 1; }; }
+               else
+                       { echo "$as_me:$LINENO: WARNING: Quota netlink daemon won't be compiled. Required libraries not found." >&5
+echo "$as_me: WARNING: Quota netlink daemon won't be compiled. Required libraries not found." >&2;}
+               fi
+               enable_netlink="no"
+               NETLINKLIBS=""
+       else
+               CPPFLAGS="$DBUS_CFLAGS $CPPFLAGS"
+               if test -z "$DBUS_LIBS"; then
+                       if test "x$enable_netlink" = "xyes"; then
+                               { { echo "$as_me:$LINENO: error: Required headers for quota netlink daemon not found." >&5
+echo "$as_me: error: Required headers for quota netlink daemon not found." >&2;}
+   { (exit 1); exit 1; }; }
+                       else
+                               { echo "$as_me:$LINENO: WARNING: Quota netlink daemon won't be compiled. Required headers not found." >&5
+echo "$as_me: WARNING: Quota netlink daemon won't be compiled. Required headers not found." >&2;}
+                       fi
+                       NETLINKLIBS=""
+                       enable_netlink="no"
+               else
+                       QUOTA_NETLINK_PROG=quota_nld
+               fi
+       fi
+fi
+
+
+
+{ echo "$as_me:$LINENO: checking for library containing gethostbyname" >&5
+echo $ECHO_N "checking for library containing gethostbyname... $ECHO_C" >&6; }
+if test "${ac_cv_search_gethostbyname+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_func_search_save_LIBS=$LIBS
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char gethostbyname ();
+int
+main ()
+{
+return gethostbyname ();
+  ;
+  return 0;
+}
+_ACEOF
+for ac_lib in '' nsl; do
+  if test -z "$ac_lib"; then
+    ac_res="none required"
+  else
+    ac_res=-l$ac_lib
+    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
+  fi
+  rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  ac_cv_search_gethostbyname=$ac_res
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext 
+  if test "${ac_cv_search_gethostbyname+set}" = set; then
+  break
+fi
+done
+if test "${ac_cv_search_gethostbyname+set}" = set; then
+  :
+else
+  ac_cv_search_gethostbyname=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_search_gethostbyname" >&5
+echo "${ECHO_T}$ac_cv_search_gethostbyname" >&6; }
+ac_res=$ac_cv_search_gethostbyname
+if test "$ac_res" != no; then
+  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+  
+fi
+
+{ echo "$as_me:$LINENO: checking for host_access in -lwrap" >&5
+echo $ECHO_N "checking for host_access in -lwrap... $ECHO_C" >&6; }
+if test "${ac_cv_lib_wrap_main+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  saved_LIBS="$LIBS"
+       LIBS="$LIBS -lwrap"
+       cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+       #include <stdio.h>
+       #include <sys/types.h>
+       #include <sys/socket.h>
+       #include <netinet/in.h>
+       #include <tcpd.h>
+       struct request_info request;
+       int deny_severity, allow_severity;
+int
+main ()
+{
+hosts_access(&request);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+       ac_cv_lib_wrap_main=yes; LIBS="$saved_LIBS"; { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_lib_wrap_main=no; LIBS="$saved_LIBS"; { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+       
+fi
+
+
+if test ${ac_cv_lib_wrap_main} = yes; then
+       if test "${ac_cv_header_tcpd_h+set}" = set; then
+  { echo "$as_me:$LINENO: checking for tcpd.h" >&5
+echo $ECHO_N "checking for tcpd.h... $ECHO_C" >&6; }
+if test "${ac_cv_header_tcpd_h+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_header_tcpd_h" >&5
+echo "${ECHO_T}$ac_cv_header_tcpd_h" >&6; }
+else
+  # Is the header compilable?
+{ echo "$as_me:$LINENO: checking tcpd.h usability" >&5
+echo $ECHO_N "checking tcpd.h usability... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+@%:@include <tcpd.h>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_header_compiler=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_header_compiler=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ echo "$as_me:$LINENO: checking tcpd.h presence" >&5
+echo $ECHO_N "checking tcpd.h presence... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+@%:@include <tcpd.h>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+        test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       }; then
+  ac_header_preproc=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  ac_header_preproc=no
+fi
+
+rm -f conftest.err conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6; }
+
+# So?  What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+  yes:no: )
+    { echo "$as_me:$LINENO: WARNING: tcpd.h: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: tcpd.h: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { echo "$as_me:$LINENO: WARNING: tcpd.h: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: tcpd.h: proceeding with the compiler's result" >&2;}
+    ac_header_preproc=yes
+    ;;
+  no:yes:* )
+    { echo "$as_me:$LINENO: WARNING: tcpd.h: present but cannot be compiled" >&5
+echo "$as_me: WARNING: tcpd.h: present but cannot be compiled" >&2;}
+    { echo "$as_me:$LINENO: WARNING: tcpd.h:     check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: tcpd.h:     check for missing prerequisite headers?" >&2;}
+    { echo "$as_me:$LINENO: WARNING: tcpd.h: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: tcpd.h: see the Autoconf documentation" >&2;}
+    { echo "$as_me:$LINENO: WARNING: tcpd.h:     section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: tcpd.h:     section \"Present But Cannot Be Compiled\"" >&2;}
+    { echo "$as_me:$LINENO: WARNING: tcpd.h: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: tcpd.h: proceeding with the preprocessor's result" >&2;}
+    { echo "$as_me:$LINENO: WARNING: tcpd.h: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: tcpd.h: in the future, the compiler will take precedence" >&2;}
+    
+    ;;
+esac
+{ echo "$as_me:$LINENO: checking for tcpd.h" >&5
+echo $ECHO_N "checking for tcpd.h... $ECHO_C" >&6; }
+if test "${ac_cv_header_tcpd_h+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_header_tcpd_h=$ac_header_preproc
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_header_tcpd_h" >&5
+echo "${ECHO_T}$ac_cv_header_tcpd_h" >&6; }
+
+fi
+if test $ac_cv_header_tcpd_h = yes; then
+  :
+else
+  
+               echo 'ERROR: could not find tcpd.h - missing TCP wrappers package'
+               exit 1
+       
+fi
+
+
+       LIBS="$LIBS -lwrap"
+       HOSTS_ACCESS="-DHOSTS_ACCESS"
+       COMPILE_OPTS="$COMPILE_OPTS HOST_ACCESS"
+       
+fi
+
+{ echo "$as_me:$LINENO: checking for an ANSI C-conforming const" >&5
+echo $ECHO_N "checking for an ANSI C-conforming const... $ECHO_C" >&6; }
+if test "${ac_cv_c_const+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+/* FIXME: Include the comments suggested by Paul. */
+#ifndef __cplusplus
+  /* Ultrix mips cc rejects this.  */
+  typedef int charset[2];
+  const charset cs;
+  /* SunOS 4.1.1 cc rejects this.  */
+  char const *const *pcpcc;
+  char **ppc;
+  /* NEC SVR4.0.2 mips cc rejects this.  */
+  struct point {int x, y;};
+  static struct point const zero = {0,0};
+  /* AIX XL C 1.02.0.0 rejects this.
+     It does not let you subtract one const X* pointer from another in
+     an arm of an if-expression whose if-part is not a constant
+     expression */
+  const char *g = "string";
+  pcpcc = &g + (g ? g-g : 0);
+  /* HPUX 7.0 cc rejects these. */
+  ++pcpcc;
+  ppc = (char**) pcpcc;
+  pcpcc = (char const *const *) ppc;
+  { /* SCO 3.2v4 cc rejects this.  */
+    char *t;
+    char const *s = 0 ? (char *) 0 : (char const *) 0;
+
+    *t++ = 0;
+    if (s) return 0;
+  }
+  { /* Someone thinks the Sun supposedly-ANSI compiler will reject this.  */
+    int x[] = {25, 17};
+    const int *foo = &x[0];
+    ++foo;
+  }
+  { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */
+    typedef const int *iptr;
+    iptr p = 0;
+    ++p;
+  }
+  { /* AIX XL C 1.02.0.0 rejects this saying
+       "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */
+    struct s { int j; const int *ap[3]; };
+    struct s *b; b->j = 5;
+  }
+  { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */
+    const int foo = 10;
+    if (!foo) return 0;
+  }
+  return !cs[0] && !zero.x;
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_c_const=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_c_const=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_c_const" >&5
+echo "${ECHO_T}$ac_cv_c_const" >&6; }
+if test $ac_cv_c_const = no; then
+  
+cat >>confdefs.h <<\_ACEOF
+@%:@define const 
+_ACEOF
+
+fi
+
+{ echo "$as_me:$LINENO: checking for inline" >&5
+echo $ECHO_N "checking for inline... $ECHO_C" >&6; }
+if test "${ac_cv_c_inline+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_c_inline=no
+for ac_kw in inline __inline__ __inline; do
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#ifndef __cplusplus
+typedef int foo_t;
+static $ac_kw foo_t static_foo () {return 0; }
+$ac_kw foo_t foo () {return 0; }
+#endif
+
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_c_inline=$ac_kw
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  test "$ac_cv_c_inline" != no && break
+done
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_c_inline" >&5
+echo "${ECHO_T}$ac_cv_c_inline" >&6; }
+
+
+case $ac_cv_c_inline in
+  inline | yes) ;;
+  *)
+    case $ac_cv_c_inline in
+      no) ac_val=;;
+      *) ac_val=$ac_cv_c_inline;;
+    esac
+    cat >>confdefs.h <<_ACEOF
+#ifndef __cplusplus
+#define inline $ac_val
+#endif
+_ACEOF
+    ;;
+esac
+
+
+# Check whether --enable-altformat was given.
+if test "${enable_altformat+set}" = set; then
+  enableval=$enable_altformat; 
+else
+  enable_altformat="yes"
+fi
+
+# Check whether --enable-rpc was given.
+if test "${enable_rpc+set}" = set; then
+  enableval=$enable_rpc; 
+else
+  enable_rpc="yes"
+fi
+
+# Check whether --enable-rpcsetquota was given.
+if test "${enable_rpcsetquota+set}" = set; then
+  enableval=$enable_rpcsetquota; 
+else
+  enable_rpcsetquota="no"
+fi
+
+# Check whether --enable-xfs_roothack was given.
+if test "${enable_xfs_roothack+set}" = set; then
+  enableval=$enable_xfs_roothack; 
+else
+  enable_xfs_roothack="no"
+fi
+
+# Check whether --enable-bsd_behaviour was given.
+if test "${enable_bsd_behaviour+set}" = set; then
+  enableval=$enable_bsd_behaviour; 
+else
+  enable_bsd_behaviour="yes"
+fi
+
+# Check whether --enable-libefence was given.
+if test "${enable_libefence+set}" = set; then
+  enableval=$enable_libefence; 
+else
+  enable_libefence="no"
+fi
+
+
+# Check whether --enable-nls was given.
+if test "${enable_nls+set}" = set; then
+  enableval=$enable_nls; 
+else
+  enable_nls="yes"
+fi
+
+# Check whether --enable-rootsbin was given.
+if test "${enable_rootsbin+set}" = set; then
+  enableval=$enable_rootsbin; 
+else
+  enable_rootsbin="no"
+fi
+
+
+if test "$enable_altformat" = "yes" ; then
+       CFLAGS="-DALT_FORMAT $CFLAGS"
+       COMPILE_OPTS="$COMPILE_OPTS ALT_FORMAT"
+fi
+if test "$enable_rpc" = "yes" ; then
+       CFLAGS="-DRPC $CFLAGS"
+       COMPILE_OPTS="$COMPILE_OPTS RPC"
+fi
+if test "$enable_rpcsetquota" = "yes" ; then
+       CFLAGS="-DRPC_SETQUOTA $CFLAGS"
+       COMPILE_OPTS="$COMPILE_OPTS RPC_SETQUOTA"
+fi
+if test "$enable_xfs_roothack" = "yes" ; then
+       CFLAGS="-DXFS_ROOTHACK $CFLAGS"
+       COMPILE_OPTS="$COMPILE_OPTS XFS_ROOTHACK"
+fi
+if test "$enable_bsd_behaviour" = "yes" ; then
+       CFLAGS="-DBSD_BEHAVIOUR $CFLAGS"
+       COMPILE_OPTS="$COMPILE_OPTS BSD_BEHAVIOUR"
+fi
+if test "$enable_libefence" = "yes" ; then
+       LIBMALLOC="/usr/lib/libefence.a"
+fi
+if test "$enable_nls" = "yes" ; then
+       CFLAGS="-D__GETTEXT__ $CFLAGS"
+       INSTMO="inst_mo"
+fi
+if test "$enable_rootsbin" = "yes" ; then
+       ROOTSBIN="/sbin"
+else
+       ROOTSBIN='$(prefix)/sbin'
+fi
+
+
+
+
+
+
+ac_config_files="$ac_config_files Makefile"
+
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems.  If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, we kill variables containing newlines.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(
+  for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
+    eval ac_val=\$$ac_var
+    case $ac_val in #(
+    *${as_nl}*)
+      case $ac_var in #(
+      *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5
+echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      *) $as_unset $ac_var ;;
+      esac ;;
+    esac
+  done
+
+  (set) 2>&1 |
+    case $as_nl`(ac_space=' '; set) 2>&1` in #(
+    *${as_nl}ac_space=\ *)
+      # `set' does not quote correctly, so add quotes (double-quote
+      # substitution turns \\\\ into \\, and sed turns \\ into \).
+      sed -n \
+       "s/'/'\\\\''/g;
+         s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+      ;; #(
+    *)
+      # `set' quotes correctly as required by POSIX, so do not add quotes.
+      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+      ;;
+    esac |
+    sort
+) |
+  sed '
+     /^ac_cv_env_/b end
+     t clear
+     :clear
+     s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+     t end
+     s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+     :end' >>confcache
+if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
+  if test -w "$cache_file"; then
+    test "x$cache_file" != "x/dev/null" &&
+      { echo "$as_me:$LINENO: updating cache $cache_file" >&5
+echo "$as_me: updating cache $cache_file" >&6;}
+    cat confcache >$cache_file
+  else
+    { echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5
+echo "$as_me: not updating unwritable cache $cache_file" >&6;}
+  fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# Transform confdefs.h into DEFS.
+# Protect against shell expansion while executing Makefile rules.
+# Protect against Makefile macro expansion.
+#
+# If the first sed substitution is executed (which looks for macros that
+# take arguments), then branch to the quote section.  Otherwise,
+# look for a macro that doesn't take arguments.
+ac_script='
+t clear
+:clear
+s/^[    ]*#[    ]*define[       ][      ]*\([^  (][^    (]*([^)]*)\)[   ]*\(.*\)/-D\1=\2/g
+t quote
+s/^[    ]*#[    ]*define[       ][      ]*\([^  ][^     ]*\)[   ]*\(.*\)/-D\1=\2/g
+t quote
+b any
+:quote
+s/[     `~#$^&*(){}\\|;'\''"<>?]/\\&/g
+s/\[/\\&/g
+s/\]/\\&/g
+s/\$/$$/g
+H
+:any
+${
+       g
+       s/^\n//
+       s/\n/ /g
+       p
+}
+'
+DEFS=`sed -n "$ac_script" confdefs.h`
+
+
+ac_libobjs=
+ac_ltlibobjs=
+for ac_i in : $LIB@&t@OBJS; do test "x$ac_i" = x: && continue
+  # 1. Remove the extension, and $U if already installed.
+  ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
+  ac_i=`echo "$ac_i" | sed "$ac_script"`
+  # 2. Prepend LIBOBJDIR.  When used with automake>=1.10 LIBOBJDIR
+  #    will be set to the directory where LIBOBJS objects are built.
+  ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext"
+  ac_ltlibobjs="$ac_ltlibobjs \${LIBOBJDIR}$ac_i"'$U.lo'
+done
+LIB@&t@OBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+
+: ${CONFIG_STATUS=./config.status}
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5
+echo "$as_me: creating $CONFIG_STATUS" >&6;}
+cat >$CONFIG_STATUS <<_ACEOF
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+SHELL=\${CONFIG_SHELL-$SHELL}
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+## --------------------- ##
+## M4sh Initialization.  ##
+## --------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in
+  *posix*) set -o posix ;;
+esac
+
+fi
+
+
+
+
+# PATH needs CR
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  echo "#! /bin/sh" >conf$$.sh
+  echo  "exit 0"   >>conf$$.sh
+  chmod +x conf$$.sh
+  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+    PATH_SEPARATOR=';'
+  else
+    PATH_SEPARATOR=:
+  fi
+  rm -f conf$$.sh
+fi
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  as_unset=unset
+else
+  as_unset=false
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+as_nl='
+'
+IFS=" ""       $as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+case $0 in
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+IFS=$as_save_IFS
+
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  { (exit 1); exit 1; }
+fi
+
+# Work around bugs in pre-3.0 UWIN ksh.
+for as_var in ENV MAIL MAILPATH
+do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+  LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+  LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+  LC_TELEPHONE LC_TIME
+do
+  if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+    eval $as_var=C; export $as_var
+  else
+    ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+  fi
+done
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+        X"$0" : 'X\(//\)$' \| \
+        X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+           s//\1/
+           q
+         }
+         /^X\/\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\/\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+
+# CDPATH.
+$as_unset CDPATH
+
+
+
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || {
+
+  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+  # uniformly replaced by the line number.  The first 'sed' inserts a
+  # line-number line after each line using $LINENO; the second 'sed'
+  # does the real work.  The second script uses 'N' to pair each
+  # line-number line with the line containing $LINENO, and appends
+  # trailing '-' during substitution so that $LINENO is not a special
+  # case at line end.
+  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+  # scripts with optimization help from Paolo Bonzini.  Blame Lee
+  # E. McMahon (1931-1989) for sed's syntax.  :-)
+  sed -n '
+    p
+    /[$]LINENO/=
+  ' <$as_myself |
+    sed '
+      s/[$]LINENO.*/&-/
+      t lineno
+      b
+      :lineno
+      N
+      :loop
+      s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
+      t loop
+      s/-\n.*//
+    ' >$as_me.lineno &&
+  chmod +x "$as_me.lineno" ||
+    { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
+   { (exit 1); exit 1; }; }
+
+  # Don't try to exec as it changes $[0], causing all sort of problems
+  # (the dirname of $[0] is not the place where we might find the
+  # original and so on.  Autoconf is especially sensitive to this).
+  . "./$as_me.lineno"
+  # Exit status is that of the last command.
+  exit
+}
+
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in
+-n*)
+  case `echo 'x\c'` in
+  *c*) ECHO_T='        ';;     # ECHO_T is single tab character.
+  *)   ECHO_C='\c';;
+  esac;;
+*)
+  ECHO_N='-n';;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir
+fi
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+  as_ln_s='ln -s'
+  # ... but there are two gotchas:
+  # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+  # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+  # In both cases, we have to default to `cp -p'.
+  ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+    as_ln_s='cp -p'
+elif ln conf$$.file conf$$ 2>/dev/null; then
+  as_ln_s=ln
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p=:
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+if test -x / >/dev/null 2>&1; then
+  as_test_x='test -x'
+else
+  if ls -dL / >/dev/null 2>&1; then
+    as_ls_L_option=L
+  else
+    as_ls_L_option=
+  fi
+  as_test_x='
+    eval sh -c '\''
+      if test -d "$1"; then
+        test -d "$1/.";
+      else
+       case $1 in
+        -*)set "./$1";;
+       esac;
+       case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in
+       ???[sx]*):;;*)false;;esac;fi
+    '\'' sh
+  '
+fi
+as_executable_p=$as_test_x
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+exec 6>&1
+
+# Save the log message, to keep $[0] and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling.
+ac_log="
+This file was extended by $as_me, which was
+generated by GNU Autoconf 2.61.  Invocation command line was
+
+  CONFIG_FILES    = $CONFIG_FILES
+  CONFIG_HEADERS  = $CONFIG_HEADERS
+  CONFIG_LINKS    = $CONFIG_LINKS
+  CONFIG_COMMANDS = $CONFIG_COMMANDS
+  $ $0 $@
+
+on `(hostname || uname -n) 2>/dev/null | sed 1q`
+"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+# Files that config.status was made for.
+config_files="$ac_config_files"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+ac_cs_usage="\
+\`$as_me' instantiates files from templates according to the
+current configuration.
+
+Usage: $0 [OPTIONS] [FILE]...
+
+  -h, --help       print this help, then exit
+  -V, --version    print version number and configuration settings, then exit
+  -q, --quiet      do not print progress messages
+  -d, --debug      don't remove temporary files
+      --recheck    update $as_me by reconfiguring in the same conditions
+  --file=FILE[:TEMPLATE]
+                  instantiate the configuration file FILE
+
+Configuration files:
+$config_files
+
+Report bugs to <bug-autoconf@gnu.org>."
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+ac_cs_version="\\
+config.status
+configured by $0, generated by GNU Autoconf 2.61,
+  with options \\"`echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\"
+
+Copyright (C) 2006 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+
+ac_pwd='$ac_pwd'
+srcdir='$srcdir'
+INSTALL='$INSTALL'
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+# If no file are specified by the user, then we need to provide default
+# value.  By we need to know if files were specified by the user.
+ac_need_defaults=:
+while test $# != 0
+do
+  case $1 in
+  --*=*)
+    ac_option=`expr "X$1" : 'X\([^=]*\)='`
+    ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
+    ac_shift=:
+    ;;
+  *)
+    ac_option=$1
+    ac_optarg=$2
+    ac_shift=shift
+    ;;
+  esac
+
+  case $ac_option in
+  # Handling of the options.
+  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+    ac_cs_recheck=: ;;
+  --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
+    echo "$ac_cs_version"; exit ;;
+  --debug | --debu | --deb | --de | --d | -d )
+    debug=: ;;
+  --file | --fil | --fi | --f )
+    $ac_shift
+    CONFIG_FILES="$CONFIG_FILES $ac_optarg"
+    ac_need_defaults=false;;
+  --he | --h |  --help | --hel | -h )
+    echo "$ac_cs_usage"; exit ;;
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil | --si | --s)
+    ac_cs_silent=: ;;
+
+  # This is an error.
+  -*) { echo "$as_me: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&2
+   { (exit 1); exit 1; }; } ;;
+
+  *) ac_config_targets="$ac_config_targets $1"
+     ac_need_defaults=false ;;
+
+  esac
+  shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+  exec 6>/dev/null
+  ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+if \$ac_cs_recheck; then
+  echo "running CONFIG_SHELL=$SHELL $SHELL $0 "$ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6
+  CONFIG_SHELL=$SHELL
+  export CONFIG_SHELL
+  exec $SHELL "$0"$ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+exec 5>>config.log
+{
+  echo
+  sed 'h;s/./-/g;s/^.../@%:@@%:@ /;s/...$/ @%:@@%:@/;p;x;p;x' <<_ASBOX
+@%:@@%:@ Running $as_me. @%:@@%:@
+_ASBOX
+  echo "$ac_log"
+} >&5
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+# Handling of arguments.
+for ac_config_target in $ac_config_targets
+do
+  case $ac_config_target in
+    "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+
+  *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5
+echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
+   { (exit 1); exit 1; }; };;
+  esac
+done
+
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used.  Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+  test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+fi
+
+# Have a temporary directory for convenience.  Make it in the build tree
+# simply because there is no reason against having it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Hook for its removal unless debugging.
+# Note that there is a small window in which the directory will not be cleaned:
+# after its creation but before its name has been assigned to `$tmp'.
+$debug ||
+{
+  tmp=
+  trap 'exit_status=$?
+  { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status
+' 0
+  trap '{ (exit 1); exit 1; }' 1 2 13 15
+}
+# Create a (secure) tmp directory for tmp files.
+
+{
+  tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
+  test -n "$tmp" && test -d "$tmp"
+}  ||
+{
+  tmp=./conf$$-$RANDOM
+  (umask 077 && mkdir "$tmp")
+} ||
+{
+   echo "$me: cannot create a temporary directory in ." >&2
+   { (exit 1); exit 1; }
+}
+
+#
+# Set up the sed scripts for CONFIG_FILES section.
+#
+
+# No need to generate the scripts if there are no CONFIG_FILES.
+# This happens for instance when ./config.status config.h
+if test -n "$CONFIG_FILES"; then
+
+_ACEOF
+
+
+
+ac_delim='%!_!# '
+for ac_last_try in false false false false false :; do
+  cat >conf$$subs.sed <<_ACEOF
+SHELL!$SHELL$ac_delim
+PATH_SEPARATOR!$PATH_SEPARATOR$ac_delim
+PACKAGE_NAME!$PACKAGE_NAME$ac_delim
+PACKAGE_TARNAME!$PACKAGE_TARNAME$ac_delim
+PACKAGE_VERSION!$PACKAGE_VERSION$ac_delim
+PACKAGE_STRING!$PACKAGE_STRING$ac_delim
+PACKAGE_BUGREPORT!$PACKAGE_BUGREPORT$ac_delim
+exec_prefix!$exec_prefix$ac_delim
+prefix!$prefix$ac_delim
+program_transform_name!$program_transform_name$ac_delim
+bindir!$bindir$ac_delim
+sbindir!$sbindir$ac_delim
+libexecdir!$libexecdir$ac_delim
+datarootdir!$datarootdir$ac_delim
+datadir!$datadir$ac_delim
+sysconfdir!$sysconfdir$ac_delim
+sharedstatedir!$sharedstatedir$ac_delim
+localstatedir!$localstatedir$ac_delim
+includedir!$includedir$ac_delim
+oldincludedir!$oldincludedir$ac_delim
+docdir!$docdir$ac_delim
+infodir!$infodir$ac_delim
+htmldir!$htmldir$ac_delim
+dvidir!$dvidir$ac_delim
+pdfdir!$pdfdir$ac_delim
+psdir!$psdir$ac_delim
+libdir!$libdir$ac_delim
+localedir!$localedir$ac_delim
+mandir!$mandir$ac_delim
+DEFS!$DEFS$ac_delim
+ECHO_C!$ECHO_C$ac_delim
+ECHO_N!$ECHO_N$ac_delim
+ECHO_T!$ECHO_T$ac_delim
+LIBS!$LIBS$ac_delim
+build_alias!$build_alias$ac_delim
+host_alias!$host_alias$ac_delim
+target_alias!$target_alias$ac_delim
+CC!$CC$ac_delim
+CFLAGS!$CFLAGS$ac_delim
+LDFLAGS!$LDFLAGS$ac_delim
+CPPFLAGS!$CPPFLAGS$ac_delim
+ac_ct_CC!$ac_ct_CC$ac_delim
+EXEEXT!$EXEEXT$ac_delim
+OBJEXT!$OBJEXT$ac_delim
+CPP!$CPP$ac_delim
+GREP!$GREP$ac_delim
+EGREP!$EGREP$ac_delim
+INSTALL_PROGRAM!$INSTALL_PROGRAM$ac_delim
+INSTALL_SCRIPT!$INSTALL_SCRIPT$ac_delim
+INSTALL_DATA!$INSTALL_DATA$ac_delim
+LDAPLIBS!$LDAPLIBS$ac_delim
+EXT2_DIRECT!$EXT2_DIRECT$ac_delim
+EXT2LIBS!$EXT2LIBS$ac_delim
+QUOTA_NETLINK_PROG!$QUOTA_NETLINK_PROG$ac_delim
+NETLINKLIBS!$NETLINKLIBS$ac_delim
+HOSTS_ACCESS!$HOSTS_ACCESS$ac_delim
+COMPILE_OPTS!$COMPILE_OPTS$ac_delim
+LIBMALLOC!$LIBMALLOC$ac_delim
+INSTMO!$INSTMO$ac_delim
+ROOTSBIN!$ROOTSBIN$ac_delim
+LIB@&t@OBJS!$LIB@&t@OBJS$ac_delim
+LTLIBOBJS!$LTLIBOBJS$ac_delim
+_ACEOF
+
+  if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 62; then
+    break
+  elif $ac_last_try; then
+    { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
+echo "$as_me: error: could not make $CONFIG_STATUS" >&2;}
+   { (exit 1); exit 1; }; }
+  else
+    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+  fi
+done
+
+ac_eof=`sed -n '/^CEOF[0-9]*$/s/CEOF/0/p' conf$$subs.sed`
+if test -n "$ac_eof"; then
+  ac_eof=`echo "$ac_eof" | sort -nru | sed 1q`
+  ac_eof=`expr $ac_eof + 1`
+fi
+
+cat >>$CONFIG_STATUS <<_ACEOF
+cat >"\$tmp/subs-1.sed" <<\CEOF$ac_eof
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b end
+_ACEOF
+sed '
+s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g
+s/^/s,@/; s/!/@,|#_!!_#|/
+:n
+t n
+s/'"$ac_delim"'$/,g/; t
+s/$/\\/; p
+N; s/^.*\n//; s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g; b n
+' >>$CONFIG_STATUS <conf$$subs.sed
+rm -f conf$$subs.sed
+cat >>$CONFIG_STATUS <<_ACEOF
+:end
+s/|#_!!_#|//g
+CEOF$ac_eof
+_ACEOF
+
+
+# VPATH may cause trouble with some makes, so we remove $(srcdir),
+# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+  ac_vpsub='/^[         ]*VPATH[        ]*=/{
+s/:*\$(srcdir):*/:/
+s/:*\${srcdir}:*/:/
+s/:*@srcdir@:*/:/
+s/^\([^=]*=[    ]*\):*/\1/
+s/:*$//
+s/^[^=]*=[      ]*$//
+}'
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+fi # test -n "$CONFIG_FILES"
+
+
+for ac_tag in  :F $CONFIG_FILES      
+do
+  case $ac_tag in
+  :[FHLC]) ac_mode=$ac_tag; continue;;
+  esac
+  case $ac_mode$ac_tag in
+  :[FHL]*:*);;
+  :L* | :C*:*) { { echo "$as_me:$LINENO: error: Invalid tag $ac_tag." >&5
+echo "$as_me: error: Invalid tag $ac_tag." >&2;}
+   { (exit 1); exit 1; }; };;
+  :[FH]-) ac_tag=-:-;;
+  :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
+  esac
+  ac_save_IFS=$IFS
+  IFS=:
+  set x $ac_tag
+  IFS=$ac_save_IFS
+  shift
+  ac_file=$1
+  shift
+
+  case $ac_mode in
+  :L) ac_source=$1;;
+  :[FH])
+    ac_file_inputs=
+    for ac_f
+    do
+      case $ac_f in
+      -) ac_f="$tmp/stdin";;
+      *) # Look for the file first in the build tree, then in the source tree
+        # (if the path is not absolute).  The absolute path cannot be DOS-style,
+        # because $ac_f cannot contain `:'.
+        test -f "$ac_f" ||
+          case $ac_f in
+          [\\/$]*) false;;
+          *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
+          esac ||
+          { { echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5
+echo "$as_me: error: cannot find input file: $ac_f" >&2;}
+   { (exit 1); exit 1; }; };;
+      esac
+      ac_file_inputs="$ac_file_inputs $ac_f"
+    done
+
+    # Let's still pretend it is `configure' which instantiates (i.e., don't
+    # use $as_me), people would be surprised to read:
+    #    /* config.h.  Generated by config.status.  */
+    configure_input="Generated from "`IFS=:
+         echo $* | sed 's|^[^:]*/||;s|:[^:]*/|, |g'`" by configure."
+    if test x"$ac_file" != x-; then
+      configure_input="$ac_file.  $configure_input"
+      { echo "$as_me:$LINENO: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+    fi
+
+    case $ac_tag in
+    *:-:* | *:-) cat >"$tmp/stdin";;
+    esac
+    ;;
+  esac
+
+  ac_dir=`$as_dirname -- "$ac_file" ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$ac_file" : 'X\(//\)[^/]' \| \
+        X"$ac_file" : 'X\(//\)$' \| \
+        X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
+echo X"$ac_file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)[^/].*/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+  { as_dir="$ac_dir"
+  case $as_dir in #(
+  -*) as_dir=./$as_dir;;
+  esac
+  test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || {
+    as_dirs=
+    while :; do
+      case $as_dir in #(
+      *\'*) as_qdir=`echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #(
+      *) as_qdir=$as_dir;;
+      esac
+      as_dirs="'$as_qdir' $as_dirs"
+      as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$as_dir" : 'X\(//\)[^/]' \| \
+        X"$as_dir" : 'X\(//\)$' \| \
+        X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)[^/].*/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+      test -d "$as_dir" && break
+    done
+    test -z "$as_dirs" || eval "mkdir $as_dirs"
+  } || test -d "$as_dir" || { { echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5
+echo "$as_me: error: cannot create directory $as_dir" >&2;}
+   { (exit 1); exit 1; }; }; }
+  ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+  .)  # We are building in place.
+    ac_srcdir=.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+
+  case $ac_mode in
+  :F)
+  #
+  # CONFIG_FILE
+  #
+
+  case $INSTALL in
+  [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+  *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;
+  esac
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+# If the template does not know about datarootdir, expand it.
+# FIXME: This hack should be removed a few years after 2.60.
+ac_datarootdir_hack=; ac_datarootdir_seen=
+
+case `sed -n '/datarootdir/ {
+  p
+  q
+}
+/@datadir@/p
+/@docdir@/p
+/@infodir@/p
+/@localedir@/p
+/@mandir@/p
+' $ac_file_inputs` in
+*datarootdir*) ac_datarootdir_seen=yes;;
+*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
+  { echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+  ac_datarootdir_hack='
+  s&@datadir@&$datadir&g
+  s&@docdir@&$docdir&g
+  s&@infodir@&$infodir&g
+  s&@localedir@&$localedir&g
+  s&@mandir@&$mandir&g
+    s&\\\${datarootdir}&$datarootdir&g' ;;
+esac
+_ACEOF
+
+# Neutralize VPATH when `$srcdir' = `.'.
+# Shell code in configure.ac might set extrasub.
+# FIXME: do we really want to maintain this feature?
+cat >>$CONFIG_STATUS <<_ACEOF
+  sed "$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s&@configure_input@&$configure_input&;t t
+s&@top_builddir@&$ac_top_builddir_sub&;t t
+s&@srcdir@&$ac_srcdir&;t t
+s&@abs_srcdir@&$ac_abs_srcdir&;t t
+s&@top_srcdir@&$ac_top_srcdir&;t t
+s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
+s&@builddir@&$ac_builddir&;t t
+s&@abs_builddir@&$ac_abs_builddir&;t t
+s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
+s&@INSTALL@&$ac_INSTALL&;t t
+$ac_datarootdir_hack
+" $ac_file_inputs | sed -f "$tmp/subs-1.sed" >$tmp/out
+
+test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
+  { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } &&
+  { ac_out=`sed -n '/^[         ]*datarootdir[  ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } &&
+  { echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined." >&5
+echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined." >&2;}
+
+  rm -f "$tmp/stdin"
+  case $ac_file in
+  -) cat "$tmp/out"; rm -f "$tmp/out";;
+  *) rm -f "$ac_file"; mv "$tmp/out" $ac_file;;
+  esac
+ ;;
+  
+  
+  
+  esac
+
+done # for ac_tag
+
+
+{ (exit 0); exit 0; }
+_ACEOF
+chmod +x $CONFIG_STATUS
+ac_clean_files=$ac_clean_files_save
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded.  So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status.  When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+  ac_cs_success=:
+  ac_config_status_args=
+  test "$silent" = yes &&
+    ac_config_status_args="$ac_config_status_args --quiet"
+  exec 5>/dev/null
+  $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
+  exec 5>>config.log
+  # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+  # would make configure fail if this is the last instruction.
+  $ac_cs_success || { (exit 1); exit 1; }
+fi
+
diff --git a/autom4te.cache/output.1 b/autom4te.cache/output.1
new file mode 100644 (file)
index 0000000..722df3a
--- /dev/null
@@ -0,0 +1,5924 @@
+@%:@! /bin/sh
+@%:@ Guess values for system-dependent variables and create Makefiles.
+@%:@ Generated by GNU Autoconf 2.61.
+@%:@ 
+@%:@ Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
+@%:@ 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+@%:@ This configure script is free software; the Free Software Foundation
+@%:@ gives unlimited permission to copy, distribute and modify it.
+## --------------------- ##
+## M4sh Initialization.  ##
+## --------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in
+  *posix*) set -o posix ;;
+esac
+
+fi
+
+
+
+
+# PATH needs CR
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  echo "#! /bin/sh" >conf$$.sh
+  echo  "exit 0"   >>conf$$.sh
+  chmod +x conf$$.sh
+  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+    PATH_SEPARATOR=';'
+  else
+    PATH_SEPARATOR=:
+  fi
+  rm -f conf$$.sh
+fi
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  as_unset=unset
+else
+  as_unset=false
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+as_nl='
+'
+IFS=" ""       $as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+case $0 in
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+IFS=$as_save_IFS
+
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  { (exit 1); exit 1; }
+fi
+
+# Work around bugs in pre-3.0 UWIN ksh.
+for as_var in ENV MAIL MAILPATH
+do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+  LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+  LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+  LC_TELEPHONE LC_TIME
+do
+  if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+    eval $as_var=C; export $as_var
+  else
+    ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+  fi
+done
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+        X"$0" : 'X\(//\)$' \| \
+        X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+           s//\1/
+           q
+         }
+         /^X\/\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\/\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+
+# CDPATH.
+$as_unset CDPATH
+
+
+if test "x$CONFIG_SHELL" = x; then
+  if (eval ":") 2>/dev/null; then
+  as_have_required=yes
+else
+  as_have_required=no
+fi
+
+  if test $as_have_required = yes &&    (eval ":
+(as_func_return () {
+  (exit \$1)
+}
+as_func_success () {
+  as_func_return 0
+}
+as_func_failure () {
+  as_func_return 1
+}
+as_func_ret_success () {
+  return 0
+}
+as_func_ret_failure () {
+  return 1
+}
+
+exitcode=0
+if as_func_success; then
+  :
+else
+  exitcode=1
+  echo as_func_success failed.
+fi
+
+if as_func_failure; then
+  exitcode=1
+  echo as_func_failure succeeded.
+fi
+
+if as_func_ret_success; then
+  :
+else
+  exitcode=1
+  echo as_func_ret_success failed.
+fi
+
+if as_func_ret_failure; then
+  exitcode=1
+  echo as_func_ret_failure succeeded.
+fi
+
+if ( set x; as_func_ret_success y && test x = \"\$1\" ); then
+  :
+else
+  exitcode=1
+  echo positional parameters were not saved.
+fi
+
+test \$exitcode = 0) || { (exit 1); exit 1; }
+
+(
+  as_lineno_1=\$LINENO
+  as_lineno_2=\$LINENO
+  test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" &&
+  test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; }
+") 2> /dev/null; then
+  :
+else
+  as_candidate_shells=
+    as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  case $as_dir in
+        /*)
+          for as_base in sh bash ksh sh5; do
+            as_candidate_shells="$as_candidate_shells $as_dir/$as_base"
+          done;;
+       esac
+done
+IFS=$as_save_IFS
+
+
+      for as_shell in $as_candidate_shells $SHELL; do
+        # Try only shells that exist, to save several forks.
+        if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
+               { ("$as_shell") 2> /dev/null <<\_ASEOF
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in
+  *posix*) set -o posix ;;
+esac
+
+fi
+
+
+:
+_ASEOF
+}; then
+  CONFIG_SHELL=$as_shell
+              as_have_required=yes
+              if { "$as_shell" 2> /dev/null <<\_ASEOF
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in
+  *posix*) set -o posix ;;
+esac
+
+fi
+
+
+:
+(as_func_return () {
+  (exit $1)
+}
+as_func_success () {
+  as_func_return 0
+}
+as_func_failure () {
+  as_func_return 1
+}
+as_func_ret_success () {
+  return 0
+}
+as_func_ret_failure () {
+  return 1
+}
+
+exitcode=0
+if as_func_success; then
+  :
+else
+  exitcode=1
+  echo as_func_success failed.
+fi
+
+if as_func_failure; then
+  exitcode=1
+  echo as_func_failure succeeded.
+fi
+
+if as_func_ret_success; then
+  :
+else
+  exitcode=1
+  echo as_func_ret_success failed.
+fi
+
+if as_func_ret_failure; then
+  exitcode=1
+  echo as_func_ret_failure succeeded.
+fi
+
+if ( set x; as_func_ret_success y && test x = "$1" ); then
+  :
+else
+  exitcode=1
+  echo positional parameters were not saved.
+fi
+
+test $exitcode = 0) || { (exit 1); exit 1; }
+
+(
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; }
+
+_ASEOF
+}; then
+  break
+fi
+
+fi
+
+      done
+
+      if test "x$CONFIG_SHELL" != x; then
+  for as_var in BASH_ENV ENV
+        do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+        done
+        export CONFIG_SHELL
+        exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"}
+fi
+
+
+    if test $as_have_required = no; then
+  echo This script requires a shell more modern than all the
+      echo shells that I found on your system.  Please install a
+      echo modern shell, or manually run the script under such a
+      echo shell if you do have one.
+      { (exit 1); exit 1; }
+fi
+
+    
+fi
+
+fi
+
+
+
+(eval "as_func_return () {
+  (exit \$1)
+}
+as_func_success () {
+  as_func_return 0
+}
+as_func_failure () {
+  as_func_return 1
+}
+as_func_ret_success () {
+  return 0
+}
+as_func_ret_failure () {
+  return 1
+}
+
+exitcode=0
+if as_func_success; then
+  :
+else
+  exitcode=1
+  echo as_func_success failed.
+fi
+
+if as_func_failure; then
+  exitcode=1
+  echo as_func_failure succeeded.
+fi
+
+if as_func_ret_success; then
+  :
+else
+  exitcode=1
+  echo as_func_ret_success failed.
+fi
+
+if as_func_ret_failure; then
+  exitcode=1
+  echo as_func_ret_failure succeeded.
+fi
+
+if ( set x; as_func_ret_success y && test x = \"\$1\" ); then
+  :
+else
+  exitcode=1
+  echo positional parameters were not saved.
+fi
+
+test \$exitcode = 0") || {
+  echo No shell found that supports shell functions.
+  echo Please tell autoconf@gnu.org about your system,
+  echo including any error possibly output before this
+  echo message
+}
+
+
+
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || {
+
+  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+  # uniformly replaced by the line number.  The first 'sed' inserts a
+  # line-number line after each line using $LINENO; the second 'sed'
+  # does the real work.  The second script uses 'N' to pair each
+  # line-number line with the line containing $LINENO, and appends
+  # trailing '-' during substitution so that $LINENO is not a special
+  # case at line end.
+  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+  # scripts with optimization help from Paolo Bonzini.  Blame Lee
+  # E. McMahon (1931-1989) for sed's syntax.  :-)
+  sed -n '
+    p
+    /[$]LINENO/=
+  ' <$as_myself |
+    sed '
+      s/[$]LINENO.*/&-/
+      t lineno
+      b
+      :lineno
+      N
+      :loop
+      s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
+      t loop
+      s/-\n.*//
+    ' >$as_me.lineno &&
+  chmod +x "$as_me.lineno" ||
+    { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
+   { (exit 1); exit 1; }; }
+
+  # Don't try to exec as it changes $[0], causing all sort of problems
+  # (the dirname of $[0] is not the place where we might find the
+  # original and so on.  Autoconf is especially sensitive to this).
+  . "./$as_me.lineno"
+  # Exit status is that of the last command.
+  exit
+}
+
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in
+-n*)
+  case `echo 'x\c'` in
+  *c*) ECHO_T='        ';;     # ECHO_T is single tab character.
+  *)   ECHO_C='\c';;
+  esac;;
+*)
+  ECHO_N='-n';;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir
+fi
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+  as_ln_s='ln -s'
+  # ... but there are two gotchas:
+  # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+  # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+  # In both cases, we have to default to `cp -p'.
+  ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+    as_ln_s='cp -p'
+elif ln conf$$.file conf$$ 2>/dev/null; then
+  as_ln_s=ln
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p=:
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+if test -x / >/dev/null 2>&1; then
+  as_test_x='test -x'
+else
+  if ls -dL / >/dev/null 2>&1; then
+    as_ls_L_option=L
+  else
+    as_ls_L_option=
+  fi
+  as_test_x='
+    eval sh -c '\''
+      if test -d "$1"; then
+        test -d "$1/.";
+      else
+       case $1 in
+        -*)set "./$1";;
+       esac;
+       case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in
+       ???[sx]*):;;*)false;;esac;fi
+    '\'' sh
+  '
+fi
+as_executable_p=$as_test_x
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+
+exec 7<&0 </dev/null 6>&1
+
+# Name of the host.
+# hostname on some systems (SVR3.2, Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+ac_clean_files=
+ac_config_libobj_dir=.
+LIB@&t@OBJS=
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+# Identity of this package.
+PACKAGE_NAME=
+PACKAGE_TARNAME=
+PACKAGE_VERSION=
+PACKAGE_STRING=
+PACKAGE_BUGREPORT=
+
+ac_unique_file="quota.c"
+# Factoring default headers for most tests.
+ac_includes_default="\
+#include <stdio.h>
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+#ifdef STDC_HEADERS
+# include <stdlib.h>
+# include <stddef.h>
+#else
+# ifdef HAVE_STDLIB_H
+#  include <stdlib.h>
+# endif
+#endif
+#ifdef HAVE_STRING_H
+# if !defined STDC_HEADERS && defined HAVE_MEMORY_H
+#  include <memory.h>
+# endif
+# include <string.h>
+#endif
+#ifdef HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+# include <inttypes.h>
+#endif
+#ifdef HAVE_STDINT_H
+# include <stdint.h>
+#endif
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif"
+
+ac_subst_vars='SHELL
+PATH_SEPARATOR
+PACKAGE_NAME
+PACKAGE_TARNAME
+PACKAGE_VERSION
+PACKAGE_STRING
+PACKAGE_BUGREPORT
+exec_prefix
+prefix
+program_transform_name
+bindir
+sbindir
+libexecdir
+datarootdir
+datadir
+sysconfdir
+sharedstatedir
+localstatedir
+includedir
+oldincludedir
+docdir
+infodir
+htmldir
+dvidir
+pdfdir
+psdir
+libdir
+localedir
+mandir
+DEFS
+ECHO_C
+ECHO_N
+ECHO_T
+LIBS
+build_alias
+host_alias
+target_alias
+CC
+CFLAGS
+LDFLAGS
+CPPFLAGS
+ac_ct_CC
+EXEEXT
+OBJEXT
+CPP
+GREP
+EGREP
+INSTALL_PROGRAM
+INSTALL_SCRIPT
+INSTALL_DATA
+LDAPLIBS
+EXT2_DIRECT
+EXT2LIBS
+PKG_CONFIG
+DBUS_CFLAGS
+DBUS_LIBS
+QUOTA_NETLINK_PROG
+NETLINKLIBS
+HOSTS_ACCESS
+COMPILE_OPTS
+LIBMALLOC
+INSTMO
+ROOTSBIN
+LIB@&t@OBJS
+LTLIBOBJS'
+ac_subst_files=''
+      ac_precious_vars='build_alias
+host_alias
+target_alias
+CC
+CFLAGS
+LDFLAGS
+LIBS
+CPPFLAGS
+CPP
+PKG_CONFIG
+DBUS_CFLAGS
+DBUS_LIBS'
+
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+# (The list follows the same order as the GNU Coding Standards.)
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datarootdir='${prefix}/share'
+datadir='${datarootdir}'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+docdir='${datarootdir}/doc/${PACKAGE}'
+infodir='${datarootdir}/info'
+htmldir='${docdir}'
+dvidir='${docdir}'
+pdfdir='${docdir}'
+psdir='${docdir}'
+libdir='${exec_prefix}/lib'
+localedir='${datarootdir}/locale'
+mandir='${datarootdir}/man'
+
+ac_prev=
+ac_dashdash=
+for ac_option
+do
+  # If the previous option needs an argument, assign it.
+  if test -n "$ac_prev"; then
+    eval $ac_prev=\$ac_option
+    ac_prev=
+    continue
+  fi
+
+  case $ac_option in
+  *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
+  *)   ac_optarg=yes ;;
+  esac
+
+  # Accept the important Cygnus configure options, so we can diagnose typos.
+
+  case $ac_dashdash$ac_option in
+  --)
+    ac_dashdash=yes ;;
+
+  -bindir | --bindir | --bindi | --bind | --bin | --bi)
+    ac_prev=bindir ;;
+  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+    bindir=$ac_optarg ;;
+
+  -build | --build | --buil | --bui | --bu)
+    ac_prev=build_alias ;;
+  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+    build_alias=$ac_optarg ;;
+
+  -cache-file | --cache-file | --cache-fil | --cache-fi \
+  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+    ac_prev=cache_file ;;
+  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+    cache_file=$ac_optarg ;;
+
+  --config-cache | -C)
+    cache_file=config.cache ;;
+
+  -datadir | --datadir | --datadi | --datad)
+    ac_prev=datadir ;;
+  -datadir=* | --datadir=* | --datadi=* | --datad=*)
+    datadir=$ac_optarg ;;
+
+  -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
+  | --dataroo | --dataro | --datar)
+    ac_prev=datarootdir ;;
+  -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
+  | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
+    datarootdir=$ac_optarg ;;
+
+  -disable-* | --disable-*)
+    ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+   { (exit 1); exit 1; }; }
+    ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'`
+    eval enable_$ac_feature=no ;;
+
+  -docdir | --docdir | --docdi | --doc | --do)
+    ac_prev=docdir ;;
+  -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
+    docdir=$ac_optarg ;;
+
+  -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
+    ac_prev=dvidir ;;
+  -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
+    dvidir=$ac_optarg ;;
+
+  -enable-* | --enable-*)
+    ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+   { (exit 1); exit 1; }; }
+    ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'`
+    eval enable_$ac_feature=\$ac_optarg ;;
+
+  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+  | --exec | --exe | --ex)
+    ac_prev=exec_prefix ;;
+  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+  | --exec=* | --exe=* | --ex=*)
+    exec_prefix=$ac_optarg ;;
+
+  -gas | --gas | --ga | --g)
+    # Obsolete; use --with-gas.
+    with_gas=yes ;;
+
+  -help | --help | --hel | --he | -h)
+    ac_init_help=long ;;
+  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+    ac_init_help=recursive ;;
+  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+    ac_init_help=short ;;
+
+  -host | --host | --hos | --ho)
+    ac_prev=host_alias ;;
+  -host=* | --host=* | --hos=* | --ho=*)
+    host_alias=$ac_optarg ;;
+
+  -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
+    ac_prev=htmldir ;;
+  -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
+  | --ht=*)
+    htmldir=$ac_optarg ;;
+
+  -includedir | --includedir | --includedi | --included | --include \
+  | --includ | --inclu | --incl | --inc)
+    ac_prev=includedir ;;
+  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+  | --includ=* | --inclu=* | --incl=* | --inc=*)
+    includedir=$ac_optarg ;;
+
+  -infodir | --infodir | --infodi | --infod | --info | --inf)
+    ac_prev=infodir ;;
+  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+    infodir=$ac_optarg ;;
+
+  -libdir | --libdir | --libdi | --libd)
+    ac_prev=libdir ;;
+  -libdir=* | --libdir=* | --libdi=* | --libd=*)
+    libdir=$ac_optarg ;;
+
+  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+  | --libexe | --libex | --libe)
+    ac_prev=libexecdir ;;
+  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+  | --libexe=* | --libex=* | --libe=*)
+    libexecdir=$ac_optarg ;;
+
+  -localedir | --localedir | --localedi | --localed | --locale)
+    ac_prev=localedir ;;
+  -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
+    localedir=$ac_optarg ;;
+
+  -localstatedir | --localstatedir | --localstatedi | --localstated \
+  | --localstate | --localstat | --localsta | --localst | --locals)
+    ac_prev=localstatedir ;;
+  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+  | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
+    localstatedir=$ac_optarg ;;
+
+  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+    ac_prev=mandir ;;
+  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+    mandir=$ac_optarg ;;
+
+  -nfp | --nfp | --nf)
+    # Obsolete; use --without-fp.
+    with_fp=no ;;
+
+  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+  | --no-cr | --no-c | -n)
+    no_create=yes ;;
+
+  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+    no_recursion=yes ;;
+
+  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+  | --oldin | --oldi | --old | --ol | --o)
+    ac_prev=oldincludedir ;;
+  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+    oldincludedir=$ac_optarg ;;
+
+  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+    ac_prev=prefix ;;
+  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+    prefix=$ac_optarg ;;
+
+  -program-prefix | --program-prefix | --program-prefi | --program-pref \
+  | --program-pre | --program-pr | --program-p)
+    ac_prev=program_prefix ;;
+  -program-prefix=* | --program-prefix=* | --program-prefi=* \
+  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+    program_prefix=$ac_optarg ;;
+
+  -program-suffix | --program-suffix | --program-suffi | --program-suff \
+  | --program-suf | --program-su | --program-s)
+    ac_prev=program_suffix ;;
+  -program-suffix=* | --program-suffix=* | --program-suffi=* \
+  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+    program_suffix=$ac_optarg ;;
+
+  -program-transform-name | --program-transform-name \
+  | --program-transform-nam | --program-transform-na \
+  | --program-transform-n | --program-transform- \
+  | --program-transform | --program-transfor \
+  | --program-transfo | --program-transf \
+  | --program-trans | --program-tran \
+  | --progr-tra | --program-tr | --program-t)
+    ac_prev=program_transform_name ;;
+  -program-transform-name=* | --program-transform-name=* \
+  | --program-transform-nam=* | --program-transform-na=* \
+  | --program-transform-n=* | --program-transform-=* \
+  | --program-transform=* | --program-transfor=* \
+  | --program-transfo=* | --program-transf=* \
+  | --program-trans=* | --program-tran=* \
+  | --progr-tra=* | --program-tr=* | --program-t=*)
+    program_transform_name=$ac_optarg ;;
+
+  -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
+    ac_prev=pdfdir ;;
+  -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
+    pdfdir=$ac_optarg ;;
+
+  -psdir | --psdir | --psdi | --psd | --ps)
+    ac_prev=psdir ;;
+  -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
+    psdir=$ac_optarg ;;
+
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil)
+    silent=yes ;;
+
+  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+    ac_prev=sbindir ;;
+  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+  | --sbi=* | --sb=*)
+    sbindir=$ac_optarg ;;
+
+  -sharedstatedir | --sharedstatedir | --sharedstatedi \
+  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+  | --sharedst | --shareds | --shared | --share | --shar \
+  | --sha | --sh)
+    ac_prev=sharedstatedir ;;
+  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+  | --sha=* | --sh=*)
+    sharedstatedir=$ac_optarg ;;
+
+  -site | --site | --sit)
+    ac_prev=site ;;
+  -site=* | --site=* | --sit=*)
+    site=$ac_optarg ;;
+
+  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+    ac_prev=srcdir ;;
+  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+    srcdir=$ac_optarg ;;
+
+  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+  | --syscon | --sysco | --sysc | --sys | --sy)
+    ac_prev=sysconfdir ;;
+  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+    sysconfdir=$ac_optarg ;;
+
+  -target | --target | --targe | --targ | --tar | --ta | --t)
+    ac_prev=target_alias ;;
+  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+    target_alias=$ac_optarg ;;
+
+  -v | -verbose | --verbose | --verbos | --verbo | --verb)
+    verbose=yes ;;
+
+  -version | --version | --versio | --versi | --vers | -V)
+    ac_init_version=: ;;
+
+  -with-* | --with-*)
+    ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid package name: $ac_package" >&2
+   { (exit 1); exit 1; }; }
+    ac_package=`echo $ac_package | sed 's/[-.]/_/g'`
+    eval with_$ac_package=\$ac_optarg ;;
+
+  -without-* | --without-*)
+    ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid package name: $ac_package" >&2
+   { (exit 1); exit 1; }; }
+    ac_package=`echo $ac_package | sed 's/[-.]/_/g'`
+    eval with_$ac_package=no ;;
+
+  --x)
+    # Obsolete; use --with-x.
+    with_x=yes ;;
+
+  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+  | --x-incl | --x-inc | --x-in | --x-i)
+    ac_prev=x_includes ;;
+  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+    x_includes=$ac_optarg ;;
+
+  -x-libraries | --x-libraries | --x-librarie | --x-librari \
+  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+    ac_prev=x_libraries ;;
+  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+    x_libraries=$ac_optarg ;;
+
+  -*) { echo "$as_me: error: unrecognized option: $ac_option
+Try \`$0 --help' for more information." >&2
+   { (exit 1); exit 1; }; }
+    ;;
+
+  *=*)
+    ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid variable name: $ac_envvar" >&2
+   { (exit 1); exit 1; }; }
+    eval $ac_envvar=\$ac_optarg
+    export $ac_envvar ;;
+
+  *)
+    # FIXME: should be removed in autoconf 3.0.
+    echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+    expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+    : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}
+    ;;
+
+  esac
+done
+
+if test -n "$ac_prev"; then
+  ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+  { echo "$as_me: error: missing argument to $ac_option" >&2
+   { (exit 1); exit 1; }; }
+fi
+
+# Be sure to have absolute directory names.
+for ac_var in  exec_prefix prefix bindir sbindir libexecdir datarootdir \
+               datadir sysconfdir sharedstatedir localstatedir includedir \
+               oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
+               libdir localedir mandir
+do
+  eval ac_val=\$$ac_var
+  case $ac_val in
+    [\\/$]* | ?:[\\/]* )  continue;;
+    NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
+  esac
+  { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+   { (exit 1); exit 1; }; }
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+  if test "x$build_alias" = x; then
+    cross_compiling=maybe
+    echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host.
+    If a cross compiler is detected then cross compile mode will be used." >&2
+  elif test "x$build_alias" != "x$host_alias"; then
+    cross_compiling=yes
+  fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+ac_pwd=`pwd` && test -n "$ac_pwd" &&
+ac_ls_di=`ls -di .` &&
+ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
+  { echo "$as_me: error: Working directory cannot be determined" >&2
+   { (exit 1); exit 1; }; }
+test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
+  { echo "$as_me: error: pwd does not report name of working directory" >&2
+   { (exit 1); exit 1; }; }
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+  ac_srcdir_defaulted=yes
+  # Try the directory containing this script, then the parent directory.
+  ac_confdir=`$as_dirname -- "$0" ||
+$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$0" : 'X\(//\)[^/]' \| \
+        X"$0" : 'X\(//\)$' \| \
+        X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+echo X"$0" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)[^/].*/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+  srcdir=$ac_confdir
+  if test ! -r "$srcdir/$ac_unique_file"; then
+    srcdir=..
+  fi
+else
+  ac_srcdir_defaulted=no
+fi
+if test ! -r "$srcdir/$ac_unique_file"; then
+  test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
+  { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2
+   { (exit 1); exit 1; }; }
+fi
+ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
+ac_abs_confdir=`(
+       cd "$srcdir" && test -r "./$ac_unique_file" || { echo "$as_me: error: $ac_msg" >&2
+   { (exit 1); exit 1; }; }
+       pwd)`
+# When building in place, set srcdir=.
+if test "$ac_abs_confdir" = "$ac_pwd"; then
+  srcdir=.
+fi
+# Remove unnecessary trailing slashes from srcdir.
+# Double slashes in file names in object file debugging info
+# mess up M-x gdb in Emacs.
+case $srcdir in
+*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
+esac
+for ac_var in $ac_precious_vars; do
+  eval ac_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_env_${ac_var}_value=\$${ac_var}
+  eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_cv_env_${ac_var}_value=\$${ac_var}
+done
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+  # Omit some internal or obsolete options to make the list less imposing.
+  # This message is too long to be a string in the A/UX 3.1 sh.
+  cat <<_ACEOF
+\`configure' configures this package to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE.  See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+  -h, --help              display this help and exit
+      --help=short        display options specific to this package
+      --help=recursive    display the short help of all the included packages
+  -V, --version           display version information and exit
+  -q, --quiet, --silent   do not print \`checking...' messages
+      --cache-file=FILE   cache test results in FILE [disabled]
+  -C, --config-cache      alias for \`--cache-file=config.cache'
+  -n, --no-create         do not create output files
+      --srcdir=DIR        find the sources in DIR [configure dir or \`..']
+
+Installation directories:
+  --prefix=PREFIX         install architecture-independent files in PREFIX
+                         [$ac_default_prefix]
+  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
+                         [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc.  You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+  --bindir=DIR           user executables [EPREFIX/bin]
+  --sbindir=DIR          system admin executables [EPREFIX/sbin]
+  --libexecdir=DIR       program executables [EPREFIX/libexec]
+  --sysconfdir=DIR       read-only single-machine data [PREFIX/etc]
+  --sharedstatedir=DIR   modifiable architecture-independent data [PREFIX/com]
+  --localstatedir=DIR    modifiable single-machine data [PREFIX/var]
+  --libdir=DIR           object code libraries [EPREFIX/lib]
+  --includedir=DIR       C header files [PREFIX/include]
+  --oldincludedir=DIR    C header files for non-gcc [/usr/include]
+  --datarootdir=DIR      read-only arch.-independent data root [PREFIX/share]
+  --datadir=DIR          read-only architecture-independent data [DATAROOTDIR]
+  --infodir=DIR          info documentation [DATAROOTDIR/info]
+  --localedir=DIR        locale-dependent data [DATAROOTDIR/locale]
+  --mandir=DIR           man documentation [DATAROOTDIR/man]
+  --docdir=DIR           documentation root @<:@DATAROOTDIR/doc/PACKAGE@:>@
+  --htmldir=DIR          html documentation [DOCDIR]
+  --dvidir=DIR           dvi documentation [DOCDIR]
+  --pdfdir=DIR           pdf documentation [DOCDIR]
+  --psdir=DIR            ps documentation [DOCDIR]
+_ACEOF
+
+  cat <<\_ACEOF
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+
+  cat <<\_ACEOF
+
+Optional Features:
+  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
+  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
+  --enable-ldapmail=yes/no/try       Enable ldap mail address lookups default=no.
+  --enable-ext2direct=yes/no/try     Enable scanning of EXT2/EXT3 filesystem using e2fslib default=try.
+  --enable-netlink=yes/no/try   Compile daemon receiving quota messages via netlink default=no.
+  --enable-altformat=yes/no     Enable alternative format used by edquota default=yes.
+  --enable-rpc=yes/no           Enable RPC support default=yes.
+  --enable-rpcsetquota=yes/no   Use RPC for setting quotas default=no.
+  --enable-xfs_roothack=yes/no  Support old XFS root filesystems default=no.
+  --enable-bsd_behaviour=yes/no Mimic BSD behaviour default=yes.
+  --enable-libefence=yes/no     Use Electric Fence memory checks default=no.
+  --enable-nls=yes/no           Enable gettext dafault=yes.
+  --enable-rootsbin=yes/no      Use /sbin for some important binaries regardless $prefix default=no.
+
+Some influential environment variables:
+  CC          C compiler command
+  CFLAGS      C compiler flags
+  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
+              nonstandard directory <lib dir>
+  LIBS        libraries to pass to the linker, e.g. -l<library>
+  CPPFLAGS    C/C++/Objective C preprocessor flags, e.g. -I<include dir> if
+              you have headers in a nonstandard directory <include dir>
+  CPP         C preprocessor
+  PKG_CONFIG  path to pkg-config utility
+  DBUS_CFLAGS C compiler flags for DBUS, overriding pkg-config
+  DBUS_LIBS   linker flags for DBUS, overriding pkg-config
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+_ACEOF
+ac_status=$?
+fi
+
+if test "$ac_init_help" = "recursive"; then
+  # If there are subdirs, report their specific --help.
+  for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+    test -d "$ac_dir" || continue
+    ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+  .)  # We are building in place.
+    ac_srcdir=.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+    cd "$ac_dir" || { ac_status=$?; continue; }
+    # Check for guested configure.
+    if test -f "$ac_srcdir/configure.gnu"; then
+      echo &&
+      $SHELL "$ac_srcdir/configure.gnu" --help=recursive
+    elif test -f "$ac_srcdir/configure"; then
+      echo &&
+      $SHELL "$ac_srcdir/configure" --help=recursive
+    else
+      echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+    fi || ac_status=$?
+    cd "$ac_pwd" || { ac_status=$?; break; }
+  done
+fi
+
+test -n "$ac_init_help" && exit $ac_status
+if $ac_init_version; then
+  cat <<\_ACEOF
+configure
+generated by GNU Autoconf 2.61
+
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
+2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+  exit
+fi
+cat >config.log <<_ACEOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by $as_me, which was
+generated by GNU Autoconf 2.61.  Invocation command line was
+
+  $ $0 $@
+
+_ACEOF
+exec 5>>config.log
+{
+cat <<_ASUNAME
+@%:@@%:@ --------- @%:@@%:@
+@%:@@%:@ Platform. @%:@@%:@
+@%:@@%:@ --------- @%:@@%:@
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`
+
+/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+/usr/bin/hostinfo      = `(/usr/bin/hostinfo) 2>/dev/null      || echo unknown`
+/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`
+/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  echo "PATH: $as_dir"
+done
+IFS=$as_save_IFS
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+@%:@@%:@ ----------- @%:@@%:@
+@%:@@%:@ Core tests. @%:@@%:@
+@%:@@%:@ ----------- @%:@@%:@
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+  for ac_arg
+  do
+    case $ac_arg in
+    -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+    -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+    | -silent | --silent | --silen | --sile | --sil)
+      continue ;;
+    *\'*)
+      ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    esac
+    case $ac_pass in
+    1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;;
+    2)
+      ac_configure_args1="$ac_configure_args1 '$ac_arg'"
+      if test $ac_must_keep_next = true; then
+       ac_must_keep_next=false # Got value, back to normal.
+      else
+       case $ac_arg in
+         *=* | --config-cache | -C | -disable-* | --disable-* \
+         | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+         | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+         | -with-* | --with-* | -without-* | --without-* | --x)
+           case "$ac_configure_args0 " in
+             "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+           esac
+           ;;
+         -* ) ac_must_keep_next=true ;;
+       esac
+      fi
+      ac_configure_args="$ac_configure_args '$ac_arg'"
+      ;;
+    esac
+  done
+done
+$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; }
+$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; }
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log.  We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Use '\'' to represent an apostrophe within the trap.
+# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
+trap 'exit_status=$?
+  # Save into config.log some information that might help in debugging.
+  {
+    echo
+
+    cat <<\_ASBOX
+@%:@@%:@ ---------------- @%:@@%:@
+@%:@@%:@ Cache variables. @%:@@%:@
+@%:@@%:@ ---------------- @%:@@%:@
+_ASBOX
+    echo
+    # The following way of writing the cache mishandles newlines in values,
+(
+  for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
+    eval ac_val=\$$ac_var
+    case $ac_val in #(
+    *${as_nl}*)
+      case $ac_var in #(
+      *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5
+echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      *) $as_unset $ac_var ;;
+      esac ;;
+    esac
+  done
+  (set) 2>&1 |
+    case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
+    *${as_nl}ac_space=\ *)
+      sed -n \
+       "s/'\''/'\''\\\\'\'''\''/g;
+         s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
+      ;; #(
+    *)
+      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+      ;;
+    esac |
+    sort
+)
+    echo
+
+    cat <<\_ASBOX
+@%:@@%:@ ----------------- @%:@@%:@
+@%:@@%:@ Output variables. @%:@@%:@
+@%:@@%:@ ----------------- @%:@@%:@
+_ASBOX
+    echo
+    for ac_var in $ac_subst_vars
+    do
+      eval ac_val=\$$ac_var
+      case $ac_val in
+      *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+      esac
+      echo "$ac_var='\''$ac_val'\''"
+    done | sort
+    echo
+
+    if test -n "$ac_subst_files"; then
+      cat <<\_ASBOX
+@%:@@%:@ ------------------- @%:@@%:@
+@%:@@%:@ File substitutions. @%:@@%:@
+@%:@@%:@ ------------------- @%:@@%:@
+_ASBOX
+      echo
+      for ac_var in $ac_subst_files
+      do
+       eval ac_val=\$$ac_var
+       case $ac_val in
+       *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+       esac
+       echo "$ac_var='\''$ac_val'\''"
+      done | sort
+      echo
+    fi
+
+    if test -s confdefs.h; then
+      cat <<\_ASBOX
+@%:@@%:@ ----------- @%:@@%:@
+@%:@@%:@ confdefs.h. @%:@@%:@
+@%:@@%:@ ----------- @%:@@%:@
+_ASBOX
+      echo
+      cat confdefs.h
+      echo
+    fi
+    test "$ac_signal" != 0 &&
+      echo "$as_me: caught signal $ac_signal"
+    echo "$as_me: exit $exit_status"
+  } >&5
+  rm -f core *.core core.conftest.* &&
+    rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
+    exit $exit_status
+' 0
+for ac_signal in 1 2 13 15; do
+  trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -f -r conftest* confdefs.h
+
+# Predefined preprocessor variables.
+
+cat >>confdefs.h <<_ACEOF
+@%:@define PACKAGE_NAME "$PACKAGE_NAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+@%:@define PACKAGE_TARNAME "$PACKAGE_TARNAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+@%:@define PACKAGE_VERSION "$PACKAGE_VERSION"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+@%:@define PACKAGE_STRING "$PACKAGE_STRING"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+@%:@define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
+_ACEOF
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer explicitly selected file to automatically selected ones.
+if test -n "$CONFIG_SITE"; then
+  set x "$CONFIG_SITE"
+elif test "x$prefix" != xNONE; then
+  set x "$prefix/share/config.site" "$prefix/etc/config.site"
+else
+  set x "$ac_default_prefix/share/config.site" \
+       "$ac_default_prefix/etc/config.site"
+fi
+shift
+for ac_site_file
+do
+  if test -r "$ac_site_file"; then
+    { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5
+echo "$as_me: loading site script $ac_site_file" >&6;}
+    sed 's/^/| /' "$ac_site_file" >&5
+    . "$ac_site_file"
+  fi
+done
+
+if test -r "$cache_file"; then
+  # Some versions of bash will fail to source /dev/null (special
+  # files actually), so we avoid doing that.
+  if test -f "$cache_file"; then
+    { echo "$as_me:$LINENO: loading cache $cache_file" >&5
+echo "$as_me: loading cache $cache_file" >&6;}
+    case $cache_file in
+      [\\/]* | ?:[\\/]* ) . "$cache_file";;
+      *)                      . "./$cache_file";;
+    esac
+  fi
+else
+  { echo "$as_me:$LINENO: creating cache $cache_file" >&5
+echo "$as_me: creating cache $cache_file" >&6;}
+  >$cache_file
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in $ac_precious_vars; do
+  eval ac_old_set=\$ac_cv_env_${ac_var}_set
+  eval ac_new_set=\$ac_env_${ac_var}_set
+  eval ac_old_val=\$ac_cv_env_${ac_var}_value
+  eval ac_new_val=\$ac_env_${ac_var}_value
+  case $ac_old_set,$ac_new_set in
+    set,)
+      { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,set)
+      { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,);;
+    *)
+      if test "x$ac_old_val" != "x$ac_new_val"; then
+       { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5
+echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+       { echo "$as_me:$LINENO:   former value:  $ac_old_val" >&5
+echo "$as_me:   former value:  $ac_old_val" >&2;}
+       { echo "$as_me:$LINENO:   current value: $ac_new_val" >&5
+echo "$as_me:   current value: $ac_new_val" >&2;}
+       ac_cache_corrupted=:
+      fi;;
+  esac
+  # Pass precious variables to config.status.
+  if test "$ac_new_set" = set; then
+    case $ac_new_val in
+    *\'*) ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+    *) ac_arg=$ac_var=$ac_new_val ;;
+    esac
+    case " $ac_configure_args " in
+      *" '$ac_arg' "*) ;; # Avoid dups.  Use of quotes ensures accuracy.
+      *) ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+    esac
+  fi
+done
+if $ac_cache_corrupted; then
+  { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5
+echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+  { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5
+echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="${ac_tool_prefix}gcc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+  ac_ct_CC=$CC
+  # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_CC="gcc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+else
+  CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+          if test -n "$ac_tool_prefix"; then
+    # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="${ac_tool_prefix}cc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+  fi
+fi
+if test -z "$CC"; then
+  # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+       ac_prog_rejected=yes
+       continue
+     fi
+    ac_cv_prog_CC="cc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+if test $ac_prog_rejected = yes; then
+  # We found a bogon in the path, so make sure we never use it.
+  set dummy $ac_cv_prog_CC
+  shift
+  if test $@%:@ != 0; then
+    # We chose a different compiler from the bogus one.
+    # However, it has the same basename, so the bogon will be chosen
+    # first if we set CC to just the basename; use the full file name.
+    shift
+    ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+  fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+fi
+if test -z "$CC"; then
+  if test -n "$ac_tool_prefix"; then
+  for ac_prog in cl.exe
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+    test -n "$CC" && break
+  done
+fi
+if test -z "$CC"; then
+  ac_ct_CC=$CC
+  for ac_prog in cl.exe
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_CC="$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+  test -n "$ac_ct_CC" && break
+done
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+fi
+
+fi
+
+
+test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&5
+echo "$as_me: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+
+# Provide some information about the compiler.
+echo "$as_me:$LINENO: checking for C compiler version" >&5
+ac_compiler=`set X $ac_compile; echo $2`
+{ (ac_try="$ac_compiler --version >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compiler --version >&5") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (ac_try="$ac_compiler -v >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compiler -v >&5") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (ac_try="$ac_compiler -V >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compiler -V >&5") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.exe b.out"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+{ echo "$as_me:$LINENO: checking for C compiler default output file name" >&5
+echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6; }
+ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+#
+# List of possible output files, starting from the most likely.
+# The algorithm is not robust to junk in `.', hence go to wildcards (a.*)
+# only as a last resort.  b.out is created by i960 compilers.
+ac_files='a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out'
+#
+# The IRIX 6 linker writes into existing files which may not be
+# executable, retaining their permissions.  Remove them first so a
+# subsequent execution test works.
+ac_rmfiles=
+for ac_file in $ac_files
+do
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;;
+    * ) ac_rmfiles="$ac_rmfiles $ac_file";;
+  esac
+done
+rm -f $ac_rmfiles
+
+if { (ac_try="$ac_link_default"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link_default") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
+# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
+# in a Makefile.  We should not override ac_cv_exeext if it was cached,
+# so that the user can short-circuit this test for compilers unknown to
+# Autoconf.
+for ac_file in $ac_files ''
+do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj )
+       ;;
+    [ab].out )
+       # We found the default executable, but exeext='' is most
+       # certainly right.
+       break;;
+    *.* )
+        if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
+       then :; else
+          ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+       fi
+       # We set ac_cv_exeext here because the later test for it is not
+       # safe: cross compilers may not add the suffix if given an `-o'
+       # argument, so we may need to know it at that point already.
+       # Even if this section looks crufty: it has the advantage of
+       # actually working.
+       break;;
+    * )
+       break;;
+  esac
+done
+test "$ac_cv_exeext" = no && ac_cv_exeext=
+
+else
+  ac_file=''
+fi
+
+{ echo "$as_me:$LINENO: result: $ac_file" >&5
+echo "${ECHO_T}$ac_file" >&6; }
+if test -z "$ac_file"; then
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { echo "$as_me:$LINENO: error: C compiler cannot create executables
+See \`config.log' for more details." >&5
+echo "$as_me: error: C compiler cannot create executables
+See \`config.log' for more details." >&2;}
+   { (exit 77); exit 77; }; }
+fi
+
+ac_exeext=$ac_cv_exeext
+
+# Check that the compiler produces executables we can run.  If not, either
+# the compiler is broken, or we cross compile.
+{ echo "$as_me:$LINENO: checking whether the C compiler works" >&5
+echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6; }
+# FIXME: These cross compiler hacks should be removed for Autoconf 3.0
+# If not cross compiling, check that we can run a simple program.
+if test "$cross_compiling" != yes; then
+  if { ac_try='./$ac_file'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+    cross_compiling=no
+  else
+    if test "$cross_compiling" = maybe; then
+       cross_compiling=yes
+    else
+       { { echo "$as_me:$LINENO: error: cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+    fi
+  fi
+fi
+{ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+
+rm -f a.out a.exe conftest$ac_cv_exeext b.out
+ac_clean_files=$ac_clean_files_save
+# Check that the compiler produces executables we can run.  If not, either
+# the compiler is broken, or we cross compile.
+{ echo "$as_me:$LINENO: checking whether we are cross compiling" >&5
+echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6; }
+{ echo "$as_me:$LINENO: result: $cross_compiling" >&5
+echo "${ECHO_T}$cross_compiling" >&6; }
+
+{ echo "$as_me:$LINENO: checking for suffix of executables" >&5
+echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6; }
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in conftest.exe conftest conftest.*; do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;;
+    *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+         break;;
+    * ) break;;
+  esac
+done
+else
+  { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+rm -f conftest$ac_cv_exeext
+{ echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5
+echo "${ECHO_T}$ac_cv_exeext" >&6; }
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+{ echo "$as_me:$LINENO: checking for suffix of object files" >&5
+echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6; }
+if test "${ac_cv_objext+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  for ac_file in conftest.o conftest.obj conftest.*; do
+  test -f "$ac_file" || continue;
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf ) ;;
+    *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+       break;;
+  esac
+done
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute suffix of object files: cannot compile
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_objext" >&5
+echo "${ECHO_T}$ac_cv_objext" >&6; }
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+{ echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6; }
+if test "${ac_cv_c_compiler_gnu+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_compiler_gnu=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_compiler_gnu=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6; }
+GCC=`test $ac_compiler_gnu = yes && echo yes`
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+{ echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5
+echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6; }
+if test "${ac_cv_prog_cc_g+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_save_c_werror_flag=$ac_c_werror_flag
+   ac_c_werror_flag=yes
+   ac_cv_prog_cc_g=no
+   CFLAGS="-g"
+   cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_prog_cc_g=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       CFLAGS=""
+      cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_c_werror_flag=$ac_save_c_werror_flag
+        CFLAGS="-g"
+        cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_prog_cc_g=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   ac_c_werror_flag=$ac_save_c_werror_flag
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_g" >&6; }
+if test "$ac_test_CFLAGS" = set; then
+  CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+  if test "$GCC" = yes; then
+    CFLAGS="-g -O2"
+  else
+    CFLAGS="-g"
+  fi
+else
+  if test "$GCC" = yes; then
+    CFLAGS="-O2"
+  else
+    CFLAGS=
+  fi
+fi
+{ echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5
+echo $ECHO_N "checking for $CC option to accept ISO C89... $ECHO_C" >&6; }
+if test "${ac_cv_prog_cc_c89+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_prog_cc_c89=no
+ac_save_CC=$CC
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stdarg.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+     char **p;
+     int i;
+{
+  return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+  char *s;
+  va_list v;
+  va_start (v,p);
+  s = g (p, va_arg (v,int));
+  va_end (v);
+  return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
+   function prototypes and stuff, but not '\xHH' hex character constants.
+   These don't provoke an error unfortunately, instead are silently treated
+   as 'x'.  The following induces an error, until -std is added to get
+   proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
+   array size at least.  It's necessary to write '\x00'==0 to get something
+   that's true only with -std.  */
+int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+   inside strings and character constants.  */
+#define FOO(x) 'x'
+int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
+  ;
+  return 0;
+}
+_ACEOF
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
+       -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+  CC="$ac_save_CC $ac_arg"
+  rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_prog_cc_c89=$ac_arg
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       
+fi
+
+rm -f core conftest.err conftest.$ac_objext 
+  test "x$ac_cv_prog_cc_c89" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+
+fi
+# AC_CACHE_VAL
+case "x$ac_cv_prog_cc_c89" in
+  x)
+    { echo "$as_me:$LINENO: result: none needed" >&5
+echo "${ECHO_T}none needed" >&6; } ;;
+  xno)
+    { echo "$as_me:$LINENO: result: unsupported" >&5
+echo "${ECHO_T}unsupported" >&6; } ;;
+  *)
+    CC="$CC $ac_cv_prog_cc_c89"
+    { echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_c89" >&6; } ;;
+esac
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+{ echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5
+echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6; }
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+  CPP=
+fi
+if test -z "$CPP"; then
+  if test "${ac_cv_prog_CPP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+      # Double quotes because CPP needs to be expanded
+    for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
+    do
+      ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+@%:@ifdef __STDC__
+@%:@ include <limits.h>
+@%:@else
+@%:@ include <assert.h>
+@%:@endif
+                    Syntax error
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+        test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Broken: fails on valid input.
+continue
+fi
+
+rm -f conftest.err conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+@%:@include <ac_nonexistent.h>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+        test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       }; then
+  # Broken: success on invalid input.
+continue
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+  break
+fi
+
+    done
+    ac_cv_prog_CPP=$CPP
+  
+fi
+  CPP=$ac_cv_prog_CPP
+else
+  ac_cv_prog_CPP=$CPP
+fi
+{ echo "$as_me:$LINENO: result: $CPP" >&5
+echo "${ECHO_T}$CPP" >&6; }
+ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+@%:@ifdef __STDC__
+@%:@ include <limits.h>
+@%:@else
+@%:@ include <assert.h>
+@%:@endif
+                    Syntax error
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+        test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Broken: fails on valid input.
+continue
+fi
+
+rm -f conftest.err conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+@%:@include <ac_nonexistent.h>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+        test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       }; then
+  # Broken: success on invalid input.
+continue
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+  :
+else
+  { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details." >&5
+echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+{ echo "$as_me:$LINENO: checking for grep that handles long lines and -e" >&5
+echo $ECHO_N "checking for grep that handles long lines and -e... $ECHO_C" >&6; }
+if test "${ac_cv_path_GREP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  # Extract the first word of "grep ggrep" to use in msg output
+if test -z "$GREP"; then
+set dummy grep ggrep; ac_prog_name=$2
+if test "${ac_cv_path_GREP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_path_GREP_found=false
+# Loop through the user's path and test for each of PROGNAME-LIST
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_prog in grep ggrep; do
+  for ac_exec_ext in '' $ac_executable_extensions; do
+    ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
+    { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue
+    # Check for GNU ac_path_GREP and select it if it is found.
+  # Check for GNU $ac_path_GREP
+case `"$ac_path_GREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
+*)
+  ac_count=0
+  echo $ECHO_N "0123456789$ECHO_C" >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    echo 'GREP' >> "conftest.nl"
+    "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    ac_count=`expr $ac_count + 1`
+    if test $ac_count -gt ${ac_path_GREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_GREP="$ac_path_GREP"
+      ac_path_GREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+
+    $ac_path_GREP_found && break 3
+  done
+done
+
+done
+IFS=$as_save_IFS
+
+
+fi
+
+GREP="$ac_cv_path_GREP"
+if test -z "$GREP"; then
+  { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5
+echo "$as_me: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+else
+  ac_cv_path_GREP=$GREP
+fi
+
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_path_GREP" >&5
+echo "${ECHO_T}$ac_cv_path_GREP" >&6; }
+ GREP="$ac_cv_path_GREP"
+
+{ echo "$as_me:$LINENO: checking for egrep" >&5
+echo $ECHO_N "checking for egrep... $ECHO_C" >&6; }
+if test "${ac_cv_path_EGREP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
+   then ac_cv_path_EGREP="$GREP -E"
+   else
+     # Extract the first word of "egrep" to use in msg output
+if test -z "$EGREP"; then
+set dummy egrep; ac_prog_name=$2
+if test "${ac_cv_path_EGREP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_path_EGREP_found=false
+# Loop through the user's path and test for each of PROGNAME-LIST
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_prog in egrep; do
+  for ac_exec_ext in '' $ac_executable_extensions; do
+    ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
+    { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue
+    # Check for GNU ac_path_EGREP and select it if it is found.
+  # Check for GNU $ac_path_EGREP
+case `"$ac_path_EGREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
+*)
+  ac_count=0
+  echo $ECHO_N "0123456789$ECHO_C" >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    echo 'EGREP' >> "conftest.nl"
+    "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    ac_count=`expr $ac_count + 1`
+    if test $ac_count -gt ${ac_path_EGREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_EGREP="$ac_path_EGREP"
+      ac_path_EGREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+
+    $ac_path_EGREP_found && break 3
+  done
+done
+
+done
+IFS=$as_save_IFS
+
+
+fi
+
+EGREP="$ac_cv_path_EGREP"
+if test -z "$EGREP"; then
+  { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5
+echo "$as_me: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+else
+  ac_cv_path_EGREP=$EGREP
+fi
+
+
+   fi
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_path_EGREP" >&5
+echo "${ECHO_T}$ac_cv_path_EGREP" >&6; }
+ EGREP="$ac_cv_path_EGREP"
+
+{ echo "$as_me:$LINENO: checking for ANSI C header files" >&5
+echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6; }
+if test "${ac_cv_header_stdc+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_header_stdc=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_header_stdc=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+if test $ac_cv_header_stdc = yes; then
+  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <string.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "memchr" >/dev/null 2>&1; then
+  :
+else
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stdlib.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "free" >/dev/null 2>&1; then
+  :
+else
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+  if test "$cross_compiling" = yes; then
+  :
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <ctype.h>
+#include <stdlib.h>
+#if ((' ' & 0x0FF) == 0x020)
+# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#else
+# define ISLOWER(c) \
+                  (('a' <= (c) && (c) <= 'i') \
+                    || ('j' <= (c) && (c) <= 'r') \
+                    || ('s' <= (c) && (c) <= 'z'))
+# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
+#endif
+
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int
+main ()
+{
+  int i;
+  for (i = 0; i < 256; i++)
+    if (XOR (islower (i), ISLOWER (i))
+       || toupper (i) != TOUPPER (i))
+      return 2;
+  return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  :
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+ac_cv_header_stdc=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+
+
+fi
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5
+echo "${ECHO_T}$ac_cv_header_stdc" >&6; }
+if test $ac_cv_header_stdc = yes; then
+  
+cat >>confdefs.h <<\_ACEOF
+@%:@define STDC_HEADERS 1
+_ACEOF
+
+fi
+
+ac_aux_dir=
+for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do
+  if test -f "$ac_dir/install-sh"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install-sh -c"
+    break
+  elif test -f "$ac_dir/install.sh"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install.sh -c"
+    break
+  elif test -f "$ac_dir/shtool"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/shtool install -c"
+    break
+  fi
+done
+if test -z "$ac_aux_dir"; then
+  { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&5
+echo "$as_me: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+# These three variables are undocumented and unsupported,
+# and are intended to be withdrawn in a future Autoconf release.
+# They can cause serious problems if a builder's source tree is in a directory
+# whose full name contains unusual characters.
+ac_config_guess="$SHELL $ac_aux_dir/config.guess"  # Please don't use this var.
+ac_config_sub="$SHELL $ac_aux_dir/config.sub"  # Please don't use this var.
+ac_configure="$SHELL $ac_aux_dir/configure"  # Please don't use this var.
+
+
+# Find a good install program.  We prefer a C program (faster),
+# so one script is as good as another.  But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# OS/2's system install, which has a completely different semantic
+# ./install, which can be erroneously created by make from ./install.sh.
+{ echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5
+echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6; }
+if test -z "$INSTALL"; then
+if test "${ac_cv_path_install+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  # Account for people who put trailing slashes in PATH elements.
+case $as_dir/ in
+  ./ | .// | /cC/* | \
+  /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+  ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \
+  /usr/ucb/* ) ;;
+  *)
+    # OSF1 and SCO ODT 3.0 have their own names for install.
+    # Don't use installbsd from OSF since it installs stuff as root
+    # by default.
+    for ac_prog in ginstall scoinst install; do
+      for ac_exec_ext in '' $ac_executable_extensions; do
+       if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then
+         if test $ac_prog = install &&
+           grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+           # AIX install.  It has an incompatible calling convention.
+           :
+         elif test $ac_prog = install &&
+           grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+           # program-specific install script used by HP pwplus--don't use.
+           :
+         else
+           ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+           break 3
+         fi
+       fi
+      done
+    done
+    ;;
+esac
+done
+IFS=$as_save_IFS
+
+
+fi
+  if test "${ac_cv_path_install+set}" = set; then
+    INSTALL=$ac_cv_path_install
+  else
+    # As a last resort, use the slow shell script.  Don't cache a
+    # value for INSTALL within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the value is a relative name.
+    INSTALL=$ac_install_sh
+  fi
+fi
+{ echo "$as_me:$LINENO: result: $INSTALL" >&5
+echo "${ECHO_T}$INSTALL" >&6; }
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+
+{ echo "$as_me:$LINENO: checking whether compiler supports PIE" >&5
+echo $ECHO_N "checking whether compiler supports PIE... $ECHO_C" >&6; }
+oldCFLAGS="$CFLAGS"
+CFLAGS="$CFLAGS -fPIE"
+oldLDFLAGS="$LDFLAGS"
+LDFLAGS="$LDFLAGS -pie"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  compilepie="yes"
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+if test "x$compilepie" != "xyes"; then
+       CFLAGS="$oldCFLAGS"
+       LDFLAGS="$oldLDFLAGS"
+       { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+else
+       { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+fi
+
+# Check whether --enable-ldapmail was given.
+if test "${enable_ldapmail+set}" = set; then
+  enableval=$enable_ldapmail; 
+else
+  enable_ldapmail="no"
+fi
+
+if test "x$enable_ldapmail" != "xno"; then
+       have_new_ldap="no"
+       have_old_ldap="no"
+       { echo "$as_me:$LINENO: checking for ldap_initialize in -lldap" >&5
+echo $ECHO_N "checking for ldap_initialize in -lldap... $ECHO_C" >&6; }
+if test "${ac_cv_lib_ldap_ldap_initialize+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lldap  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldap_initialize ();
+int
+main ()
+{
+return ldap_initialize ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  ac_cv_lib_ldap_ldap_initialize=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_lib_ldap_ldap_initialize=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_lib_ldap_ldap_initialize" >&5
+echo "${ECHO_T}$ac_cv_lib_ldap_ldap_initialize" >&6; }
+if test $ac_cv_lib_ldap_ldap_initialize = yes; then
+  have_new_ldap="yes"
+else
+  { echo "$as_me:$LINENO: checking for ldap_init in -lldap" >&5
+echo $ECHO_N "checking for ldap_init in -lldap... $ECHO_C" >&6; }
+if test "${ac_cv_lib_ldap_ldap_init+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lldap  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldap_init ();
+int
+main ()
+{
+return ldap_init ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  ac_cv_lib_ldap_ldap_init=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_lib_ldap_ldap_init=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_lib_ldap_ldap_init" >&5
+echo "${ECHO_T}$ac_cv_lib_ldap_ldap_init" >&6; }
+if test $ac_cv_lib_ldap_ldap_init = yes; then
+  have_old_ldap="yes"
+fi
+
+fi
+
+       if test "x$have_new_ldap" != "xno" -o "x$have_old_ldap" != "xno"; then
+               LDAPLIBS="-L/usr/lib -lldap"
+               CFLAGS="$CFLAGS -DUSE_LDAP_MAIL_LOOKUP"
+               COMPILE_OPTS="$COMPILE_OPTS USE_LDAP_MAIL_LOOKUP"
+               if test "x$have_new_ldap" = "xyes"; then
+                       CFLAGS="$CFLAGS -DUSE_LDAP_23"
+                       { echo "$as_me:$LINENO: checking whether ldap_perror is declared" >&5
+echo $ECHO_N "checking whether ldap_perror is declared... $ECHO_C" >&6; }
+if test "${ac_cv_have_decl_ldap_perror+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <ldap.h>
+
+int
+main ()
+{
+#ifndef ldap_perror
+  (void) ldap_perror;
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_have_decl_ldap_perror=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_have_decl_ldap_perror=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_ldap_perror" >&5
+echo "${ECHO_T}$ac_cv_have_decl_ldap_perror" >&6; }
+if test $ac_cv_have_decl_ldap_perror = yes; then
+  :
+else
+  CFLAGS="$CFLAGS -DNEED_LDAP_PERROR"
+fi
+
+               fi
+       else
+               if test "x$enable_ldapmail" = "xyes"; then
+                       { { echo "$as_me:$LINENO: error: LDAP support required but library not found." >&5
+echo "$as_me: error: LDAP support required but library not found." >&2;}
+   { (exit 1); exit 1; }; };
+               fi
+       fi
+fi
+
+
+       
+# On IRIX 5.3, sys/types and inttypes.h are conflicting.
+
+
+
+
+
+
+
+
+
+for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
+                 inttypes.h stdint.h unistd.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+
+@%:@include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  eval "$as_ac_Header=yes"
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       eval "$as_ac_Header=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+              { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+  cat >>confdefs.h <<_ACEOF
+@%:@define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+fi
+
+done
+
+
+if test "${ac_cv_header_ext2fs_ext2fs_h+set}" = set; then
+  { echo "$as_me:$LINENO: checking for ext2fs/ext2fs.h" >&5
+echo $ECHO_N "checking for ext2fs/ext2fs.h... $ECHO_C" >&6; }
+if test "${ac_cv_header_ext2fs_ext2fs_h+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_header_ext2fs_ext2fs_h" >&5
+echo "${ECHO_T}$ac_cv_header_ext2fs_ext2fs_h" >&6; }
+else
+  # Is the header compilable?
+{ echo "$as_me:$LINENO: checking ext2fs/ext2fs.h usability" >&5
+echo $ECHO_N "checking ext2fs/ext2fs.h usability... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+@%:@include <ext2fs/ext2fs.h>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_header_compiler=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_header_compiler=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ echo "$as_me:$LINENO: checking ext2fs/ext2fs.h presence" >&5
+echo $ECHO_N "checking ext2fs/ext2fs.h presence... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+@%:@include <ext2fs/ext2fs.h>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+        test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       }; then
+  ac_header_preproc=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  ac_header_preproc=no
+fi
+
+rm -f conftest.err conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6; }
+
+# So?  What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+  yes:no: )
+    { echo "$as_me:$LINENO: WARNING: ext2fs/ext2fs.h: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: ext2fs/ext2fs.h: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { echo "$as_me:$LINENO: WARNING: ext2fs/ext2fs.h: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: ext2fs/ext2fs.h: proceeding with the compiler's result" >&2;}
+    ac_header_preproc=yes
+    ;;
+  no:yes:* )
+    { echo "$as_me:$LINENO: WARNING: ext2fs/ext2fs.h: present but cannot be compiled" >&5
+echo "$as_me: WARNING: ext2fs/ext2fs.h: present but cannot be compiled" >&2;}
+    { echo "$as_me:$LINENO: WARNING: ext2fs/ext2fs.h:     check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: ext2fs/ext2fs.h:     check for missing prerequisite headers?" >&2;}
+    { echo "$as_me:$LINENO: WARNING: ext2fs/ext2fs.h: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: ext2fs/ext2fs.h: see the Autoconf documentation" >&2;}
+    { echo "$as_me:$LINENO: WARNING: ext2fs/ext2fs.h:     section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: ext2fs/ext2fs.h:     section \"Present But Cannot Be Compiled\"" >&2;}
+    { echo "$as_me:$LINENO: WARNING: ext2fs/ext2fs.h: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: ext2fs/ext2fs.h: proceeding with the preprocessor's result" >&2;}
+    { echo "$as_me:$LINENO: WARNING: ext2fs/ext2fs.h: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: ext2fs/ext2fs.h: in the future, the compiler will take precedence" >&2;}
+    
+    ;;
+esac
+{ echo "$as_me:$LINENO: checking for ext2fs/ext2fs.h" >&5
+echo $ECHO_N "checking for ext2fs/ext2fs.h... $ECHO_C" >&6; }
+if test "${ac_cv_header_ext2fs_ext2fs_h+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_header_ext2fs_ext2fs_h=$ac_header_preproc
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_header_ext2fs_ext2fs_h" >&5
+echo "${ECHO_T}$ac_cv_header_ext2fs_ext2fs_h" >&6; }
+
+fi
+if test $ac_cv_header_ext2fs_ext2fs_h = yes; then
+  ext2fshead="yes"
+fi
+
+
+if test "x$ext2fshead" = "xyes"; then
+       CFLAGS="-DHAVE_EXT2_INCLUDE $CFLAGS"
+       { echo "$as_me:$LINENO: checking for ext2_ino_t" >&5
+echo $ECHO_N "checking for ext2_ino_t... $ECHO_C" >&6; }
+       have_ext2_ino_t="no"
+       cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <ext2fs/ext2fs.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "ext2_ino_t" >/dev/null 2>&1; then
+  have_ext2_ino_t="yes"
+fi
+rm -f conftest*
+
+       if test "x$have_ext2_ino_t" != "xyes"; then
+               { echo "$as_me:$LINENO: result: not found" >&5
+echo "${ECHO_T}not found" >&6; }
+       else
+               { echo "$as_me:$LINENO: result: found" >&5
+echo "${ECHO_T}found" >&6; }
+               CFLAGS="-DHAVE_EXT2_INO_T $CFLAGS"
+       fi
+fi
+
+# Check whether --enable-ext2direct was given.
+if test "${enable_ext2direct+set}" = set; then
+  enableval=$enable_ext2direct; 
+else
+  enable_ext2direct="try"
+fi
+
+if test "x$enable_ext2direct" != "xno"; then
+       { echo "$as_me:$LINENO: checking for com_err in -lcom_err" >&5
+echo $ECHO_N "checking for com_err in -lcom_err... $ECHO_C" >&6; }
+if test "${ac_cv_lib_com_err_com_err+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lcom_err  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char com_err ();
+int
+main ()
+{
+return com_err ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  ac_cv_lib_com_err_com_err=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_lib_com_err_com_err=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_lib_com_err_com_err" >&5
+echo "${ECHO_T}$ac_cv_lib_com_err_com_err" >&6; }
+if test $ac_cv_lib_com_err_com_err = yes; then
+  EXT2LIBS="-lcom_err $EXT2LIBS"
+fi
+
+       { echo "$as_me:$LINENO: checking for ext2fs_initialize in -lext2fs" >&5
+echo $ECHO_N "checking for ext2fs_initialize in -lext2fs... $ECHO_C" >&6; }
+if test "${ac_cv_lib_ext2fs_ext2fs_initialize+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lext2fs "-lcom_err" $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ext2fs_initialize ();
+int
+main ()
+{
+return ext2fs_initialize ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  ac_cv_lib_ext2fs_ext2fs_initialize=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_lib_ext2fs_ext2fs_initialize=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_lib_ext2fs_ext2fs_initialize" >&5
+echo "${ECHO_T}$ac_cv_lib_ext2fs_ext2fs_initialize" >&6; }
+if test $ac_cv_lib_ext2fs_ext2fs_initialize = yes; then
+  EXT2LIBS="-lext2fs $EXT2LIBS"
+fi
+
+       if test "${ac_cv_lib_com_err_com_err}" != "yes" -o "${ac_cv_lib_ext2fs_ext2fs_initialize}" != "yes"; then
+               if test "x$enable_ext2direct" = "xyes"; then
+                       { { echo "$as_me:$LINENO: error: Ext2 direct support required but libraries not found." >&5
+echo "$as_me: error: Ext2 direct support required but libraries not found." >&2;}
+   { (exit 1); exit 1; }; }
+               else
+                       { echo "$as_me:$LINENO: WARNING: Ext2 direct support won't be compiled. Libraries not found." >&5
+echo "$as_me: WARNING: Ext2 direct support won't be compiled. Libraries not found." >&2;}
+               fi
+               enable_ext2direct="no"
+               EXT2LIBS=""
+       else
+               if test "x$ext2fshead" != "xyes"; then
+                       if test "x$enable_ext2direct" = "xyes"; then
+                               { { echo "$as_me:$LINENO: error: Ext2 direct support required but header files not found." >&5
+echo "$as_me: error: Ext2 direct support required but header files not found." >&2;}
+   { (exit 1); exit 1; }; }
+                       else
+                               { echo "$as_me:$LINENO: WARNING: Ext2 direct support won't be compiled. Header files not found." >&5
+echo "$as_me: WARNING: Ext2 direct support won't be compiled. Header files not found." >&2;}
+                       fi
+                       enable_ext2direct="no"
+                       EXT2LIBS=""
+               else
+                       enable_ext2direct="yes"
+               fi
+       fi
+       if test "x$enable_ext2direct" = "xyes"; then
+               EXT2_DIRECT="-DEXT2_DIRECT"
+               COMPILE_OPTS="$COMPILE_OPTS EXT2_DIRECT"
+               
+       fi
+fi
+
+
+#AC_ARG_WITH(dbus_include,
+#      [  --with-dbus_include=path        Path to directory with dbus include directory [default=/usr/include/dbus-1.0/]],
+#      DBUS_INCLUDE="$with_dbus_include",
+#      DBUS_INCLUDE="/usr/include/dbus-1.0/")
+#AC_ARG_WITH(dbus_arch_include,
+#      [  --with-dbus_arch_include=path   Path to directory with dbus arch-dependent include directory [default=/usr/lib/dbus-1.0/include/]],
+#      DBUS_ARCH_INCLUDE="$with_dbus_arch_include",
+#      DBUS_ARCH_INCLUDE="/usr/lib/dbus-1.0/include/")
+
+# Check whether --enable-netlink was given.
+if test "${enable_netlink+set}" = set; then
+  enableval=$enable_netlink; 
+else
+  enable_netlink="no"
+fi
+
+if test "x$enable_netlink" != "xno"; then
+       
+
+if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
+       if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args.
+set dummy ${ac_tool_prefix}pkg-config; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_path_PKG_CONFIG+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case $PKG_CONFIG in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+PKG_CONFIG=$ac_cv_path_PKG_CONFIG
+if test -n "$PKG_CONFIG"; then
+  { echo "$as_me:$LINENO: result: $PKG_CONFIG" >&5
+echo "${ECHO_T}$PKG_CONFIG" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_path_PKG_CONFIG"; then
+  ac_pt_PKG_CONFIG=$PKG_CONFIG
+  # Extract the first word of "pkg-config", so it can be a program name with args.
+set dummy pkg-config; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_path_ac_pt_PKG_CONFIG+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case $ac_pt_PKG_CONFIG in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG
+if test -n "$ac_pt_PKG_CONFIG"; then
+  { echo "$as_me:$LINENO: result: $ac_pt_PKG_CONFIG" >&5
+echo "${ECHO_T}$ac_pt_PKG_CONFIG" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+  if test "x$ac_pt_PKG_CONFIG" = x; then
+    PKG_CONFIG=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    PKG_CONFIG=$ac_pt_PKG_CONFIG
+  fi
+else
+  PKG_CONFIG="$ac_cv_path_PKG_CONFIG"
+fi
+
+fi
+if test -n "$PKG_CONFIG"; then
+       _pkg_min_version=0.9.0
+       { echo "$as_me:$LINENO: checking pkg-config is at least version $_pkg_min_version" >&5
+echo $ECHO_N "checking pkg-config is at least version $_pkg_min_version... $ECHO_C" >&6; }
+       if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then
+               { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+       else
+               { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+               PKG_CONFIG=""
+       fi
+               
+fi
+
+pkg_failed=no
+{ echo "$as_me:$LINENO: checking for DBUS" >&5
+echo $ECHO_N "checking for DBUS... $ECHO_C" >&6; }
+
+if test -n "$PKG_CONFIG"; then
+    if test -n "$DBUS_CFLAGS"; then
+        pkg_cv_DBUS_CFLAGS="$DBUS_CFLAGS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { (echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"dbus-1\"") >&5
+  ($PKG_CONFIG --exists --print-errors "dbus-1") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  pkg_cv_DBUS_CFLAGS=`$PKG_CONFIG --cflags "dbus-1" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+       pkg_failed=untried
+fi
+if test -n "$PKG_CONFIG"; then
+    if test -n "$DBUS_LIBS"; then
+        pkg_cv_DBUS_LIBS="$DBUS_LIBS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { (echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"dbus-1\"") >&5
+  ($PKG_CONFIG --exists --print-errors "dbus-1") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  pkg_cv_DBUS_LIBS=`$PKG_CONFIG --libs "dbus-1" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+       pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+        
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+               DBUS_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "dbus-1"`
+        else 
+               DBUS_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "dbus-1"`
+        fi
+       # Put the nasty error message in config.log where it belongs
+       echo "$DBUS_PKG_ERRORS" >&5
+
+       { { echo "$as_me:$LINENO: error: Package requirements (dbus-1) were not met:
+
+$DBUS_PKG_ERRORS
+
+Consider adjusting the PKG_CONFIG_PATH environment variable if you
+installed software in a non-standard prefix.
+
+Alternatively, you may set the environment variables DBUS_CFLAGS
+and DBUS_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details.
+" >&5
+echo "$as_me: error: Package requirements (dbus-1) were not met:
+
+$DBUS_PKG_ERRORS
+
+Consider adjusting the PKG_CONFIG_PATH environment variable if you
+installed software in a non-standard prefix.
+
+Alternatively, you may set the environment variables DBUS_CFLAGS
+and DBUS_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details.
+" >&2;}
+   { (exit 1); exit 1; }; }
+elif test $pkg_failed = untried; then
+       { { echo "$as_me:$LINENO: error: The pkg-config script could not be found or is too old.  Make sure it
+is in your PATH or set the PKG_CONFIG environment variable to the full
+path to pkg-config.
+
+Alternatively, you may set the environment variables DBUS_CFLAGS
+and DBUS_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details.
+
+To get pkg-config, see <http://www.freedesktop.org/software/pkgconfig>.
+See \`config.log' for more details." >&5
+echo "$as_me: error: The pkg-config script could not be found or is too old.  Make sure it
+is in your PATH or set the PKG_CONFIG environment variable to the full
+path to pkg-config.
+
+Alternatively, you may set the environment variables DBUS_CFLAGS
+and DBUS_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details.
+
+To get pkg-config, see <http://www.freedesktop.org/software/pkgconfig>.
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+else
+       DBUS_CFLAGS=$pkg_cv_DBUS_CFLAGS
+       DBUS_LIBS=$pkg_cv_DBUS_LIBS
+        { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+       :
+fi
+       NETLINKLIBS="$DBUS_LIBS"
+
+       { echo "$as_me:$LINENO: checking for genl_register in -lnl" >&5
+echo $ECHO_N "checking for genl_register in -lnl... $ECHO_C" >&6; }
+if test "${ac_cv_lib_nl_genl_register+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lnl  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char genl_register ();
+int
+main ()
+{
+return genl_register ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  ac_cv_lib_nl_genl_register=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_lib_nl_genl_register=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_lib_nl_genl_register" >&5
+echo "${ECHO_T}$ac_cv_lib_nl_genl_register" >&6; }
+if test $ac_cv_lib_nl_genl_register = yes; then
+  NETLINKLIBS="-lnl $NETLINKLIBS"
+fi
+
+       if test -z "$NETLINKLIBS" -o -z "$DBUS_LIBS"; then
+               if test "x$enable_netlink" = "xyes"; then
+                       { { echo "$as_me:$LINENO: error: Required libraries for quota netlink daemon not found." >&5
+echo "$as_me: error: Required libraries for quota netlink daemon not found." >&2;}
+   { (exit 1); exit 1; }; }
+               else
+                       { echo "$as_me:$LINENO: WARNING: Quota netlink daemon won't be compiled. Required libraries not found." >&5
+echo "$as_me: WARNING: Quota netlink daemon won't be compiled. Required libraries not found." >&2;}
+               fi
+               enable_netlink="no"
+               NETLINKLIBS=""
+       else
+               CPPFLAGS="$DBUS_CFLAGS $CPPFLAGS"
+               if test -z "$DBUS_LIBS"; then
+                       if test "x$enable_netlink" = "xyes"; then
+                               { { echo "$as_me:$LINENO: error: Required headers for quota netlink daemon not found." >&5
+echo "$as_me: error: Required headers for quota netlink daemon not found." >&2;}
+   { (exit 1); exit 1; }; }
+                       else
+                               { echo "$as_me:$LINENO: WARNING: Quota netlink daemon won't be compiled. Required headers not found." >&5
+echo "$as_me: WARNING: Quota netlink daemon won't be compiled. Required headers not found." >&2;}
+                       fi
+                       NETLINKLIBS=""
+                       enable_netlink="no"
+               else
+                       QUOTA_NETLINK_PROG=quota_nld
+               fi
+       fi
+fi
+
+
+
+{ echo "$as_me:$LINENO: checking for library containing gethostbyname" >&5
+echo $ECHO_N "checking for library containing gethostbyname... $ECHO_C" >&6; }
+if test "${ac_cv_search_gethostbyname+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_func_search_save_LIBS=$LIBS
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char gethostbyname ();
+int
+main ()
+{
+return gethostbyname ();
+  ;
+  return 0;
+}
+_ACEOF
+for ac_lib in '' nsl; do
+  if test -z "$ac_lib"; then
+    ac_res="none required"
+  else
+    ac_res=-l$ac_lib
+    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
+  fi
+  rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  ac_cv_search_gethostbyname=$ac_res
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext 
+  if test "${ac_cv_search_gethostbyname+set}" = set; then
+  break
+fi
+done
+if test "${ac_cv_search_gethostbyname+set}" = set; then
+  :
+else
+  ac_cv_search_gethostbyname=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_search_gethostbyname" >&5
+echo "${ECHO_T}$ac_cv_search_gethostbyname" >&6; }
+ac_res=$ac_cv_search_gethostbyname
+if test "$ac_res" != no; then
+  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+  
+fi
+
+{ echo "$as_me:$LINENO: checking for host_access in -lwrap" >&5
+echo $ECHO_N "checking for host_access in -lwrap... $ECHO_C" >&6; }
+if test "${ac_cv_lib_wrap_main+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  saved_LIBS="$LIBS"
+       LIBS="$LIBS -lwrap"
+       cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+       #include <stdio.h>
+       #include <sys/types.h>
+       #include <sys/socket.h>
+       #include <netinet/in.h>
+       #include <tcpd.h>
+       struct request_info request;
+       int deny_severity, allow_severity;
+int
+main ()
+{
+hosts_access(&request);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+       ac_cv_lib_wrap_main=yes; LIBS="$saved_LIBS"; { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_lib_wrap_main=no; LIBS="$saved_LIBS"; { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+       
+fi
+
+
+if test ${ac_cv_lib_wrap_main} = yes; then
+       if test "${ac_cv_header_tcpd_h+set}" = set; then
+  { echo "$as_me:$LINENO: checking for tcpd.h" >&5
+echo $ECHO_N "checking for tcpd.h... $ECHO_C" >&6; }
+if test "${ac_cv_header_tcpd_h+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_header_tcpd_h" >&5
+echo "${ECHO_T}$ac_cv_header_tcpd_h" >&6; }
+else
+  # Is the header compilable?
+{ echo "$as_me:$LINENO: checking tcpd.h usability" >&5
+echo $ECHO_N "checking tcpd.h usability... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+@%:@include <tcpd.h>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_header_compiler=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_header_compiler=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ echo "$as_me:$LINENO: checking tcpd.h presence" >&5
+echo $ECHO_N "checking tcpd.h presence... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+@%:@include <tcpd.h>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+        test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       }; then
+  ac_header_preproc=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  ac_header_preproc=no
+fi
+
+rm -f conftest.err conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6; }
+
+# So?  What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+  yes:no: )
+    { echo "$as_me:$LINENO: WARNING: tcpd.h: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: tcpd.h: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { echo "$as_me:$LINENO: WARNING: tcpd.h: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: tcpd.h: proceeding with the compiler's result" >&2;}
+    ac_header_preproc=yes
+    ;;
+  no:yes:* )
+    { echo "$as_me:$LINENO: WARNING: tcpd.h: present but cannot be compiled" >&5
+echo "$as_me: WARNING: tcpd.h: present but cannot be compiled" >&2;}
+    { echo "$as_me:$LINENO: WARNING: tcpd.h:     check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: tcpd.h:     check for missing prerequisite headers?" >&2;}
+    { echo "$as_me:$LINENO: WARNING: tcpd.h: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: tcpd.h: see the Autoconf documentation" >&2;}
+    { echo "$as_me:$LINENO: WARNING: tcpd.h:     section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: tcpd.h:     section \"Present But Cannot Be Compiled\"" >&2;}
+    { echo "$as_me:$LINENO: WARNING: tcpd.h: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: tcpd.h: proceeding with the preprocessor's result" >&2;}
+    { echo "$as_me:$LINENO: WARNING: tcpd.h: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: tcpd.h: in the future, the compiler will take precedence" >&2;}
+    
+    ;;
+esac
+{ echo "$as_me:$LINENO: checking for tcpd.h" >&5
+echo $ECHO_N "checking for tcpd.h... $ECHO_C" >&6; }
+if test "${ac_cv_header_tcpd_h+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_header_tcpd_h=$ac_header_preproc
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_header_tcpd_h" >&5
+echo "${ECHO_T}$ac_cv_header_tcpd_h" >&6; }
+
+fi
+if test $ac_cv_header_tcpd_h = yes; then
+  :
+else
+  
+               echo 'ERROR: could not find tcpd.h - missing TCP wrappers package'
+               exit 1
+       
+fi
+
+
+       LIBS="$LIBS -lwrap"
+       HOSTS_ACCESS="-DHOSTS_ACCESS"
+       COMPILE_OPTS="$COMPILE_OPTS HOST_ACCESS"
+       
+fi
+
+{ echo "$as_me:$LINENO: checking for an ANSI C-conforming const" >&5
+echo $ECHO_N "checking for an ANSI C-conforming const... $ECHO_C" >&6; }
+if test "${ac_cv_c_const+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+/* FIXME: Include the comments suggested by Paul. */
+#ifndef __cplusplus
+  /* Ultrix mips cc rejects this.  */
+  typedef int charset[2];
+  const charset cs;
+  /* SunOS 4.1.1 cc rejects this.  */
+  char const *const *pcpcc;
+  char **ppc;
+  /* NEC SVR4.0.2 mips cc rejects this.  */
+  struct point {int x, y;};
+  static struct point const zero = {0,0};
+  /* AIX XL C 1.02.0.0 rejects this.
+     It does not let you subtract one const X* pointer from another in
+     an arm of an if-expression whose if-part is not a constant
+     expression */
+  const char *g = "string";
+  pcpcc = &g + (g ? g-g : 0);
+  /* HPUX 7.0 cc rejects these. */
+  ++pcpcc;
+  ppc = (char**) pcpcc;
+  pcpcc = (char const *const *) ppc;
+  { /* SCO 3.2v4 cc rejects this.  */
+    char *t;
+    char const *s = 0 ? (char *) 0 : (char const *) 0;
+
+    *t++ = 0;
+    if (s) return 0;
+  }
+  { /* Someone thinks the Sun supposedly-ANSI compiler will reject this.  */
+    int x[] = {25, 17};
+    const int *foo = &x[0];
+    ++foo;
+  }
+  { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */
+    typedef const int *iptr;
+    iptr p = 0;
+    ++p;
+  }
+  { /* AIX XL C 1.02.0.0 rejects this saying
+       "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */
+    struct s { int j; const int *ap[3]; };
+    struct s *b; b->j = 5;
+  }
+  { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */
+    const int foo = 10;
+    if (!foo) return 0;
+  }
+  return !cs[0] && !zero.x;
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_c_const=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_c_const=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_c_const" >&5
+echo "${ECHO_T}$ac_cv_c_const" >&6; }
+if test $ac_cv_c_const = no; then
+  
+cat >>confdefs.h <<\_ACEOF
+@%:@define const 
+_ACEOF
+
+fi
+
+{ echo "$as_me:$LINENO: checking for inline" >&5
+echo $ECHO_N "checking for inline... $ECHO_C" >&6; }
+if test "${ac_cv_c_inline+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_c_inline=no
+for ac_kw in inline __inline__ __inline; do
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#ifndef __cplusplus
+typedef int foo_t;
+static $ac_kw foo_t static_foo () {return 0; }
+$ac_kw foo_t foo () {return 0; }
+#endif
+
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_c_inline=$ac_kw
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  test "$ac_cv_c_inline" != no && break
+done
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_c_inline" >&5
+echo "${ECHO_T}$ac_cv_c_inline" >&6; }
+
+
+case $ac_cv_c_inline in
+  inline | yes) ;;
+  *)
+    case $ac_cv_c_inline in
+      no) ac_val=;;
+      *) ac_val=$ac_cv_c_inline;;
+    esac
+    cat >>confdefs.h <<_ACEOF
+#ifndef __cplusplus
+#define inline $ac_val
+#endif
+_ACEOF
+    ;;
+esac
+
+
+# Check whether --enable-altformat was given.
+if test "${enable_altformat+set}" = set; then
+  enableval=$enable_altformat; 
+else
+  enable_altformat="yes"
+fi
+
+# Check whether --enable-rpc was given.
+if test "${enable_rpc+set}" = set; then
+  enableval=$enable_rpc; 
+else
+  enable_rpc="yes"
+fi
+
+# Check whether --enable-rpcsetquota was given.
+if test "${enable_rpcsetquota+set}" = set; then
+  enableval=$enable_rpcsetquota; 
+else
+  enable_rpcsetquota="no"
+fi
+
+# Check whether --enable-xfs_roothack was given.
+if test "${enable_xfs_roothack+set}" = set; then
+  enableval=$enable_xfs_roothack; 
+else
+  enable_xfs_roothack="no"
+fi
+
+# Check whether --enable-bsd_behaviour was given.
+if test "${enable_bsd_behaviour+set}" = set; then
+  enableval=$enable_bsd_behaviour; 
+else
+  enable_bsd_behaviour="yes"
+fi
+
+# Check whether --enable-libefence was given.
+if test "${enable_libefence+set}" = set; then
+  enableval=$enable_libefence; 
+else
+  enable_libefence="no"
+fi
+
+
+# Check whether --enable-nls was given.
+if test "${enable_nls+set}" = set; then
+  enableval=$enable_nls; 
+else
+  enable_nls="yes"
+fi
+
+# Check whether --enable-rootsbin was given.
+if test "${enable_rootsbin+set}" = set; then
+  enableval=$enable_rootsbin; 
+else
+  enable_rootsbin="no"
+fi
+
+
+if test "$enable_altformat" = "yes" ; then
+       CFLAGS="-DALT_FORMAT $CFLAGS"
+       COMPILE_OPTS="$COMPILE_OPTS ALT_FORMAT"
+fi
+if test "$enable_rpc" = "yes" ; then
+       CFLAGS="-DRPC $CFLAGS"
+       COMPILE_OPTS="$COMPILE_OPTS RPC"
+fi
+if test "$enable_rpcsetquota" = "yes" ; then
+       CFLAGS="-DRPC_SETQUOTA $CFLAGS"
+       COMPILE_OPTS="$COMPILE_OPTS RPC_SETQUOTA"
+fi
+if test "$enable_xfs_roothack" = "yes" ; then
+       CFLAGS="-DXFS_ROOTHACK $CFLAGS"
+       COMPILE_OPTS="$COMPILE_OPTS XFS_ROOTHACK"
+fi
+if test "$enable_bsd_behaviour" = "yes" ; then
+       CFLAGS="-DBSD_BEHAVIOUR $CFLAGS"
+       COMPILE_OPTS="$COMPILE_OPTS BSD_BEHAVIOUR"
+fi
+if test "$enable_libefence" = "yes" ; then
+       LIBMALLOC="/usr/lib/libefence.a"
+fi
+if test "$enable_nls" = "yes" ; then
+       CFLAGS="-D__GETTEXT__ $CFLAGS"
+       INSTMO="inst_mo"
+fi
+if test "$enable_rootsbin" = "yes" ; then
+       ROOTSBIN="/sbin"
+else
+       ROOTSBIN='$(prefix)/sbin'
+fi
+
+
+
+
+
+
+ac_config_files="$ac_config_files Makefile"
+
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems.  If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, we kill variables containing newlines.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(
+  for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
+    eval ac_val=\$$ac_var
+    case $ac_val in #(
+    *${as_nl}*)
+      case $ac_var in #(
+      *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5
+echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      *) $as_unset $ac_var ;;
+      esac ;;
+    esac
+  done
+
+  (set) 2>&1 |
+    case $as_nl`(ac_space=' '; set) 2>&1` in #(
+    *${as_nl}ac_space=\ *)
+      # `set' does not quote correctly, so add quotes (double-quote
+      # substitution turns \\\\ into \\, and sed turns \\ into \).
+      sed -n \
+       "s/'/'\\\\''/g;
+         s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+      ;; #(
+    *)
+      # `set' quotes correctly as required by POSIX, so do not add quotes.
+      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+      ;;
+    esac |
+    sort
+) |
+  sed '
+     /^ac_cv_env_/b end
+     t clear
+     :clear
+     s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+     t end
+     s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+     :end' >>confcache
+if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
+  if test -w "$cache_file"; then
+    test "x$cache_file" != "x/dev/null" &&
+      { echo "$as_me:$LINENO: updating cache $cache_file" >&5
+echo "$as_me: updating cache $cache_file" >&6;}
+    cat confcache >$cache_file
+  else
+    { echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5
+echo "$as_me: not updating unwritable cache $cache_file" >&6;}
+  fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# Transform confdefs.h into DEFS.
+# Protect against shell expansion while executing Makefile rules.
+# Protect against Makefile macro expansion.
+#
+# If the first sed substitution is executed (which looks for macros that
+# take arguments), then branch to the quote section.  Otherwise,
+# look for a macro that doesn't take arguments.
+ac_script='
+t clear
+:clear
+s/^[    ]*#[    ]*define[       ][      ]*\([^  (][^    (]*([^)]*)\)[   ]*\(.*\)/-D\1=\2/g
+t quote
+s/^[    ]*#[    ]*define[       ][      ]*\([^  ][^     ]*\)[   ]*\(.*\)/-D\1=\2/g
+t quote
+b any
+:quote
+s/[     `~#$^&*(){}\\|;'\''"<>?]/\\&/g
+s/\[/\\&/g
+s/\]/\\&/g
+s/\$/$$/g
+H
+:any
+${
+       g
+       s/^\n//
+       s/\n/ /g
+       p
+}
+'
+DEFS=`sed -n "$ac_script" confdefs.h`
+
+
+ac_libobjs=
+ac_ltlibobjs=
+for ac_i in : $LIB@&t@OBJS; do test "x$ac_i" = x: && continue
+  # 1. Remove the extension, and $U if already installed.
+  ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
+  ac_i=`echo "$ac_i" | sed "$ac_script"`
+  # 2. Prepend LIBOBJDIR.  When used with automake>=1.10 LIBOBJDIR
+  #    will be set to the directory where LIBOBJS objects are built.
+  ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext"
+  ac_ltlibobjs="$ac_ltlibobjs \${LIBOBJDIR}$ac_i"'$U.lo'
+done
+LIB@&t@OBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+
+: ${CONFIG_STATUS=./config.status}
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5
+echo "$as_me: creating $CONFIG_STATUS" >&6;}
+cat >$CONFIG_STATUS <<_ACEOF
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+SHELL=\${CONFIG_SHELL-$SHELL}
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+## --------------------- ##
+## M4sh Initialization.  ##
+## --------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in
+  *posix*) set -o posix ;;
+esac
+
+fi
+
+
+
+
+# PATH needs CR
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  echo "#! /bin/sh" >conf$$.sh
+  echo  "exit 0"   >>conf$$.sh
+  chmod +x conf$$.sh
+  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+    PATH_SEPARATOR=';'
+  else
+    PATH_SEPARATOR=:
+  fi
+  rm -f conf$$.sh
+fi
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  as_unset=unset
+else
+  as_unset=false
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+as_nl='
+'
+IFS=" ""       $as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+case $0 in
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+IFS=$as_save_IFS
+
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  { (exit 1); exit 1; }
+fi
+
+# Work around bugs in pre-3.0 UWIN ksh.
+for as_var in ENV MAIL MAILPATH
+do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+  LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+  LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+  LC_TELEPHONE LC_TIME
+do
+  if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+    eval $as_var=C; export $as_var
+  else
+    ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+  fi
+done
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+        X"$0" : 'X\(//\)$' \| \
+        X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+           s//\1/
+           q
+         }
+         /^X\/\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\/\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+
+# CDPATH.
+$as_unset CDPATH
+
+
+
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || {
+
+  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+  # uniformly replaced by the line number.  The first 'sed' inserts a
+  # line-number line after each line using $LINENO; the second 'sed'
+  # does the real work.  The second script uses 'N' to pair each
+  # line-number line with the line containing $LINENO, and appends
+  # trailing '-' during substitution so that $LINENO is not a special
+  # case at line end.
+  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+  # scripts with optimization help from Paolo Bonzini.  Blame Lee
+  # E. McMahon (1931-1989) for sed's syntax.  :-)
+  sed -n '
+    p
+    /[$]LINENO/=
+  ' <$as_myself |
+    sed '
+      s/[$]LINENO.*/&-/
+      t lineno
+      b
+      :lineno
+      N
+      :loop
+      s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
+      t loop
+      s/-\n.*//
+    ' >$as_me.lineno &&
+  chmod +x "$as_me.lineno" ||
+    { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
+   { (exit 1); exit 1; }; }
+
+  # Don't try to exec as it changes $[0], causing all sort of problems
+  # (the dirname of $[0] is not the place where we might find the
+  # original and so on.  Autoconf is especially sensitive to this).
+  . "./$as_me.lineno"
+  # Exit status is that of the last command.
+  exit
+}
+
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in
+-n*)
+  case `echo 'x\c'` in
+  *c*) ECHO_T='        ';;     # ECHO_T is single tab character.
+  *)   ECHO_C='\c';;
+  esac;;
+*)
+  ECHO_N='-n';;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir
+fi
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+  as_ln_s='ln -s'
+  # ... but there are two gotchas:
+  # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+  # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+  # In both cases, we have to default to `cp -p'.
+  ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+    as_ln_s='cp -p'
+elif ln conf$$.file conf$$ 2>/dev/null; then
+  as_ln_s=ln
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p=:
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+if test -x / >/dev/null 2>&1; then
+  as_test_x='test -x'
+else
+  if ls -dL / >/dev/null 2>&1; then
+    as_ls_L_option=L
+  else
+    as_ls_L_option=
+  fi
+  as_test_x='
+    eval sh -c '\''
+      if test -d "$1"; then
+        test -d "$1/.";
+      else
+       case $1 in
+        -*)set "./$1";;
+       esac;
+       case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in
+       ???[sx]*):;;*)false;;esac;fi
+    '\'' sh
+  '
+fi
+as_executable_p=$as_test_x
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+exec 6>&1
+
+# Save the log message, to keep $[0] and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling.
+ac_log="
+This file was extended by $as_me, which was
+generated by GNU Autoconf 2.61.  Invocation command line was
+
+  CONFIG_FILES    = $CONFIG_FILES
+  CONFIG_HEADERS  = $CONFIG_HEADERS
+  CONFIG_LINKS    = $CONFIG_LINKS
+  CONFIG_COMMANDS = $CONFIG_COMMANDS
+  $ $0 $@
+
+on `(hostname || uname -n) 2>/dev/null | sed 1q`
+"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+# Files that config.status was made for.
+config_files="$ac_config_files"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+ac_cs_usage="\
+\`$as_me' instantiates files from templates according to the
+current configuration.
+
+Usage: $0 [OPTIONS] [FILE]...
+
+  -h, --help       print this help, then exit
+  -V, --version    print version number and configuration settings, then exit
+  -q, --quiet      do not print progress messages
+  -d, --debug      don't remove temporary files
+      --recheck    update $as_me by reconfiguring in the same conditions
+  --file=FILE[:TEMPLATE]
+                  instantiate the configuration file FILE
+
+Configuration files:
+$config_files
+
+Report bugs to <bug-autoconf@gnu.org>."
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+ac_cs_version="\\
+config.status
+configured by $0, generated by GNU Autoconf 2.61,
+  with options \\"`echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\"
+
+Copyright (C) 2006 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+
+ac_pwd='$ac_pwd'
+srcdir='$srcdir'
+INSTALL='$INSTALL'
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+# If no file are specified by the user, then we need to provide default
+# value.  By we need to know if files were specified by the user.
+ac_need_defaults=:
+while test $# != 0
+do
+  case $1 in
+  --*=*)
+    ac_option=`expr "X$1" : 'X\([^=]*\)='`
+    ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
+    ac_shift=:
+    ;;
+  *)
+    ac_option=$1
+    ac_optarg=$2
+    ac_shift=shift
+    ;;
+  esac
+
+  case $ac_option in
+  # Handling of the options.
+  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+    ac_cs_recheck=: ;;
+  --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
+    echo "$ac_cs_version"; exit ;;
+  --debug | --debu | --deb | --de | --d | -d )
+    debug=: ;;
+  --file | --fil | --fi | --f )
+    $ac_shift
+    CONFIG_FILES="$CONFIG_FILES $ac_optarg"
+    ac_need_defaults=false;;
+  --he | --h |  --help | --hel | -h )
+    echo "$ac_cs_usage"; exit ;;
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil | --si | --s)
+    ac_cs_silent=: ;;
+
+  # This is an error.
+  -*) { echo "$as_me: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&2
+   { (exit 1); exit 1; }; } ;;
+
+  *) ac_config_targets="$ac_config_targets $1"
+     ac_need_defaults=false ;;
+
+  esac
+  shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+  exec 6>/dev/null
+  ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+if \$ac_cs_recheck; then
+  echo "running CONFIG_SHELL=$SHELL $SHELL $0 "$ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6
+  CONFIG_SHELL=$SHELL
+  export CONFIG_SHELL
+  exec $SHELL "$0"$ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+exec 5>>config.log
+{
+  echo
+  sed 'h;s/./-/g;s/^.../@%:@@%:@ /;s/...$/ @%:@@%:@/;p;x;p;x' <<_ASBOX
+@%:@@%:@ Running $as_me. @%:@@%:@
+_ASBOX
+  echo "$ac_log"
+} >&5
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+# Handling of arguments.
+for ac_config_target in $ac_config_targets
+do
+  case $ac_config_target in
+    "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+
+  *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5
+echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
+   { (exit 1); exit 1; }; };;
+  esac
+done
+
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used.  Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+  test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+fi
+
+# Have a temporary directory for convenience.  Make it in the build tree
+# simply because there is no reason against having it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Hook for its removal unless debugging.
+# Note that there is a small window in which the directory will not be cleaned:
+# after its creation but before its name has been assigned to `$tmp'.
+$debug ||
+{
+  tmp=
+  trap 'exit_status=$?
+  { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status
+' 0
+  trap '{ (exit 1); exit 1; }' 1 2 13 15
+}
+# Create a (secure) tmp directory for tmp files.
+
+{
+  tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
+  test -n "$tmp" && test -d "$tmp"
+}  ||
+{
+  tmp=./conf$$-$RANDOM
+  (umask 077 && mkdir "$tmp")
+} ||
+{
+   echo "$me: cannot create a temporary directory in ." >&2
+   { (exit 1); exit 1; }
+}
+
+#
+# Set up the sed scripts for CONFIG_FILES section.
+#
+
+# No need to generate the scripts if there are no CONFIG_FILES.
+# This happens for instance when ./config.status config.h
+if test -n "$CONFIG_FILES"; then
+
+_ACEOF
+
+
+
+ac_delim='%!_!# '
+for ac_last_try in false false false false false :; do
+  cat >conf$$subs.sed <<_ACEOF
+SHELL!$SHELL$ac_delim
+PATH_SEPARATOR!$PATH_SEPARATOR$ac_delim
+PACKAGE_NAME!$PACKAGE_NAME$ac_delim
+PACKAGE_TARNAME!$PACKAGE_TARNAME$ac_delim
+PACKAGE_VERSION!$PACKAGE_VERSION$ac_delim
+PACKAGE_STRING!$PACKAGE_STRING$ac_delim
+PACKAGE_BUGREPORT!$PACKAGE_BUGREPORT$ac_delim
+exec_prefix!$exec_prefix$ac_delim
+prefix!$prefix$ac_delim
+program_transform_name!$program_transform_name$ac_delim
+bindir!$bindir$ac_delim
+sbindir!$sbindir$ac_delim
+libexecdir!$libexecdir$ac_delim
+datarootdir!$datarootdir$ac_delim
+datadir!$datadir$ac_delim
+sysconfdir!$sysconfdir$ac_delim
+sharedstatedir!$sharedstatedir$ac_delim
+localstatedir!$localstatedir$ac_delim
+includedir!$includedir$ac_delim
+oldincludedir!$oldincludedir$ac_delim
+docdir!$docdir$ac_delim
+infodir!$infodir$ac_delim
+htmldir!$htmldir$ac_delim
+dvidir!$dvidir$ac_delim
+pdfdir!$pdfdir$ac_delim
+psdir!$psdir$ac_delim
+libdir!$libdir$ac_delim
+localedir!$localedir$ac_delim
+mandir!$mandir$ac_delim
+DEFS!$DEFS$ac_delim
+ECHO_C!$ECHO_C$ac_delim
+ECHO_N!$ECHO_N$ac_delim
+ECHO_T!$ECHO_T$ac_delim
+LIBS!$LIBS$ac_delim
+build_alias!$build_alias$ac_delim
+host_alias!$host_alias$ac_delim
+target_alias!$target_alias$ac_delim
+CC!$CC$ac_delim
+CFLAGS!$CFLAGS$ac_delim
+LDFLAGS!$LDFLAGS$ac_delim
+CPPFLAGS!$CPPFLAGS$ac_delim
+ac_ct_CC!$ac_ct_CC$ac_delim
+EXEEXT!$EXEEXT$ac_delim
+OBJEXT!$OBJEXT$ac_delim
+CPP!$CPP$ac_delim
+GREP!$GREP$ac_delim
+EGREP!$EGREP$ac_delim
+INSTALL_PROGRAM!$INSTALL_PROGRAM$ac_delim
+INSTALL_SCRIPT!$INSTALL_SCRIPT$ac_delim
+INSTALL_DATA!$INSTALL_DATA$ac_delim
+LDAPLIBS!$LDAPLIBS$ac_delim
+EXT2_DIRECT!$EXT2_DIRECT$ac_delim
+EXT2LIBS!$EXT2LIBS$ac_delim
+PKG_CONFIG!$PKG_CONFIG$ac_delim
+DBUS_CFLAGS!$DBUS_CFLAGS$ac_delim
+DBUS_LIBS!$DBUS_LIBS$ac_delim
+QUOTA_NETLINK_PROG!$QUOTA_NETLINK_PROG$ac_delim
+NETLINKLIBS!$NETLINKLIBS$ac_delim
+HOSTS_ACCESS!$HOSTS_ACCESS$ac_delim
+COMPILE_OPTS!$COMPILE_OPTS$ac_delim
+LIBMALLOC!$LIBMALLOC$ac_delim
+INSTMO!$INSTMO$ac_delim
+ROOTSBIN!$ROOTSBIN$ac_delim
+LIB@&t@OBJS!$LIB@&t@OBJS$ac_delim
+LTLIBOBJS!$LTLIBOBJS$ac_delim
+_ACEOF
+
+  if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 65; then
+    break
+  elif $ac_last_try; then
+    { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
+echo "$as_me: error: could not make $CONFIG_STATUS" >&2;}
+   { (exit 1); exit 1; }; }
+  else
+    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+  fi
+done
+
+ac_eof=`sed -n '/^CEOF[0-9]*$/s/CEOF/0/p' conf$$subs.sed`
+if test -n "$ac_eof"; then
+  ac_eof=`echo "$ac_eof" | sort -nru | sed 1q`
+  ac_eof=`expr $ac_eof + 1`
+fi
+
+cat >>$CONFIG_STATUS <<_ACEOF
+cat >"\$tmp/subs-1.sed" <<\CEOF$ac_eof
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b end
+_ACEOF
+sed '
+s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g
+s/^/s,@/; s/!/@,|#_!!_#|/
+:n
+t n
+s/'"$ac_delim"'$/,g/; t
+s/$/\\/; p
+N; s/^.*\n//; s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g; b n
+' >>$CONFIG_STATUS <conf$$subs.sed
+rm -f conf$$subs.sed
+cat >>$CONFIG_STATUS <<_ACEOF
+:end
+s/|#_!!_#|//g
+CEOF$ac_eof
+_ACEOF
+
+
+# VPATH may cause trouble with some makes, so we remove $(srcdir),
+# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+  ac_vpsub='/^[         ]*VPATH[        ]*=/{
+s/:*\$(srcdir):*/:/
+s/:*\${srcdir}:*/:/
+s/:*@srcdir@:*/:/
+s/^\([^=]*=[    ]*\):*/\1/
+s/:*$//
+s/^[^=]*=[      ]*$//
+}'
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+fi # test -n "$CONFIG_FILES"
+
+
+for ac_tag in  :F $CONFIG_FILES      
+do
+  case $ac_tag in
+  :[FHLC]) ac_mode=$ac_tag; continue;;
+  esac
+  case $ac_mode$ac_tag in
+  :[FHL]*:*);;
+  :L* | :C*:*) { { echo "$as_me:$LINENO: error: Invalid tag $ac_tag." >&5
+echo "$as_me: error: Invalid tag $ac_tag." >&2;}
+   { (exit 1); exit 1; }; };;
+  :[FH]-) ac_tag=-:-;;
+  :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
+  esac
+  ac_save_IFS=$IFS
+  IFS=:
+  set x $ac_tag
+  IFS=$ac_save_IFS
+  shift
+  ac_file=$1
+  shift
+
+  case $ac_mode in
+  :L) ac_source=$1;;
+  :[FH])
+    ac_file_inputs=
+    for ac_f
+    do
+      case $ac_f in
+      -) ac_f="$tmp/stdin";;
+      *) # Look for the file first in the build tree, then in the source tree
+        # (if the path is not absolute).  The absolute path cannot be DOS-style,
+        # because $ac_f cannot contain `:'.
+        test -f "$ac_f" ||
+          case $ac_f in
+          [\\/$]*) false;;
+          *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
+          esac ||
+          { { echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5
+echo "$as_me: error: cannot find input file: $ac_f" >&2;}
+   { (exit 1); exit 1; }; };;
+      esac
+      ac_file_inputs="$ac_file_inputs $ac_f"
+    done
+
+    # Let's still pretend it is `configure' which instantiates (i.e., don't
+    # use $as_me), people would be surprised to read:
+    #    /* config.h.  Generated by config.status.  */
+    configure_input="Generated from "`IFS=:
+         echo $* | sed 's|^[^:]*/||;s|:[^:]*/|, |g'`" by configure."
+    if test x"$ac_file" != x-; then
+      configure_input="$ac_file.  $configure_input"
+      { echo "$as_me:$LINENO: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+    fi
+
+    case $ac_tag in
+    *:-:* | *:-) cat >"$tmp/stdin";;
+    esac
+    ;;
+  esac
+
+  ac_dir=`$as_dirname -- "$ac_file" ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$ac_file" : 'X\(//\)[^/]' \| \
+        X"$ac_file" : 'X\(//\)$' \| \
+        X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
+echo X"$ac_file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)[^/].*/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+  { as_dir="$ac_dir"
+  case $as_dir in #(
+  -*) as_dir=./$as_dir;;
+  esac
+  test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || {
+    as_dirs=
+    while :; do
+      case $as_dir in #(
+      *\'*) as_qdir=`echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #(
+      *) as_qdir=$as_dir;;
+      esac
+      as_dirs="'$as_qdir' $as_dirs"
+      as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$as_dir" : 'X\(//\)[^/]' \| \
+        X"$as_dir" : 'X\(//\)$' \| \
+        X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)[^/].*/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+      test -d "$as_dir" && break
+    done
+    test -z "$as_dirs" || eval "mkdir $as_dirs"
+  } || test -d "$as_dir" || { { echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5
+echo "$as_me: error: cannot create directory $as_dir" >&2;}
+   { (exit 1); exit 1; }; }; }
+  ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+  .)  # We are building in place.
+    ac_srcdir=.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+
+  case $ac_mode in
+  :F)
+  #
+  # CONFIG_FILE
+  #
+
+  case $INSTALL in
+  [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+  *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;
+  esac
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+# If the template does not know about datarootdir, expand it.
+# FIXME: This hack should be removed a few years after 2.60.
+ac_datarootdir_hack=; ac_datarootdir_seen=
+
+case `sed -n '/datarootdir/ {
+  p
+  q
+}
+/@datadir@/p
+/@docdir@/p
+/@infodir@/p
+/@localedir@/p
+/@mandir@/p
+' $ac_file_inputs` in
+*datarootdir*) ac_datarootdir_seen=yes;;
+*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
+  { echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+  ac_datarootdir_hack='
+  s&@datadir@&$datadir&g
+  s&@docdir@&$docdir&g
+  s&@infodir@&$infodir&g
+  s&@localedir@&$localedir&g
+  s&@mandir@&$mandir&g
+    s&\\\${datarootdir}&$datarootdir&g' ;;
+esac
+_ACEOF
+
+# Neutralize VPATH when `$srcdir' = `.'.
+# Shell code in configure.ac might set extrasub.
+# FIXME: do we really want to maintain this feature?
+cat >>$CONFIG_STATUS <<_ACEOF
+  sed "$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s&@configure_input@&$configure_input&;t t
+s&@top_builddir@&$ac_top_builddir_sub&;t t
+s&@srcdir@&$ac_srcdir&;t t
+s&@abs_srcdir@&$ac_abs_srcdir&;t t
+s&@top_srcdir@&$ac_top_srcdir&;t t
+s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
+s&@builddir@&$ac_builddir&;t t
+s&@abs_builddir@&$ac_abs_builddir&;t t
+s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
+s&@INSTALL@&$ac_INSTALL&;t t
+$ac_datarootdir_hack
+" $ac_file_inputs | sed -f "$tmp/subs-1.sed" >$tmp/out
+
+test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
+  { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } &&
+  { ac_out=`sed -n '/^[         ]*datarootdir[  ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } &&
+  { echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined." >&5
+echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined." >&2;}
+
+  rm -f "$tmp/stdin"
+  case $ac_file in
+  -) cat "$tmp/out"; rm -f "$tmp/out";;
+  *) rm -f "$ac_file"; mv "$tmp/out" $ac_file;;
+  esac
+ ;;
+  
+  
+  
+  esac
+
+done # for ac_tag
+
+
+{ (exit 0); exit 0; }
+_ACEOF
+chmod +x $CONFIG_STATUS
+ac_clean_files=$ac_clean_files_save
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded.  So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status.  When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+  ac_cs_success=:
+  ac_config_status_args=
+  test "$silent" = yes &&
+    ac_config_status_args="$ac_config_status_args --quiet"
+  exec 5>/dev/null
+  $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
+  exec 5>>config.log
+  # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+  # would make configure fail if this is the last instruction.
+  $ac_cs_success || { (exit 1); exit 1; }
+fi
+
diff --git a/autom4te.cache/output.2 b/autom4te.cache/output.2
new file mode 100644 (file)
index 0000000..b8de232
--- /dev/null
@@ -0,0 +1,6360 @@
+@%:@! /bin/sh
+@%:@ Guess values for system-dependent variables and create Makefiles.
+@%:@ Generated by GNU Autoconf 2.63.
+@%:@ 
+@%:@ Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
+@%:@ 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+@%:@ This configure script is free software; the Free Software Foundation
+@%:@ gives unlimited permission to copy, distribute and modify it.
+## --------------------- ##
+## M4sh Initialization.  ##
+## --------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in
+  *posix*) set -o posix ;;
+esac
+
+fi
+
+
+
+
+# PATH needs CR
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+if (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='printf %s\n'
+  as_echo_n='printf %s'
+else
+  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+    as_echo_n='/usr/ucb/echo -n'
+  else
+    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+    as_echo_n_body='eval
+      arg=$1;
+      case $arg in
+      *"$as_nl"*)
+       expr "X$arg" : "X\\(.*\\)$as_nl";
+       arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+      esac;
+      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+    '
+    export as_echo_n_body
+    as_echo_n='sh -c $as_echo_n_body as_echo'
+  fi
+  export as_echo_body
+  as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+      PATH_SEPARATOR=';'
+  }
+fi
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  as_unset=unset
+else
+  as_unset=false
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" ""       $as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+case $0 in
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+IFS=$as_save_IFS
+
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  { (exit 1); exit 1; }
+fi
+
+# Work around bugs in pre-3.0 UWIN ksh.
+for as_var in ENV MAIL MAILPATH
+do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+        X"$0" : 'X\(//\)$' \| \
+        X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+           s//\1/
+           q
+         }
+         /^X\/\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\/\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+
+# CDPATH.
+$as_unset CDPATH
+
+
+if test "x$CONFIG_SHELL" = x; then
+  if (eval ":") 2>/dev/null; then
+  as_have_required=yes
+else
+  as_have_required=no
+fi
+
+  if test $as_have_required = yes &&    (eval ":
+(as_func_return () {
+  (exit \$1)
+}
+as_func_success () {
+  as_func_return 0
+}
+as_func_failure () {
+  as_func_return 1
+}
+as_func_ret_success () {
+  return 0
+}
+as_func_ret_failure () {
+  return 1
+}
+
+exitcode=0
+if as_func_success; then
+  :
+else
+  exitcode=1
+  echo as_func_success failed.
+fi
+
+if as_func_failure; then
+  exitcode=1
+  echo as_func_failure succeeded.
+fi
+
+if as_func_ret_success; then
+  :
+else
+  exitcode=1
+  echo as_func_ret_success failed.
+fi
+
+if as_func_ret_failure; then
+  exitcode=1
+  echo as_func_ret_failure succeeded.
+fi
+
+if ( set x; as_func_ret_success y && test x = \"\$1\" ); then
+  :
+else
+  exitcode=1
+  echo positional parameters were not saved.
+fi
+
+test \$exitcode = 0) || { (exit 1); exit 1; }
+
+(
+  as_lineno_1=\$LINENO
+  as_lineno_2=\$LINENO
+  test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" &&
+  test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; }
+") 2> /dev/null; then
+  :
+else
+  as_candidate_shells=
+    as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  case $as_dir in
+        /*)
+          for as_base in sh bash ksh sh5; do
+            as_candidate_shells="$as_candidate_shells $as_dir/$as_base"
+          done;;
+       esac
+done
+IFS=$as_save_IFS
+
+
+      for as_shell in $as_candidate_shells $SHELL; do
+        # Try only shells that exist, to save several forks.
+        if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
+               { ("$as_shell") 2> /dev/null <<\_ASEOF
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in
+  *posix*) set -o posix ;;
+esac
+
+fi
+
+
+:
+_ASEOF
+}; then
+  CONFIG_SHELL=$as_shell
+              as_have_required=yes
+              if { "$as_shell" 2> /dev/null <<\_ASEOF
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in
+  *posix*) set -o posix ;;
+esac
+
+fi
+
+
+:
+(as_func_return () {
+  (exit $1)
+}
+as_func_success () {
+  as_func_return 0
+}
+as_func_failure () {
+  as_func_return 1
+}
+as_func_ret_success () {
+  return 0
+}
+as_func_ret_failure () {
+  return 1
+}
+
+exitcode=0
+if as_func_success; then
+  :
+else
+  exitcode=1
+  echo as_func_success failed.
+fi
+
+if as_func_failure; then
+  exitcode=1
+  echo as_func_failure succeeded.
+fi
+
+if as_func_ret_success; then
+  :
+else
+  exitcode=1
+  echo as_func_ret_success failed.
+fi
+
+if as_func_ret_failure; then
+  exitcode=1
+  echo as_func_ret_failure succeeded.
+fi
+
+if ( set x; as_func_ret_success y && test x = "$1" ); then
+  :
+else
+  exitcode=1
+  echo positional parameters were not saved.
+fi
+
+test $exitcode = 0) || { (exit 1); exit 1; }
+
+(
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; }
+
+_ASEOF
+}; then
+  break
+fi
+
+fi
+
+      done
+
+      if test "x$CONFIG_SHELL" != x; then
+  for as_var in BASH_ENV ENV
+       do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+       done
+       export CONFIG_SHELL
+       exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"}
+fi
+
+
+    if test $as_have_required = no; then
+  echo This script requires a shell more modern than all the
+      echo shells that I found on your system.  Please install a
+      echo modern shell, or manually run the script under such a
+      echo shell if you do have one.
+      { (exit 1); exit 1; }
+fi
+
+    
+fi
+
+fi
+
+
+
+(eval "as_func_return () {
+  (exit \$1)
+}
+as_func_success () {
+  as_func_return 0
+}
+as_func_failure () {
+  as_func_return 1
+}
+as_func_ret_success () {
+  return 0
+}
+as_func_ret_failure () {
+  return 1
+}
+
+exitcode=0
+if as_func_success; then
+  :
+else
+  exitcode=1
+  echo as_func_success failed.
+fi
+
+if as_func_failure; then
+  exitcode=1
+  echo as_func_failure succeeded.
+fi
+
+if as_func_ret_success; then
+  :
+else
+  exitcode=1
+  echo as_func_ret_success failed.
+fi
+
+if as_func_ret_failure; then
+  exitcode=1
+  echo as_func_ret_failure succeeded.
+fi
+
+if ( set x; as_func_ret_success y && test x = \"\$1\" ); then
+  :
+else
+  exitcode=1
+  echo positional parameters were not saved.
+fi
+
+test \$exitcode = 0") || {
+  echo No shell found that supports shell functions.
+  echo Please tell bug-autoconf@gnu.org about your system,
+  echo including any error possibly output before this message.
+  echo This can help us improve future autoconf versions.
+  echo Configuration will now proceed without shell functions.
+}
+
+
+
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || {
+
+  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+  # uniformly replaced by the line number.  The first 'sed' inserts a
+  # line-number line after each line using $LINENO; the second 'sed'
+  # does the real work.  The second script uses 'N' to pair each
+  # line-number line with the line containing $LINENO, and appends
+  # trailing '-' during substitution so that $LINENO is not a special
+  # case at line end.
+  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+  # scripts with optimization help from Paolo Bonzini.  Blame Lee
+  # E. McMahon (1931-1989) for sed's syntax.  :-)
+  sed -n '
+    p
+    /[$]LINENO/=
+  ' <$as_myself |
+    sed '
+      s/[$]LINENO.*/&-/
+      t lineno
+      b
+      :lineno
+      N
+      :loop
+      s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
+      t loop
+      s/-\n.*//
+    ' >$as_me.lineno &&
+  chmod +x "$as_me.lineno" ||
+    { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
+   { (exit 1); exit 1; }; }
+
+  # Don't try to exec as it changes $[0], causing all sort of problems
+  # (the dirname of $[0] is not the place where we might find the
+  # original and so on.  Autoconf is especially sensitive to this).
+  . "./$as_me.lineno"
+  # Exit status is that of the last command.
+  exit
+}
+
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in
+-n*)
+  case `echo 'x\c'` in
+  *c*) ECHO_T='        ';;     # ECHO_T is single tab character.
+  *)   ECHO_C='\c';;
+  esac;;
+*)
+  ECHO_N='-n';;
+esac
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+  if ln -s conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s='ln -s'
+    # ... but there are two gotchas:
+    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+    # In both cases, we have to default to `cp -p'.
+    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+      as_ln_s='cp -p'
+  elif ln conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s=ln
+  else
+    as_ln_s='cp -p'
+  fi
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p=:
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+if test -x / >/dev/null 2>&1; then
+  as_test_x='test -x'
+else
+  if ls -dL / >/dev/null 2>&1; then
+    as_ls_L_option=L
+  else
+    as_ls_L_option=
+  fi
+  as_test_x='
+    eval sh -c '\''
+      if test -d "$1"; then
+       test -d "$1/.";
+      else
+       case $1 in
+       -*)set "./$1";;
+       esac;
+       case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in
+       ???[sx]*):;;*)false;;esac;fi
+    '\'' sh
+  '
+fi
+as_executable_p=$as_test_x
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+
+exec 7<&0 </dev/null 6>&1
+
+# Name of the host.
+# hostname on some systems (SVR3.2, Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+ac_clean_files=
+ac_config_libobj_dir=.
+LIB@&t@OBJS=
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+# Identity of this package.
+PACKAGE_NAME=
+PACKAGE_TARNAME=
+PACKAGE_VERSION=
+PACKAGE_STRING=
+PACKAGE_BUGREPORT=
+
+ac_unique_file="quota.c"
+# Factoring default headers for most tests.
+ac_includes_default="\
+#include <stdio.h>
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+#ifdef STDC_HEADERS
+# include <stdlib.h>
+# include <stddef.h>
+#else
+# ifdef HAVE_STDLIB_H
+#  include <stdlib.h>
+# endif
+#endif
+#ifdef HAVE_STRING_H
+# if !defined STDC_HEADERS && defined HAVE_MEMORY_H
+#  include <memory.h>
+# endif
+# include <string.h>
+#endif
+#ifdef HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+# include <inttypes.h>
+#endif
+#ifdef HAVE_STDINT_H
+# include <stdint.h>
+#endif
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif"
+
+ac_subst_vars='LTLIBOBJS
+LIB@&t@OBJS
+ROOTSBIN
+INSTMO
+LIBMALLOC
+NETLINKLIBS
+QUOTA_NETLINK_PROG
+DBUS_LIBS
+DBUS_CFLAGS
+PKG_CONFIG
+EXT2LIBS
+LDAPLIBS
+INSTALL_DATA
+INSTALL_SCRIPT
+INSTALL_PROGRAM
+EGREP
+GREP
+CPP
+OBJEXT
+EXEEXT
+ac_ct_CC
+CPPFLAGS
+LDFLAGS
+CFLAGS
+CC
+target_alias
+host_alias
+build_alias
+LIBS
+ECHO_T
+ECHO_N
+ECHO_C
+DEFS
+mandir
+localedir
+libdir
+psdir
+pdfdir
+dvidir
+htmldir
+infodir
+docdir
+oldincludedir
+includedir
+localstatedir
+sharedstatedir
+sysconfdir
+datadir
+datarootdir
+libexecdir
+sbindir
+bindir
+program_transform_name
+prefix
+exec_prefix
+PACKAGE_BUGREPORT
+PACKAGE_STRING
+PACKAGE_VERSION
+PACKAGE_TARNAME
+PACKAGE_NAME
+PATH_SEPARATOR
+SHELL'
+ac_subst_files=''
+ac_user_opts='
+enable_option_checking
+enable_ldapmail
+enable_ext2direct
+enable_netlink
+enable_altformat
+enable_rpc
+enable_rpcsetquota
+enable_xfs_roothack
+enable_bsd_behaviour
+enable_libefence
+enable_nls
+enable_rootsbin
+enable_proc_mounts
+'
+      ac_precious_vars='build_alias
+host_alias
+target_alias
+CC
+CFLAGS
+LDFLAGS
+LIBS
+CPPFLAGS
+CPP
+PKG_CONFIG
+DBUS_CFLAGS
+DBUS_LIBS'
+
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+ac_unrecognized_opts=
+ac_unrecognized_sep=
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+# (The list follows the same order as the GNU Coding Standards.)
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datarootdir='${prefix}/share'
+datadir='${datarootdir}'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+docdir='${datarootdir}/doc/${PACKAGE}'
+infodir='${datarootdir}/info'
+htmldir='${docdir}'
+dvidir='${docdir}'
+pdfdir='${docdir}'
+psdir='${docdir}'
+libdir='${exec_prefix}/lib'
+localedir='${datarootdir}/locale'
+mandir='${datarootdir}/man'
+
+ac_prev=
+ac_dashdash=
+for ac_option
+do
+  # If the previous option needs an argument, assign it.
+  if test -n "$ac_prev"; then
+    eval $ac_prev=\$ac_option
+    ac_prev=
+    continue
+  fi
+
+  case $ac_option in
+  *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
+  *)   ac_optarg=yes ;;
+  esac
+
+  # Accept the important Cygnus configure options, so we can diagnose typos.
+
+  case $ac_dashdash$ac_option in
+  --)
+    ac_dashdash=yes ;;
+
+  -bindir | --bindir | --bindi | --bind | --bin | --bi)
+    ac_prev=bindir ;;
+  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+    bindir=$ac_optarg ;;
+
+  -build | --build | --buil | --bui | --bu)
+    ac_prev=build_alias ;;
+  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+    build_alias=$ac_optarg ;;
+
+  -cache-file | --cache-file | --cache-fil | --cache-fi \
+  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+    ac_prev=cache_file ;;
+  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+    cache_file=$ac_optarg ;;
+
+  --config-cache | -C)
+    cache_file=config.cache ;;
+
+  -datadir | --datadir | --datadi | --datad)
+    ac_prev=datadir ;;
+  -datadir=* | --datadir=* | --datadi=* | --datad=*)
+    datadir=$ac_optarg ;;
+
+  -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
+  | --dataroo | --dataro | --datar)
+    ac_prev=datarootdir ;;
+  -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
+  | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
+    datarootdir=$ac_optarg ;;
+
+  -disable-* | --disable-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      { $as_echo "$as_me: error: invalid feature name: $ac_useropt" >&2
+   { (exit 1); exit 1; }; }
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"enable_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig"
+        ac_unrecognized_sep=', ';;
+    esac
+    eval enable_$ac_useropt=no ;;
+
+  -docdir | --docdir | --docdi | --doc | --do)
+    ac_prev=docdir ;;
+  -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
+    docdir=$ac_optarg ;;
+
+  -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
+    ac_prev=dvidir ;;
+  -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
+    dvidir=$ac_optarg ;;
+
+  -enable-* | --enable-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      { $as_echo "$as_me: error: invalid feature name: $ac_useropt" >&2
+   { (exit 1); exit 1; }; }
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"enable_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig"
+        ac_unrecognized_sep=', ';;
+    esac
+    eval enable_$ac_useropt=\$ac_optarg ;;
+
+  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+  | --exec | --exe | --ex)
+    ac_prev=exec_prefix ;;
+  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+  | --exec=* | --exe=* | --ex=*)
+    exec_prefix=$ac_optarg ;;
+
+  -gas | --gas | --ga | --g)
+    # Obsolete; use --with-gas.
+    with_gas=yes ;;
+
+  -help | --help | --hel | --he | -h)
+    ac_init_help=long ;;
+  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+    ac_init_help=recursive ;;
+  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+    ac_init_help=short ;;
+
+  -host | --host | --hos | --ho)
+    ac_prev=host_alias ;;
+  -host=* | --host=* | --hos=* | --ho=*)
+    host_alias=$ac_optarg ;;
+
+  -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
+    ac_prev=htmldir ;;
+  -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
+  | --ht=*)
+    htmldir=$ac_optarg ;;
+
+  -includedir | --includedir | --includedi | --included | --include \
+  | --includ | --inclu | --incl | --inc)
+    ac_prev=includedir ;;
+  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+  | --includ=* | --inclu=* | --incl=* | --inc=*)
+    includedir=$ac_optarg ;;
+
+  -infodir | --infodir | --infodi | --infod | --info | --inf)
+    ac_prev=infodir ;;
+  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+    infodir=$ac_optarg ;;
+
+  -libdir | --libdir | --libdi | --libd)
+    ac_prev=libdir ;;
+  -libdir=* | --libdir=* | --libdi=* | --libd=*)
+    libdir=$ac_optarg ;;
+
+  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+  | --libexe | --libex | --libe)
+    ac_prev=libexecdir ;;
+  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+  | --libexe=* | --libex=* | --libe=*)
+    libexecdir=$ac_optarg ;;
+
+  -localedir | --localedir | --localedi | --localed | --locale)
+    ac_prev=localedir ;;
+  -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
+    localedir=$ac_optarg ;;
+
+  -localstatedir | --localstatedir | --localstatedi | --localstated \
+  | --localstate | --localstat | --localsta | --localst | --locals)
+    ac_prev=localstatedir ;;
+  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+  | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
+    localstatedir=$ac_optarg ;;
+
+  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+    ac_prev=mandir ;;
+  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+    mandir=$ac_optarg ;;
+
+  -nfp | --nfp | --nf)
+    # Obsolete; use --without-fp.
+    with_fp=no ;;
+
+  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+  | --no-cr | --no-c | -n)
+    no_create=yes ;;
+
+  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+    no_recursion=yes ;;
+
+  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+  | --oldin | --oldi | --old | --ol | --o)
+    ac_prev=oldincludedir ;;
+  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+    oldincludedir=$ac_optarg ;;
+
+  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+    ac_prev=prefix ;;
+  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+    prefix=$ac_optarg ;;
+
+  -program-prefix | --program-prefix | --program-prefi | --program-pref \
+  | --program-pre | --program-pr | --program-p)
+    ac_prev=program_prefix ;;
+  -program-prefix=* | --program-prefix=* | --program-prefi=* \
+  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+    program_prefix=$ac_optarg ;;
+
+  -program-suffix | --program-suffix | --program-suffi | --program-suff \
+  | --program-suf | --program-su | --program-s)
+    ac_prev=program_suffix ;;
+  -program-suffix=* | --program-suffix=* | --program-suffi=* \
+  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+    program_suffix=$ac_optarg ;;
+
+  -program-transform-name | --program-transform-name \
+  | --program-transform-nam | --program-transform-na \
+  | --program-transform-n | --program-transform- \
+  | --program-transform | --program-transfor \
+  | --program-transfo | --program-transf \
+  | --program-trans | --program-tran \
+  | --progr-tra | --program-tr | --program-t)
+    ac_prev=program_transform_name ;;
+  -program-transform-name=* | --program-transform-name=* \
+  | --program-transform-nam=* | --program-transform-na=* \
+  | --program-transform-n=* | --program-transform-=* \
+  | --program-transform=* | --program-transfor=* \
+  | --program-transfo=* | --program-transf=* \
+  | --program-trans=* | --program-tran=* \
+  | --progr-tra=* | --program-tr=* | --program-t=*)
+    program_transform_name=$ac_optarg ;;
+
+  -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
+    ac_prev=pdfdir ;;
+  -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
+    pdfdir=$ac_optarg ;;
+
+  -psdir | --psdir | --psdi | --psd | --ps)
+    ac_prev=psdir ;;
+  -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
+    psdir=$ac_optarg ;;
+
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil)
+    silent=yes ;;
+
+  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+    ac_prev=sbindir ;;
+  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+  | --sbi=* | --sb=*)
+    sbindir=$ac_optarg ;;
+
+  -sharedstatedir | --sharedstatedir | --sharedstatedi \
+  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+  | --sharedst | --shareds | --shared | --share | --shar \
+  | --sha | --sh)
+    ac_prev=sharedstatedir ;;
+  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+  | --sha=* | --sh=*)
+    sharedstatedir=$ac_optarg ;;
+
+  -site | --site | --sit)
+    ac_prev=site ;;
+  -site=* | --site=* | --sit=*)
+    site=$ac_optarg ;;
+
+  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+    ac_prev=srcdir ;;
+  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+    srcdir=$ac_optarg ;;
+
+  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+  | --syscon | --sysco | --sysc | --sys | --sy)
+    ac_prev=sysconfdir ;;
+  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+    sysconfdir=$ac_optarg ;;
+
+  -target | --target | --targe | --targ | --tar | --ta | --t)
+    ac_prev=target_alias ;;
+  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+    target_alias=$ac_optarg ;;
+
+  -v | -verbose | --verbose | --verbos | --verbo | --verb)
+    verbose=yes ;;
+
+  -version | --version | --versio | --versi | --vers | -V)
+    ac_init_version=: ;;
+
+  -with-* | --with-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      { $as_echo "$as_me: error: invalid package name: $ac_useropt" >&2
+   { (exit 1); exit 1; }; }
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"with_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig"
+        ac_unrecognized_sep=', ';;
+    esac
+    eval with_$ac_useropt=\$ac_optarg ;;
+
+  -without-* | --without-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      { $as_echo "$as_me: error: invalid package name: $ac_useropt" >&2
+   { (exit 1); exit 1; }; }
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"with_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig"
+        ac_unrecognized_sep=', ';;
+    esac
+    eval with_$ac_useropt=no ;;
+
+  --x)
+    # Obsolete; use --with-x.
+    with_x=yes ;;
+
+  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+  | --x-incl | --x-inc | --x-in | --x-i)
+    ac_prev=x_includes ;;
+  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+    x_includes=$ac_optarg ;;
+
+  -x-libraries | --x-libraries | --x-librarie | --x-librari \
+  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+    ac_prev=x_libraries ;;
+  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+    x_libraries=$ac_optarg ;;
+
+  -*) { $as_echo "$as_me: error: unrecognized option: $ac_option
+Try \`$0 --help' for more information." >&2
+   { (exit 1); exit 1; }; }
+    ;;
+
+  *=*)
+    ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null &&
+      { $as_echo "$as_me: error: invalid variable name: $ac_envvar" >&2
+   { (exit 1); exit 1; }; }
+    eval $ac_envvar=\$ac_optarg
+    export $ac_envvar ;;
+
+  *)
+    # FIXME: should be removed in autoconf 3.0.
+    $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+    expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+    : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}
+    ;;
+
+  esac
+done
+
+if test -n "$ac_prev"; then
+  ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+  { $as_echo "$as_me: error: missing argument to $ac_option" >&2
+   { (exit 1); exit 1; }; }
+fi
+
+if test -n "$ac_unrecognized_opts"; then
+  case $enable_option_checking in
+    no) ;;
+    fatal) { $as_echo "$as_me: error: unrecognized options: $ac_unrecognized_opts" >&2
+   { (exit 1); exit 1; }; } ;;
+    *)     $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
+  esac
+fi
+
+# Check all directory arguments for consistency.
+for ac_var in  exec_prefix prefix bindir sbindir libexecdir datarootdir \
+               datadir sysconfdir sharedstatedir localstatedir includedir \
+               oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
+               libdir localedir mandir
+do
+  eval ac_val=\$$ac_var
+  # Remove trailing slashes.
+  case $ac_val in
+    */ )
+      ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'`
+      eval $ac_var=\$ac_val;;
+  esac
+  # Be sure to have absolute directory names.
+  case $ac_val in
+    [\\/$]* | ?:[\\/]* )  continue;;
+    NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
+  esac
+  { $as_echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+   { (exit 1); exit 1; }; }
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+  if test "x$build_alias" = x; then
+    cross_compiling=maybe
+    $as_echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host.
+    If a cross compiler is detected then cross compile mode will be used." >&2
+  elif test "x$build_alias" != "x$host_alias"; then
+    cross_compiling=yes
+  fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+ac_pwd=`pwd` && test -n "$ac_pwd" &&
+ac_ls_di=`ls -di .` &&
+ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
+  { $as_echo "$as_me: error: working directory cannot be determined" >&2
+   { (exit 1); exit 1; }; }
+test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
+  { $as_echo "$as_me: error: pwd does not report name of working directory" >&2
+   { (exit 1); exit 1; }; }
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+  ac_srcdir_defaulted=yes
+  # Try the directory containing this script, then the parent directory.
+  ac_confdir=`$as_dirname -- "$as_myself" ||
+$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$as_myself" : 'X\(//\)[^/]' \| \
+        X"$as_myself" : 'X\(//\)$' \| \
+        X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_myself" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)[^/].*/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+  srcdir=$ac_confdir
+  if test ! -r "$srcdir/$ac_unique_file"; then
+    srcdir=..
+  fi
+else
+  ac_srcdir_defaulted=no
+fi
+if test ! -r "$srcdir/$ac_unique_file"; then
+  test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
+  { $as_echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2
+   { (exit 1); exit 1; }; }
+fi
+ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
+ac_abs_confdir=`(
+       cd "$srcdir" && test -r "./$ac_unique_file" || { $as_echo "$as_me: error: $ac_msg" >&2
+   { (exit 1); exit 1; }; }
+       pwd)`
+# When building in place, set srcdir=.
+if test "$ac_abs_confdir" = "$ac_pwd"; then
+  srcdir=.
+fi
+# Remove unnecessary trailing slashes from srcdir.
+# Double slashes in file names in object file debugging info
+# mess up M-x gdb in Emacs.
+case $srcdir in
+*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
+esac
+for ac_var in $ac_precious_vars; do
+  eval ac_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_env_${ac_var}_value=\$${ac_var}
+  eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_cv_env_${ac_var}_value=\$${ac_var}
+done
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+  # Omit some internal or obsolete options to make the list less imposing.
+  # This message is too long to be a string in the A/UX 3.1 sh.
+  cat <<_ACEOF
+\`configure' configures this package to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE.  See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+  -h, --help              display this help and exit
+      --help=short        display options specific to this package
+      --help=recursive    display the short help of all the included packages
+  -V, --version           display version information and exit
+  -q, --quiet, --silent   do not print \`checking...' messages
+      --cache-file=FILE   cache test results in FILE [disabled]
+  -C, --config-cache      alias for \`--cache-file=config.cache'
+  -n, --no-create         do not create output files
+      --srcdir=DIR        find the sources in DIR [configure dir or \`..']
+
+Installation directories:
+  --prefix=PREFIX         install architecture-independent files in PREFIX
+                          [$ac_default_prefix]
+  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
+                          [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc.  You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+  --bindir=DIR            user executables [EPREFIX/bin]
+  --sbindir=DIR           system admin executables [EPREFIX/sbin]
+  --libexecdir=DIR        program executables [EPREFIX/libexec]
+  --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]
+  --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]
+  --localstatedir=DIR     modifiable single-machine data [PREFIX/var]
+  --libdir=DIR            object code libraries [EPREFIX/lib]
+  --includedir=DIR        C header files [PREFIX/include]
+  --oldincludedir=DIR     C header files for non-gcc [/usr/include]
+  --datarootdir=DIR       read-only arch.-independent data root [PREFIX/share]
+  --datadir=DIR           read-only architecture-independent data [DATAROOTDIR]
+  --infodir=DIR           info documentation [DATAROOTDIR/info]
+  --localedir=DIR         locale-dependent data [DATAROOTDIR/locale]
+  --mandir=DIR            man documentation [DATAROOTDIR/man]
+  --docdir=DIR            documentation root @<:@DATAROOTDIR/doc/PACKAGE@:>@
+  --htmldir=DIR           html documentation [DOCDIR]
+  --dvidir=DIR            dvi documentation [DOCDIR]
+  --pdfdir=DIR            pdf documentation [DOCDIR]
+  --psdir=DIR             ps documentation [DOCDIR]
+_ACEOF
+
+  cat <<\_ACEOF
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+
+  cat <<\_ACEOF
+
+Optional Features:
+  --disable-option-checking  ignore unrecognized --enable/--with options
+  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
+  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
+  --enable-ldapmail=yes/no/try       Enable ldap mail address lookups default=no.
+  --enable-ext2direct=yes/no/try     Enable scanning of EXT2/EXT3 filesystem using e2fslib default=try.
+  --enable-netlink=yes/no/try   Compile daemon receiving quota messages via netlink default=no.
+  --enable-altformat=yes/no     Enable alternative format used by edquota default=yes.
+  --enable-rpc=yes/no           Enable RPC support default=yes.
+  --enable-rpcsetquota=yes/no   Use RPC for setting quotas default=no.
+  --enable-xfs_roothack=yes/no  Support old XFS root filesystems default=no.
+  --enable-bsd_behaviour=yes/no Mimic BSD behaviour default=yes.
+  --enable-libefence=yes/no     Use Electric Fence memory checks default=no.
+  --enable-nls=yes/no           Enable gettext default=yes.
+  --enable-rootsbin=yes/no      Use /sbin for some important binaries regardless $prefix default=no.
+  --enable-proc-mounts=path   Use alternate file instead of /etc/mtab default=/proc/mounts.
+
+Some influential environment variables:
+  CC          C compiler command
+  CFLAGS      C compiler flags
+  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
+              nonstandard directory <lib dir>
+  LIBS        libraries to pass to the linker, e.g. -l<library>
+  CPPFLAGS    C/C++/Objective C preprocessor flags, e.g. -I<include dir> if
+              you have headers in a nonstandard directory <include dir>
+  CPP         C preprocessor
+  PKG_CONFIG  path to pkg-config utility
+  DBUS_CFLAGS C compiler flags for DBUS, overriding pkg-config
+  DBUS_LIBS   linker flags for DBUS, overriding pkg-config
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+_ACEOF
+ac_status=$?
+fi
+
+if test "$ac_init_help" = "recursive"; then
+  # If there are subdirs, report their specific --help.
+  for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+    test -d "$ac_dir" ||
+      { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } ||
+      continue
+    ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+  .)  # We are building in place.
+    ac_srcdir=.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+    cd "$ac_dir" || { ac_status=$?; continue; }
+    # Check for guested configure.
+    if test -f "$ac_srcdir/configure.gnu"; then
+      echo &&
+      $SHELL "$ac_srcdir/configure.gnu" --help=recursive
+    elif test -f "$ac_srcdir/configure"; then
+      echo &&
+      $SHELL "$ac_srcdir/configure" --help=recursive
+    else
+      $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+    fi || ac_status=$?
+    cd "$ac_pwd" || { ac_status=$?; break; }
+  done
+fi
+
+test -n "$ac_init_help" && exit $ac_status
+if $ac_init_version; then
+  cat <<\_ACEOF
+configure
+generated by GNU Autoconf 2.63
+
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
+2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+  exit
+fi
+cat >config.log <<_ACEOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by $as_me, which was
+generated by GNU Autoconf 2.63.  Invocation command line was
+
+  $ $0 $@
+
+_ACEOF
+exec 5>>config.log
+{
+cat <<_ASUNAME
+@%:@@%:@ --------- @%:@@%:@
+@%:@@%:@ Platform. @%:@@%:@
+@%:@@%:@ --------- @%:@@%:@
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`
+
+/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+/usr/bin/hostinfo      = `(/usr/bin/hostinfo) 2>/dev/null      || echo unknown`
+/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`
+/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  $as_echo "PATH: $as_dir"
+done
+IFS=$as_save_IFS
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+@%:@@%:@ ----------- @%:@@%:@
+@%:@@%:@ Core tests. @%:@@%:@
+@%:@@%:@ ----------- @%:@@%:@
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+  for ac_arg
+  do
+    case $ac_arg in
+    -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+    -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+    | -silent | --silent | --silen | --sile | --sil)
+      continue ;;
+    *\'*)
+      ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    esac
+    case $ac_pass in
+    1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;;
+    2)
+      ac_configure_args1="$ac_configure_args1 '$ac_arg'"
+      if test $ac_must_keep_next = true; then
+       ac_must_keep_next=false # Got value, back to normal.
+      else
+       case $ac_arg in
+         *=* | --config-cache | -C | -disable-* | --disable-* \
+         | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+         | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+         | -with-* | --with-* | -without-* | --without-* | --x)
+           case "$ac_configure_args0 " in
+             "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+           esac
+           ;;
+         -* ) ac_must_keep_next=true ;;
+       esac
+      fi
+      ac_configure_args="$ac_configure_args '$ac_arg'"
+      ;;
+    esac
+  done
+done
+$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; }
+$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; }
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log.  We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Use '\'' to represent an apostrophe within the trap.
+# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
+trap 'exit_status=$?
+  # Save into config.log some information that might help in debugging.
+  {
+    echo
+
+    cat <<\_ASBOX
+@%:@@%:@ ---------------- @%:@@%:@
+@%:@@%:@ Cache variables. @%:@@%:@
+@%:@@%:@ ---------------- @%:@@%:@
+_ASBOX
+    echo
+    # The following way of writing the cache mishandles newlines in values,
+(
+  for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
+    eval ac_val=\$$ac_var
+    case $ac_val in #(
+    *${as_nl}*)
+      case $ac_var in #(
+      *_cv_*) { $as_echo "$as_me:$LINENO: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+      *) $as_unset $ac_var ;;
+      esac ;;
+    esac
+  done
+  (set) 2>&1 |
+    case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
+    *${as_nl}ac_space=\ *)
+      sed -n \
+       "s/'\''/'\''\\\\'\'''\''/g;
+         s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
+      ;; #(
+    *)
+      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+      ;;
+    esac |
+    sort
+)
+    echo
+
+    cat <<\_ASBOX
+@%:@@%:@ ----------------- @%:@@%:@
+@%:@@%:@ Output variables. @%:@@%:@
+@%:@@%:@ ----------------- @%:@@%:@
+_ASBOX
+    echo
+    for ac_var in $ac_subst_vars
+    do
+      eval ac_val=\$$ac_var
+      case $ac_val in
+      *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+      esac
+      $as_echo "$ac_var='\''$ac_val'\''"
+    done | sort
+    echo
+
+    if test -n "$ac_subst_files"; then
+      cat <<\_ASBOX
+@%:@@%:@ ------------------- @%:@@%:@
+@%:@@%:@ File substitutions. @%:@@%:@
+@%:@@%:@ ------------------- @%:@@%:@
+_ASBOX
+      echo
+      for ac_var in $ac_subst_files
+      do
+       eval ac_val=\$$ac_var
+       case $ac_val in
+       *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+       esac
+       $as_echo "$ac_var='\''$ac_val'\''"
+      done | sort
+      echo
+    fi
+
+    if test -s confdefs.h; then
+      cat <<\_ASBOX
+@%:@@%:@ ----------- @%:@@%:@
+@%:@@%:@ confdefs.h. @%:@@%:@
+@%:@@%:@ ----------- @%:@@%:@
+_ASBOX
+      echo
+      cat confdefs.h
+      echo
+    fi
+    test "$ac_signal" != 0 &&
+      $as_echo "$as_me: caught signal $ac_signal"
+    $as_echo "$as_me: exit $exit_status"
+  } >&5
+  rm -f core *.core core.conftest.* &&
+    rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
+    exit $exit_status
+' 0
+for ac_signal in 1 2 13 15; do
+  trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -f -r conftest* confdefs.h
+
+# Predefined preprocessor variables.
+
+cat >>confdefs.h <<_ACEOF
+@%:@define PACKAGE_NAME "$PACKAGE_NAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+@%:@define PACKAGE_TARNAME "$PACKAGE_TARNAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+@%:@define PACKAGE_VERSION "$PACKAGE_VERSION"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+@%:@define PACKAGE_STRING "$PACKAGE_STRING"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+@%:@define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
+_ACEOF
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer an explicitly selected file to automatically selected ones.
+ac_site_file1=NONE
+ac_site_file2=NONE
+if test -n "$CONFIG_SITE"; then
+  ac_site_file1=$CONFIG_SITE
+elif test "x$prefix" != xNONE; then
+  ac_site_file1=$prefix/share/config.site
+  ac_site_file2=$prefix/etc/config.site
+else
+  ac_site_file1=$ac_default_prefix/share/config.site
+  ac_site_file2=$ac_default_prefix/etc/config.site
+fi
+for ac_site_file in "$ac_site_file1" "$ac_site_file2"
+do
+  test "x$ac_site_file" = xNONE && continue
+  if test -r "$ac_site_file"; then
+    { $as_echo "$as_me:$LINENO: loading site script $ac_site_file" >&5
+$as_echo "$as_me: loading site script $ac_site_file" >&6;}
+    sed 's/^/| /' "$ac_site_file" >&5
+    . "$ac_site_file"
+  fi
+done
+
+if test -r "$cache_file"; then
+  # Some versions of bash will fail to source /dev/null (special
+  # files actually), so we avoid doing that.
+  if test -f "$cache_file"; then
+    { $as_echo "$as_me:$LINENO: loading cache $cache_file" >&5
+$as_echo "$as_me: loading cache $cache_file" >&6;}
+    case $cache_file in
+      [\\/]* | ?:[\\/]* ) . "$cache_file";;
+      *)                      . "./$cache_file";;
+    esac
+  fi
+else
+  { $as_echo "$as_me:$LINENO: creating cache $cache_file" >&5
+$as_echo "$as_me: creating cache $cache_file" >&6;}
+  >$cache_file
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in $ac_precious_vars; do
+  eval ac_old_set=\$ac_cv_env_${ac_var}_set
+  eval ac_new_set=\$ac_env_${ac_var}_set
+  eval ac_old_val=\$ac_cv_env_${ac_var}_value
+  eval ac_new_val=\$ac_env_${ac_var}_value
+  case $ac_old_set,$ac_new_set in
+    set,)
+      { $as_echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,set)
+      { $as_echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,);;
+    *)
+      if test "x$ac_old_val" != "x$ac_new_val"; then
+       # differences in whitespace do not lead to failure.
+       ac_old_val_w=`echo x $ac_old_val`
+       ac_new_val_w=`echo x $ac_new_val`
+       if test "$ac_old_val_w" != "$ac_new_val_w"; then
+         { $as_echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5
+$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+         ac_cache_corrupted=:
+       else
+         { $as_echo "$as_me:$LINENO: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
+$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
+         eval $ac_var=\$ac_old_val
+       fi
+       { $as_echo "$as_me:$LINENO:   former value:  \`$ac_old_val'" >&5
+$as_echo "$as_me:   former value:  \`$ac_old_val'" >&2;}
+       { $as_echo "$as_me:$LINENO:   current value: \`$ac_new_val'" >&5
+$as_echo "$as_me:   current value: \`$ac_new_val'" >&2;}
+      fi;;
+  esac
+  # Pass precious variables to config.status.
+  if test "$ac_new_set" = set; then
+    case $ac_new_val in
+    *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+    *) ac_arg=$ac_var=$ac_new_val ;;
+    esac
+    case " $ac_configure_args " in
+      *" '$ac_arg' "*) ;; # Avoid dups.  Use of quotes ensures accuracy.
+      *) ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+    esac
+  fi
+done
+if $ac_cache_corrupted; then
+  { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+  { $as_echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5
+$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+  { { $as_echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5
+$as_echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+ac_config_headers="$ac_config_headers config.h"
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="${ac_tool_prefix}gcc"
+    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:$LINENO: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+  ac_ct_CC=$CC
+  # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_CC="gcc"
+    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { $as_echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+else
+  CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+          if test -n "$ac_tool_prefix"; then
+    # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="${ac_tool_prefix}cc"
+    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:$LINENO: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  fi
+fi
+if test -z "$CC"; then
+  # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+       ac_prog_rejected=yes
+       continue
+     fi
+    ac_cv_prog_CC="cc"
+    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+if test $ac_prog_rejected = yes; then
+  # We found a bogon in the path, so make sure we never use it.
+  set dummy $ac_cv_prog_CC
+  shift
+  if test $@%:@ != 0; then
+    # We chose a different compiler from the bogus one.
+    # However, it has the same basename, so the bogon will be chosen
+    # first if we set CC to just the basename; use the full file name.
+    shift
+    ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+  fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:$LINENO: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$CC"; then
+  if test -n "$ac_tool_prefix"; then
+  for ac_prog in cl.exe
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:$LINENO: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    test -n "$CC" && break
+  done
+fi
+if test -z "$CC"; then
+  ac_ct_CC=$CC
+  for ac_prog in cl.exe
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_CC="$ac_prog"
+    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { $as_echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$ac_ct_CC" && break
+done
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+fi
+
+fi
+
+
+test -z "$CC" && { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+{ { $as_echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&5
+$as_echo "$as_me: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }; }
+
+# Provide some information about the compiler.
+$as_echo "$as_me:$LINENO: checking for C compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+{ (ac_try="$ac_compiler --version >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_compiler --version >&5") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (ac_try="$ac_compiler -v >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_compiler -v >&5") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (ac_try="$ac_compiler -V >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_compiler -V >&5") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+{ $as_echo "$as_me:$LINENO: checking for C compiler default output file name" >&5
+$as_echo_n "checking for C compiler default output file name... " >&6; }
+ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+
+# The possible output files:
+ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"
+
+ac_rmfiles=
+for ac_file in $ac_files
+do
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+    * ) ac_rmfiles="$ac_rmfiles $ac_file";;
+  esac
+done
+rm -f $ac_rmfiles
+
+if { (ac_try="$ac_link_default"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_link_default") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
+# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
+# in a Makefile.  We should not override ac_cv_exeext if it was cached,
+# so that the user can short-circuit this test for compilers unknown to
+# Autoconf.
+for ac_file in $ac_files ''
+do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )
+       ;;
+    [ab].out )
+       # We found the default executable, but exeext='' is most
+       # certainly right.
+       break;;
+    *.* )
+        if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
+       then :; else
+          ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+       fi
+       # We set ac_cv_exeext here because the later test for it is not
+       # safe: cross compilers may not add the suffix if given an `-o'
+       # argument, so we may need to know it at that point already.
+       # Even if this section looks crufty: it has the advantage of
+       # actually working.
+       break;;
+    * )
+       break;;
+  esac
+done
+test "$ac_cv_exeext" = no && ac_cv_exeext=
+
+else
+  ac_file=''
+fi
+
+{ $as_echo "$as_me:$LINENO: result: $ac_file" >&5
+$as_echo "$ac_file" >&6; }
+if test -z "$ac_file"; then
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+{ { $as_echo "$as_me:$LINENO: error: C compiler cannot create executables
+See \`config.log' for more details." >&5
+$as_echo "$as_me: error: C compiler cannot create executables
+See \`config.log' for more details." >&2;}
+   { (exit 77); exit 77; }; }; }
+fi
+
+ac_exeext=$ac_cv_exeext
+
+# Check that the compiler produces executables we can run.  If not, either
+# the compiler is broken, or we cross compile.
+{ $as_echo "$as_me:$LINENO: checking whether the C compiler works" >&5
+$as_echo_n "checking whether the C compiler works... " >&6; }
+# FIXME: These cross compiler hacks should be removed for Autoconf 3.0
+# If not cross compiling, check that we can run a simple program.
+if test "$cross_compiling" != yes; then
+  if { ac_try='./$ac_file'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+    cross_compiling=no
+  else
+    if test "$cross_compiling" = maybe; then
+       cross_compiling=yes
+    else
+       { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+{ { $as_echo "$as_me:$LINENO: error: cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." >&5
+$as_echo "$as_me: error: cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }; }
+    fi
+  fi
+fi
+{ $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
+
+rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out
+ac_clean_files=$ac_clean_files_save
+# Check that the compiler produces executables we can run.  If not, either
+# the compiler is broken, or we cross compile.
+{ $as_echo "$as_me:$LINENO: checking whether we are cross compiling" >&5
+$as_echo_n "checking whether we are cross compiling... " >&6; }
+{ $as_echo "$as_me:$LINENO: result: $cross_compiling" >&5
+$as_echo "$cross_compiling" >&6; }
+
+{ $as_echo "$as_me:$LINENO: checking for suffix of executables" >&5
+$as_echo_n "checking for suffix of executables... " >&6; }
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in conftest.exe conftest conftest.*; do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+    *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+         break;;
+    * ) break;;
+  esac
+done
+else
+  { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+{ { $as_echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details." >&5
+$as_echo "$as_me: error: cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }; }
+fi
+
+rm -f conftest$ac_cv_exeext
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5
+$as_echo "$ac_cv_exeext" >&6; }
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+{ $as_echo "$as_me:$LINENO: checking for suffix of object files" >&5
+$as_echo_n "checking for suffix of object files... " >&6; }
+if test "${ac_cv_objext+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_compile") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  for ac_file in conftest.o conftest.obj conftest.*; do
+  test -f "$ac_file" || continue;
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;
+    *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+       break;;
+  esac
+done
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+{ { $as_echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile
+See \`config.log' for more details." >&5
+$as_echo "$as_me: error: cannot compute suffix of object files: cannot compile
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }; }
+fi
+
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_objext" >&5
+$as_echo "$ac_cv_objext" >&6; }
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+{ $as_echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5
+$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
+if test "${ac_cv_c_compiler_gnu+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_compiler_gnu=yes
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_compiler_gnu=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5
+$as_echo "$ac_cv_c_compiler_gnu" >&6; }
+if test $ac_compiler_gnu = yes; then
+  GCC=yes
+else
+  GCC=
+fi
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+{ $as_echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5
+$as_echo_n "checking whether $CC accepts -g... " >&6; }
+if test "${ac_cv_prog_cc_g+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  ac_save_c_werror_flag=$ac_c_werror_flag
+   ac_c_werror_flag=yes
+   ac_cv_prog_cc_g=no
+   CFLAGS="-g"
+   cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_prog_cc_g=yes
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       CFLAGS=""
+      cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  :
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_c_werror_flag=$ac_save_c_werror_flag
+        CFLAGS="-g"
+        cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_prog_cc_g=yes
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   ac_c_werror_flag=$ac_save_c_werror_flag
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5
+$as_echo "$ac_cv_prog_cc_g" >&6; }
+if test "$ac_test_CFLAGS" = set; then
+  CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+  if test "$GCC" = yes; then
+    CFLAGS="-g -O2"
+  else
+    CFLAGS="-g"
+  fi
+else
+  if test "$GCC" = yes; then
+    CFLAGS="-O2"
+  else
+    CFLAGS=
+  fi
+fi
+{ $as_echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5
+$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
+if test "${ac_cv_prog_cc_c89+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  ac_cv_prog_cc_c89=no
+ac_save_CC=$CC
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stdarg.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+     char **p;
+     int i;
+{
+  return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+  char *s;
+  va_list v;
+  va_start (v,p);
+  s = g (p, va_arg (v,int));
+  va_end (v);
+  return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
+   function prototypes and stuff, but not '\xHH' hex character constants.
+   These don't provoke an error unfortunately, instead are silently treated
+   as 'x'.  The following induces an error, until -std is added to get
+   proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
+   array size at least.  It's necessary to write '\x00'==0 to get something
+   that's true only with -std.  */
+int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+   inside strings and character constants.  */
+#define FOO(x) 'x'
+int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
+  ;
+  return 0;
+}
+_ACEOF
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
+       -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+  CC="$ac_save_CC $ac_arg"
+  rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_prog_cc_c89=$ac_arg
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       
+fi
+
+rm -f core conftest.err conftest.$ac_objext 
+  test "x$ac_cv_prog_cc_c89" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+
+fi
+# AC_CACHE_VAL
+case "x$ac_cv_prog_cc_c89" in
+  x)
+    { $as_echo "$as_me:$LINENO: result: none needed" >&5
+$as_echo "none needed" >&6; } ;;
+  xno)
+    { $as_echo "$as_me:$LINENO: result: unsupported" >&5
+$as_echo "unsupported" >&6; } ;;
+  *)
+    CC="$CC $ac_cv_prog_cc_c89"
+    { $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5
+$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
+esac
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+{ $as_echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5
+$as_echo_n "checking how to run the C preprocessor... " >&6; }
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+  CPP=
+fi
+if test -z "$CPP"; then
+  if test "${ac_cv_prog_CPP+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+      # Double quotes because CPP needs to be expanded
+    for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
+    do
+      ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+@%:@ifdef __STDC__
+@%:@ include <limits.h>
+@%:@else
+@%:@ include <assert.h>
+@%:@endif
+                    Syntax error
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+        test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       }; then
+  :
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Broken: fails on valid input.
+continue
+fi
+
+rm -f conftest.err conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+@%:@include <ac_nonexistent.h>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+        test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       }; then
+  # Broken: success on invalid input.
+continue
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+  break
+fi
+
+    done
+    ac_cv_prog_CPP=$CPP
+  
+fi
+  CPP=$ac_cv_prog_CPP
+else
+  ac_cv_prog_CPP=$CPP
+fi
+{ $as_echo "$as_me:$LINENO: result: $CPP" >&5
+$as_echo "$CPP" >&6; }
+ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+@%:@ifdef __STDC__
+@%:@ include <limits.h>
+@%:@else
+@%:@ include <assert.h>
+@%:@endif
+                    Syntax error
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+        test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       }; then
+  :
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Broken: fails on valid input.
+continue
+fi
+
+rm -f conftest.err conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+@%:@include <ac_nonexistent.h>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+        test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       }; then
+  # Broken: success on invalid input.
+continue
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+  :
+else
+  { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+{ { $as_echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details." >&5
+$as_echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+{ $as_echo "$as_me:$LINENO: checking for grep that handles long lines and -e" >&5
+$as_echo_n "checking for grep that handles long lines and -e... " >&6; }
+if test "${ac_cv_path_GREP+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$GREP"; then
+  ac_path_GREP_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_prog in grep ggrep; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
+      { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue
+# Check for GNU ac_path_GREP and select it if it is found.
+  # Check for GNU $ac_path_GREP
+case `"$ac_path_GREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo 'GREP' >> "conftest.nl"
+    "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    ac_count=`expr $ac_count + 1`
+    if test $ac_count -gt ${ac_path_GREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_GREP="$ac_path_GREP"
+      ac_path_GREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+      $ac_path_GREP_found && break 3
+    done
+  done
+done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_GREP"; then
+    { { $as_echo "$as_me:$LINENO: error: no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5
+$as_echo "$as_me: error: no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;}
+   { (exit 1); exit 1; }; }
+  fi
+else
+  ac_cv_path_GREP=$GREP
+fi
+
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_path_GREP" >&5
+$as_echo "$ac_cv_path_GREP" >&6; }
+ GREP="$ac_cv_path_GREP"
+
+{ $as_echo "$as_me:$LINENO: checking for egrep" >&5
+$as_echo_n "checking for egrep... " >&6; }
+if test "${ac_cv_path_EGREP+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
+   then ac_cv_path_EGREP="$GREP -E"
+   else
+     if test -z "$EGREP"; then
+  ac_path_EGREP_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_prog in egrep; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
+      { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue
+# Check for GNU ac_path_EGREP and select it if it is found.
+  # Check for GNU $ac_path_EGREP
+case `"$ac_path_EGREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo 'EGREP' >> "conftest.nl"
+    "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    ac_count=`expr $ac_count + 1`
+    if test $ac_count -gt ${ac_path_EGREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_EGREP="$ac_path_EGREP"
+      ac_path_EGREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+      $ac_path_EGREP_found && break 3
+    done
+  done
+done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_EGREP"; then
+    { { $as_echo "$as_me:$LINENO: error: no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5
+$as_echo "$as_me: error: no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;}
+   { (exit 1); exit 1; }; }
+  fi
+else
+  ac_cv_path_EGREP=$EGREP
+fi
+
+   fi
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_path_EGREP" >&5
+$as_echo "$ac_cv_path_EGREP" >&6; }
+ EGREP="$ac_cv_path_EGREP"
+
+{ $as_echo "$as_me:$LINENO: checking for ANSI C header files" >&5
+$as_echo_n "checking for ANSI C header files... " >&6; }
+if test "${ac_cv_header_stdc+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_header_stdc=yes
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_header_stdc=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+if test $ac_cv_header_stdc = yes; then
+  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <string.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "memchr" >/dev/null 2>&1; then
+  :
+else
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stdlib.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "free" >/dev/null 2>&1; then
+  :
+else
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+  if test "$cross_compiling" = yes; then
+  :
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <ctype.h>
+#include <stdlib.h>
+#if ((' ' & 0x0FF) == 0x020)
+# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#else
+# define ISLOWER(c) \
+                  (('a' <= (c) && (c) <= 'i') \
+                    || ('j' <= (c) && (c) <= 'r') \
+                    || ('s' <= (c) && (c) <= 'z'))
+# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
+#endif
+
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int
+main ()
+{
+  int i;
+  for (i = 0; i < 256; i++)
+    if (XOR (islower (i), ISLOWER (i))
+       || toupper (i) != TOUPPER (i))
+      return 2;
+  return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  :
+else
+  $as_echo "$as_me: program exited with status $ac_status" >&5
+$as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+ac_cv_header_stdc=no
+fi
+rm -rf conftest.dSYM
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+
+
+fi
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5
+$as_echo "$ac_cv_header_stdc" >&6; }
+if test $ac_cv_header_stdc = yes; then
+  
+cat >>confdefs.h <<\_ACEOF
+@%:@define STDC_HEADERS 1
+_ACEOF
+
+fi
+
+ac_aux_dir=
+for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do
+  if test -f "$ac_dir/install-sh"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install-sh -c"
+    break
+  elif test -f "$ac_dir/install.sh"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install.sh -c"
+    break
+  elif test -f "$ac_dir/shtool"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/shtool install -c"
+    break
+  fi
+done
+if test -z "$ac_aux_dir"; then
+  { { $as_echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&5
+$as_echo "$as_me: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+# These three variables are undocumented and unsupported,
+# and are intended to be withdrawn in a future Autoconf release.
+# They can cause serious problems if a builder's source tree is in a directory
+# whose full name contains unusual characters.
+ac_config_guess="$SHELL $ac_aux_dir/config.guess"  # Please don't use this var.
+ac_config_sub="$SHELL $ac_aux_dir/config.sub"  # Please don't use this var.
+ac_configure="$SHELL $ac_aux_dir/configure"  # Please don't use this var.
+
+
+# Find a good install program.  We prefer a C program (faster),
+# so one script is as good as another.  But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# OS/2's system install, which has a completely different semantic
+# ./install, which can be erroneously created by make from ./install.sh.
+# Reject install programs that cannot install multiple files.
+{ $as_echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5
+$as_echo_n "checking for a BSD-compatible install... " >&6; }
+if test -z "$INSTALL"; then
+if test "${ac_cv_path_install+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  # Account for people who put trailing slashes in PATH elements.
+case $as_dir/ in
+  ./ | .// | /cC/* | \
+  /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+  ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \
+  /usr/ucb/* ) ;;
+  *)
+    # OSF1 and SCO ODT 3.0 have their own names for install.
+    # Don't use installbsd from OSF since it installs stuff as root
+    # by default.
+    for ac_prog in ginstall scoinst install; do
+      for ac_exec_ext in '' $ac_executable_extensions; do
+       if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then
+         if test $ac_prog = install &&
+           grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+           # AIX install.  It has an incompatible calling convention.
+           :
+         elif test $ac_prog = install &&
+           grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+           # program-specific install script used by HP pwplus--don't use.
+           :
+         else
+           rm -rf conftest.one conftest.two conftest.dir
+           echo one > conftest.one
+           echo two > conftest.two
+           mkdir conftest.dir
+           if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" &&
+             test -s conftest.one && test -s conftest.two &&
+             test -s conftest.dir/conftest.one &&
+             test -s conftest.dir/conftest.two
+           then
+             ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+             break 3
+           fi
+         fi
+       fi
+      done
+    done
+    ;;
+esac
+
+done
+IFS=$as_save_IFS
+
+rm -rf conftest.one conftest.two conftest.dir
+
+fi
+  if test "${ac_cv_path_install+set}" = set; then
+    INSTALL=$ac_cv_path_install
+  else
+    # As a last resort, use the slow shell script.  Don't cache a
+    # value for INSTALL within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the value is a relative name.
+    INSTALL=$ac_install_sh
+  fi
+fi
+{ $as_echo "$as_me:$LINENO: result: $INSTALL" >&5
+$as_echo "$INSTALL" >&6; }
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+
+{ $as_echo "$as_me:$LINENO: checking whether compiler supports PIE" >&5
+$as_echo_n "checking whether compiler supports PIE... " >&6; }
+oldCFLAGS="$CFLAGS"
+CFLAGS="$CFLAGS -fPIE"
+oldLDFLAGS="$LDFLAGS"
+LDFLAGS="$LDFLAGS -pie"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest$ac_exeext && {
+        test "$cross_compiling" = yes ||
+        $as_test_x conftest$ac_exeext
+       }; then
+  compilepie="yes"
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       
+fi
+
+rm -rf conftest.dSYM
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+if test "x$compilepie" != "xyes"; then
+       CFLAGS="$oldCFLAGS"
+       LDFLAGS="$oldLDFLAGS"
+       { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+else
+       { $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
+fi
+
+@%:@ Check whether --enable-ldapmail was given.
+if test "${enable_ldapmail+set}" = set; then
+  enableval=$enable_ldapmail; 
+else
+  enable_ldapmail="no"
+fi
+
+if test "x$enable_ldapmail" != "xno"; then
+       have_new_ldap="no"
+       have_old_ldap="no"
+       { $as_echo "$as_me:$LINENO: checking for ldap_initialize in -lldap" >&5
+$as_echo_n "checking for ldap_initialize in -lldap... " >&6; }
+if test "${ac_cv_lib_ldap_ldap_initialize+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lldap  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldap_initialize ();
+int
+main ()
+{
+return ldap_initialize ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest$ac_exeext && {
+        test "$cross_compiling" = yes ||
+        $as_test_x conftest$ac_exeext
+       }; then
+  ac_cv_lib_ldap_ldap_initialize=yes
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_lib_ldap_ldap_initialize=no
+fi
+
+rm -rf conftest.dSYM
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_ldap_ldap_initialize" >&5
+$as_echo "$ac_cv_lib_ldap_ldap_initialize" >&6; }
+if test "x$ac_cv_lib_ldap_ldap_initialize" = x""yes; then
+  have_new_ldap="yes"
+else
+  { $as_echo "$as_me:$LINENO: checking for ldap_init in -lldap" >&5
+$as_echo_n "checking for ldap_init in -lldap... " >&6; }
+if test "${ac_cv_lib_ldap_ldap_init+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lldap  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldap_init ();
+int
+main ()
+{
+return ldap_init ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest$ac_exeext && {
+        test "$cross_compiling" = yes ||
+        $as_test_x conftest$ac_exeext
+       }; then
+  ac_cv_lib_ldap_ldap_init=yes
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_lib_ldap_ldap_init=no
+fi
+
+rm -rf conftest.dSYM
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_ldap_ldap_init" >&5
+$as_echo "$ac_cv_lib_ldap_ldap_init" >&6; }
+if test "x$ac_cv_lib_ldap_ldap_init" = x""yes; then
+  have_old_ldap="yes"
+fi
+
+fi
+
+       if test "x$have_new_ldap" != "xno" -o "x$have_old_ldap" != "xno"; then
+               LDAPLIBS="-L/usr/lib -lldap -llber"
+               
+cat >>confdefs.h <<\_ACEOF
+@%:@define USE_LDAP_MAIL_LOOKUP 1
+_ACEOF
+
+               COMPILE_OPTS="$COMPILE_OPTS USE_LDAP_MAIL_LOOKUP"
+               if test "x$have_new_ldap" = "xyes"; then
+                       
+cat >>confdefs.h <<\_ACEOF
+@%:@define USE_LDAP_23 1
+_ACEOF
+
+                       { $as_echo "$as_me:$LINENO: checking whether ldap_perror is declared" >&5
+$as_echo_n "checking whether ldap_perror is declared... " >&6; }
+if test "${ac_cv_have_decl_ldap_perror+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <ldap.h>
+
+int
+main ()
+{
+#ifndef ldap_perror
+  (void) ldap_perror;
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_have_decl_ldap_perror=yes
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_have_decl_ldap_perror=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_have_decl_ldap_perror" >&5
+$as_echo "$ac_cv_have_decl_ldap_perror" >&6; }
+if test "x$ac_cv_have_decl_ldap_perror" = x""yes; then
+  :
+else
+  
+cat >>confdefs.h <<\_ACEOF
+@%:@define NEED_LDAP_PERROR 1
+_ACEOF
+
+fi
+
+               fi
+       else
+               if test "x$enable_ldapmail" = "xyes"; then
+                       { { $as_echo "$as_me:$LINENO: error: LDAP support required but library not found." >&5
+$as_echo "$as_me: error: LDAP support required but library not found." >&2;}
+   { (exit 1); exit 1; }; };
+               fi
+       fi
+fi
+
+
+       
+# On IRIX 5.3, sys/types and inttypes.h are conflicting.
+
+
+
+
+
+
+
+
+
+for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
+                 inttypes.h stdint.h unistd.h
+do
+as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5
+$as_echo_n "checking for $ac_header... " >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  $as_echo_n "(cached) " >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+
+@%:@include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  eval "$as_ac_Header=yes"
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       eval "$as_ac_Header=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+ac_res=`eval 'as_val=${'$as_ac_Header'}
+                $as_echo "$as_val"'`
+              { $as_echo "$as_me:$LINENO: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+as_val=`eval 'as_val=${'$as_ac_Header'}
+                $as_echo "$as_val"'`
+   if test "x$as_val" = x""yes; then
+  cat >>confdefs.h <<_ACEOF
+@%:@define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+fi
+
+done
+
+
+if test "${ac_cv_header_ext2fs_ext2fs_h+set}" = set; then
+  { $as_echo "$as_me:$LINENO: checking for ext2fs/ext2fs.h" >&5
+$as_echo_n "checking for ext2fs/ext2fs.h... " >&6; }
+if test "${ac_cv_header_ext2fs_ext2fs_h+set}" = set; then
+  $as_echo_n "(cached) " >&6
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_ext2fs_ext2fs_h" >&5
+$as_echo "$ac_cv_header_ext2fs_ext2fs_h" >&6; }
+else
+  # Is the header compilable?
+{ $as_echo "$as_me:$LINENO: checking ext2fs/ext2fs.h usability" >&5
+$as_echo_n "checking ext2fs/ext2fs.h usability... " >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+@%:@include <ext2fs/ext2fs.h>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_header_compiler=yes
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_header_compiler=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+$as_echo "$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ $as_echo "$as_me:$LINENO: checking ext2fs/ext2fs.h presence" >&5
+$as_echo_n "checking ext2fs/ext2fs.h presence... " >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+@%:@include <ext2fs/ext2fs.h>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+        test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       }; then
+  ac_header_preproc=yes
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  ac_header_preproc=no
+fi
+
+rm -f conftest.err conftest.$ac_ext
+{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+$as_echo "$ac_header_preproc" >&6; }
+
+# So?  What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+  yes:no: )
+    { $as_echo "$as_me:$LINENO: WARNING: ext2fs/ext2fs.h: accepted by the compiler, rejected by the preprocessor!" >&5
+$as_echo "$as_me: WARNING: ext2fs/ext2fs.h: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: ext2fs/ext2fs.h: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: ext2fs/ext2fs.h: proceeding with the compiler's result" >&2;}
+    ac_header_preproc=yes
+    ;;
+  no:yes:* )
+    { $as_echo "$as_me:$LINENO: WARNING: ext2fs/ext2fs.h: present but cannot be compiled" >&5
+$as_echo "$as_me: WARNING: ext2fs/ext2fs.h: present but cannot be compiled" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: ext2fs/ext2fs.h:     check for missing prerequisite headers?" >&5
+$as_echo "$as_me: WARNING: ext2fs/ext2fs.h:     check for missing prerequisite headers?" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: ext2fs/ext2fs.h: see the Autoconf documentation" >&5
+$as_echo "$as_me: WARNING: ext2fs/ext2fs.h: see the Autoconf documentation" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: ext2fs/ext2fs.h:     section \"Present But Cannot Be Compiled\"" >&5
+$as_echo "$as_me: WARNING: ext2fs/ext2fs.h:     section \"Present But Cannot Be Compiled\"" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: ext2fs/ext2fs.h: proceeding with the preprocessor's result" >&5
+$as_echo "$as_me: WARNING: ext2fs/ext2fs.h: proceeding with the preprocessor's result" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: ext2fs/ext2fs.h: in the future, the compiler will take precedence" >&5
+$as_echo "$as_me: WARNING: ext2fs/ext2fs.h: in the future, the compiler will take precedence" >&2;}
+    
+    ;;
+esac
+{ $as_echo "$as_me:$LINENO: checking for ext2fs/ext2fs.h" >&5
+$as_echo_n "checking for ext2fs/ext2fs.h... " >&6; }
+if test "${ac_cv_header_ext2fs_ext2fs_h+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  ac_cv_header_ext2fs_ext2fs_h=$ac_header_preproc
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_ext2fs_ext2fs_h" >&5
+$as_echo "$ac_cv_header_ext2fs_ext2fs_h" >&6; }
+
+fi
+if test "x$ac_cv_header_ext2fs_ext2fs_h" = x""yes; then
+  ext2fshead="yes"
+fi
+
+
+if test "x$ext2fshead" = "xyes"; then
+       
+cat >>confdefs.h <<\_ACEOF
+@%:@define HAVE_EXT2_INCLUDE 1
+_ACEOF
+
+       { $as_echo "$as_me:$LINENO: checking for ext2_ino_t" >&5
+$as_echo_n "checking for ext2_ino_t... " >&6; }
+       have_ext2_ino_t="no"
+       cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <ext2fs/ext2fs.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "ext2_ino_t" >/dev/null 2>&1; then
+  have_ext2_ino_t="yes"
+fi
+rm -f conftest*
+
+       if test "x$have_ext2_ino_t" != "xyes"; then
+               { $as_echo "$as_me:$LINENO: result: not found" >&5
+$as_echo "not found" >&6; }
+       else
+               { $as_echo "$as_me:$LINENO: result: found" >&5
+$as_echo "found" >&6; }
+               
+cat >>confdefs.h <<\_ACEOF
+@%:@define HAVE_EXT2_INO_T 1
+_ACEOF
+
+       fi
+fi
+
+@%:@ Check whether --enable-ext2direct was given.
+if test "${enable_ext2direct+set}" = set; then
+  enableval=$enable_ext2direct; 
+else
+  enable_ext2direct="try"
+fi
+
+if test "x$enable_ext2direct" != "xno"; then
+       { $as_echo "$as_me:$LINENO: checking for com_err in -lcom_err" >&5
+$as_echo_n "checking for com_err in -lcom_err... " >&6; }
+if test "${ac_cv_lib_com_err_com_err+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lcom_err  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char com_err ();
+int
+main ()
+{
+return com_err ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest$ac_exeext && {
+        test "$cross_compiling" = yes ||
+        $as_test_x conftest$ac_exeext
+       }; then
+  ac_cv_lib_com_err_com_err=yes
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_lib_com_err_com_err=no
+fi
+
+rm -rf conftest.dSYM
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_com_err_com_err" >&5
+$as_echo "$ac_cv_lib_com_err_com_err" >&6; }
+if test "x$ac_cv_lib_com_err_com_err" = x""yes; then
+  EXT2LIBS="-lcom_err $EXT2LIBS"
+fi
+
+       { $as_echo "$as_me:$LINENO: checking for ext2fs_initialize in -lext2fs" >&5
+$as_echo_n "checking for ext2fs_initialize in -lext2fs... " >&6; }
+if test "${ac_cv_lib_ext2fs_ext2fs_initialize+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lext2fs "-lcom_err" $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ext2fs_initialize ();
+int
+main ()
+{
+return ext2fs_initialize ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest$ac_exeext && {
+        test "$cross_compiling" = yes ||
+        $as_test_x conftest$ac_exeext
+       }; then
+  ac_cv_lib_ext2fs_ext2fs_initialize=yes
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_lib_ext2fs_ext2fs_initialize=no
+fi
+
+rm -rf conftest.dSYM
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_ext2fs_ext2fs_initialize" >&5
+$as_echo "$ac_cv_lib_ext2fs_ext2fs_initialize" >&6; }
+if test "x$ac_cv_lib_ext2fs_ext2fs_initialize" = x""yes; then
+  EXT2LIBS="-lext2fs $EXT2LIBS"
+fi
+
+       if test "${ac_cv_lib_com_err_com_err}" != "yes" -o "${ac_cv_lib_ext2fs_ext2fs_initialize}" != "yes"; then
+               if test "x$enable_ext2direct" = "xyes"; then
+                       { { $as_echo "$as_me:$LINENO: error: Ext2 direct support required but libraries not found." >&5
+$as_echo "$as_me: error: Ext2 direct support required but libraries not found." >&2;}
+   { (exit 1); exit 1; }; }
+               else
+                       { $as_echo "$as_me:$LINENO: WARNING: Ext2 direct support won't be compiled. Libraries not found." >&5
+$as_echo "$as_me: WARNING: Ext2 direct support won't be compiled. Libraries not found." >&2;}
+               fi
+               enable_ext2direct="no"
+               EXT2LIBS=""
+       else
+               if test "x$ext2fshead" != "xyes"; then
+                       if test "x$enable_ext2direct" = "xyes"; then
+                               { { $as_echo "$as_me:$LINENO: error: Ext2 direct support required but header files not found." >&5
+$as_echo "$as_me: error: Ext2 direct support required but header files not found." >&2;}
+   { (exit 1); exit 1; }; }
+                       else
+                               { $as_echo "$as_me:$LINENO: WARNING: Ext2 direct support won't be compiled. Header files not found." >&5
+$as_echo "$as_me: WARNING: Ext2 direct support won't be compiled. Header files not found." >&2;}
+                       fi
+                       enable_ext2direct="no"
+                       EXT2LIBS=""
+               else
+                       enable_ext2direct="yes"
+               fi
+       fi
+       if test "x$enable_ext2direct" = "xyes"; then
+               
+cat >>confdefs.h <<\_ACEOF
+@%:@define EXT2_DIRECT 1
+_ACEOF
+
+               COMPILE_OPTS="$COMPILE_OPTS EXT2_DIRECT"
+       fi
+fi
+
+
+@%:@ Check whether --enable-netlink was given.
+if test "${enable_netlink+set}" = set; then
+  enableval=$enable_netlink; 
+else
+  enable_netlink="no"
+fi
+
+if test "x$enable_netlink" != "xno"; then
+       
+
+if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
+       if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args.
+set dummy ${ac_tool_prefix}pkg-config; ac_word=$2
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_path_PKG_CONFIG+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  case $PKG_CONFIG in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+PKG_CONFIG=$ac_cv_path_PKG_CONFIG
+if test -n "$PKG_CONFIG"; then
+  { $as_echo "$as_me:$LINENO: result: $PKG_CONFIG" >&5
+$as_echo "$PKG_CONFIG" >&6; }
+else
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_path_PKG_CONFIG"; then
+  ac_pt_PKG_CONFIG=$PKG_CONFIG
+  # Extract the first word of "pkg-config", so it can be a program name with args.
+set dummy pkg-config; ac_word=$2
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_path_ac_pt_PKG_CONFIG+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  case $ac_pt_PKG_CONFIG in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG
+if test -n "$ac_pt_PKG_CONFIG"; then
+  { $as_echo "$as_me:$LINENO: result: $ac_pt_PKG_CONFIG" >&5
+$as_echo "$ac_pt_PKG_CONFIG" >&6; }
+else
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_pt_PKG_CONFIG" = x; then
+    PKG_CONFIG=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    PKG_CONFIG=$ac_pt_PKG_CONFIG
+  fi
+else
+  PKG_CONFIG="$ac_cv_path_PKG_CONFIG"
+fi
+
+fi
+if test -n "$PKG_CONFIG"; then
+       _pkg_min_version=0.9.0
+       { $as_echo "$as_me:$LINENO: checking pkg-config is at least version $_pkg_min_version" >&5
+$as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; }
+       if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then
+               { $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
+       else
+               { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+               PKG_CONFIG=""
+       fi
+               
+fi
+
+pkg_failed=no
+{ $as_echo "$as_me:$LINENO: checking for DBUS" >&5
+$as_echo_n "checking for DBUS... " >&6; }
+
+if test -n "$PKG_CONFIG"; then
+    if test -n "$DBUS_CFLAGS"; then
+        pkg_cv_DBUS_CFLAGS="$DBUS_CFLAGS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { ($as_echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"dbus-1\"") >&5
+  ($PKG_CONFIG --exists --print-errors "dbus-1") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  pkg_cv_DBUS_CFLAGS=`$PKG_CONFIG --cflags "dbus-1" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+       pkg_failed=untried
+fi
+if test -n "$PKG_CONFIG"; then
+    if test -n "$DBUS_LIBS"; then
+        pkg_cv_DBUS_LIBS="$DBUS_LIBS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { ($as_echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"dbus-1\"") >&5
+  ($PKG_CONFIG --exists --print-errors "dbus-1") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  pkg_cv_DBUS_LIBS=`$PKG_CONFIG --libs "dbus-1" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+       pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+        
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+               DBUS_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "dbus-1"`
+        else 
+               DBUS_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "dbus-1"`
+        fi
+       # Put the nasty error message in config.log where it belongs
+       echo "$DBUS_PKG_ERRORS" >&5
+
+       { { $as_echo "$as_me:$LINENO: error: Package requirements (dbus-1) were not met:
+
+$DBUS_PKG_ERRORS
+
+Consider adjusting the PKG_CONFIG_PATH environment variable if you
+installed software in a non-standard prefix.
+
+Alternatively, you may set the environment variables DBUS_CFLAGS
+and DBUS_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details.
+" >&5
+$as_echo "$as_me: error: Package requirements (dbus-1) were not met:
+
+$DBUS_PKG_ERRORS
+
+Consider adjusting the PKG_CONFIG_PATH environment variable if you
+installed software in a non-standard prefix.
+
+Alternatively, you may set the environment variables DBUS_CFLAGS
+and DBUS_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details.
+" >&2;}
+   { (exit 1); exit 1; }; }
+elif test $pkg_failed = untried; then
+       { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+{ { $as_echo "$as_me:$LINENO: error: The pkg-config script could not be found or is too old.  Make sure it
+is in your PATH or set the PKG_CONFIG environment variable to the full
+path to pkg-config.
+
+Alternatively, you may set the environment variables DBUS_CFLAGS
+and DBUS_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details.
+
+To get pkg-config, see <http://www.freedesktop.org/software/pkgconfig>.
+See \`config.log' for more details." >&5
+$as_echo "$as_me: error: The pkg-config script could not be found or is too old.  Make sure it
+is in your PATH or set the PKG_CONFIG environment variable to the full
+path to pkg-config.
+
+Alternatively, you may set the environment variables DBUS_CFLAGS
+and DBUS_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details.
+
+To get pkg-config, see <http://www.freedesktop.org/software/pkgconfig>.
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }; }
+else
+       DBUS_CFLAGS=$pkg_cv_DBUS_CFLAGS
+       DBUS_LIBS=$pkg_cv_DBUS_LIBS
+        { $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
+       :
+fi
+
+       { $as_echo "$as_me:$LINENO: checking for genl_register in -lnl" >&5
+$as_echo_n "checking for genl_register in -lnl... " >&6; }
+if test "${ac_cv_lib_nl_genl_register+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lnl  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char genl_register ();
+int
+main ()
+{
+return genl_register ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest$ac_exeext && {
+        test "$cross_compiling" = yes ||
+        $as_test_x conftest$ac_exeext
+       }; then
+  ac_cv_lib_nl_genl_register=yes
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_lib_nl_genl_register=no
+fi
+
+rm -rf conftest.dSYM
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_nl_genl_register" >&5
+$as_echo "$ac_cv_lib_nl_genl_register" >&6; }
+if test "x$ac_cv_lib_nl_genl_register" = x""yes; then
+  NETLINKLIBS="-lnl $DBUS_LIBS"
+fi
+
+       if test -z "$NETLINKLIBS" -o -z "$DBUS_LIBS"; then
+               if test "x$enable_netlink" = "xyes"; then
+                       { { $as_echo "$as_me:$LINENO: error: Required libraries for quota netlink daemon not found." >&5
+$as_echo "$as_me: error: Required libraries for quota netlink daemon not found." >&2;}
+   { (exit 1); exit 1; }; }
+               else
+                       { $as_echo "$as_me:$LINENO: WARNING: Quota netlink daemon won't be compiled. Required libraries not found." >&5
+$as_echo "$as_me: WARNING: Quota netlink daemon won't be compiled. Required libraries not found." >&2;}
+               fi
+               enable_netlink="no"
+               NETLINKLIBS=""
+       else
+               CPPFLAGS="$DBUS_CFLAGS $CPPFLAGS"
+               if test -z "$DBUS_LIBS"; then
+                       if test "x$enable_netlink" = "xyes"; then
+                               { { $as_echo "$as_me:$LINENO: error: Required headers for quota netlink daemon not found." >&5
+$as_echo "$as_me: error: Required headers for quota netlink daemon not found." >&2;}
+   { (exit 1); exit 1; }; }
+                       else
+                               { $as_echo "$as_me:$LINENO: WARNING: Quota netlink daemon won't be compiled. Required headers not found." >&5
+$as_echo "$as_me: WARNING: Quota netlink daemon won't be compiled. Required headers not found." >&2;}
+                       fi
+                       NETLINKLIBS=""
+                       enable_netlink="no"
+               else
+                       QUOTA_NETLINK_PROG=quota_nld
+               fi
+       fi
+fi
+
+
+
+{ $as_echo "$as_me:$LINENO: checking for library containing gethostbyname" >&5
+$as_echo_n "checking for library containing gethostbyname... " >&6; }
+if test "${ac_cv_search_gethostbyname+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  ac_func_search_save_LIBS=$LIBS
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char gethostbyname ();
+int
+main ()
+{
+return gethostbyname ();
+  ;
+  return 0;
+}
+_ACEOF
+for ac_lib in '' nsl; do
+  if test -z "$ac_lib"; then
+    ac_res="none required"
+  else
+    ac_res=-l$ac_lib
+    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
+  fi
+  rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest$ac_exeext && {
+        test "$cross_compiling" = yes ||
+        $as_test_x conftest$ac_exeext
+       }; then
+  ac_cv_search_gethostbyname=$ac_res
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       
+fi
+
+rm -rf conftest.dSYM
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext 
+  if test "${ac_cv_search_gethostbyname+set}" = set; then
+  break
+fi
+done
+if test "${ac_cv_search_gethostbyname+set}" = set; then
+  :
+else
+  ac_cv_search_gethostbyname=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_search_gethostbyname" >&5
+$as_echo "$ac_cv_search_gethostbyname" >&6; }
+ac_res=$ac_cv_search_gethostbyname
+if test "$ac_res" != no; then
+  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+  
+fi
+
+{ $as_echo "$as_me:$LINENO: checking for host_access in -lwrap" >&5
+$as_echo_n "checking for host_access in -lwrap... " >&6; }
+if test "${ac_cv_lib_wrap_main+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  saved_LIBS="$LIBS"
+       LIBS="$LIBS -lwrap"
+       cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+       #include <stdio.h>
+       #include <sys/types.h>
+       #include <sys/socket.h>
+       #include <netinet/in.h>
+       #include <tcpd.h>
+       struct request_info request;
+       int deny_severity, allow_severity;
+int
+main ()
+{
+hosts_access(&request);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest$ac_exeext && {
+        test "$cross_compiling" = yes ||
+        $as_test_x conftest$ac_exeext
+       }; then
+       ac_cv_lib_wrap_main=yes; LIBS="$saved_LIBS"; { $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_lib_wrap_main=no; LIBS="$saved_LIBS"; { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+rm -rf conftest.dSYM
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+       
+fi
+
+
+if test ${ac_cv_lib_wrap_main} = yes; then
+       if test "${ac_cv_header_tcpd_h+set}" = set; then
+  { $as_echo "$as_me:$LINENO: checking for tcpd.h" >&5
+$as_echo_n "checking for tcpd.h... " >&6; }
+if test "${ac_cv_header_tcpd_h+set}" = set; then
+  $as_echo_n "(cached) " >&6
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_tcpd_h" >&5
+$as_echo "$ac_cv_header_tcpd_h" >&6; }
+else
+  # Is the header compilable?
+{ $as_echo "$as_me:$LINENO: checking tcpd.h usability" >&5
+$as_echo_n "checking tcpd.h usability... " >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+@%:@include <tcpd.h>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_header_compiler=yes
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_header_compiler=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+$as_echo "$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ $as_echo "$as_me:$LINENO: checking tcpd.h presence" >&5
+$as_echo_n "checking tcpd.h presence... " >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+@%:@include <tcpd.h>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+        test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       }; then
+  ac_header_preproc=yes
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  ac_header_preproc=no
+fi
+
+rm -f conftest.err conftest.$ac_ext
+{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+$as_echo "$ac_header_preproc" >&6; }
+
+# So?  What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+  yes:no: )
+    { $as_echo "$as_me:$LINENO: WARNING: tcpd.h: accepted by the compiler, rejected by the preprocessor!" >&5
+$as_echo "$as_me: WARNING: tcpd.h: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: tcpd.h: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: tcpd.h: proceeding with the compiler's result" >&2;}
+    ac_header_preproc=yes
+    ;;
+  no:yes:* )
+    { $as_echo "$as_me:$LINENO: WARNING: tcpd.h: present but cannot be compiled" >&5
+$as_echo "$as_me: WARNING: tcpd.h: present but cannot be compiled" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: tcpd.h:     check for missing prerequisite headers?" >&5
+$as_echo "$as_me: WARNING: tcpd.h:     check for missing prerequisite headers?" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: tcpd.h: see the Autoconf documentation" >&5
+$as_echo "$as_me: WARNING: tcpd.h: see the Autoconf documentation" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: tcpd.h:     section \"Present But Cannot Be Compiled\"" >&5
+$as_echo "$as_me: WARNING: tcpd.h:     section \"Present But Cannot Be Compiled\"" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: tcpd.h: proceeding with the preprocessor's result" >&5
+$as_echo "$as_me: WARNING: tcpd.h: proceeding with the preprocessor's result" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: tcpd.h: in the future, the compiler will take precedence" >&5
+$as_echo "$as_me: WARNING: tcpd.h: in the future, the compiler will take precedence" >&2;}
+    
+    ;;
+esac
+{ $as_echo "$as_me:$LINENO: checking for tcpd.h" >&5
+$as_echo_n "checking for tcpd.h... " >&6; }
+if test "${ac_cv_header_tcpd_h+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  ac_cv_header_tcpd_h=$ac_header_preproc
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_tcpd_h" >&5
+$as_echo "$ac_cv_header_tcpd_h" >&6; }
+
+fi
+if test "x$ac_cv_header_tcpd_h" = x""yes; then
+  :
+else
+  
+               echo 'ERROR: could not find tcpd.h - missing TCP wrappers package'
+               exit 1
+       
+fi
+
+
+       LIBS="$LIBS -lwrap"
+       
+cat >>confdefs.h <<\_ACEOF
+@%:@define HOSTS_ACCESS 1
+_ACEOF
+
+       COMPILE_OPTS="$COMPILE_OPTS HOSTS_ACCESS"
+fi
+
+{ $as_echo "$as_me:$LINENO: checking for an ANSI C-conforming const" >&5
+$as_echo_n "checking for an ANSI C-conforming const... " >&6; }
+if test "${ac_cv_c_const+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+/* FIXME: Include the comments suggested by Paul. */
+#ifndef __cplusplus
+  /* Ultrix mips cc rejects this.  */
+  typedef int charset[2];
+  const charset cs;
+  /* SunOS 4.1.1 cc rejects this.  */
+  char const *const *pcpcc;
+  char **ppc;
+  /* NEC SVR4.0.2 mips cc rejects this.  */
+  struct point {int x, y;};
+  static struct point const zero = {0,0};
+  /* AIX XL C 1.02.0.0 rejects this.
+     It does not let you subtract one const X* pointer from another in
+     an arm of an if-expression whose if-part is not a constant
+     expression */
+  const char *g = "string";
+  pcpcc = &g + (g ? g-g : 0);
+  /* HPUX 7.0 cc rejects these. */
+  ++pcpcc;
+  ppc = (char**) pcpcc;
+  pcpcc = (char const *const *) ppc;
+  { /* SCO 3.2v4 cc rejects this.  */
+    char *t;
+    char const *s = 0 ? (char *) 0 : (char const *) 0;
+
+    *t++ = 0;
+    if (s) return 0;
+  }
+  { /* Someone thinks the Sun supposedly-ANSI compiler will reject this.  */
+    int x[] = {25, 17};
+    const int *foo = &x[0];
+    ++foo;
+  }
+  { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */
+    typedef const int *iptr;
+    iptr p = 0;
+    ++p;
+  }
+  { /* AIX XL C 1.02.0.0 rejects this saying
+       "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */
+    struct s { int j; const int *ap[3]; };
+    struct s *b; b->j = 5;
+  }
+  { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */
+    const int foo = 10;
+    if (!foo) return 0;
+  }
+  return !cs[0] && !zero.x;
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_c_const=yes
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_c_const=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_c_const" >&5
+$as_echo "$ac_cv_c_const" >&6; }
+if test $ac_cv_c_const = no; then
+  
+cat >>confdefs.h <<\_ACEOF
+@%:@define const /**/
+_ACEOF
+
+fi
+
+{ $as_echo "$as_me:$LINENO: checking for inline" >&5
+$as_echo_n "checking for inline... " >&6; }
+if test "${ac_cv_c_inline+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  ac_cv_c_inline=no
+for ac_kw in inline __inline__ __inline; do
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#ifndef __cplusplus
+typedef int foo_t;
+static $ac_kw foo_t static_foo () {return 0; }
+$ac_kw foo_t foo () {return 0; }
+#endif
+
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_c_inline=$ac_kw
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  test "$ac_cv_c_inline" != no && break
+done
+
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_c_inline" >&5
+$as_echo "$ac_cv_c_inline" >&6; }
+
+
+case $ac_cv_c_inline in
+  inline | yes) ;;
+  *)
+    case $ac_cv_c_inline in
+      no) ac_val=;;
+      *) ac_val=$ac_cv_c_inline;;
+    esac
+    cat >>confdefs.h <<_ACEOF
+#ifndef __cplusplus
+#define inline $ac_val
+#endif
+_ACEOF
+    ;;
+esac
+
+
+@%:@ Check whether --enable-altformat was given.
+if test "${enable_altformat+set}" = set; then
+  enableval=$enable_altformat; 
+else
+  enable_altformat="yes"
+fi
+
+@%:@ Check whether --enable-rpc was given.
+if test "${enable_rpc+set}" = set; then
+  enableval=$enable_rpc; 
+else
+  enable_rpc="yes"
+fi
+
+@%:@ Check whether --enable-rpcsetquota was given.
+if test "${enable_rpcsetquota+set}" = set; then
+  enableval=$enable_rpcsetquota; 
+else
+  enable_rpcsetquota="no"
+fi
+
+@%:@ Check whether --enable-xfs_roothack was given.
+if test "${enable_xfs_roothack+set}" = set; then
+  enableval=$enable_xfs_roothack; 
+else
+  enable_xfs_roothack="no"
+fi
+
+@%:@ Check whether --enable-bsd_behaviour was given.
+if test "${enable_bsd_behaviour+set}" = set; then
+  enableval=$enable_bsd_behaviour; 
+else
+  enable_bsd_behaviour="yes"
+fi
+
+@%:@ Check whether --enable-libefence was given.
+if test "${enable_libefence+set}" = set; then
+  enableval=$enable_libefence; 
+else
+  enable_libefence="no"
+fi
+
+
+@%:@ Check whether --enable-nls was given.
+if test "${enable_nls+set}" = set; then
+  enableval=$enable_nls; 
+else
+  enable_nls="yes"
+fi
+
+@%:@ Check whether --enable-rootsbin was given.
+if test "${enable_rootsbin+set}" = set; then
+  enableval=$enable_rootsbin; 
+else
+  enable_rootsbin="no"
+fi
+
+@%:@ Check whether --enable-proc-mounts was given.
+if test "${enable_proc_mounts+set}" = set; then
+  enableval=$enable_proc_mounts; 
+else
+  enable_proc_mounts="/proc/mounts"
+fi
+
+
+if test "$enable_altformat" = "yes" ; then
+       
+cat >>confdefs.h <<\_ACEOF
+@%:@define ALT_FORMAT 1
+_ACEOF
+
+       COMPILE_OPTS="$COMPILE_OPTS ALT_FORMAT"
+fi
+if test "$enable_rpc" = "yes" ; then
+       
+cat >>confdefs.h <<\_ACEOF
+@%:@define RPC 1
+_ACEOF
+
+       COMPILE_OPTS="$COMPILE_OPTS RPC"
+fi
+if test "$enable_rpcsetquota" = "yes" ; then
+       
+cat >>confdefs.h <<\_ACEOF
+@%:@define RPC_SETQUOTA 1
+_ACEOF
+
+       COMPILE_OPTS="$COMPILE_OPTS RPC_SETQUOTA"
+fi
+if test "$enable_xfs_roothack" = "yes" ; then
+       
+cat >>confdefs.h <<\_ACEOF
+@%:@define XFS_ROOTHACK 1
+_ACEOF
+
+       COMPILE_OPTS="$COMPILE_OPTS XFS_ROOTHACK"
+fi
+if test "$enable_bsd_behaviour" = "yes" ; then
+       
+cat >>confdefs.h <<\_ACEOF
+@%:@define BSD_BEHAVIOUR 1
+_ACEOF
+
+       COMPILE_OPTS="$COMPILE_OPTS BSD_BEHAVIOUR"
+fi
+if test "$enable_libefence" = "yes" ; then
+       LIBMALLOC="/usr/lib/libefence.a"
+fi
+if test "$enable_nls" = "yes" ; then
+       
+cat >>confdefs.h <<\_ACEOF
+@%:@define USE_GETTEXT 1
+_ACEOF
+
+       INSTMO="inst_mo"
+fi
+if test "$enable_proc_mounts" != "no"; then
+       
+cat >>confdefs.h <<_ACEOF
+@%:@define ALT_MTAB "$enable_proc_mounts"
+_ACEOF
+
+fi
+if test "$enable_rootsbin" = "yes" ; then
+       ROOTSBIN="/sbin"
+else
+       ROOTSBIN='$(prefix)/sbin'
+fi
+
+
+cat >>confdefs.h <<_ACEOF
+@%:@define COMPILE_OPTS "$COMPILE_OPTS"
+_ACEOF
+
+
+cat >>confdefs.h <<\_ACEOF
+@%:@define PACKAGE_VERSION "4.00-pre1"
+_ACEOF
+
+
+
+
+
+
+
+ac_config_files="$ac_config_files Makefile"
+
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems.  If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, we kill variables containing newlines.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(
+  for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
+    eval ac_val=\$$ac_var
+    case $ac_val in #(
+    *${as_nl}*)
+      case $ac_var in #(
+      *_cv_*) { $as_echo "$as_me:$LINENO: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+      *) $as_unset $ac_var ;;
+      esac ;;
+    esac
+  done
+
+  (set) 2>&1 |
+    case $as_nl`(ac_space=' '; set) 2>&1` in #(
+    *${as_nl}ac_space=\ *)
+      # `set' does not quote correctly, so add quotes (double-quote
+      # substitution turns \\\\ into \\, and sed turns \\ into \).
+      sed -n \
+       "s/'/'\\\\''/g;
+         s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+      ;; #(
+    *)
+      # `set' quotes correctly as required by POSIX, so do not add quotes.
+      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+      ;;
+    esac |
+    sort
+) |
+  sed '
+     /^ac_cv_env_/b end
+     t clear
+     :clear
+     s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+     t end
+     s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+     :end' >>confcache
+if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
+  if test -w "$cache_file"; then
+    test "x$cache_file" != "x/dev/null" &&
+      { $as_echo "$as_me:$LINENO: updating cache $cache_file" >&5
+$as_echo "$as_me: updating cache $cache_file" >&6;}
+    cat confcache >$cache_file
+  else
+    { $as_echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5
+$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
+  fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+DEFS=-DHAVE_CONFIG_H
+
+ac_libobjs=
+ac_ltlibobjs=
+for ac_i in : $LIB@&t@OBJS; do test "x$ac_i" = x: && continue
+  # 1. Remove the extension, and $U if already installed.
+  ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
+  ac_i=`$as_echo "$ac_i" | sed "$ac_script"`
+  # 2. Prepend LIBOBJDIR.  When used with automake>=1.10 LIBOBJDIR
+  #    will be set to the directory where LIBOBJS objects are built.
+  ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext"
+  ac_ltlibobjs="$ac_ltlibobjs \${LIBOBJDIR}$ac_i"'$U.lo'
+done
+LIB@&t@OBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+
+: ${CONFIG_STATUS=./config.status}
+ac_write_fail=0
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ $as_echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5
+$as_echo "$as_me: creating $CONFIG_STATUS" >&6;}
+cat >$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+SHELL=\${CONFIG_SHELL-$SHELL}
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+## --------------------- ##
+## M4sh Initialization.  ##
+## --------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in
+  *posix*) set -o posix ;;
+esac
+
+fi
+
+
+
+
+# PATH needs CR
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+if (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='printf %s\n'
+  as_echo_n='printf %s'
+else
+  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+    as_echo_n='/usr/ucb/echo -n'
+  else
+    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+    as_echo_n_body='eval
+      arg=$1;
+      case $arg in
+      *"$as_nl"*)
+       expr "X$arg" : "X\\(.*\\)$as_nl";
+       arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+      esac;
+      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+    '
+    export as_echo_n_body
+    as_echo_n='sh -c $as_echo_n_body as_echo'
+  fi
+  export as_echo_body
+  as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+      PATH_SEPARATOR=';'
+  }
+fi
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  as_unset=unset
+else
+  as_unset=false
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" ""       $as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+case $0 in
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+IFS=$as_save_IFS
+
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  { (exit 1); exit 1; }
+fi
+
+# Work around bugs in pre-3.0 UWIN ksh.
+for as_var in ENV MAIL MAILPATH
+do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+        X"$0" : 'X\(//\)$' \| \
+        X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+           s//\1/
+           q
+         }
+         /^X\/\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\/\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+
+# CDPATH.
+$as_unset CDPATH
+
+
+
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || {
+
+  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+  # uniformly replaced by the line number.  The first 'sed' inserts a
+  # line-number line after each line using $LINENO; the second 'sed'
+  # does the real work.  The second script uses 'N' to pair each
+  # line-number line with the line containing $LINENO, and appends
+  # trailing '-' during substitution so that $LINENO is not a special
+  # case at line end.
+  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+  # scripts with optimization help from Paolo Bonzini.  Blame Lee
+  # E. McMahon (1931-1989) for sed's syntax.  :-)
+  sed -n '
+    p
+    /[$]LINENO/=
+  ' <$as_myself |
+    sed '
+      s/[$]LINENO.*/&-/
+      t lineno
+      b
+      :lineno
+      N
+      :loop
+      s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
+      t loop
+      s/-\n.*//
+    ' >$as_me.lineno &&
+  chmod +x "$as_me.lineno" ||
+    { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
+   { (exit 1); exit 1; }; }
+
+  # Don't try to exec as it changes $[0], causing all sort of problems
+  # (the dirname of $[0] is not the place where we might find the
+  # original and so on.  Autoconf is especially sensitive to this).
+  . "./$as_me.lineno"
+  # Exit status is that of the last command.
+  exit
+}
+
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in
+-n*)
+  case `echo 'x\c'` in
+  *c*) ECHO_T='        ';;     # ECHO_T is single tab character.
+  *)   ECHO_C='\c';;
+  esac;;
+*)
+  ECHO_N='-n';;
+esac
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+  if ln -s conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s='ln -s'
+    # ... but there are two gotchas:
+    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+    # In both cases, we have to default to `cp -p'.
+    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+      as_ln_s='cp -p'
+  elif ln conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s=ln
+  else
+    as_ln_s='cp -p'
+  fi
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p=:
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+if test -x / >/dev/null 2>&1; then
+  as_test_x='test -x'
+else
+  if ls -dL / >/dev/null 2>&1; then
+    as_ls_L_option=L
+  else
+    as_ls_L_option=
+  fi
+  as_test_x='
+    eval sh -c '\''
+      if test -d "$1"; then
+       test -d "$1/.";
+      else
+       case $1 in
+       -*)set "./$1";;
+       esac;
+       case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in
+       ???[sx]*):;;*)false;;esac;fi
+    '\'' sh
+  '
+fi
+as_executable_p=$as_test_x
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+exec 6>&1
+
+# Save the log message, to keep $[0] and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling.
+ac_log="
+This file was extended by $as_me, which was
+generated by GNU Autoconf 2.63.  Invocation command line was
+
+  CONFIG_FILES    = $CONFIG_FILES
+  CONFIG_HEADERS  = $CONFIG_HEADERS
+  CONFIG_LINKS    = $CONFIG_LINKS
+  CONFIG_COMMANDS = $CONFIG_COMMANDS
+  $ $0 $@
+
+on `(hostname || uname -n) 2>/dev/null | sed 1q`
+"
+
+_ACEOF
+
+case $ac_config_files in *"
+"*) set x $ac_config_files; shift; ac_config_files=$*;;
+esac
+
+case $ac_config_headers in *"
+"*) set x $ac_config_headers; shift; ac_config_headers=$*;;
+esac
+
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+# Files that config.status was made for.
+config_files="$ac_config_files"
+config_headers="$ac_config_headers"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+ac_cs_usage="\
+\`$as_me' instantiates files from templates according to the
+current configuration.
+
+Usage: $0 [OPTION]... [FILE]...
+
+  -h, --help       print this help, then exit
+  -V, --version    print version number and configuration settings, then exit
+  -q, --quiet, --silent
+                   do not print progress messages
+  -d, --debug      don't remove temporary files
+      --recheck    update $as_me by reconfiguring in the same conditions
+      --file=FILE[:TEMPLATE] 
+                   instantiate the configuration file FILE
+      --header=FILE[:TEMPLATE] 
+                   instantiate the configuration header FILE
+
+Configuration files:
+$config_files
+
+Configuration headers:
+$config_headers
+
+Report bugs to <bug-autoconf@gnu.org>."
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_cs_version="\\
+config.status
+configured by $0, generated by GNU Autoconf 2.63,
+  with options \\"`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\"
+
+Copyright (C) 2008 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+
+ac_pwd='$ac_pwd'
+srcdir='$srcdir'
+INSTALL='$INSTALL'
+test -n "\$AWK" || AWK=awk
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# The default lists apply if the user does not specify any file.
+ac_need_defaults=:
+while test $# != 0
+do
+  case $1 in
+  --*=*)
+    ac_option=`expr "X$1" : 'X\([^=]*\)='`
+    ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
+    ac_shift=:
+    ;;
+  *)
+    ac_option=$1
+    ac_optarg=$2
+    ac_shift=shift
+    ;;
+  esac
+
+  case $ac_option in
+  # Handling of the options.
+  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+    ac_cs_recheck=: ;;
+  --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
+    $as_echo "$ac_cs_version"; exit ;;
+  --debug | --debu | --deb | --de | --d | -d )
+    debug=: ;;
+  --file | --fil | --fi | --f )
+    $ac_shift
+    case $ac_optarg in
+    *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    esac
+    CONFIG_FILES="$CONFIG_FILES '$ac_optarg'"
+    ac_need_defaults=false;;
+  --header | --heade | --head | --hea )
+    $ac_shift
+    case $ac_optarg in
+    *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    esac
+    CONFIG_HEADERS="$CONFIG_HEADERS '$ac_optarg'"
+    ac_need_defaults=false;;
+  --he | --h)
+    # Conflict between --help and --header
+    { $as_echo "$as_me: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&2
+   { (exit 1); exit 1; }; };;
+  --help | --hel | -h )
+    $as_echo "$ac_cs_usage"; exit ;;
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil | --si | --s)
+    ac_cs_silent=: ;;
+
+  # This is an error.
+  -*) { $as_echo "$as_me: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&2
+   { (exit 1); exit 1; }; } ;;
+
+  *) ac_config_targets="$ac_config_targets $1"
+     ac_need_defaults=false ;;
+
+  esac
+  shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+  exec 6>/dev/null
+  ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+if \$ac_cs_recheck; then
+  set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+  shift
+  \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
+  CONFIG_SHELL='$SHELL'
+  export CONFIG_SHELL
+  exec "\$@"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+exec 5>>config.log
+{
+  echo
+  sed 'h;s/./-/g;s/^.../@%:@@%:@ /;s/...$/ @%:@@%:@/;p;x;p;x' <<_ASBOX
+@%:@@%:@ Running $as_me. @%:@@%:@
+_ASBOX
+  $as_echo "$ac_log"
+} >&5
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+
+# Handling of arguments.
+for ac_config_target in $ac_config_targets
+do
+  case $ac_config_target in
+    "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;;
+    "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+
+  *) { { $as_echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5
+$as_echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
+   { (exit 1); exit 1; }; };;
+  esac
+done
+
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used.  Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+  test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+  test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
+fi
+
+# Have a temporary directory for convenience.  Make it in the build tree
+# simply because there is no reason against having it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Hook for its removal unless debugging.
+# Note that there is a small window in which the directory will not be cleaned:
+# after its creation but before its name has been assigned to `$tmp'.
+$debug ||
+{
+  tmp=
+  trap 'exit_status=$?
+  { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status
+' 0
+  trap '{ (exit 1); exit 1; }' 1 2 13 15
+}
+# Create a (secure) tmp directory for tmp files.
+
+{
+  tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
+  test -n "$tmp" && test -d "$tmp"
+}  ||
+{
+  tmp=./conf$$-$RANDOM
+  (umask 077 && mkdir "$tmp")
+} ||
+{
+   $as_echo "$as_me: cannot create a temporary directory in ." >&2
+   { (exit 1); exit 1; }
+}
+
+# Set up the scripts for CONFIG_FILES section.
+# No need to generate them if there are no CONFIG_FILES.
+# This happens for instance with `./config.status config.h'.
+if test -n "$CONFIG_FILES"; then
+
+
+ac_cr='\r'
+ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null`
+if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
+  ac_cs_awk_cr='\\r'
+else
+  ac_cs_awk_cr=$ac_cr
+fi
+
+echo 'BEGIN {' >"$tmp/subs1.awk" &&
+_ACEOF
+
+
+{
+  echo "cat >conf$$subs.awk <<_ACEOF" &&
+  echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' &&
+  echo "_ACEOF"
+} >conf$$subs.sh ||
+  { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
+$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;}
+   { (exit 1); exit 1; }; }
+ac_delim_num=`echo "$ac_subst_vars" | grep -c '$'`
+ac_delim='%!_!# '
+for ac_last_try in false false false false false :; do
+  . ./conf$$subs.sh ||
+    { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
+$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;}
+   { (exit 1); exit 1; }; }
+
+  ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`
+  if test $ac_delim_n = $ac_delim_num; then
+    break
+  elif $ac_last_try; then
+    { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
+$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;}
+   { (exit 1); exit 1; }; }
+  else
+    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+  fi
+done
+rm -f conf$$subs.sh
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+cat >>"\$tmp/subs1.awk" <<\\_ACAWK &&
+_ACEOF
+sed -n '
+h
+s/^/S["/; s/!.*/"]=/
+p
+g
+s/^[^!]*!//
+:repl
+t repl
+s/'"$ac_delim"'$//
+t delim
+:nl
+h
+s/\(.\{148\}\).*/\1/
+t more1
+s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/
+p
+n
+b repl
+:more1
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t nl
+:delim
+h
+s/\(.\{148\}\).*/\1/
+t more2
+s/["\\]/\\&/g; s/^/"/; s/$/"/
+p
+b
+:more2
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t delim
+' <conf$$subs.awk | sed '
+/^[^""]/{
+  N
+  s/\n//
+}
+' >>$CONFIG_STATUS || ac_write_fail=1
+rm -f conf$$subs.awk
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+_ACAWK
+cat >>"\$tmp/subs1.awk" <<_ACAWK &&
+  for (key in S) S_is_set[key] = 1
+  FS = "\a"
+
+}
+{
+  line = $ 0
+  nfields = split(line, field, "@")
+  substed = 0
+  len = length(field[1])
+  for (i = 2; i < nfields; i++) {
+    key = field[i]
+    keylen = length(key)
+    if (S_is_set[key]) {
+      value = S[key]
+      line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3)
+      len += length(value) + length(field[++i])
+      substed = 1
+    } else
+      len += 1 + keylen
+  }
+
+  print line
+}
+
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then
+  sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
+else
+  cat
+fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \
+  || { { $as_echo "$as_me:$LINENO: error: could not setup config files machinery" >&5
+$as_echo "$as_me: error: could not setup config files machinery" >&2;}
+   { (exit 1); exit 1; }; }
+_ACEOF
+
+# VPATH may cause trouble with some makes, so we remove $(srcdir),
+# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+  ac_vpsub='/^[         ]*VPATH[        ]*=/{
+s/:*\$(srcdir):*/:/
+s/:*\${srcdir}:*/:/
+s/:*@srcdir@:*/:/
+s/^\([^=]*=[    ]*\):*/\1/
+s/:*$//
+s/^[^=]*=[      ]*$//
+}'
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+fi # test -n "$CONFIG_FILES"
+
+# Set up the scripts for CONFIG_HEADERS section.
+# No need to generate them if there are no CONFIG_HEADERS.
+# This happens for instance with `./config.status Makefile'.
+if test -n "$CONFIG_HEADERS"; then
+cat >"$tmp/defines.awk" <<\_ACAWK ||
+BEGIN {
+_ACEOF
+
+# Transform confdefs.h into an awk script `defines.awk', embedded as
+# here-document in config.status, that substitutes the proper values into
+# config.h.in to produce config.h.
+
+# Create a delimiter string that does not exist in confdefs.h, to ease
+# handling of long lines.
+ac_delim='%!_!# '
+for ac_last_try in false false :; do
+  ac_t=`sed -n "/$ac_delim/p" confdefs.h`
+  if test -z "$ac_t"; then
+    break
+  elif $ac_last_try; then
+    { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_HEADERS" >&5
+$as_echo "$as_me: error: could not make $CONFIG_HEADERS" >&2;}
+   { (exit 1); exit 1; }; }
+  else
+    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+  fi
+done
+
+# For the awk script, D is an array of macro values keyed by name,
+# likewise P contains macro parameters if any.  Preserve backslash
+# newline sequences.
+
+ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*
+sed -n '
+s/.\{148\}/&'"$ac_delim"'/g
+t rset
+:rset
+s/^[    ]*#[    ]*define[       ][      ]*/ /
+t def
+d
+:def
+s/\\$//
+t bsnl
+s/["\\]/\\&/g
+s/^ \('"$ac_word_re"'\)\(([^()]*)\)[    ]*\(.*\)/P["\1"]="\2"\
+D["\1"]=" \3"/p
+s/^ \('"$ac_word_re"'\)[        ]*\(.*\)/D["\1"]=" \2"/p
+d
+:bsnl
+s/["\\]/\\&/g
+s/^ \('"$ac_word_re"'\)\(([^()]*)\)[    ]*\(.*\)/P["\1"]="\2"\
+D["\1"]=" \3\\\\\\n"\\/p
+t cont
+s/^ \('"$ac_word_re"'\)[        ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p
+t cont
+d
+:cont
+n
+s/.\{148\}/&'"$ac_delim"'/g
+t clear
+:clear
+s/\\$//
+t bsnlc
+s/["\\]/\\&/g; s/^/"/; s/$/"/p
+d
+:bsnlc
+s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p
+b cont
+' <confdefs.h | sed '
+s/'"$ac_delim"'/"\\\
+"/g' >>$CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+  for (key in D) D_is_set[key] = 1
+  FS = "\a"
+}
+/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ {
+  line = \$ 0
+  split(line, arg, " ")
+  if (arg[1] == "#") {
+    defundef = arg[2]
+    mac1 = arg[3]
+  } else {
+    defundef = substr(arg[1], 2)
+    mac1 = arg[2]
+  }
+  split(mac1, mac2, "(") #)
+  macro = mac2[1]
+  prefix = substr(line, 1, index(line, defundef) - 1)
+  if (D_is_set[macro]) {
+    # Preserve the white space surrounding the "#".
+    print prefix "define", macro P[macro] D[macro]
+    next
+  } else {
+    # Replace #undef with comments.  This is necessary, for example,
+    # in the case of _POSIX_SOURCE, which is predefined and required
+    # on some systems where configure will not decide to define it.
+    if (defundef == "undef") {
+      print "/*", prefix defundef, macro, "*/"
+      next
+    }
+  }
+}
+{ print }
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+  { { $as_echo "$as_me:$LINENO: error: could not setup config headers machinery" >&5
+$as_echo "$as_me: error: could not setup config headers machinery" >&2;}
+   { (exit 1); exit 1; }; }
+fi # test -n "$CONFIG_HEADERS"
+
+
+eval set X "  :F $CONFIG_FILES  :H $CONFIG_HEADERS    "
+shift
+for ac_tag
+do
+  case $ac_tag in
+  :[FHLC]) ac_mode=$ac_tag; continue;;
+  esac
+  case $ac_mode$ac_tag in
+  :[FHL]*:*);;
+  :L* | :C*:*) { { $as_echo "$as_me:$LINENO: error: invalid tag $ac_tag" >&5
+$as_echo "$as_me: error: invalid tag $ac_tag" >&2;}
+   { (exit 1); exit 1; }; };;
+  :[FH]-) ac_tag=-:-;;
+  :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
+  esac
+  ac_save_IFS=$IFS
+  IFS=:
+  set x $ac_tag
+  IFS=$ac_save_IFS
+  shift
+  ac_file=$1
+  shift
+
+  case $ac_mode in
+  :L) ac_source=$1;;
+  :[FH])
+    ac_file_inputs=
+    for ac_f
+    do
+      case $ac_f in
+      -) ac_f="$tmp/stdin";;
+      *) # Look for the file first in the build tree, then in the source tree
+        # (if the path is not absolute).  The absolute path cannot be DOS-style,
+        # because $ac_f cannot contain `:'.
+        test -f "$ac_f" ||
+          case $ac_f in
+          [\\/$]*) false;;
+          *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
+          esac ||
+          { { $as_echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5
+$as_echo "$as_me: error: cannot find input file: $ac_f" >&2;}
+   { (exit 1); exit 1; }; };;
+      esac
+      case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
+      ac_file_inputs="$ac_file_inputs '$ac_f'"
+    done
+
+    # Let's still pretend it is `configure' which instantiates (i.e., don't
+    # use $as_me), people would be surprised to read:
+    #    /* config.h.  Generated by config.status.  */
+    configure_input='Generated from '`
+         $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
+       `' by configure.'
+    if test x"$ac_file" != x-; then
+      configure_input="$ac_file.  $configure_input"
+      { $as_echo "$as_me:$LINENO: creating $ac_file" >&5
+$as_echo "$as_me: creating $ac_file" >&6;}
+    fi
+    # Neutralize special characters interpreted by sed in replacement strings.
+    case $configure_input in #(
+    *\&* | *\|* | *\\* )
+       ac_sed_conf_input=`$as_echo "$configure_input" |
+       sed 's/[\\\\&|]/\\\\&/g'`;; #(
+    *) ac_sed_conf_input=$configure_input;;
+    esac
+
+    case $ac_tag in
+    *:-:* | *:-) cat >"$tmp/stdin" \
+      || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5
+$as_echo "$as_me: error: could not create $ac_file" >&2;}
+   { (exit 1); exit 1; }; } ;;
+    esac
+    ;;
+  esac
+
+  ac_dir=`$as_dirname -- "$ac_file" ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$ac_file" : 'X\(//\)[^/]' \| \
+        X"$ac_file" : 'X\(//\)$' \| \
+        X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$ac_file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)[^/].*/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+  { as_dir="$ac_dir"
+  case $as_dir in #(
+  -*) as_dir=./$as_dir;;
+  esac
+  test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || {
+    as_dirs=
+    while :; do
+      case $as_dir in #(
+      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+      *) as_qdir=$as_dir;;
+      esac
+      as_dirs="'$as_qdir' $as_dirs"
+      as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$as_dir" : 'X\(//\)[^/]' \| \
+        X"$as_dir" : 'X\(//\)$' \| \
+        X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)[^/].*/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+      test -d "$as_dir" && break
+    done
+    test -z "$as_dirs" || eval "mkdir $as_dirs"
+  } || test -d "$as_dir" || { { $as_echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5
+$as_echo "$as_me: error: cannot create directory $as_dir" >&2;}
+   { (exit 1); exit 1; }; }; }
+  ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+  .)  # We are building in place.
+    ac_srcdir=.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+
+  case $ac_mode in
+  :F)
+  #
+  # CONFIG_FILE
+  #
+
+  case $INSTALL in
+  [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+  *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;
+  esac
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# If the template does not know about datarootdir, expand it.
+# FIXME: This hack should be removed a few years after 2.60.
+ac_datarootdir_hack=; ac_datarootdir_seen=
+
+ac_sed_dataroot='
+/datarootdir/ {
+  p
+  q
+}
+/@datadir@/p
+/@docdir@/p
+/@infodir@/p
+/@localedir@/p
+/@mandir@/p
+'
+case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
+*datarootdir*) ac_datarootdir_seen=yes;;
+*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
+  { $as_echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+  ac_datarootdir_hack='
+  s&@datadir@&$datadir&g
+  s&@docdir@&$docdir&g
+  s&@infodir@&$infodir&g
+  s&@localedir@&$localedir&g
+  s&@mandir@&$mandir&g
+    s&\\\${datarootdir}&$datarootdir&g' ;;
+esac
+_ACEOF
+
+# Neutralize VPATH when `$srcdir' = `.'.
+# Shell code in configure.ac might set extrasub.
+# FIXME: do we really want to maintain this feature?
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_sed_extra="$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s|@configure_input@|$ac_sed_conf_input|;t t
+s&@top_builddir@&$ac_top_builddir_sub&;t t
+s&@top_build_prefix@&$ac_top_build_prefix&;t t
+s&@srcdir@&$ac_srcdir&;t t
+s&@abs_srcdir@&$ac_abs_srcdir&;t t
+s&@top_srcdir@&$ac_top_srcdir&;t t
+s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
+s&@builddir@&$ac_builddir&;t t
+s&@abs_builddir@&$ac_abs_builddir&;t t
+s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
+s&@INSTALL@&$ac_INSTALL&;t t
+$ac_datarootdir_hack
+"
+eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \
+  || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5
+$as_echo "$as_me: error: could not create $ac_file" >&2;}
+   { (exit 1); exit 1; }; }
+
+test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
+  { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } &&
+  { ac_out=`sed -n '/^[         ]*datarootdir[  ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } &&
+  { $as_echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined." >&5
+$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined." >&2;}
+
+  rm -f "$tmp/stdin"
+  case $ac_file in
+  -) cat "$tmp/out" && rm -f "$tmp/out";;
+  *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";;
+  esac \
+  || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5
+$as_echo "$as_me: error: could not create $ac_file" >&2;}
+   { (exit 1); exit 1; }; }
+ ;;
+  :H)
+  #
+  # CONFIG_HEADER
+  #
+  if test x"$ac_file" != x-; then
+    {
+      $as_echo "/* $configure_input  */" \
+      && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs"
+    } >"$tmp/config.h" \
+      || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5
+$as_echo "$as_me: error: could not create $ac_file" >&2;}
+   { (exit 1); exit 1; }; }
+    if diff "$ac_file" "$tmp/config.h" >/dev/null 2>&1; then
+      { $as_echo "$as_me:$LINENO: $ac_file is unchanged" >&5
+$as_echo "$as_me: $ac_file is unchanged" >&6;}
+    else
+      rm -f "$ac_file"
+      mv "$tmp/config.h" "$ac_file" \
+       || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5
+$as_echo "$as_me: error: could not create $ac_file" >&2;}
+   { (exit 1); exit 1; }; }
+    fi
+  else
+    $as_echo "/* $configure_input  */" \
+      && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" \
+      || { { $as_echo "$as_me:$LINENO: error: could not create -" >&5
+$as_echo "$as_me: error: could not create -" >&2;}
+   { (exit 1); exit 1; }; }
+  fi
+ ;;
+  
+  
+  esac
+
+done # for ac_tag
+
+
+{ (exit 0); exit 0; }
+_ACEOF
+chmod +x $CONFIG_STATUS
+ac_clean_files=$ac_clean_files_save
+
+test $ac_write_fail = 0 ||
+  { { $as_echo "$as_me:$LINENO: error: write failure creating $CONFIG_STATUS" >&5
+$as_echo "$as_me: error: write failure creating $CONFIG_STATUS" >&2;}
+   { (exit 1); exit 1; }; }
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded.  So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status.  When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+  ac_cs_success=:
+  ac_config_status_args=
+  test "$silent" = yes &&
+    ac_config_status_args="$ac_config_status_args --quiet"
+  exec 5>/dev/null
+  $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
+  exec 5>>config.log
+  # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+  # would make configure fail if this is the last instruction.
+  $ac_cs_success || { (exit 1); exit 1; }
+fi
+if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
+  { $as_echo "$as_me:$LINENO: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
+$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
+fi
+
diff --git a/autom4te.cache/requests b/autom4te.cache/requests
new file mode 100644 (file)
index 0000000..91f735f
--- /dev/null
@@ -0,0 +1,218 @@
+# This file was generated.
+# It contains the lists of macros which have been traced.
+# It can be safely removed.
+
+@request = (
+             bless( [
+                      '0',
+                      1,
+                      [
+                        '/usr/share/autoconf'
+                      ],
+                      [
+                        '/usr/share/autoconf/autoconf/autoconf.m4f',
+                        'configure.in'
+                      ],
+                      {
+                        '_LT_AC_TAGCONFIG' => 1,
+                        'AM_PROG_F77_C_O' => 1,
+                        'm4_pattern_forbid' => 1,
+                        'AC_CANONICAL_TARGET' => 1,
+                        'AC_CONFIG_LIBOBJ_DIR' => 1,
+                        'AC_TYPE_OFF_T' => 1,
+                        'AC_C_VOLATILE' => 1,
+                        'AC_FUNC_CLOSEDIR_VOID' => 1,
+                        'AC_REPLACE_FNMATCH' => 1,
+                        'AC_PROG_LIBTOOL' => 1,
+                        'AC_FUNC_STAT' => 1,
+                        'AC_HEADER_TIME' => 1,
+                        'AC_FUNC_WAIT3' => 1,
+                        'AM_AUTOMAKE_VERSION' => 1,
+                        'AC_STRUCT_TM' => 1,
+                        'AC_FUNC_LSTAT' => 1,
+                        'AC_TYPE_MODE_T' => 1,
+                        'AC_FUNC_GETMNTENT' => 1,
+                        'AC_FUNC_STRTOD' => 1,
+                        'AC_CHECK_HEADERS' => 1,
+                        'LT_CONFIG_LTDL_DIR' => 1,
+                        'AC_FUNC_STRNLEN' => 1,
+                        'm4_sinclude' => 1,
+                        'AC_PROG_CXX' => 1,
+                        'AC_PATH_X' => 1,
+                        'AC_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK' => 1,
+                        'AC_PROG_AWK' => 1,
+                        '_m4_warn' => 1,
+                        'AC_HEADER_STDC' => 1,
+                        'AC_HEADER_MAJOR' => 1,
+                        'AM_PROG_CXX_C_O' => 1,
+                        'LT_INIT' => 1,
+                        'AC_FUNC_ERROR_AT_LINE' => 1,
+                        'AC_PROG_GCC_TRADITIONAL' => 1,
+                        'AC_LIBSOURCE' => 1,
+                        'AC_FUNC_MBRTOWC' => 1,
+                        'AC_STRUCT_ST_BLOCKS' => 1,
+                        'AM_PROG_FC_C_O' => 1,
+                        'AC_CANONICAL_BUILD' => 1,
+                        'AC_TYPE_SIGNAL' => 1,
+                        'AC_TYPE_UID_T' => 1,
+                        '_AM_SUBST_NOTMAKE' => 1,
+                        'AC_CONFIG_AUX_DIR' => 1,
+                        'AC_PROG_MAKE_SET' => 1,
+                        'sinclude' => 1,
+                        'm4_pattern_allow' => 1,
+                        'AC_DEFINE_TRACE_LITERAL' => 1,
+                        'AC_FUNC_STRERROR_R' => 1,
+                        'AC_PROG_CC' => 1,
+                        'AC_FUNC_FORK' => 1,
+                        'AC_DECL_SYS_SIGLIST' => 1,
+                        'AC_FUNC_VPRINTF' => 1,
+                        'AC_FUNC_STRCOLL' => 1,
+                        'AC_PROG_YACC' => 1,
+                        'AC_SUBST_TRACE' => 1,
+                        'AC_INIT' => 1,
+                        'AC_STRUCT_TIMEZONE' => 1,
+                        'AC_FUNC_CHOWN' => 1,
+                        'AC_SUBST' => 1,
+                        'AC_FUNC_ALLOCA' => 1,
+                        'AC_FC_SRCEXT' => 1,
+                        'AC_CANONICAL_HOST' => 1,
+                        'AC_FUNC_GETPGRP' => 1,
+                        'AC_PROG_RANLIB' => 1,
+                        'AM_INIT_AUTOMAKE' => 1,
+                        'AC_FUNC_SETPGRP' => 1,
+                        'AC_CONFIG_SUBDIRS' => 1,
+                        'AC_FUNC_MMAP' => 1,
+                        'AC_FUNC_REALLOC' => 1,
+                        'AC_TYPE_SIZE_T' => 1,
+                        'AC_REQUIRE_AUX_FILE' => 1,
+                        'AC_CONFIG_LINKS' => 1,
+                        'AC_CHECK_TYPES' => 1,
+                        'LT_SUPPORTED_TAG' => 1,
+                        'AC_CHECK_MEMBERS' => 1,
+                        'AM_MAINTAINER_MODE' => 1,
+                        'AC_FUNC_UTIME_NULL' => 1,
+                        'AC_FUNC_SELECT_ARGTYPES' => 1,
+                        'AM_GNU_GETTEXT_INTL_SUBDIR' => 1,
+                        'AC_FUNC_STRFTIME' => 1,
+                        'AC_HEADER_STAT' => 1,
+                        'AC_C_INLINE' => 1,
+                        'AC_PROG_CPP' => 1,
+                        'AM_ENABLE_MULTILIB' => 1,
+                        'AC_TYPE_PID_T' => 1,
+                        'AC_C_CONST' => 1,
+                        'AC_PROG_LEX' => 1,
+                        'AC_CONFIG_FILES' => 1,
+                        'include' => 1,
+                        'AC_FUNC_SETVBUF_REVERSED' => 1,
+                        'AC_PROG_INSTALL' => 1,
+                        'AM_GNU_GETTEXT' => 1,
+                        'AC_FUNC_OBSTACK' => 1,
+                        'AC_CHECK_LIB' => 1,
+                        'AC_FUNC_MALLOC' => 1,
+                        'AC_FUNC_GETGROUPS' => 1,
+                        'AC_FC_FREEFORM' => 1,
+                        'AC_FUNC_GETLOADAVG' => 1,
+                        'AH_OUTPUT' => 1,
+                        'AC_FUNC_FSEEKO' => 1,
+                        'AM_PROG_CC_C_O' => 1,
+                        'AM_CONDITIONAL' => 1,
+                        'AC_CANONICAL_SYSTEM' => 1,
+                        'AC_FUNC_MKTIME' => 1,
+                        'AC_CONFIG_HEADERS' => 1,
+                        'AC_HEADER_SYS_WAIT' => 1,
+                        'AC_FUNC_MEMCMP' => 1,
+                        'AC_PROG_LN_S' => 1,
+                        'm4_include' => 1,
+                        'AC_HEADER_DIRENT' => 1,
+                        'AC_CHECK_FUNCS' => 1
+                      }
+                    ], 'Autom4te::Request' ),
+             bless( [
+                      '1',
+                      1,
+                      [
+                        '/usr/share/autoconf'
+                      ],
+                      [
+                        '/usr/share/autoconf/autoconf/autoconf.m4f',
+                        '/usr/share/aclocal/pkg.m4',
+                        'configure.in'
+                      ],
+                      {
+                        'PKG_CHECK_EXISTS' => 1,
+                        'm4_pattern_allow' => 1,
+                        '_AM_AUTOCONF_VERSION' => 1,
+                        'm4_pattern_forbid' => 1,
+                        'include' => 1,
+                        'AC_DEFUN_ONCE' => 1,
+                        'm4_include' => 1,
+                        'PKG_PROG_PKG_CONFIG' => 1,
+                        'AC_DEFUN' => 1,
+                        '_PKG_SHORT_ERRORS_SUPPORTED' => 1,
+                        '_m4_warn' => 1,
+                        'PKG_CHECK_MODULES' => 1,
+                        'AU_DEFUN' => 1
+                      }
+                    ], 'Autom4te::Request' ),
+             bless( [
+                      '2',
+                      1,
+                      [
+                        '/usr/share/autoconf'
+                      ],
+                      [
+                        '/usr/share/autoconf/autoconf/autoconf.m4f',
+                        'aclocal.m4',
+                        'configure.in'
+                      ],
+                      {
+                        'AM_PROG_F77_C_O' => 1,
+                        '_LT_AC_TAGCONFIG' => 1,
+                        'm4_pattern_forbid' => 1,
+                        'AC_INIT' => 1,
+                        '_AM_COND_IF' => 1,
+                        'AC_CANONICAL_TARGET' => 1,
+                        'AC_CONFIG_LIBOBJ_DIR' => 1,
+                        'AC_SUBST' => 1,
+                        'AC_CANONICAL_HOST' => 1,
+                        'AC_FC_SRCEXT' => 1,
+                        'AC_PROG_LIBTOOL' => 1,
+                        'AM_INIT_AUTOMAKE' => 1,
+                        'AC_CONFIG_SUBDIRS' => 1,
+                        'AM_AUTOMAKE_VERSION' => 1,
+                        'LT_CONFIG_LTDL_DIR' => 1,
+                        'AC_REQUIRE_AUX_FILE' => 1,
+                        'AC_CONFIG_LINKS' => 1,
+                        'LT_SUPPORTED_TAG' => 1,
+                        'm4_sinclude' => 1,
+                        'AM_MAINTAINER_MODE' => 1,
+                        'AM_GNU_GETTEXT_INTL_SUBDIR' => 1,
+                        '_m4_warn' => 1,
+                        'AM_PROG_CXX_C_O' => 1,
+                        '_AM_COND_ENDIF' => 1,
+                        'AM_ENABLE_MULTILIB' => 1,
+                        'AC_CONFIG_FILES' => 1,
+                        'include' => 1,
+                        'LT_INIT' => 1,
+                        'AM_GNU_GETTEXT' => 1,
+                        'AC_LIBSOURCE' => 1,
+                        'AM_PROG_FC_C_O' => 1,
+                        'AC_CANONICAL_BUILD' => 1,
+                        'AC_FC_FREEFORM' => 1,
+                        'AH_OUTPUT' => 1,
+                        '_AM_SUBST_NOTMAKE' => 1,
+                        'AC_CONFIG_AUX_DIR' => 1,
+                        'AM_PROG_CC_C_O' => 1,
+                        'm4_pattern_allow' => 1,
+                        'sinclude' => 1,
+                        'AM_CONDITIONAL' => 1,
+                        'AC_CANONICAL_SYSTEM' => 1,
+                        'AC_CONFIG_HEADERS' => 1,
+                        'AC_DEFINE_TRACE_LITERAL' => 1,
+                        'm4_include' => 1,
+                        '_AM_COND_ELSE' => 1,
+                        'AC_SUBST_TRACE' => 1
+                      }
+                    ], 'Autom4te::Request' )
+           );
+
diff --git a/autom4te.cache/traces.0 b/autom4te.cache/traces.0
new file mode 100644 (file)
index 0000000..9e9e4fc
--- /dev/null
@@ -0,0 +1,367 @@
+m4trace:configure.in:2: -1- AC_INIT([quota.c])
+m4trace:configure.in:2: -1- m4_pattern_forbid([^_?A[CHUM]_])
+m4trace:configure.in:2: -1- m4_pattern_forbid([_AC_])
+m4trace:configure.in:2: -1- m4_pattern_forbid([^LIBOBJS$], [do not use LIBOBJS directly, use AC_LIBOBJ (see section `AC_LIBOBJ vs LIBOBJS'])
+m4trace:configure.in:2: -1- m4_pattern_allow([^AS_FLAGS$])
+m4trace:configure.in:2: -1- m4_pattern_forbid([^_?m4_])
+m4trace:configure.in:2: -1- m4_pattern_forbid([^dnl$])
+m4trace:configure.in:2: -1- m4_pattern_forbid([^_?AS_])
+m4trace:configure.in:2: -1- AC_SUBST([SHELL], [${CONFIG_SHELL-/bin/sh}])
+m4trace:configure.in:2: -1- AC_SUBST_TRACE([SHELL])
+m4trace:configure.in:2: -1- m4_pattern_allow([^SHELL$])
+m4trace:configure.in:2: -1- AC_SUBST([PATH_SEPARATOR])
+m4trace:configure.in:2: -1- AC_SUBST_TRACE([PATH_SEPARATOR])
+m4trace:configure.in:2: -1- m4_pattern_allow([^PATH_SEPARATOR$])
+m4trace:configure.in:2: -1- AC_SUBST([PACKAGE_NAME], [m4_ifdef([AC_PACKAGE_NAME],      ['AC_PACKAGE_NAME'])])
+m4trace:configure.in:2: -1- AC_SUBST_TRACE([PACKAGE_NAME])
+m4trace:configure.in:2: -1- m4_pattern_allow([^PACKAGE_NAME$])
+m4trace:configure.in:2: -1- AC_SUBST([PACKAGE_TARNAME], [m4_ifdef([AC_PACKAGE_TARNAME],   ['AC_PACKAGE_TARNAME'])])
+m4trace:configure.in:2: -1- AC_SUBST_TRACE([PACKAGE_TARNAME])
+m4trace:configure.in:2: -1- m4_pattern_allow([^PACKAGE_TARNAME$])
+m4trace:configure.in:2: -1- AC_SUBST([PACKAGE_VERSION], [m4_ifdef([AC_PACKAGE_VERSION],   ['AC_PACKAGE_VERSION'])])
+m4trace:configure.in:2: -1- AC_SUBST_TRACE([PACKAGE_VERSION])
+m4trace:configure.in:2: -1- m4_pattern_allow([^PACKAGE_VERSION$])
+m4trace:configure.in:2: -1- AC_SUBST([PACKAGE_STRING], [m4_ifdef([AC_PACKAGE_STRING],    ['AC_PACKAGE_STRING'])])
+m4trace:configure.in:2: -1- AC_SUBST_TRACE([PACKAGE_STRING])
+m4trace:configure.in:2: -1- m4_pattern_allow([^PACKAGE_STRING$])
+m4trace:configure.in:2: -1- AC_SUBST([PACKAGE_BUGREPORT], [m4_ifdef([AC_PACKAGE_BUGREPORT], ['AC_PACKAGE_BUGREPORT'])])
+m4trace:configure.in:2: -1- AC_SUBST_TRACE([PACKAGE_BUGREPORT])
+m4trace:configure.in:2: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$])
+m4trace:configure.in:2: -1- AC_SUBST([exec_prefix], [NONE])
+m4trace:configure.in:2: -1- AC_SUBST_TRACE([exec_prefix])
+m4trace:configure.in:2: -1- m4_pattern_allow([^exec_prefix$])
+m4trace:configure.in:2: -1- AC_SUBST([prefix], [NONE])
+m4trace:configure.in:2: -1- AC_SUBST_TRACE([prefix])
+m4trace:configure.in:2: -1- m4_pattern_allow([^prefix$])
+m4trace:configure.in:2: -1- AC_SUBST([program_transform_name], [s,x,x,])
+m4trace:configure.in:2: -1- AC_SUBST_TRACE([program_transform_name])
+m4trace:configure.in:2: -1- m4_pattern_allow([^program_transform_name$])
+m4trace:configure.in:2: -1- AC_SUBST([bindir], ['${exec_prefix}/bin'])
+m4trace:configure.in:2: -1- AC_SUBST_TRACE([bindir])
+m4trace:configure.in:2: -1- m4_pattern_allow([^bindir$])
+m4trace:configure.in:2: -1- AC_SUBST([sbindir], ['${exec_prefix}/sbin'])
+m4trace:configure.in:2: -1- AC_SUBST_TRACE([sbindir])
+m4trace:configure.in:2: -1- m4_pattern_allow([^sbindir$])
+m4trace:configure.in:2: -1- AC_SUBST([libexecdir], ['${exec_prefix}/libexec'])
+m4trace:configure.in:2: -1- AC_SUBST_TRACE([libexecdir])
+m4trace:configure.in:2: -1- m4_pattern_allow([^libexecdir$])
+m4trace:configure.in:2: -1- AC_SUBST([datarootdir], ['${prefix}/share'])
+m4trace:configure.in:2: -1- AC_SUBST_TRACE([datarootdir])
+m4trace:configure.in:2: -1- m4_pattern_allow([^datarootdir$])
+m4trace:configure.in:2: -1- AC_SUBST([datadir], ['${datarootdir}'])
+m4trace:configure.in:2: -1- AC_SUBST_TRACE([datadir])
+m4trace:configure.in:2: -1- m4_pattern_allow([^datadir$])
+m4trace:configure.in:2: -1- AC_SUBST([sysconfdir], ['${prefix}/etc'])
+m4trace:configure.in:2: -1- AC_SUBST_TRACE([sysconfdir])
+m4trace:configure.in:2: -1- m4_pattern_allow([^sysconfdir$])
+m4trace:configure.in:2: -1- AC_SUBST([sharedstatedir], ['${prefix}/com'])
+m4trace:configure.in:2: -1- AC_SUBST_TRACE([sharedstatedir])
+m4trace:configure.in:2: -1- m4_pattern_allow([^sharedstatedir$])
+m4trace:configure.in:2: -1- AC_SUBST([localstatedir], ['${prefix}/var'])
+m4trace:configure.in:2: -1- AC_SUBST_TRACE([localstatedir])
+m4trace:configure.in:2: -1- m4_pattern_allow([^localstatedir$])
+m4trace:configure.in:2: -1- AC_SUBST([includedir], ['${prefix}/include'])
+m4trace:configure.in:2: -1- AC_SUBST_TRACE([includedir])
+m4trace:configure.in:2: -1- m4_pattern_allow([^includedir$])
+m4trace:configure.in:2: -1- AC_SUBST([oldincludedir], ['/usr/include'])
+m4trace:configure.in:2: -1- AC_SUBST_TRACE([oldincludedir])
+m4trace:configure.in:2: -1- m4_pattern_allow([^oldincludedir$])
+m4trace:configure.in:2: -1- AC_SUBST([docdir], [m4_ifset([AC_PACKAGE_TARNAME],
+                                    ['${datarootdir}/doc/${PACKAGE_TARNAME}'],
+                                    ['${datarootdir}/doc/${PACKAGE}'])])
+m4trace:configure.in:2: -1- AC_SUBST_TRACE([docdir])
+m4trace:configure.in:2: -1- m4_pattern_allow([^docdir$])
+m4trace:configure.in:2: -1- AC_SUBST([infodir], ['${datarootdir}/info'])
+m4trace:configure.in:2: -1- AC_SUBST_TRACE([infodir])
+m4trace:configure.in:2: -1- m4_pattern_allow([^infodir$])
+m4trace:configure.in:2: -1- AC_SUBST([htmldir], ['${docdir}'])
+m4trace:configure.in:2: -1- AC_SUBST_TRACE([htmldir])
+m4trace:configure.in:2: -1- m4_pattern_allow([^htmldir$])
+m4trace:configure.in:2: -1- AC_SUBST([dvidir], ['${docdir}'])
+m4trace:configure.in:2: -1- AC_SUBST_TRACE([dvidir])
+m4trace:configure.in:2: -1- m4_pattern_allow([^dvidir$])
+m4trace:configure.in:2: -1- AC_SUBST([pdfdir], ['${docdir}'])
+m4trace:configure.in:2: -1- AC_SUBST_TRACE([pdfdir])
+m4trace:configure.in:2: -1- m4_pattern_allow([^pdfdir$])
+m4trace:configure.in:2: -1- AC_SUBST([psdir], ['${docdir}'])
+m4trace:configure.in:2: -1- AC_SUBST_TRACE([psdir])
+m4trace:configure.in:2: -1- m4_pattern_allow([^psdir$])
+m4trace:configure.in:2: -1- AC_SUBST([libdir], ['${exec_prefix}/lib'])
+m4trace:configure.in:2: -1- AC_SUBST_TRACE([libdir])
+m4trace:configure.in:2: -1- m4_pattern_allow([^libdir$])
+m4trace:configure.in:2: -1- AC_SUBST([localedir], ['${datarootdir}/locale'])
+m4trace:configure.in:2: -1- AC_SUBST_TRACE([localedir])
+m4trace:configure.in:2: -1- m4_pattern_allow([^localedir$])
+m4trace:configure.in:2: -1- AC_SUBST([mandir], ['${datarootdir}/man'])
+m4trace:configure.in:2: -1- AC_SUBST_TRACE([mandir])
+m4trace:configure.in:2: -1- m4_pattern_allow([^mandir$])
+m4trace:configure.in:2: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_NAME])
+m4trace:configure.in:2: -1- m4_pattern_allow([^PACKAGE_NAME$])
+m4trace:configure.in:2: -1- AH_OUTPUT([PACKAGE_NAME], [/* Define to the full name of this package. */
+#undef PACKAGE_NAME])
+m4trace:configure.in:2: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_TARNAME])
+m4trace:configure.in:2: -1- m4_pattern_allow([^PACKAGE_TARNAME$])
+m4trace:configure.in:2: -1- AH_OUTPUT([PACKAGE_TARNAME], [/* Define to the one symbol short name of this package. */
+#undef PACKAGE_TARNAME])
+m4trace:configure.in:2: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_VERSION])
+m4trace:configure.in:2: -1- m4_pattern_allow([^PACKAGE_VERSION$])
+m4trace:configure.in:2: -1- AH_OUTPUT([PACKAGE_VERSION], [/* Define to the version of this package. */
+#undef PACKAGE_VERSION])
+m4trace:configure.in:2: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_STRING])
+m4trace:configure.in:2: -1- m4_pattern_allow([^PACKAGE_STRING$])
+m4trace:configure.in:2: -1- AH_OUTPUT([PACKAGE_STRING], [/* Define to the full name and version of this package. */
+#undef PACKAGE_STRING])
+m4trace:configure.in:2: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_BUGREPORT])
+m4trace:configure.in:2: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$])
+m4trace:configure.in:2: -1- AH_OUTPUT([PACKAGE_BUGREPORT], [/* Define to the address where bug reports for this package should be sent. */
+#undef PACKAGE_BUGREPORT])
+m4trace:configure.in:2: -1- AC_SUBST([DEFS])
+m4trace:configure.in:2: -1- AC_SUBST_TRACE([DEFS])
+m4trace:configure.in:2: -1- m4_pattern_allow([^DEFS$])
+m4trace:configure.in:2: -1- AC_SUBST([ECHO_C])
+m4trace:configure.in:2: -1- AC_SUBST_TRACE([ECHO_C])
+m4trace:configure.in:2: -1- m4_pattern_allow([^ECHO_C$])
+m4trace:configure.in:2: -1- AC_SUBST([ECHO_N])
+m4trace:configure.in:2: -1- AC_SUBST_TRACE([ECHO_N])
+m4trace:configure.in:2: -1- m4_pattern_allow([^ECHO_N$])
+m4trace:configure.in:2: -1- AC_SUBST([ECHO_T])
+m4trace:configure.in:2: -1- AC_SUBST_TRACE([ECHO_T])
+m4trace:configure.in:2: -1- m4_pattern_allow([^ECHO_T$])
+m4trace:configure.in:2: -1- AC_SUBST([LIBS])
+m4trace:configure.in:2: -1- AC_SUBST_TRACE([LIBS])
+m4trace:configure.in:2: -1- m4_pattern_allow([^LIBS$])
+m4trace:configure.in:2: -1- AC_SUBST([build_alias])
+m4trace:configure.in:2: -1- AC_SUBST_TRACE([build_alias])
+m4trace:configure.in:2: -1- m4_pattern_allow([^build_alias$])
+m4trace:configure.in:2: -1- AC_SUBST([host_alias])
+m4trace:configure.in:2: -1- AC_SUBST_TRACE([host_alias])
+m4trace:configure.in:2: -1- m4_pattern_allow([^host_alias$])
+m4trace:configure.in:2: -1- AC_SUBST([target_alias])
+m4trace:configure.in:2: -1- AC_SUBST_TRACE([target_alias])
+m4trace:configure.in:2: -1- m4_pattern_allow([^target_alias$])
+m4trace:configure.in:5: -1- AC_PROG_CC
+m4trace:configure.in:5: -1- AC_SUBST([CC])
+m4trace:configure.in:5: -1- AC_SUBST_TRACE([CC])
+m4trace:configure.in:5: -1- m4_pattern_allow([^CC$])
+m4trace:configure.in:5: -1- AC_SUBST([CFLAGS])
+m4trace:configure.in:5: -1- AC_SUBST_TRACE([CFLAGS])
+m4trace:configure.in:5: -1- m4_pattern_allow([^CFLAGS$])
+m4trace:configure.in:5: -1- AC_SUBST([LDFLAGS])
+m4trace:configure.in:5: -1- AC_SUBST_TRACE([LDFLAGS])
+m4trace:configure.in:5: -1- m4_pattern_allow([^LDFLAGS$])
+m4trace:configure.in:5: -1- AC_SUBST([LIBS])
+m4trace:configure.in:5: -1- AC_SUBST_TRACE([LIBS])
+m4trace:configure.in:5: -1- m4_pattern_allow([^LIBS$])
+m4trace:configure.in:5: -1- AC_SUBST([CPPFLAGS])
+m4trace:configure.in:5: -1- AC_SUBST_TRACE([CPPFLAGS])
+m4trace:configure.in:5: -1- m4_pattern_allow([^CPPFLAGS$])
+m4trace:configure.in:5: -1- AC_SUBST([CC])
+m4trace:configure.in:5: -1- AC_SUBST_TRACE([CC])
+m4trace:configure.in:5: -1- m4_pattern_allow([^CC$])
+m4trace:configure.in:5: -1- AC_SUBST([CC])
+m4trace:configure.in:5: -1- AC_SUBST_TRACE([CC])
+m4trace:configure.in:5: -1- m4_pattern_allow([^CC$])
+m4trace:configure.in:5: -1- AC_SUBST([CC])
+m4trace:configure.in:5: -1- AC_SUBST_TRACE([CC])
+m4trace:configure.in:5: -1- m4_pattern_allow([^CC$])
+m4trace:configure.in:5: -1- AC_SUBST([CC])
+m4trace:configure.in:5: -1- AC_SUBST_TRACE([CC])
+m4trace:configure.in:5: -1- m4_pattern_allow([^CC$])
+m4trace:configure.in:5: -1- AC_SUBST([ac_ct_CC])
+m4trace:configure.in:5: -1- AC_SUBST_TRACE([ac_ct_CC])
+m4trace:configure.in:5: -1- m4_pattern_allow([^ac_ct_CC$])
+m4trace:configure.in:5: -1- AC_SUBST([EXEEXT], [$ac_cv_exeext])
+m4trace:configure.in:5: -1- AC_SUBST_TRACE([EXEEXT])
+m4trace:configure.in:5: -1- m4_pattern_allow([^EXEEXT$])
+m4trace:configure.in:5: -1- AC_SUBST([OBJEXT], [$ac_cv_objext])
+m4trace:configure.in:5: -1- AC_SUBST_TRACE([OBJEXT])
+m4trace:configure.in:5: -1- m4_pattern_allow([^OBJEXT$])
+m4trace:configure.in:6: -1- AC_HEADER_STDC
+m4trace:configure.in:6: -1- AC_PROG_CPP
+m4trace:configure.in:6: -1- AC_SUBST([CPP])
+m4trace:configure.in:6: -1- AC_SUBST_TRACE([CPP])
+m4trace:configure.in:6: -1- m4_pattern_allow([^CPP$])
+m4trace:configure.in:6: -1- AC_SUBST([CPPFLAGS])
+m4trace:configure.in:6: -1- AC_SUBST_TRACE([CPPFLAGS])
+m4trace:configure.in:6: -1- m4_pattern_allow([^CPPFLAGS$])
+m4trace:configure.in:6: -1- AC_SUBST([CPP])
+m4trace:configure.in:6: -1- AC_SUBST_TRACE([CPP])
+m4trace:configure.in:6: -1- m4_pattern_allow([^CPP$])
+m4trace:configure.in:6: -1- AC_SUBST([GREP])
+m4trace:configure.in:6: -1- AC_SUBST_TRACE([GREP])
+m4trace:configure.in:6: -1- m4_pattern_allow([^GREP$])
+m4trace:configure.in:6: -1- AC_SUBST([GREP])
+m4trace:configure.in:6: -1- AC_SUBST_TRACE([GREP])
+m4trace:configure.in:6: -1- m4_pattern_allow([^GREP$])
+m4trace:configure.in:6: -1- AC_SUBST([EGREP])
+m4trace:configure.in:6: -1- AC_SUBST_TRACE([EGREP])
+m4trace:configure.in:6: -1- m4_pattern_allow([^EGREP$])
+m4trace:configure.in:6: -1- AC_SUBST([EGREP])
+m4trace:configure.in:6: -1- AC_SUBST_TRACE([EGREP])
+m4trace:configure.in:6: -1- m4_pattern_allow([^EGREP$])
+m4trace:configure.in:6: -1- AC_DEFINE_TRACE_LITERAL([STDC_HEADERS])
+m4trace:configure.in:6: -1- m4_pattern_allow([^STDC_HEADERS$])
+m4trace:configure.in:6: -1- AH_OUTPUT([STDC_HEADERS], [/* Define to 1 if you have the ANSI C header files. */
+#undef STDC_HEADERS])
+m4trace:configure.in:7: -1- AC_PROG_INSTALL
+m4trace:configure.in:7: -1- AC_REQUIRE_AUX_FILE([install-sh])
+m4trace:configure.in:7: -1- AC_SUBST([INSTALL_PROGRAM])
+m4trace:configure.in:7: -1- AC_SUBST_TRACE([INSTALL_PROGRAM])
+m4trace:configure.in:7: -1- m4_pattern_allow([^INSTALL_PROGRAM$])
+m4trace:configure.in:7: -1- AC_SUBST([INSTALL_SCRIPT])
+m4trace:configure.in:7: -1- AC_SUBST_TRACE([INSTALL_SCRIPT])
+m4trace:configure.in:7: -1- m4_pattern_allow([^INSTALL_SCRIPT$])
+m4trace:configure.in:7: -1- AC_SUBST([INSTALL_DATA])
+m4trace:configure.in:7: -1- AC_SUBST_TRACE([INSTALL_DATA])
+m4trace:configure.in:7: -1- m4_pattern_allow([^INSTALL_DATA$])
+m4trace:configure.in:31: -2- AC_CHECK_LIB([ldap], [ldap_init], [have_old_ldap="yes"])
+m4trace:configure.in:31: -1- AC_CHECK_LIB([ldap], [ldap_initialize], [have_new_ldap="yes"], [{ echo "$as_me:$LINENO: checking for ldap_init in -lldap" >&5
+echo $ECHO_N "checking for ldap_init in -lldap... $ECHO_C" >&6; }
+if test "${ac_cv_lib_ldap_ldap_init+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lldap  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldap_init ();
+int
+main ()
+{
+return ldap_init ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  ac_cv_lib_ldap_ldap_init=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_lib_ldap_ldap_init=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_lib_ldap_ldap_init" >&5
+echo "${ECHO_T}$ac_cv_lib_ldap_ldap_init" >&6; }
+if test $ac_cv_lib_ldap_ldap_init = yes; then
+  have_old_ldap="yes"
+fi
+])
+m4trace:configure.in:46: -1- AC_SUBST([LDAPLIBS])
+m4trace:configure.in:46: -1- AC_SUBST_TRACE([LDAPLIBS])
+m4trace:configure.in:46: -1- m4_pattern_allow([^LDAPLIBS$])
+m4trace:configure.in:49: -1- AC_CHECK_HEADERS([sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
+                 inttypes.h stdint.h unistd.h], [], [], [$ac_includes_default])
+m4trace:configure.in:49: -1- AH_OUTPUT([HAVE_SYS_TYPES_H], [/* Define to 1 if you have the <sys/types.h> header file. */
+#undef HAVE_SYS_TYPES_H])
+m4trace:configure.in:49: -1- AH_OUTPUT([HAVE_SYS_STAT_H], [/* Define to 1 if you have the <sys/stat.h> header file. */
+#undef HAVE_SYS_STAT_H])
+m4trace:configure.in:49: -1- AH_OUTPUT([HAVE_STDLIB_H], [/* Define to 1 if you have the <stdlib.h> header file. */
+#undef HAVE_STDLIB_H])
+m4trace:configure.in:49: -1- AH_OUTPUT([HAVE_STRING_H], [/* Define to 1 if you have the <string.h> header file. */
+#undef HAVE_STRING_H])
+m4trace:configure.in:49: -1- AH_OUTPUT([HAVE_MEMORY_H], [/* Define to 1 if you have the <memory.h> header file. */
+#undef HAVE_MEMORY_H])
+m4trace:configure.in:49: -1- AH_OUTPUT([HAVE_STRINGS_H], [/* Define to 1 if you have the <strings.h> header file. */
+#undef HAVE_STRINGS_H])
+m4trace:configure.in:49: -1- AH_OUTPUT([HAVE_INTTYPES_H], [/* Define to 1 if you have the <inttypes.h> header file. */
+#undef HAVE_INTTYPES_H])
+m4trace:configure.in:49: -1- AH_OUTPUT([HAVE_STDINT_H], [/* Define to 1 if you have the <stdint.h> header file. */
+#undef HAVE_STDINT_H])
+m4trace:configure.in:49: -1- AH_OUTPUT([HAVE_UNISTD_H], [/* Define to 1 if you have the <unistd.h> header file. */
+#undef HAVE_UNISTD_H])
+m4trace:configure.in:68: -1- AC_CHECK_LIB([com_err], [com_err], [EXT2LIBS="-lcom_err $EXT2LIBS"])
+m4trace:configure.in:69: -1- AC_CHECK_LIB([ext2fs], [ext2fs_initialize], [EXT2LIBS="-lext2fs $EXT2LIBS"], [], ["-lcom_err"])
+m4trace:configure.in:94: -1- AC_SUBST([EXT2_DIRECT])
+m4trace:configure.in:94: -1- AC_SUBST_TRACE([EXT2_DIRECT])
+m4trace:configure.in:94: -1- m4_pattern_allow([^EXT2_DIRECT$])
+m4trace:configure.in:97: -1- AC_SUBST([EXT2LIBS])
+m4trace:configure.in:97: -1- AC_SUBST_TRACE([EXT2LIBS])
+m4trace:configure.in:97: -1- m4_pattern_allow([^EXT2LIBS$])
+m4trace:configure.in:116: -1- AC_CHECK_LIB([nl], [genl_register], [NETLINKLIBS="-lnl $NETLINKLIBS"])
+m4trace:configure.in:140: -1- AC_SUBST([QUOTA_NETLINK_PROG])
+m4trace:configure.in:140: -1- AC_SUBST_TRACE([QUOTA_NETLINK_PROG])
+m4trace:configure.in:140: -1- m4_pattern_allow([^QUOTA_NETLINK_PROG$])
+m4trace:configure.in:141: -1- AC_SUBST([NETLINKLIBS])
+m4trace:configure.in:141: -1- AC_SUBST_TRACE([NETLINKLIBS])
+m4trace:configure.in:141: -1- m4_pattern_allow([^NETLINKLIBS$])
+m4trace:configure.in:169: -1- AC_SUBST([HOSTS_ACCESS])
+m4trace:configure.in:169: -1- AC_SUBST_TRACE([HOSTS_ACCESS])
+m4trace:configure.in:169: -1- m4_pattern_allow([^HOSTS_ACCESS$])
+m4trace:configure.in:173: -1- AC_C_CONST
+m4trace:configure.in:173: -1- AC_DEFINE_TRACE_LITERAL([const])
+m4trace:configure.in:173: -1- m4_pattern_allow([^const$])
+m4trace:configure.in:173: -1- AH_OUTPUT([const], [/* Define to empty if `const\' does not conform to ANSI C. */
+#undef const])
+m4trace:configure.in:174: -1- AC_C_INLINE
+m4trace:configure.in:174: -1- AH_OUTPUT([inline], [/* Define to `__inline__\' or `__inline\' if that\'s what the C compiler
+   calls it, or to nothing if \'inline\' is not supported under any name.  */
+#ifndef __cplusplus
+#undef inline
+#endif])
+m4trace:configure.in:242: -1- AC_SUBST([COMPILE_OPTS])
+m4trace:configure.in:242: -1- AC_SUBST_TRACE([COMPILE_OPTS])
+m4trace:configure.in:242: -1- m4_pattern_allow([^COMPILE_OPTS$])
+m4trace:configure.in:243: -1- AC_SUBST([LIBMALLOC])
+m4trace:configure.in:243: -1- AC_SUBST_TRACE([LIBMALLOC])
+m4trace:configure.in:243: -1- m4_pattern_allow([^LIBMALLOC$])
+m4trace:configure.in:244: -1- AC_SUBST([INSTMO])
+m4trace:configure.in:244: -1- AC_SUBST_TRACE([INSTMO])
+m4trace:configure.in:244: -1- m4_pattern_allow([^INSTMO$])
+m4trace:configure.in:245: -1- AC_SUBST([ROOTSBIN])
+m4trace:configure.in:245: -1- AC_SUBST_TRACE([ROOTSBIN])
+m4trace:configure.in:245: -1- m4_pattern_allow([^ROOTSBIN$])
+m4trace:configure.in:246: -1- AC_SUBST([CPPFLAGS])
+m4trace:configure.in:246: -1- AC_SUBST_TRACE([CPPFLAGS])
+m4trace:configure.in:246: -1- m4_pattern_allow([^CPPFLAGS$])
+m4trace:configure.in:248: -1- AC_CONFIG_FILES([Makefile])
+m4trace:configure.in:248: -1- _m4_warn([obsolete], [AC_OUTPUT should be used without arguments.
+You should run autoupdate.], [])
+m4trace:configure.in:248: -1- AC_SUBST([LIB@&t@OBJS], [$ac_libobjs])
+m4trace:configure.in:248: -1- AC_SUBST_TRACE([LIB@&t@OBJS])
+m4trace:configure.in:248: -1- m4_pattern_allow([^LIB@&t@OBJS$])
+m4trace:configure.in:248: -1- AC_SUBST([LTLIBOBJS], [$ac_ltlibobjs])
+m4trace:configure.in:248: -1- AC_SUBST_TRACE([LTLIBOBJS])
+m4trace:configure.in:248: -1- m4_pattern_allow([^LTLIBOBJS$])
+m4trace:configure.in:248: -1- AC_SUBST_TRACE([top_builddir])
+m4trace:configure.in:248: -1- AC_SUBST_TRACE([srcdir])
+m4trace:configure.in:248: -1- AC_SUBST_TRACE([abs_srcdir])
+m4trace:configure.in:248: -1- AC_SUBST_TRACE([top_srcdir])
+m4trace:configure.in:248: -1- AC_SUBST_TRACE([abs_top_srcdir])
+m4trace:configure.in:248: -1- AC_SUBST_TRACE([builddir])
+m4trace:configure.in:248: -1- AC_SUBST_TRACE([abs_builddir])
+m4trace:configure.in:248: -1- AC_SUBST_TRACE([abs_top_builddir])
+m4trace:configure.in:248: -1- AC_SUBST_TRACE([INSTALL])
diff --git a/autom4te.cache/traces.1 b/autom4te.cache/traces.1
new file mode 100644 (file)
index 0000000..dd69637
--- /dev/null
@@ -0,0 +1,184 @@
+m4trace:/usr/share/aclocal/pkg.m4:26: -1- AC_DEFUN([PKG_PROG_PKG_CONFIG], [m4_pattern_forbid([^_?PKG_[A-Z_]+$])
+m4_pattern_allow([^PKG_CONFIG(_PATH)?$])
+AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility])dnl
+if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
+       AC_PATH_TOOL([PKG_CONFIG], [pkg-config])
+fi
+if test -n "$PKG_CONFIG"; then
+       _pkg_min_version=m4_default([$1], [0.9.0])
+       AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version])
+       if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then
+               AC_MSG_RESULT([yes])
+       else
+               AC_MSG_RESULT([no])
+               PKG_CONFIG=""
+       fi
+               
+fi[]dnl
+])
+m4trace:/usr/share/aclocal/pkg.m4:56: -1- AC_DEFUN([PKG_CHECK_EXISTS], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
+if test -n "$PKG_CONFIG" && \
+    AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then
+  m4_ifval([$2], [$2], [:])
+m4_ifvaln([$3], [else
+  $3])dnl
+fi])
+m4trace:/usr/share/aclocal/pkg.m4:84: -1- AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi[]dnl
+])
+m4trace:/usr/share/aclocal/pkg.m4:104: -1- AC_DEFUN([PKG_CHECK_MODULES], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
+AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl
+AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl
+
+pkg_failed=no
+AC_MSG_CHECKING([for $1])
+
+_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2])
+_PKG_CONFIG([$1][_LIBS], [libs], [$2])
+
+m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS
+and $1[]_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details.])
+
+if test $pkg_failed = yes; then
+        _PKG_SHORT_ERRORS_SUPPORTED
+        if test $_pkg_short_errors_supported = yes; then
+               $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$2"`
+        else 
+               $1[]_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$2"`
+        fi
+       # Put the nasty error message in config.log where it belongs
+       echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD
+
+       ifelse([$4], , [AC_MSG_ERROR(dnl
+[Package requirements ($2) were not met:
+
+$$1_PKG_ERRORS
+
+Consider adjusting the PKG_CONFIG_PATH environment variable if you
+installed software in a non-standard prefix.
+
+_PKG_TEXT
+])],
+               [AC_MSG_RESULT([no])
+                $4])
+elif test $pkg_failed = untried; then
+       ifelse([$4], , [AC_MSG_FAILURE(dnl
+[The pkg-config script could not be found or is too old.  Make sure it
+is in your PATH or set the PKG_CONFIG environment variable to the full
+path to pkg-config.
+
+_PKG_TEXT
+
+To get pkg-config, see <http://www.freedesktop.org/software/pkgconfig>.])],
+               [$4])
+else
+       $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS
+       $1[]_LIBS=$pkg_cv_[]$1[]_LIBS
+        AC_MSG_RESULT([yes])
+       ifelse([$3], , :, [$3])
+fi[]dnl
+])
+m4trace:configure.in:2: -1- m4_pattern_forbid([^_?A[CHUM]_])
+m4trace:configure.in:2: -1- m4_pattern_forbid([_AC_])
+m4trace:configure.in:2: -1- m4_pattern_forbid([^LIBOBJS$], [do not use LIBOBJS directly, use AC_LIBOBJ (see section `AC_LIBOBJ vs LIBOBJS'])
+m4trace:configure.in:2: -1- m4_pattern_allow([^AS_FLAGS$])
+m4trace:configure.in:2: -1- m4_pattern_forbid([^_?m4_])
+m4trace:configure.in:2: -1- m4_pattern_forbid([^dnl$])
+m4trace:configure.in:2: -1- m4_pattern_forbid([^_?AS_])
+m4trace:configure.in:2: -1- m4_pattern_allow([^SHELL$])
+m4trace:configure.in:2: -1- m4_pattern_allow([^PATH_SEPARATOR$])
+m4trace:configure.in:2: -1- m4_pattern_allow([^PACKAGE_NAME$])
+m4trace:configure.in:2: -1- m4_pattern_allow([^PACKAGE_TARNAME$])
+m4trace:configure.in:2: -1- m4_pattern_allow([^PACKAGE_VERSION$])
+m4trace:configure.in:2: -1- m4_pattern_allow([^PACKAGE_STRING$])
+m4trace:configure.in:2: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$])
+m4trace:configure.in:2: -1- m4_pattern_allow([^exec_prefix$])
+m4trace:configure.in:2: -1- m4_pattern_allow([^prefix$])
+m4trace:configure.in:2: -1- m4_pattern_allow([^program_transform_name$])
+m4trace:configure.in:2: -1- m4_pattern_allow([^bindir$])
+m4trace:configure.in:2: -1- m4_pattern_allow([^sbindir$])
+m4trace:configure.in:2: -1- m4_pattern_allow([^libexecdir$])
+m4trace:configure.in:2: -1- m4_pattern_allow([^datarootdir$])
+m4trace:configure.in:2: -1- m4_pattern_allow([^datadir$])
+m4trace:configure.in:2: -1- m4_pattern_allow([^sysconfdir$])
+m4trace:configure.in:2: -1- m4_pattern_allow([^sharedstatedir$])
+m4trace:configure.in:2: -1- m4_pattern_allow([^localstatedir$])
+m4trace:configure.in:2: -1- m4_pattern_allow([^includedir$])
+m4trace:configure.in:2: -1- m4_pattern_allow([^oldincludedir$])
+m4trace:configure.in:2: -1- m4_pattern_allow([^docdir$])
+m4trace:configure.in:2: -1- m4_pattern_allow([^infodir$])
+m4trace:configure.in:2: -1- m4_pattern_allow([^htmldir$])
+m4trace:configure.in:2: -1- m4_pattern_allow([^dvidir$])
+m4trace:configure.in:2: -1- m4_pattern_allow([^pdfdir$])
+m4trace:configure.in:2: -1- m4_pattern_allow([^psdir$])
+m4trace:configure.in:2: -1- m4_pattern_allow([^libdir$])
+m4trace:configure.in:2: -1- m4_pattern_allow([^localedir$])
+m4trace:configure.in:2: -1- m4_pattern_allow([^mandir$])
+m4trace:configure.in:2: -1- m4_pattern_allow([^PACKAGE_NAME$])
+m4trace:configure.in:2: -1- m4_pattern_allow([^PACKAGE_TARNAME$])
+m4trace:configure.in:2: -1- m4_pattern_allow([^PACKAGE_VERSION$])
+m4trace:configure.in:2: -1- m4_pattern_allow([^PACKAGE_STRING$])
+m4trace:configure.in:2: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$])
+m4trace:configure.in:2: -1- m4_pattern_allow([^DEFS$])
+m4trace:configure.in:2: -1- m4_pattern_allow([^ECHO_C$])
+m4trace:configure.in:2: -1- m4_pattern_allow([^ECHO_N$])
+m4trace:configure.in:2: -1- m4_pattern_allow([^ECHO_T$])
+m4trace:configure.in:2: -1- m4_pattern_allow([^LIBS$])
+m4trace:configure.in:2: -1- m4_pattern_allow([^build_alias$])
+m4trace:configure.in:2: -1- m4_pattern_allow([^host_alias$])
+m4trace:configure.in:2: -1- m4_pattern_allow([^target_alias$])
+m4trace:configure.in:5: -1- m4_pattern_allow([^CC$])
+m4trace:configure.in:5: -1- m4_pattern_allow([^CFLAGS$])
+m4trace:configure.in:5: -1- m4_pattern_allow([^LDFLAGS$])
+m4trace:configure.in:5: -1- m4_pattern_allow([^LIBS$])
+m4trace:configure.in:5: -1- m4_pattern_allow([^CPPFLAGS$])
+m4trace:configure.in:5: -1- m4_pattern_allow([^CC$])
+m4trace:configure.in:5: -1- m4_pattern_allow([^CC$])
+m4trace:configure.in:5: -1- m4_pattern_allow([^CC$])
+m4trace:configure.in:5: -1- m4_pattern_allow([^CC$])
+m4trace:configure.in:5: -1- m4_pattern_allow([^ac_ct_CC$])
+m4trace:configure.in:5: -1- m4_pattern_allow([^EXEEXT$])
+m4trace:configure.in:5: -1- m4_pattern_allow([^OBJEXT$])
+m4trace:configure.in:6: -1- m4_pattern_allow([^CPP$])
+m4trace:configure.in:6: -1- m4_pattern_allow([^CPPFLAGS$])
+m4trace:configure.in:6: -1- m4_pattern_allow([^CPP$])
+m4trace:configure.in:6: -1- m4_pattern_allow([^GREP$])
+m4trace:configure.in:6: -1- m4_pattern_allow([^GREP$])
+m4trace:configure.in:6: -1- m4_pattern_allow([^EGREP$])
+m4trace:configure.in:6: -1- m4_pattern_allow([^EGREP$])
+m4trace:configure.in:6: -1- m4_pattern_allow([^STDC_HEADERS$])
+m4trace:configure.in:7: -1- m4_pattern_allow([^INSTALL_PROGRAM$])
+m4trace:configure.in:7: -1- m4_pattern_allow([^INSTALL_SCRIPT$])
+m4trace:configure.in:7: -1- m4_pattern_allow([^INSTALL_DATA$])
+m4trace:configure.in:46: -1- m4_pattern_allow([^LDAPLIBS$])
+m4trace:configure.in:94: -1- m4_pattern_allow([^EXT2_DIRECT$])
+m4trace:configure.in:97: -1- m4_pattern_allow([^EXT2LIBS$])
+m4trace:configure.in:113: -1- PKG_CHECK_MODULES([DBUS], [dbus-1])
+m4trace:configure.in:113: -1- PKG_PROG_PKG_CONFIG
+m4trace:configure.in:113: -1- m4_pattern_forbid([^_?PKG_[A-Z_]+$])
+m4trace:configure.in:113: -1- m4_pattern_allow([^PKG_CONFIG(_PATH)?$])
+m4trace:configure.in:113: -1- m4_pattern_allow([^PKG_CONFIG$])
+m4trace:configure.in:113: -1- m4_pattern_allow([^PKG_CONFIG$])
+m4trace:configure.in:113: -1- m4_pattern_allow([^DBUS_CFLAGS$])
+m4trace:configure.in:113: -1- m4_pattern_allow([^DBUS_LIBS$])
+m4trace:configure.in:113: -1- PKG_CHECK_EXISTS([dbus-1], [pkg_cv_[]DBUS_CFLAGS=`$PKG_CONFIG --[]cflags "dbus-1" 2>/dev/null`], [pkg_failed=yes])
+m4trace:configure.in:113: -1- PKG_CHECK_EXISTS([dbus-1], [pkg_cv_[]DBUS_LIBS=`$PKG_CONFIG --[]libs "dbus-1" 2>/dev/null`], [pkg_failed=yes])
+m4trace:configure.in:113: -1- _PKG_SHORT_ERRORS_SUPPORTED
+m4trace:configure.in:140: -1- m4_pattern_allow([^QUOTA_NETLINK_PROG$])
+m4trace:configure.in:141: -1- m4_pattern_allow([^NETLINKLIBS$])
+m4trace:configure.in:169: -1- m4_pattern_allow([^HOSTS_ACCESS$])
+m4trace:configure.in:173: -1- m4_pattern_allow([^const$])
+m4trace:configure.in:242: -1- m4_pattern_allow([^COMPILE_OPTS$])
+m4trace:configure.in:243: -1- m4_pattern_allow([^LIBMALLOC$])
+m4trace:configure.in:244: -1- m4_pattern_allow([^INSTMO$])
+m4trace:configure.in:245: -1- m4_pattern_allow([^ROOTSBIN$])
+m4trace:configure.in:246: -1- m4_pattern_allow([^CPPFLAGS$])
+m4trace:configure.in:248: -1- _m4_warn([obsolete], [AC_OUTPUT should be used without arguments.
+You should run autoupdate.], [])
+m4trace:configure.in:248: -1- m4_pattern_allow([^LIB@&t@OBJS$])
+m4trace:configure.in:248: -1- m4_pattern_allow([^LTLIBOBJS$])
diff --git a/autom4te.cache/traces.2 b/autom4te.cache/traces.2
new file mode 100644 (file)
index 0000000..a18ff41
--- /dev/null
@@ -0,0 +1,355 @@
+m4trace:configure.in:2: -1- AC_INIT([quota.c])
+m4trace:configure.in:2: -1- m4_pattern_forbid([^_?A[CHUM]_])
+m4trace:configure.in:2: -1- m4_pattern_forbid([_AC_])
+m4trace:configure.in:2: -1- m4_pattern_forbid([^LIBOBJS$], [do not use LIBOBJS directly, use AC_LIBOBJ (see section `AC_LIBOBJ vs LIBOBJS'])
+m4trace:configure.in:2: -1- m4_pattern_allow([^AS_FLAGS$])
+m4trace:configure.in:2: -1- m4_pattern_forbid([^_?m4_])
+m4trace:configure.in:2: -1- m4_pattern_forbid([^dnl$])
+m4trace:configure.in:2: -1- m4_pattern_forbid([^_?AS_])
+m4trace:configure.in:2: -1- AC_SUBST([SHELL], [${CONFIG_SHELL-/bin/sh}])
+m4trace:configure.in:2: -1- AC_SUBST_TRACE([SHELL])
+m4trace:configure.in:2: -1- m4_pattern_allow([^SHELL$])
+m4trace:configure.in:2: -1- AC_SUBST([PATH_SEPARATOR])
+m4trace:configure.in:2: -1- AC_SUBST_TRACE([PATH_SEPARATOR])
+m4trace:configure.in:2: -1- m4_pattern_allow([^PATH_SEPARATOR$])
+m4trace:configure.in:2: -1- AC_SUBST([PACKAGE_NAME], [m4_ifdef([AC_PACKAGE_NAME],      ['AC_PACKAGE_NAME'])])
+m4trace:configure.in:2: -1- AC_SUBST_TRACE([PACKAGE_NAME])
+m4trace:configure.in:2: -1- m4_pattern_allow([^PACKAGE_NAME$])
+m4trace:configure.in:2: -1- AC_SUBST([PACKAGE_TARNAME], [m4_ifdef([AC_PACKAGE_TARNAME],   ['AC_PACKAGE_TARNAME'])])
+m4trace:configure.in:2: -1- AC_SUBST_TRACE([PACKAGE_TARNAME])
+m4trace:configure.in:2: -1- m4_pattern_allow([^PACKAGE_TARNAME$])
+m4trace:configure.in:2: -1- AC_SUBST([PACKAGE_VERSION], [m4_ifdef([AC_PACKAGE_VERSION],   ['AC_PACKAGE_VERSION'])])
+m4trace:configure.in:2: -1- AC_SUBST_TRACE([PACKAGE_VERSION])
+m4trace:configure.in:2: -1- m4_pattern_allow([^PACKAGE_VERSION$])
+m4trace:configure.in:2: -1- AC_SUBST([PACKAGE_STRING], [m4_ifdef([AC_PACKAGE_STRING],    ['AC_PACKAGE_STRING'])])
+m4trace:configure.in:2: -1- AC_SUBST_TRACE([PACKAGE_STRING])
+m4trace:configure.in:2: -1- m4_pattern_allow([^PACKAGE_STRING$])
+m4trace:configure.in:2: -1- AC_SUBST([PACKAGE_BUGREPORT], [m4_ifdef([AC_PACKAGE_BUGREPORT], ['AC_PACKAGE_BUGREPORT'])])
+m4trace:configure.in:2: -1- AC_SUBST_TRACE([PACKAGE_BUGREPORT])
+m4trace:configure.in:2: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$])
+m4trace:configure.in:2: -1- AC_SUBST([exec_prefix], [NONE])
+m4trace:configure.in:2: -1- AC_SUBST_TRACE([exec_prefix])
+m4trace:configure.in:2: -1- m4_pattern_allow([^exec_prefix$])
+m4trace:configure.in:2: -1- AC_SUBST([prefix], [NONE])
+m4trace:configure.in:2: -1- AC_SUBST_TRACE([prefix])
+m4trace:configure.in:2: -1- m4_pattern_allow([^prefix$])
+m4trace:configure.in:2: -1- AC_SUBST([program_transform_name], [s,x,x,])
+m4trace:configure.in:2: -1- AC_SUBST_TRACE([program_transform_name])
+m4trace:configure.in:2: -1- m4_pattern_allow([^program_transform_name$])
+m4trace:configure.in:2: -1- AC_SUBST([bindir], ['${exec_prefix}/bin'])
+m4trace:configure.in:2: -1- AC_SUBST_TRACE([bindir])
+m4trace:configure.in:2: -1- m4_pattern_allow([^bindir$])
+m4trace:configure.in:2: -1- AC_SUBST([sbindir], ['${exec_prefix}/sbin'])
+m4trace:configure.in:2: -1- AC_SUBST_TRACE([sbindir])
+m4trace:configure.in:2: -1- m4_pattern_allow([^sbindir$])
+m4trace:configure.in:2: -1- AC_SUBST([libexecdir], ['${exec_prefix}/libexec'])
+m4trace:configure.in:2: -1- AC_SUBST_TRACE([libexecdir])
+m4trace:configure.in:2: -1- m4_pattern_allow([^libexecdir$])
+m4trace:configure.in:2: -1- AC_SUBST([datarootdir], ['${prefix}/share'])
+m4trace:configure.in:2: -1- AC_SUBST_TRACE([datarootdir])
+m4trace:configure.in:2: -1- m4_pattern_allow([^datarootdir$])
+m4trace:configure.in:2: -1- AC_SUBST([datadir], ['${datarootdir}'])
+m4trace:configure.in:2: -1- AC_SUBST_TRACE([datadir])
+m4trace:configure.in:2: -1- m4_pattern_allow([^datadir$])
+m4trace:configure.in:2: -1- AC_SUBST([sysconfdir], ['${prefix}/etc'])
+m4trace:configure.in:2: -1- AC_SUBST_TRACE([sysconfdir])
+m4trace:configure.in:2: -1- m4_pattern_allow([^sysconfdir$])
+m4trace:configure.in:2: -1- AC_SUBST([sharedstatedir], ['${prefix}/com'])
+m4trace:configure.in:2: -1- AC_SUBST_TRACE([sharedstatedir])
+m4trace:configure.in:2: -1- m4_pattern_allow([^sharedstatedir$])
+m4trace:configure.in:2: -1- AC_SUBST([localstatedir], ['${prefix}/var'])
+m4trace:configure.in:2: -1- AC_SUBST_TRACE([localstatedir])
+m4trace:configure.in:2: -1- m4_pattern_allow([^localstatedir$])
+m4trace:configure.in:2: -1- AC_SUBST([includedir], ['${prefix}/include'])
+m4trace:configure.in:2: -1- AC_SUBST_TRACE([includedir])
+m4trace:configure.in:2: -1- m4_pattern_allow([^includedir$])
+m4trace:configure.in:2: -1- AC_SUBST([oldincludedir], ['/usr/include'])
+m4trace:configure.in:2: -1- AC_SUBST_TRACE([oldincludedir])
+m4trace:configure.in:2: -1- m4_pattern_allow([^oldincludedir$])
+m4trace:configure.in:2: -1- AC_SUBST([docdir], [m4_ifset([AC_PACKAGE_TARNAME],
+                                    ['${datarootdir}/doc/${PACKAGE_TARNAME}'],
+                                    ['${datarootdir}/doc/${PACKAGE}'])])
+m4trace:configure.in:2: -1- AC_SUBST_TRACE([docdir])
+m4trace:configure.in:2: -1- m4_pattern_allow([^docdir$])
+m4trace:configure.in:2: -1- AC_SUBST([infodir], ['${datarootdir}/info'])
+m4trace:configure.in:2: -1- AC_SUBST_TRACE([infodir])
+m4trace:configure.in:2: -1- m4_pattern_allow([^infodir$])
+m4trace:configure.in:2: -1- AC_SUBST([htmldir], ['${docdir}'])
+m4trace:configure.in:2: -1- AC_SUBST_TRACE([htmldir])
+m4trace:configure.in:2: -1- m4_pattern_allow([^htmldir$])
+m4trace:configure.in:2: -1- AC_SUBST([dvidir], ['${docdir}'])
+m4trace:configure.in:2: -1- AC_SUBST_TRACE([dvidir])
+m4trace:configure.in:2: -1- m4_pattern_allow([^dvidir$])
+m4trace:configure.in:2: -1- AC_SUBST([pdfdir], ['${docdir}'])
+m4trace:configure.in:2: -1- AC_SUBST_TRACE([pdfdir])
+m4trace:configure.in:2: -1- m4_pattern_allow([^pdfdir$])
+m4trace:configure.in:2: -1- AC_SUBST([psdir], ['${docdir}'])
+m4trace:configure.in:2: -1- AC_SUBST_TRACE([psdir])
+m4trace:configure.in:2: -1- m4_pattern_allow([^psdir$])
+m4trace:configure.in:2: -1- AC_SUBST([libdir], ['${exec_prefix}/lib'])
+m4trace:configure.in:2: -1- AC_SUBST_TRACE([libdir])
+m4trace:configure.in:2: -1- m4_pattern_allow([^libdir$])
+m4trace:configure.in:2: -1- AC_SUBST([localedir], ['${datarootdir}/locale'])
+m4trace:configure.in:2: -1- AC_SUBST_TRACE([localedir])
+m4trace:configure.in:2: -1- m4_pattern_allow([^localedir$])
+m4trace:configure.in:2: -1- AC_SUBST([mandir], ['${datarootdir}/man'])
+m4trace:configure.in:2: -1- AC_SUBST_TRACE([mandir])
+m4trace:configure.in:2: -1- m4_pattern_allow([^mandir$])
+m4trace:configure.in:2: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_NAME])
+m4trace:configure.in:2: -1- m4_pattern_allow([^PACKAGE_NAME$])
+m4trace:configure.in:2: -1- AH_OUTPUT([PACKAGE_NAME], [/* Define to the full name of this package. */
+#undef PACKAGE_NAME])
+m4trace:configure.in:2: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_TARNAME])
+m4trace:configure.in:2: -1- m4_pattern_allow([^PACKAGE_TARNAME$])
+m4trace:configure.in:2: -1- AH_OUTPUT([PACKAGE_TARNAME], [/* Define to the one symbol short name of this package. */
+#undef PACKAGE_TARNAME])
+m4trace:configure.in:2: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_VERSION])
+m4trace:configure.in:2: -1- m4_pattern_allow([^PACKAGE_VERSION$])
+m4trace:configure.in:2: -1- AH_OUTPUT([PACKAGE_VERSION], [/* Define to the version of this package. */
+#undef PACKAGE_VERSION])
+m4trace:configure.in:2: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_STRING])
+m4trace:configure.in:2: -1- m4_pattern_allow([^PACKAGE_STRING$])
+m4trace:configure.in:2: -1- AH_OUTPUT([PACKAGE_STRING], [/* Define to the full name and version of this package. */
+#undef PACKAGE_STRING])
+m4trace:configure.in:2: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_BUGREPORT])
+m4trace:configure.in:2: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$])
+m4trace:configure.in:2: -1- AH_OUTPUT([PACKAGE_BUGREPORT], [/* Define to the address where bug reports for this package should be sent. */
+#undef PACKAGE_BUGREPORT])
+m4trace:configure.in:2: -1- AC_SUBST([DEFS])
+m4trace:configure.in:2: -1- AC_SUBST_TRACE([DEFS])
+m4trace:configure.in:2: -1- m4_pattern_allow([^DEFS$])
+m4trace:configure.in:2: -1- AC_SUBST([ECHO_C])
+m4trace:configure.in:2: -1- AC_SUBST_TRACE([ECHO_C])
+m4trace:configure.in:2: -1- m4_pattern_allow([^ECHO_C$])
+m4trace:configure.in:2: -1- AC_SUBST([ECHO_N])
+m4trace:configure.in:2: -1- AC_SUBST_TRACE([ECHO_N])
+m4trace:configure.in:2: -1- m4_pattern_allow([^ECHO_N$])
+m4trace:configure.in:2: -1- AC_SUBST([ECHO_T])
+m4trace:configure.in:2: -1- AC_SUBST_TRACE([ECHO_T])
+m4trace:configure.in:2: -1- m4_pattern_allow([^ECHO_T$])
+m4trace:configure.in:2: -1- AC_SUBST([LIBS])
+m4trace:configure.in:2: -1- AC_SUBST_TRACE([LIBS])
+m4trace:configure.in:2: -1- m4_pattern_allow([^LIBS$])
+m4trace:configure.in:2: -1- AC_SUBST([build_alias])
+m4trace:configure.in:2: -1- AC_SUBST_TRACE([build_alias])
+m4trace:configure.in:2: -1- m4_pattern_allow([^build_alias$])
+m4trace:configure.in:2: -1- AC_SUBST([host_alias])
+m4trace:configure.in:2: -1- AC_SUBST_TRACE([host_alias])
+m4trace:configure.in:2: -1- m4_pattern_allow([^host_alias$])
+m4trace:configure.in:2: -1- AC_SUBST([target_alias])
+m4trace:configure.in:2: -1- AC_SUBST_TRACE([target_alias])
+m4trace:configure.in:2: -1- m4_pattern_allow([^target_alias$])
+m4trace:configure.in:3: -1- AC_CONFIG_HEADERS([config.h])
+m4trace:configure.in:6: -1- AC_SUBST([CC])
+m4trace:configure.in:6: -1- AC_SUBST_TRACE([CC])
+m4trace:configure.in:6: -1- m4_pattern_allow([^CC$])
+m4trace:configure.in:6: -1- AC_SUBST([CFLAGS])
+m4trace:configure.in:6: -1- AC_SUBST_TRACE([CFLAGS])
+m4trace:configure.in:6: -1- m4_pattern_allow([^CFLAGS$])
+m4trace:configure.in:6: -1- AC_SUBST([LDFLAGS])
+m4trace:configure.in:6: -1- AC_SUBST_TRACE([LDFLAGS])
+m4trace:configure.in:6: -1- m4_pattern_allow([^LDFLAGS$])
+m4trace:configure.in:6: -1- AC_SUBST([LIBS])
+m4trace:configure.in:6: -1- AC_SUBST_TRACE([LIBS])
+m4trace:configure.in:6: -1- m4_pattern_allow([^LIBS$])
+m4trace:configure.in:6: -1- AC_SUBST([CPPFLAGS])
+m4trace:configure.in:6: -1- AC_SUBST_TRACE([CPPFLAGS])
+m4trace:configure.in:6: -1- m4_pattern_allow([^CPPFLAGS$])
+m4trace:configure.in:6: -1- AC_SUBST([CC])
+m4trace:configure.in:6: -1- AC_SUBST_TRACE([CC])
+m4trace:configure.in:6: -1- m4_pattern_allow([^CC$])
+m4trace:configure.in:6: -1- AC_SUBST([CC])
+m4trace:configure.in:6: -1- AC_SUBST_TRACE([CC])
+m4trace:configure.in:6: -1- m4_pattern_allow([^CC$])
+m4trace:configure.in:6: -1- AC_SUBST([CC])
+m4trace:configure.in:6: -1- AC_SUBST_TRACE([CC])
+m4trace:configure.in:6: -1- m4_pattern_allow([^CC$])
+m4trace:configure.in:6: -1- AC_SUBST([CC])
+m4trace:configure.in:6: -1- AC_SUBST_TRACE([CC])
+m4trace:configure.in:6: -1- m4_pattern_allow([^CC$])
+m4trace:configure.in:6: -1- AC_SUBST([ac_ct_CC])
+m4trace:configure.in:6: -1- AC_SUBST_TRACE([ac_ct_CC])
+m4trace:configure.in:6: -1- m4_pattern_allow([^ac_ct_CC$])
+m4trace:configure.in:6: -1- AC_SUBST([EXEEXT], [$ac_cv_exeext])
+m4trace:configure.in:6: -1- AC_SUBST_TRACE([EXEEXT])
+m4trace:configure.in:6: -1- m4_pattern_allow([^EXEEXT$])
+m4trace:configure.in:6: -1- AC_SUBST([OBJEXT], [$ac_cv_objext])
+m4trace:configure.in:6: -1- AC_SUBST_TRACE([OBJEXT])
+m4trace:configure.in:6: -1- m4_pattern_allow([^OBJEXT$])
+m4trace:configure.in:7: -1- AC_SUBST([CPP])
+m4trace:configure.in:7: -1- AC_SUBST_TRACE([CPP])
+m4trace:configure.in:7: -1- m4_pattern_allow([^CPP$])
+m4trace:configure.in:7: -1- AC_SUBST([CPPFLAGS])
+m4trace:configure.in:7: -1- AC_SUBST_TRACE([CPPFLAGS])
+m4trace:configure.in:7: -1- m4_pattern_allow([^CPPFLAGS$])
+m4trace:configure.in:7: -1- AC_SUBST([CPP])
+m4trace:configure.in:7: -1- AC_SUBST_TRACE([CPP])
+m4trace:configure.in:7: -1- m4_pattern_allow([^CPP$])
+m4trace:configure.in:7: -1- AC_SUBST([GREP])
+m4trace:configure.in:7: -1- AC_SUBST_TRACE([GREP])
+m4trace:configure.in:7: -1- m4_pattern_allow([^GREP$])
+m4trace:configure.in:7: -1- AC_SUBST([EGREP])
+m4trace:configure.in:7: -1- AC_SUBST_TRACE([EGREP])
+m4trace:configure.in:7: -1- m4_pattern_allow([^EGREP$])
+m4trace:configure.in:7: -1- AC_DEFINE_TRACE_LITERAL([STDC_HEADERS])
+m4trace:configure.in:7: -1- m4_pattern_allow([^STDC_HEADERS$])
+m4trace:configure.in:7: -1- AH_OUTPUT([STDC_HEADERS], [/* Define to 1 if you have the ANSI C header files. */
+#undef STDC_HEADERS])
+m4trace:configure.in:8: -1- AC_REQUIRE_AUX_FILE([install-sh])
+m4trace:configure.in:8: -1- AC_SUBST([INSTALL_PROGRAM])
+m4trace:configure.in:8: -1- AC_SUBST_TRACE([INSTALL_PROGRAM])
+m4trace:configure.in:8: -1- m4_pattern_allow([^INSTALL_PROGRAM$])
+m4trace:configure.in:8: -1- AC_SUBST([INSTALL_SCRIPT])
+m4trace:configure.in:8: -1- AC_SUBST_TRACE([INSTALL_SCRIPT])
+m4trace:configure.in:8: -1- m4_pattern_allow([^INSTALL_SCRIPT$])
+m4trace:configure.in:8: -1- AC_SUBST([INSTALL_DATA])
+m4trace:configure.in:8: -1- AC_SUBST_TRACE([INSTALL_DATA])
+m4trace:configure.in:8: -1- m4_pattern_allow([^INSTALL_DATA$])
+m4trace:configure.in:35: -1- AC_DEFINE_TRACE_LITERAL([USE_LDAP_MAIL_LOOKUP])
+m4trace:configure.in:35: -1- m4_pattern_allow([^USE_LDAP_MAIL_LOOKUP$])
+m4trace:configure.in:35: -1- AH_OUTPUT([USE_LDAP_MAIL_LOOKUP], [/* Lookup email address using LDAP */
+#undef USE_LDAP_MAIL_LOOKUP])
+m4trace:configure.in:38: -1- AC_DEFINE_TRACE_LITERAL([USE_LDAP_23])
+m4trace:configure.in:38: -1- m4_pattern_allow([^USE_LDAP_23$])
+m4trace:configure.in:38: -1- AH_OUTPUT([USE_LDAP_23], [/* LDAP 2.3 or newer installed */
+#undef USE_LDAP_23])
+m4trace:configure.in:40: -2- AC_DEFINE_TRACE_LITERAL([NEED_LDAP_PERROR])
+m4trace:configure.in:40: -2- m4_pattern_allow([^NEED_LDAP_PERROR$])
+m4trace:configure.in:40: -2- AH_OUTPUT([NEED_LDAP_PERROR], [/* ldap_perror function not declared */
+#undef NEED_LDAP_PERROR])
+m4trace:configure.in:49: -1- AC_SUBST([LDAPLIBS])
+m4trace:configure.in:49: -1- AC_SUBST_TRACE([LDAPLIBS])
+m4trace:configure.in:49: -1- m4_pattern_allow([^LDAPLIBS$])
+m4trace:configure.in:52: -1- AH_OUTPUT([HAVE_SYS_TYPES_H], [/* Define to 1 if you have the <sys/types.h> header file. */
+#undef HAVE_SYS_TYPES_H])
+m4trace:configure.in:52: -1- AH_OUTPUT([HAVE_SYS_STAT_H], [/* Define to 1 if you have the <sys/stat.h> header file. */
+#undef HAVE_SYS_STAT_H])
+m4trace:configure.in:52: -1- AH_OUTPUT([HAVE_STDLIB_H], [/* Define to 1 if you have the <stdlib.h> header file. */
+#undef HAVE_STDLIB_H])
+m4trace:configure.in:52: -1- AH_OUTPUT([HAVE_STRING_H], [/* Define to 1 if you have the <string.h> header file. */
+#undef HAVE_STRING_H])
+m4trace:configure.in:52: -1- AH_OUTPUT([HAVE_MEMORY_H], [/* Define to 1 if you have the <memory.h> header file. */
+#undef HAVE_MEMORY_H])
+m4trace:configure.in:52: -1- AH_OUTPUT([HAVE_STRINGS_H], [/* Define to 1 if you have the <strings.h> header file. */
+#undef HAVE_STRINGS_H])
+m4trace:configure.in:52: -1- AH_OUTPUT([HAVE_INTTYPES_H], [/* Define to 1 if you have the <inttypes.h> header file. */
+#undef HAVE_INTTYPES_H])
+m4trace:configure.in:52: -1- AH_OUTPUT([HAVE_STDINT_H], [/* Define to 1 if you have the <stdint.h> header file. */
+#undef HAVE_STDINT_H])
+m4trace:configure.in:52: -1- AH_OUTPUT([HAVE_UNISTD_H], [/* Define to 1 if you have the <unistd.h> header file. */
+#undef HAVE_UNISTD_H])
+m4trace:configure.in:54: -1- AC_DEFINE_TRACE_LITERAL([HAVE_EXT2_INCLUDE])
+m4trace:configure.in:54: -1- m4_pattern_allow([^HAVE_EXT2_INCLUDE$])
+m4trace:configure.in:54: -1- AH_OUTPUT([HAVE_EXT2_INCLUDE], [/* Header files for e2fslib */
+#undef HAVE_EXT2_INCLUDE])
+m4trace:configure.in:62: -1- AC_DEFINE_TRACE_LITERAL([HAVE_EXT2_INO_T])
+m4trace:configure.in:62: -1- m4_pattern_allow([^HAVE_EXT2_INO_T$])
+m4trace:configure.in:62: -1- AH_OUTPUT([HAVE_EXT2_INO_T], [/* ext2fs.h defines ext2_ino_t */
+#undef HAVE_EXT2_INO_T])
+m4trace:configure.in:95: -1- AC_DEFINE_TRACE_LITERAL([EXT2_DIRECT])
+m4trace:configure.in:95: -1- m4_pattern_allow([^EXT2_DIRECT$])
+m4trace:configure.in:95: -1- AH_OUTPUT([EXT2_DIRECT], [/* Scanning of ext? filesystems using e2fslib */
+#undef EXT2_DIRECT])
+m4trace:configure.in:99: -1- AC_SUBST([EXT2LIBS])
+m4trace:configure.in:99: -1- AC_SUBST_TRACE([EXT2LIBS])
+m4trace:configure.in:99: -1- m4_pattern_allow([^EXT2LIBS$])
+m4trace:configure.in:106: -1- m4_pattern_forbid([^_?PKG_[A-Z_]+$])
+m4trace:configure.in:106: -1- m4_pattern_allow([^PKG_CONFIG(_PATH)?$])
+m4trace:configure.in:106: -1- AC_SUBST([PKG_CONFIG])
+m4trace:configure.in:106: -1- AC_SUBST_TRACE([PKG_CONFIG])
+m4trace:configure.in:106: -1- m4_pattern_allow([^PKG_CONFIG$])
+m4trace:configure.in:106: -1- AC_SUBST([PKG_CONFIG])
+m4trace:configure.in:106: -1- AC_SUBST_TRACE([PKG_CONFIG])
+m4trace:configure.in:106: -1- m4_pattern_allow([^PKG_CONFIG$])
+m4trace:configure.in:106: -1- AC_SUBST([DBUS_CFLAGS])
+m4trace:configure.in:106: -1- AC_SUBST_TRACE([DBUS_CFLAGS])
+m4trace:configure.in:106: -1- m4_pattern_allow([^DBUS_CFLAGS$])
+m4trace:configure.in:106: -1- AC_SUBST([DBUS_LIBS])
+m4trace:configure.in:106: -1- AC_SUBST_TRACE([DBUS_LIBS])
+m4trace:configure.in:106: -1- m4_pattern_allow([^DBUS_LIBS$])
+m4trace:configure.in:132: -1- AC_SUBST([QUOTA_NETLINK_PROG])
+m4trace:configure.in:132: -1- AC_SUBST_TRACE([QUOTA_NETLINK_PROG])
+m4trace:configure.in:132: -1- m4_pattern_allow([^QUOTA_NETLINK_PROG$])
+m4trace:configure.in:133: -1- AC_SUBST([NETLINKLIBS])
+m4trace:configure.in:133: -1- AC_SUBST_TRACE([NETLINKLIBS])
+m4trace:configure.in:133: -1- m4_pattern_allow([^NETLINKLIBS$])
+m4trace:configure.in:159: -1- AC_DEFINE_TRACE_LITERAL([HOSTS_ACCESS])
+m4trace:configure.in:159: -1- m4_pattern_allow([^HOSTS_ACCESS$])
+m4trace:configure.in:159: -1- AH_OUTPUT([HOSTS_ACCESS], [/* Use hosts.allow and hosts.deny for access checking of rpc.rquotad */
+#undef HOSTS_ACCESS])
+m4trace:configure.in:164: -1- AC_DEFINE_TRACE_LITERAL([const])
+m4trace:configure.in:164: -1- m4_pattern_allow([^const$])
+m4trace:configure.in:164: -1- AH_OUTPUT([const], [/* Define to empty if `const\' does not conform to ANSI C. */
+#undef const])
+m4trace:configure.in:165: -1- AH_OUTPUT([inline], [/* Define to `__inline__\' or `__inline\' if that\'s what the C compiler
+   calls it, or to nothing if \'inline\' is not supported under any name.  */
+#ifndef __cplusplus
+#undef inline
+#endif])
+m4trace:configure.in:206: -1- AC_DEFINE_TRACE_LITERAL([ALT_FORMAT])
+m4trace:configure.in:206: -1- m4_pattern_allow([^ALT_FORMAT$])
+m4trace:configure.in:206: -1- AH_OUTPUT([ALT_FORMAT], [/* Alternative file format of edquota */
+#undef ALT_FORMAT])
+m4trace:configure.in:210: -1- AC_DEFINE_TRACE_LITERAL([RPC])
+m4trace:configure.in:210: -1- m4_pattern_allow([^RPC$])
+m4trace:configure.in:210: -1- AH_OUTPUT([RPC], [/* Support for RPC */
+#undef RPC])
+m4trace:configure.in:214: -1- AC_DEFINE_TRACE_LITERAL([RPC_SETQUOTA])
+m4trace:configure.in:214: -1- m4_pattern_allow([^RPC_SETQUOTA$])
+m4trace:configure.in:214: -1- AH_OUTPUT([RPC_SETQUOTA], [/* Allow setting of quotas over RPC */
+#undef RPC_SETQUOTA])
+m4trace:configure.in:218: -1- AC_DEFINE_TRACE_LITERAL([XFS_ROOTHACK])
+m4trace:configure.in:218: -1- m4_pattern_allow([^XFS_ROOTHACK$])
+m4trace:configure.in:218: -1- AH_OUTPUT([XFS_ROOTHACK], [/* Assume quota mount options for root filesystem */
+#undef XFS_ROOTHACK])
+m4trace:configure.in:222: -1- AC_DEFINE_TRACE_LITERAL([BSD_BEHAVIOUR])
+m4trace:configure.in:222: -1- m4_pattern_allow([^BSD_BEHAVIOUR$])
+m4trace:configure.in:222: -1- AH_OUTPUT([BSD_BEHAVIOUR], [/* Check rights to query / set quotas before calling quotactl */
+#undef BSD_BEHAVIOUR])
+m4trace:configure.in:229: -1- AC_DEFINE_TRACE_LITERAL([USE_GETTEXT])
+m4trace:configure.in:229: -1- m4_pattern_allow([^USE_GETTEXT$])
+m4trace:configure.in:229: -1- AH_OUTPUT([USE_GETTEXT], [/* Use gettext to translate messages */
+#undef USE_GETTEXT])
+m4trace:configure.in:233: -1- AC_DEFINE_TRACE_LITERAL([ALT_MTAB])
+m4trace:configure.in:233: -1- m4_pattern_allow([^ALT_MTAB$])
+m4trace:configure.in:233: -1- AH_OUTPUT([ALT_MTAB], [/* File with mounted filesystems */
+#undef ALT_MTAB])
+m4trace:configure.in:241: -1- AC_DEFINE_TRACE_LITERAL([COMPILE_OPTS])
+m4trace:configure.in:241: -1- m4_pattern_allow([^COMPILE_OPTS$])
+m4trace:configure.in:241: -1- AH_OUTPUT([COMPILE_OPTS], [/* Configuration options */
+#undef COMPILE_OPTS])
+m4trace:configure.in:242: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_VERSION])
+m4trace:configure.in:242: -1- m4_pattern_allow([^PACKAGE_VERSION$])
+m4trace:configure.in:242: -1- AH_OUTPUT([PACKAGE_VERSION], [/* Version of quota tools */
+#undef PACKAGE_VERSION])
+m4trace:configure.in:244: -1- AC_SUBST([LIBMALLOC])
+m4trace:configure.in:244: -1- AC_SUBST_TRACE([LIBMALLOC])
+m4trace:configure.in:244: -1- m4_pattern_allow([^LIBMALLOC$])
+m4trace:configure.in:245: -1- AC_SUBST([INSTMO])
+m4trace:configure.in:245: -1- AC_SUBST_TRACE([INSTMO])
+m4trace:configure.in:245: -1- m4_pattern_allow([^INSTMO$])
+m4trace:configure.in:246: -1- AC_SUBST([ROOTSBIN])
+m4trace:configure.in:246: -1- AC_SUBST_TRACE([ROOTSBIN])
+m4trace:configure.in:246: -1- m4_pattern_allow([^ROOTSBIN$])
+m4trace:configure.in:247: -1- AC_SUBST([CPPFLAGS])
+m4trace:configure.in:247: -1- AC_SUBST_TRACE([CPPFLAGS])
+m4trace:configure.in:247: -1- m4_pattern_allow([^CPPFLAGS$])
+m4trace:configure.in:249: -1- AC_CONFIG_FILES([Makefile])
+m4trace:configure.in:249: -1- _m4_warn([obsolete], [AC_OUTPUT should be used without arguments.
+You should run autoupdate.], [])
+m4trace:configure.in:249: -1- AC_SUBST([LIB@&t@OBJS], [$ac_libobjs])
+m4trace:configure.in:249: -1- AC_SUBST_TRACE([LIB@&t@OBJS])
+m4trace:configure.in:249: -1- m4_pattern_allow([^LIB@&t@OBJS$])
+m4trace:configure.in:249: -1- AC_SUBST([LTLIBOBJS], [$ac_ltlibobjs])
+m4trace:configure.in:249: -1- AC_SUBST_TRACE([LTLIBOBJS])
+m4trace:configure.in:249: -1- m4_pattern_allow([^LTLIBOBJS$])
+m4trace:configure.in:249: -1- AC_SUBST_TRACE([top_builddir])
+m4trace:configure.in:249: -1- AC_SUBST_TRACE([top_build_prefix])
+m4trace:configure.in:249: -1- AC_SUBST_TRACE([srcdir])
+m4trace:configure.in:249: -1- AC_SUBST_TRACE([abs_srcdir])
+m4trace:configure.in:249: -1- AC_SUBST_TRACE([top_srcdir])
+m4trace:configure.in:249: -1- AC_SUBST_TRACE([abs_top_srcdir])
+m4trace:configure.in:249: -1- AC_SUBST_TRACE([builddir])
+m4trace:configure.in:249: -1- AC_SUBST_TRACE([abs_builddir])
+m4trace:configure.in:249: -1- AC_SUBST_TRACE([abs_top_builddir])
+m4trace:configure.in:249: -1- AC_SUBST_TRACE([INSTALL])
diff --git a/bylabel.c b/bylabel.c
new file mode 100644 (file)
index 0000000..68a109c
--- /dev/null
+++ b/bylabel.c
@@ -0,0 +1,275 @@
+/*
+ * Derived from the util-linux/mount/mount_by_label.c source,
+ * currently maintained by Andries Brouwer <aeb@cwi.nl>.
+ *
+ * 1999-02-22 Arkadiusz Mi¶kiewicz <misiek@misiek.eu.org>
+ * - added Native Language Support
+ * 2000-01-20 James Antill <james@and.org>
+ * - Added error message if /proc/partitions cannot be opened
+ * 2000-05-09 Erik Troan <ewt@redhat.com>
+ * - Added cache for UUID and disk labels
+ * 2000-11-07 Nathan Scott <nathans@sgi.com>
+ * - Added XFS support
+ */
+
+#include "config.h"
+
+#include <stdio.h>
+#include <sys/param.h>
+#include <string.h>
+#include <ctype.h>
+#include <fcntl.h>
+#include <unistd.h>
+
+#include "bylabel.h"
+#include "common.h"
+#include "pot.h"
+
+#define PROC_PARTITIONS "/proc/partitions"
+#define DEVLABELDIR    "/dev"
+
+static struct uuidCache_s {
+       struct uuidCache_s *next;
+       char uuid[16];
+       char *label;
+       char *device;
+} *uuidCache = NULL;
+
+#define EXT2_SUPER_MAGIC       0xEF53
+struct ext2_super_block {
+       u_char s_dummy1[56];
+       u_char s_magic[2];
+       u_char s_dummy2[46];
+       u_char s_uuid[16];
+       u_char s_volume_name[16];
+};
+
+#define ext2magic(s)   ((uint) s.s_magic[0] + (((uint) s.s_magic[1]) << 8))
+
+#define XFS_SUPER_MAGIC "XFSB"
+#define XFS_SUPER_MAGIC2 "BSFX"
+struct xfs_super_block {
+       u_char s_magic[4];
+       u_char s_dummy[28];
+       u_char s_uuid[16];
+       u_char s_dummy2[60];
+       u_char s_fsname[12];
+};
+
+#define REISER_SUPER_MAGIC     "ReIsEr2Fs"
+struct reiserfs_super_block {
+       u_char s_dummy1[52];
+       u_char s_magic[10];
+       u_char s_dummy2[22];
+       u_char s_uuid[16];
+       u_char s_volume_name[16];
+};
+
+static inline unsigned short swapped(unsigned short a)
+{
+       return (a >> 8) | (a << 8);
+}
+
+/* for now, only ext2 and xfs are supported */
+static int get_label_uuid(const char *device, char **label, char *uuid)
+{
+
+       /* start with ext2 and xfs tests, taken from mount_guess_fstype */
+       /* should merge these later */
+       int fd, rv = 1;
+       size_t namesize;
+       struct ext2_super_block e2sb;
+       struct xfs_super_block xfsb;
+       struct reiserfs_super_block reisersb;
+
+       fd = open(device, O_RDONLY);
+       if (fd < 0)
+               return rv;
+
+       if (lseek(fd, 1024, SEEK_SET) == 1024
+           && read(fd, (char *)&e2sb, sizeof(e2sb)) == sizeof(e2sb)
+           && ext2magic(e2sb) == EXT2_SUPER_MAGIC) {
+               memcpy(uuid, e2sb.s_uuid, sizeof(e2sb.s_uuid));
+               namesize = sizeof(e2sb.s_volume_name);
+               *label = smalloc(namesize + 1);
+               sstrncpy(*label, (char *)e2sb.s_volume_name, namesize);
+               rv = 0;
+       }
+       else if (lseek(fd, 0, SEEK_SET) == 0
+                && read(fd, (char *)&xfsb, sizeof(xfsb)) == sizeof(xfsb)
+                && (strncmp((char *)&xfsb.s_magic, XFS_SUPER_MAGIC, 4) == 0 ||
+                    strncmp((char *)&xfsb.s_magic, XFS_SUPER_MAGIC2, 4) == 0)) {
+               memcpy(uuid, xfsb.s_uuid, sizeof(xfsb.s_uuid));
+               namesize = sizeof(xfsb.s_fsname);
+               *label = smalloc(namesize + 1);
+               sstrncpy(*label, (char *)xfsb.s_fsname, namesize);
+               rv = 0;
+       }
+       else if (lseek(fd, 65536, SEEK_SET) == 65536
+               && read(fd, (char *)&reisersb, sizeof(reisersb)) == sizeof(reisersb)
+               && !strncmp((char *)&reisersb.s_magic, REISER_SUPER_MAGIC, 9)) {
+               memcpy(uuid, reisersb.s_uuid, sizeof(reisersb.s_uuid));
+               namesize = sizeof(reisersb.s_volume_name);
+               *label = smalloc(namesize + 1);
+               sstrncpy(*label, (char *)reisersb.s_volume_name, namesize);
+               rv = 0;
+       }
+       close(fd);
+       return rv;
+}
+
+static void uuidcache_addentry(char *device, char *label, char *uuid)
+{
+       struct uuidCache_s *last;
+
+       if (!uuidCache) {
+               last = uuidCache = smalloc(sizeof(*uuidCache));
+       }
+       else {
+               for (last = uuidCache; last->next; last = last->next);
+               last->next = smalloc(sizeof(*uuidCache));
+               last = last->next;
+       }
+       last->next = NULL;
+       last->device = device;
+       last->label = label;
+       memcpy(last->uuid, uuid, sizeof(last->uuid));
+}
+
+static void uuidcache_init(void)
+{
+       char line[100];
+       char *s;
+       int ma, mi, sz;
+       static char ptname[100];
+       FILE *procpt;
+       char uuid[16], *label;
+       char device[110];
+       int firstPass;
+       int handleOnFirst;
+
+       if (uuidCache)
+               return;
+
+       procpt = fopen(PROC_PARTITIONS, "r");
+       if (!procpt)
+               return;
+
+       for (firstPass = 1; firstPass >= 0; firstPass--) {
+               fseek(procpt, 0, SEEK_SET);
+
+               while (fgets(line, sizeof(line), procpt)) {
+                       if (sscanf(line, " %d %d %d %[^\n ]", &ma, &mi, &sz, ptname) != 4)
+                               continue;
+
+                       /* skip extended partitions (heuristic: size 1) */
+                       if (sz == 1)
+                               continue;
+
+                       /* look only at md devices on first pass */
+                       handleOnFirst = !strncmp(ptname, "md", 2);
+                       if (firstPass != handleOnFirst)
+                               continue;
+
+                       /* skip entire disk (minor 0, 64, ... on ide;
+                          0, 16, ... on sd) */
+                       /* heuristic: partition name ends in a digit */
+
+                       for (s = ptname; *s; s++);
+                       if (isdigit(s[-1])) {
+                               /*
+                                * Note: this is a heuristic only - there is no reason
+                                * why these devices should live in /dev.
+                                * Perhaps this directory should be specifiable by option.
+                                * One might for example have /devlabel with links to /dev
+                                * for the devices that may be accessed in this way.
+                                * (This is useful, if the cdrom on /dev/hdc must not
+                                * be accessed.)
+                                */
+                               snprintf(device, sizeof(device), "%s/%s", DEVLABELDIR, ptname);
+                               if (!get_label_uuid(device, &label, uuid))
+                                       uuidcache_addentry(sstrdup(device), label, uuid);
+                       }
+               }
+       }
+
+       fclose(procpt);
+}
+
+#define UUID   1
+#define VOL    2
+
+static char *get_spec_by_x(int n, const char *t)
+{
+       struct uuidCache_s *uc;
+
+       uuidcache_init();
+       uc = uuidCache;
+
+       while (uc) {
+               switch (n) {
+                 case UUID:
+                         if (!memcmp(t, uc->uuid, sizeof(uc->uuid)))
+                                 return sstrdup(uc->device);
+                         break;
+                 case VOL:
+                         if (!strcmp(t, uc->label))
+                                 return sstrdup(uc->device);
+                         break;
+               }
+               uc = uc->next;
+       }
+       return NULL;
+}
+
+static u_char fromhex(char c)
+{
+       if (isdigit(c))
+               return (c - '0');
+       else if (islower(c))
+               return (c - 'a' + 10);
+       else
+               return (c - 'A' + 10);
+}
+
+static char *get_spec_by_uuid(const char *s)
+{
+       u_char uuid[16];
+       int i;
+
+       if (strlen(s) != 36 || s[8] != '-' || s[13] != '-' || s[18] != '-' || s[23] != '-')
+               goto bad_uuid;
+       for (i = 0; i < 16; i++) {
+               if (*s == '-')
+                       s++;
+               if (!isxdigit(s[0]) || !isxdigit(s[1]))
+                       goto bad_uuid;
+               uuid[i] = ((fromhex(s[0]) << 4) | fromhex(s[1]));
+               s += 2;
+       }
+       return get_spec_by_x(UUID, (char *)uuid);
+
+      bad_uuid:
+       errstr(_("Found an invalid UUID: %s\n"), s);
+       return NULL;
+}
+
+static char *get_spec_by_volume_label(const char *s)
+{
+       return get_spec_by_x(VOL, s);
+}
+
+const char *get_device_name(const char *item)
+{
+       const char *rc;
+
+       if (!strncmp(item, "UUID=", 5))
+               rc = get_spec_by_uuid(item + 5);
+       else if (!strncmp(item, "LABEL=", 6))
+               rc = get_spec_by_volume_label(item + 6);
+       else
+               rc = sstrdup(item);
+       if (!rc)
+               errstr(_("Error checking device name: %s\n"), item);
+       return rc;
+}
diff --git a/bylabel.h b/bylabel.h
new file mode 100644 (file)
index 0000000..12fc725
--- /dev/null
+++ b/bylabel.h
@@ -0,0 +1,4 @@
+#ifndef BYLABEL_H_
+#define BYLABEL_H_
+const char *get_device_name(const char *item);
+#endif /* BYLABEL_H_ */
diff --git a/common.c b/common.c
new file mode 100644 (file)
index 0000000..69e6178
--- /dev/null
+++ b/common.c
@@ -0,0 +1,127 @@
+/*
+ *
+ *     Common things for all utilities
+ *
+ *     Jan Kara <jack@suse.cz> - sponsored by SuSE CR
+ *
+ *      Jani Jaakkola <jjaakkol@cs.helsinki.fi> - syslog support
+ */
+
+#include "config.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <syslog.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include "pot.h"
+#include "common.h"
+
+static int enable_syslog=0;
+
+void use_syslog(void)
+{
+       openlog(progname,0,LOG_DAEMON);
+       enable_syslog=1;
+}
+
+static void do_syslog(int level, const char *format, va_list args)
+{
+       char buf[1024];
+       int i, j;
+       
+       vsnprintf(buf,sizeof(buf),format,args);
+       /* This while removes newlines from the log, so that
+        * syslog() will be called once for every line */
+       for (i = 0; buf[i]; i = j) {
+               for (j = i; buf[j] && buf[j] != '\n'; j++);
+               if (buf[j] == '\n')
+                       buf[j++] = '\0';
+               syslog(level, "%s", buf + i);
+       }
+}
+
+void die(int ret, char *fmtstr, ...)
+{
+       va_list args;
+
+       va_start(args, fmtstr);
+       if (enable_syslog) {
+               do_syslog(LOG_CRIT, fmtstr, args);
+               syslog(LOG_CRIT, "Exiting with status %d", ret);
+       } else {
+               fprintf(stderr, "%s: ", progname);
+               vfprintf(stderr, fmtstr, args);
+       }
+       va_end(args);
+       exit(ret);
+}
+
+void errstr(char *fmtstr, ...)
+{
+       va_list args;
+
+       va_start(args, fmtstr);
+       if (enable_syslog)
+               do_syslog(LOG_ERR, fmtstr, args);
+       else {
+               fprintf(stderr, "%s: ", progname);
+               vfprintf(stderr, fmtstr, args);
+       }
+       va_end(args);
+}
+
+void *smalloc(size_t size)
+{
+       void *ret = malloc(size);
+
+       if (!ret) {
+               fputs("Not enough memory.\n", stderr);
+               exit(3);
+       }
+       return ret;
+}
+
+void *srealloc(void *ptr, size_t size)
+{
+       void *ret = realloc(ptr, size);
+
+       if (!ret) {
+               fputs("Not enough memory.\n", stderr);
+               exit(3);
+       }
+       return ret;
+}
+
+void sstrncpy(char *d, const char *s, size_t len)
+{
+       strncpy(d, s, len);
+       d[len - 1] = 0;
+}
+
+void sstrncat(char *d, const char *s, size_t len)
+{
+       strncat(d, s, len);
+       d[len - 1] = 0;
+}
+
+char *sstrdup(const char *s)
+{
+       char *r = strdup(s);
+
+       if (!r) {
+               puts("Not enough memory.");
+               exit(3);
+       }
+       return r;
+}
+
+void version(void)
+{
+       printf(_("Quota utilities version %s.\n"), PACKAGE_VERSION);
+       printf(_("Compiled with:%s\n"), COMPILE_OPTS);
+       printf(_("Bugs to %s\n"), MY_EMAIL);
+}
diff --git a/common.h b/common.h
new file mode 100644 (file)
index 0000000..8b04e55
--- /dev/null
+++ b/common.h
@@ -0,0 +1,49 @@
+/*
+ *
+ *     Various things common for all utilities
+ *
+ */
+
+#ifndef GUARD_COMMON_H
+#define GUARD_COMMON_H
+
+#ifndef __attribute__
+# if !defined __GNUC__ || __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 8) || __STRICT_ANSI__
+#  define __attribute__(x)
+# endif
+#endif
+
+#define MY_EMAIL "jack@suse.cz"
+
+/* Name of current program for error reporting */
+extern char *progname;
+
+/* Finish programs being */
+void __attribute ((noreturn)) die(int, char *, ...) __attribute__ ((__format__ (__printf__, 2, 3)));
+
+/* Print an error */
+void errstr(char *, ...) __attribute__ ((__format__ (__printf__, 1, 2)));
+
+/* If use_syslog is called, all error reports using errstr() and die() are
+ * written to syslog instead of stderr */
+void use_syslog();
+
+/* malloc() with error check */
+void *smalloc(size_t);
+
+/* realloc() with error check */
+void *srealloc(void *, size_t);
+
+/* Safe strncpy - always finishes string */
+void sstrncpy(char *, const char *, size_t);
+
+/* Safe strncat - always finishes string */
+void sstrncat(char *, const char *, size_t);
+
+/* Safe version of strdup() */
+char *sstrdup(const char *s);
+
+/* Print version string */
+void version(void);
+
+#endif /* GUARD_COMMON_H */
diff --git a/config.h.in b/config.h.in
new file mode 100644 (file)
index 0000000..432e3b5
--- /dev/null
@@ -0,0 +1,100 @@
+/* config.h.in.  Generated from configure.in by autoheader.  */
+
+/* Alternative file format of edquota */
+#undef ALT_FORMAT
+
+/* File with mounted filesystems */
+#undef ALT_MTAB
+
+/* Check rights to query / set quotas before calling quotactl */
+#undef BSD_BEHAVIOUR
+
+/* Configuration options */
+#undef COMPILE_OPTS
+
+/* Scanning of ext? filesystems using e2fslib */
+#undef EXT2_DIRECT
+
+/* Header files for e2fslib */
+#undef HAVE_EXT2_INCLUDE
+
+/* ext2fs.h defines ext2_ino_t */
+#undef HAVE_EXT2_INO_T
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#undef HAVE_INTTYPES_H
+
+/* Define to 1 if you have the <memory.h> header file. */
+#undef HAVE_MEMORY_H
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#undef HAVE_STDINT_H
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#undef HAVE_STDLIB_H
+
+/* Define to 1 if you have the <strings.h> header file. */
+#undef HAVE_STRINGS_H
+
+/* Define to 1 if you have the <string.h> header file. */
+#undef HAVE_STRING_H
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#undef HAVE_SYS_STAT_H
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#undef HAVE_SYS_TYPES_H
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#undef HAVE_UNISTD_H
+
+/* Use hosts.allow and hosts.deny for access checking of rpc.rquotad */
+#undef HOSTS_ACCESS
+
+/* ldap_perror function not declared */
+#undef NEED_LDAP_PERROR
+
+/* Define to the address where bug reports for this package should be sent. */
+#undef PACKAGE_BUGREPORT
+
+/* Define to the full name of this package. */
+#undef PACKAGE_NAME
+
+/* Define to the full name and version of this package. */
+#undef PACKAGE_STRING
+
+/* Define to the one symbol short name of this package. */
+#undef PACKAGE_TARNAME
+
+/* Version of quota tools */
+#undef PACKAGE_VERSION
+
+/* Support for RPC */
+#undef RPC
+
+/* Allow setting of quotas over RPC */
+#undef RPC_SETQUOTA
+
+/* Define to 1 if you have the ANSI C header files. */
+#undef STDC_HEADERS
+
+/* Use gettext to translate messages */
+#undef USE_GETTEXT
+
+/* LDAP 2.3 or newer installed */
+#undef USE_LDAP_23
+
+/* Lookup email address using LDAP */
+#undef USE_LDAP_MAIL_LOOKUP
+
+/* Assume quota mount options for root filesystem */
+#undef XFS_ROOTHACK
+
+/* Define to empty if `const' does not conform to ANSI C. */
+#undef const
+
+/* Define to `__inline__' or `__inline' if that's what the C compiler
+   calls it, or to nothing if 'inline' is not supported under any name.  */
+#ifndef __cplusplus
+#undef inline
+#endif
diff --git a/configure b/configure
new file mode 100755 (executable)
index 0000000..6786250
--- /dev/null
+++ b/configure
@@ -0,0 +1,6360 @@
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.63.
+#
+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
+# 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+## --------------------- ##
+## M4sh Initialization.  ##
+## --------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in
+  *posix*) set -o posix ;;
+esac
+
+fi
+
+
+
+
+# PATH needs CR
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+if (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='printf %s\n'
+  as_echo_n='printf %s'
+else
+  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+    as_echo_n='/usr/ucb/echo -n'
+  else
+    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+    as_echo_n_body='eval
+      arg=$1;
+      case $arg in
+      *"$as_nl"*)
+       expr "X$arg" : "X\\(.*\\)$as_nl";
+       arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+      esac;
+      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+    '
+    export as_echo_n_body
+    as_echo_n='sh -c $as_echo_n_body as_echo'
+  fi
+  export as_echo_body
+  as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+      PATH_SEPARATOR=';'
+  }
+fi
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  as_unset=unset
+else
+  as_unset=false
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" ""       $as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+case $0 in
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+IFS=$as_save_IFS
+
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  { (exit 1); exit 1; }
+fi
+
+# Work around bugs in pre-3.0 UWIN ksh.
+for as_var in ENV MAIL MAILPATH
+do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+        X"$0" : 'X\(//\)$' \| \
+        X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+           s//\1/
+           q
+         }
+         /^X\/\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\/\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+
+# CDPATH.
+$as_unset CDPATH
+
+
+if test "x$CONFIG_SHELL" = x; then
+  if (eval ":") 2>/dev/null; then
+  as_have_required=yes
+else
+  as_have_required=no
+fi
+
+  if test $as_have_required = yes &&    (eval ":
+(as_func_return () {
+  (exit \$1)
+}
+as_func_success () {
+  as_func_return 0
+}
+as_func_failure () {
+  as_func_return 1
+}
+as_func_ret_success () {
+  return 0
+}
+as_func_ret_failure () {
+  return 1
+}
+
+exitcode=0
+if as_func_success; then
+  :
+else
+  exitcode=1
+  echo as_func_success failed.
+fi
+
+if as_func_failure; then
+  exitcode=1
+  echo as_func_failure succeeded.
+fi
+
+if as_func_ret_success; then
+  :
+else
+  exitcode=1
+  echo as_func_ret_success failed.
+fi
+
+if as_func_ret_failure; then
+  exitcode=1
+  echo as_func_ret_failure succeeded.
+fi
+
+if ( set x; as_func_ret_success y && test x = \"\$1\" ); then
+  :
+else
+  exitcode=1
+  echo positional parameters were not saved.
+fi
+
+test \$exitcode = 0) || { (exit 1); exit 1; }
+
+(
+  as_lineno_1=\$LINENO
+  as_lineno_2=\$LINENO
+  test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" &&
+  test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; }
+") 2> /dev/null; then
+  :
+else
+  as_candidate_shells=
+    as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  case $as_dir in
+        /*)
+          for as_base in sh bash ksh sh5; do
+            as_candidate_shells="$as_candidate_shells $as_dir/$as_base"
+          done;;
+       esac
+done
+IFS=$as_save_IFS
+
+
+      for as_shell in $as_candidate_shells $SHELL; do
+        # Try only shells that exist, to save several forks.
+        if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
+               { ("$as_shell") 2> /dev/null <<\_ASEOF
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in
+  *posix*) set -o posix ;;
+esac
+
+fi
+
+
+:
+_ASEOF
+}; then
+  CONFIG_SHELL=$as_shell
+              as_have_required=yes
+              if { "$as_shell" 2> /dev/null <<\_ASEOF
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in
+  *posix*) set -o posix ;;
+esac
+
+fi
+
+
+:
+(as_func_return () {
+  (exit $1)
+}
+as_func_success () {
+  as_func_return 0
+}
+as_func_failure () {
+  as_func_return 1
+}
+as_func_ret_success () {
+  return 0
+}
+as_func_ret_failure () {
+  return 1
+}
+
+exitcode=0
+if as_func_success; then
+  :
+else
+  exitcode=1
+  echo as_func_success failed.
+fi
+
+if as_func_failure; then
+  exitcode=1
+  echo as_func_failure succeeded.
+fi
+
+if as_func_ret_success; then
+  :
+else
+  exitcode=1
+  echo as_func_ret_success failed.
+fi
+
+if as_func_ret_failure; then
+  exitcode=1
+  echo as_func_ret_failure succeeded.
+fi
+
+if ( set x; as_func_ret_success y && test x = "$1" ); then
+  :
+else
+  exitcode=1
+  echo positional parameters were not saved.
+fi
+
+test $exitcode = 0) || { (exit 1); exit 1; }
+
+(
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; }
+
+_ASEOF
+}; then
+  break
+fi
+
+fi
+
+      done
+
+      if test "x$CONFIG_SHELL" != x; then
+  for as_var in BASH_ENV ENV
+       do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+       done
+       export CONFIG_SHELL
+       exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"}
+fi
+
+
+    if test $as_have_required = no; then
+  echo This script requires a shell more modern than all the
+      echo shells that I found on your system.  Please install a
+      echo modern shell, or manually run the script under such a
+      echo shell if you do have one.
+      { (exit 1); exit 1; }
+fi
+
+
+fi
+
+fi
+
+
+
+(eval "as_func_return () {
+  (exit \$1)
+}
+as_func_success () {
+  as_func_return 0
+}
+as_func_failure () {
+  as_func_return 1
+}
+as_func_ret_success () {
+  return 0
+}
+as_func_ret_failure () {
+  return 1
+}
+
+exitcode=0
+if as_func_success; then
+  :
+else
+  exitcode=1
+  echo as_func_success failed.
+fi
+
+if as_func_failure; then
+  exitcode=1
+  echo as_func_failure succeeded.
+fi
+
+if as_func_ret_success; then
+  :
+else
+  exitcode=1
+  echo as_func_ret_success failed.
+fi
+
+if as_func_ret_failure; then
+  exitcode=1
+  echo as_func_ret_failure succeeded.
+fi
+
+if ( set x; as_func_ret_success y && test x = \"\$1\" ); then
+  :
+else
+  exitcode=1
+  echo positional parameters were not saved.
+fi
+
+test \$exitcode = 0") || {
+  echo No shell found that supports shell functions.
+  echo Please tell bug-autoconf@gnu.org about your system,
+  echo including any error possibly output before this message.
+  echo This can help us improve future autoconf versions.
+  echo Configuration will now proceed without shell functions.
+}
+
+
+
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || {
+
+  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+  # uniformly replaced by the line number.  The first 'sed' inserts a
+  # line-number line after each line using $LINENO; the second 'sed'
+  # does the real work.  The second script uses 'N' to pair each
+  # line-number line with the line containing $LINENO, and appends
+  # trailing '-' during substitution so that $LINENO is not a special
+  # case at line end.
+  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+  # scripts with optimization help from Paolo Bonzini.  Blame Lee
+  # E. McMahon (1931-1989) for sed's syntax.  :-)
+  sed -n '
+    p
+    /[$]LINENO/=
+  ' <$as_myself |
+    sed '
+      s/[$]LINENO.*/&-/
+      t lineno
+      b
+      :lineno
+      N
+      :loop
+      s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
+      t loop
+      s/-\n.*//
+    ' >$as_me.lineno &&
+  chmod +x "$as_me.lineno" ||
+    { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
+   { (exit 1); exit 1; }; }
+
+  # Don't try to exec as it changes $[0], causing all sort of problems
+  # (the dirname of $[0] is not the place where we might find the
+  # original and so on.  Autoconf is especially sensitive to this).
+  . "./$as_me.lineno"
+  # Exit status is that of the last command.
+  exit
+}
+
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in
+-n*)
+  case `echo 'x\c'` in
+  *c*) ECHO_T='        ';;     # ECHO_T is single tab character.
+  *)   ECHO_C='\c';;
+  esac;;
+*)
+  ECHO_N='-n';;
+esac
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+  if ln -s conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s='ln -s'
+    # ... but there are two gotchas:
+    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+    # In both cases, we have to default to `cp -p'.
+    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+      as_ln_s='cp -p'
+  elif ln conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s=ln
+  else
+    as_ln_s='cp -p'
+  fi
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p=:
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+if test -x / >/dev/null 2>&1; then
+  as_test_x='test -x'
+else
+  if ls -dL / >/dev/null 2>&1; then
+    as_ls_L_option=L
+  else
+    as_ls_L_option=
+  fi
+  as_test_x='
+    eval sh -c '\''
+      if test -d "$1"; then
+       test -d "$1/.";
+      else
+       case $1 in
+       -*)set "./$1";;
+       esac;
+       case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in
+       ???[sx]*):;;*)false;;esac;fi
+    '\'' sh
+  '
+fi
+as_executable_p=$as_test_x
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+
+exec 7<&0 </dev/null 6>&1
+
+# Name of the host.
+# hostname on some systems (SVR3.2, Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+ac_clean_files=
+ac_config_libobj_dir=.
+LIBOBJS=
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+# Identity of this package.
+PACKAGE_NAME=
+PACKAGE_TARNAME=
+PACKAGE_VERSION=
+PACKAGE_STRING=
+PACKAGE_BUGREPORT=
+
+ac_unique_file="quota.c"
+# Factoring default headers for most tests.
+ac_includes_default="\
+#include <stdio.h>
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+#ifdef STDC_HEADERS
+# include <stdlib.h>
+# include <stddef.h>
+#else
+# ifdef HAVE_STDLIB_H
+#  include <stdlib.h>
+# endif
+#endif
+#ifdef HAVE_STRING_H
+# if !defined STDC_HEADERS && defined HAVE_MEMORY_H
+#  include <memory.h>
+# endif
+# include <string.h>
+#endif
+#ifdef HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+# include <inttypes.h>
+#endif
+#ifdef HAVE_STDINT_H
+# include <stdint.h>
+#endif
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif"
+
+ac_subst_vars='LTLIBOBJS
+LIBOBJS
+ROOTSBIN
+INSTMO
+LIBMALLOC
+NETLINKLIBS
+QUOTA_NETLINK_PROG
+DBUS_LIBS
+DBUS_CFLAGS
+PKG_CONFIG
+EXT2LIBS
+LDAPLIBS
+INSTALL_DATA
+INSTALL_SCRIPT
+INSTALL_PROGRAM
+EGREP
+GREP
+CPP
+OBJEXT
+EXEEXT
+ac_ct_CC
+CPPFLAGS
+LDFLAGS
+CFLAGS
+CC
+target_alias
+host_alias
+build_alias
+LIBS
+ECHO_T
+ECHO_N
+ECHO_C
+DEFS
+mandir
+localedir
+libdir
+psdir
+pdfdir
+dvidir
+htmldir
+infodir
+docdir
+oldincludedir
+includedir
+localstatedir
+sharedstatedir
+sysconfdir
+datadir
+datarootdir
+libexecdir
+sbindir
+bindir
+program_transform_name
+prefix
+exec_prefix
+PACKAGE_BUGREPORT
+PACKAGE_STRING
+PACKAGE_VERSION
+PACKAGE_TARNAME
+PACKAGE_NAME
+PATH_SEPARATOR
+SHELL'
+ac_subst_files=''
+ac_user_opts='
+enable_option_checking
+enable_ldapmail
+enable_ext2direct
+enable_netlink
+enable_altformat
+enable_rpc
+enable_rpcsetquota
+enable_xfs_roothack
+enable_bsd_behaviour
+enable_libefence
+enable_nls
+enable_rootsbin
+enable_proc_mounts
+'
+      ac_precious_vars='build_alias
+host_alias
+target_alias
+CC
+CFLAGS
+LDFLAGS
+LIBS
+CPPFLAGS
+CPP
+PKG_CONFIG
+DBUS_CFLAGS
+DBUS_LIBS'
+
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+ac_unrecognized_opts=
+ac_unrecognized_sep=
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+# (The list follows the same order as the GNU Coding Standards.)
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datarootdir='${prefix}/share'
+datadir='${datarootdir}'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+docdir='${datarootdir}/doc/${PACKAGE}'
+infodir='${datarootdir}/info'
+htmldir='${docdir}'
+dvidir='${docdir}'
+pdfdir='${docdir}'
+psdir='${docdir}'
+libdir='${exec_prefix}/lib'
+localedir='${datarootdir}/locale'
+mandir='${datarootdir}/man'
+
+ac_prev=
+ac_dashdash=
+for ac_option
+do
+  # If the previous option needs an argument, assign it.
+  if test -n "$ac_prev"; then
+    eval $ac_prev=\$ac_option
+    ac_prev=
+    continue
+  fi
+
+  case $ac_option in
+  *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
+  *)   ac_optarg=yes ;;
+  esac
+
+  # Accept the important Cygnus configure options, so we can diagnose typos.
+
+  case $ac_dashdash$ac_option in
+  --)
+    ac_dashdash=yes ;;
+
+  -bindir | --bindir | --bindi | --bind | --bin | --bi)
+    ac_prev=bindir ;;
+  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+    bindir=$ac_optarg ;;
+
+  -build | --build | --buil | --bui | --bu)
+    ac_prev=build_alias ;;
+  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+    build_alias=$ac_optarg ;;
+
+  -cache-file | --cache-file | --cache-fil | --cache-fi \
+  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+    ac_prev=cache_file ;;
+  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+    cache_file=$ac_optarg ;;
+
+  --config-cache | -C)
+    cache_file=config.cache ;;
+
+  -datadir | --datadir | --datadi | --datad)
+    ac_prev=datadir ;;
+  -datadir=* | --datadir=* | --datadi=* | --datad=*)
+    datadir=$ac_optarg ;;
+
+  -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
+  | --dataroo | --dataro | --datar)
+    ac_prev=datarootdir ;;
+  -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
+  | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
+    datarootdir=$ac_optarg ;;
+
+  -disable-* | --disable-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      { $as_echo "$as_me: error: invalid feature name: $ac_useropt" >&2
+   { (exit 1); exit 1; }; }
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"enable_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig"
+        ac_unrecognized_sep=', ';;
+    esac
+    eval enable_$ac_useropt=no ;;
+
+  -docdir | --docdir | --docdi | --doc | --do)
+    ac_prev=docdir ;;
+  -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
+    docdir=$ac_optarg ;;
+
+  -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
+    ac_prev=dvidir ;;
+  -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
+    dvidir=$ac_optarg ;;
+
+  -enable-* | --enable-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      { $as_echo "$as_me: error: invalid feature name: $ac_useropt" >&2
+   { (exit 1); exit 1; }; }
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"enable_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig"
+        ac_unrecognized_sep=', ';;
+    esac
+    eval enable_$ac_useropt=\$ac_optarg ;;
+
+  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+  | --exec | --exe | --ex)
+    ac_prev=exec_prefix ;;
+  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+  | --exec=* | --exe=* | --ex=*)
+    exec_prefix=$ac_optarg ;;
+
+  -gas | --gas | --ga | --g)
+    # Obsolete; use --with-gas.
+    with_gas=yes ;;
+
+  -help | --help | --hel | --he | -h)
+    ac_init_help=long ;;
+  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+    ac_init_help=recursive ;;
+  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+    ac_init_help=short ;;
+
+  -host | --host | --hos | --ho)
+    ac_prev=host_alias ;;
+  -host=* | --host=* | --hos=* | --ho=*)
+    host_alias=$ac_optarg ;;
+
+  -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
+    ac_prev=htmldir ;;
+  -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
+  | --ht=*)
+    htmldir=$ac_optarg ;;
+
+  -includedir | --includedir | --includedi | --included | --include \
+  | --includ | --inclu | --incl | --inc)
+    ac_prev=includedir ;;
+  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+  | --includ=* | --inclu=* | --incl=* | --inc=*)
+    includedir=$ac_optarg ;;
+
+  -infodir | --infodir | --infodi | --infod | --info | --inf)
+    ac_prev=infodir ;;
+  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+    infodir=$ac_optarg ;;
+
+  -libdir | --libdir | --libdi | --libd)
+    ac_prev=libdir ;;
+  -libdir=* | --libdir=* | --libdi=* | --libd=*)
+    libdir=$ac_optarg ;;
+
+  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+  | --libexe | --libex | --libe)
+    ac_prev=libexecdir ;;
+  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+  | --libexe=* | --libex=* | --libe=*)
+    libexecdir=$ac_optarg ;;
+
+  -localedir | --localedir | --localedi | --localed | --locale)
+    ac_prev=localedir ;;
+  -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
+    localedir=$ac_optarg ;;
+
+  -localstatedir | --localstatedir | --localstatedi | --localstated \
+  | --localstate | --localstat | --localsta | --localst | --locals)
+    ac_prev=localstatedir ;;
+  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+  | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
+    localstatedir=$ac_optarg ;;
+
+  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+    ac_prev=mandir ;;
+  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+    mandir=$ac_optarg ;;
+
+  -nfp | --nfp | --nf)
+    # Obsolete; use --without-fp.
+    with_fp=no ;;
+
+  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+  | --no-cr | --no-c | -n)
+    no_create=yes ;;
+
+  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+    no_recursion=yes ;;
+
+  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+  | --oldin | --oldi | --old | --ol | --o)
+    ac_prev=oldincludedir ;;
+  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+    oldincludedir=$ac_optarg ;;
+
+  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+    ac_prev=prefix ;;
+  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+    prefix=$ac_optarg ;;
+
+  -program-prefix | --program-prefix | --program-prefi | --program-pref \
+  | --program-pre | --program-pr | --program-p)
+    ac_prev=program_prefix ;;
+  -program-prefix=* | --program-prefix=* | --program-prefi=* \
+  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+    program_prefix=$ac_optarg ;;
+
+  -program-suffix | --program-suffix | --program-suffi | --program-suff \
+  | --program-suf | --program-su | --program-s)
+    ac_prev=program_suffix ;;
+  -program-suffix=* | --program-suffix=* | --program-suffi=* \
+  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+    program_suffix=$ac_optarg ;;
+
+  -program-transform-name | --program-transform-name \
+  | --program-transform-nam | --program-transform-na \
+  | --program-transform-n | --program-transform- \
+  | --program-transform | --program-transfor \
+  | --program-transfo | --program-transf \
+  | --program-trans | --program-tran \
+  | --progr-tra | --program-tr | --program-t)
+    ac_prev=program_transform_name ;;
+  -program-transform-name=* | --program-transform-name=* \
+  | --program-transform-nam=* | --program-transform-na=* \
+  | --program-transform-n=* | --program-transform-=* \
+  | --program-transform=* | --program-transfor=* \
+  | --program-transfo=* | --program-transf=* \
+  | --program-trans=* | --program-tran=* \
+  | --progr-tra=* | --program-tr=* | --program-t=*)
+    program_transform_name=$ac_optarg ;;
+
+  -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
+    ac_prev=pdfdir ;;
+  -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
+    pdfdir=$ac_optarg ;;
+
+  -psdir | --psdir | --psdi | --psd | --ps)
+    ac_prev=psdir ;;
+  -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
+    psdir=$ac_optarg ;;
+
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil)
+    silent=yes ;;
+
+  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+    ac_prev=sbindir ;;
+  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+  | --sbi=* | --sb=*)
+    sbindir=$ac_optarg ;;
+
+  -sharedstatedir | --sharedstatedir | --sharedstatedi \
+  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+  | --sharedst | --shareds | --shared | --share | --shar \
+  | --sha | --sh)
+    ac_prev=sharedstatedir ;;
+  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+  | --sha=* | --sh=*)
+    sharedstatedir=$ac_optarg ;;
+
+  -site | --site | --sit)
+    ac_prev=site ;;
+  -site=* | --site=* | --sit=*)
+    site=$ac_optarg ;;
+
+  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+    ac_prev=srcdir ;;
+  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+    srcdir=$ac_optarg ;;
+
+  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+  | --syscon | --sysco | --sysc | --sys | --sy)
+    ac_prev=sysconfdir ;;
+  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+    sysconfdir=$ac_optarg ;;
+
+  -target | --target | --targe | --targ | --tar | --ta | --t)
+    ac_prev=target_alias ;;
+  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+    target_alias=$ac_optarg ;;
+
+  -v | -verbose | --verbose | --verbos | --verbo | --verb)
+    verbose=yes ;;
+
+  -version | --version | --versio | --versi | --vers | -V)
+    ac_init_version=: ;;
+
+  -with-* | --with-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      { $as_echo "$as_me: error: invalid package name: $ac_useropt" >&2
+   { (exit 1); exit 1; }; }
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"with_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig"
+        ac_unrecognized_sep=', ';;
+    esac
+    eval with_$ac_useropt=\$ac_optarg ;;
+
+  -without-* | --without-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      { $as_echo "$as_me: error: invalid package name: $ac_useropt" >&2
+   { (exit 1); exit 1; }; }
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"with_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig"
+        ac_unrecognized_sep=', ';;
+    esac
+    eval with_$ac_useropt=no ;;
+
+  --x)
+    # Obsolete; use --with-x.
+    with_x=yes ;;
+
+  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+  | --x-incl | --x-inc | --x-in | --x-i)
+    ac_prev=x_includes ;;
+  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+    x_includes=$ac_optarg ;;
+
+  -x-libraries | --x-libraries | --x-librarie | --x-librari \
+  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+    ac_prev=x_libraries ;;
+  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+    x_libraries=$ac_optarg ;;
+
+  -*) { $as_echo "$as_me: error: unrecognized option: $ac_option
+Try \`$0 --help' for more information." >&2
+   { (exit 1); exit 1; }; }
+    ;;
+
+  *=*)
+    ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null &&
+      { $as_echo "$as_me: error: invalid variable name: $ac_envvar" >&2
+   { (exit 1); exit 1; }; }
+    eval $ac_envvar=\$ac_optarg
+    export $ac_envvar ;;
+
+  *)
+    # FIXME: should be removed in autoconf 3.0.
+    $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+    expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+    : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}
+    ;;
+
+  esac
+done
+
+if test -n "$ac_prev"; then
+  ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+  { $as_echo "$as_me: error: missing argument to $ac_option" >&2
+   { (exit 1); exit 1; }; }
+fi
+
+if test -n "$ac_unrecognized_opts"; then
+  case $enable_option_checking in
+    no) ;;
+    fatal) { $as_echo "$as_me: error: unrecognized options: $ac_unrecognized_opts" >&2
+   { (exit 1); exit 1; }; } ;;
+    *)     $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
+  esac
+fi
+
+# Check all directory arguments for consistency.
+for ac_var in  exec_prefix prefix bindir sbindir libexecdir datarootdir \
+               datadir sysconfdir sharedstatedir localstatedir includedir \
+               oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
+               libdir localedir mandir
+do
+  eval ac_val=\$$ac_var
+  # Remove trailing slashes.
+  case $ac_val in
+    */ )
+      ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'`
+      eval $ac_var=\$ac_val;;
+  esac
+  # Be sure to have absolute directory names.
+  case $ac_val in
+    [\\/$]* | ?:[\\/]* )  continue;;
+    NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
+  esac
+  { $as_echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+   { (exit 1); exit 1; }; }
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+  if test "x$build_alias" = x; then
+    cross_compiling=maybe
+    $as_echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host.
+    If a cross compiler is detected then cross compile mode will be used." >&2
+  elif test "x$build_alias" != "x$host_alias"; then
+    cross_compiling=yes
+  fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+ac_pwd=`pwd` && test -n "$ac_pwd" &&
+ac_ls_di=`ls -di .` &&
+ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
+  { $as_echo "$as_me: error: working directory cannot be determined" >&2
+   { (exit 1); exit 1; }; }
+test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
+  { $as_echo "$as_me: error: pwd does not report name of working directory" >&2
+   { (exit 1); exit 1; }; }
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+  ac_srcdir_defaulted=yes
+  # Try the directory containing this script, then the parent directory.
+  ac_confdir=`$as_dirname -- "$as_myself" ||
+$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$as_myself" : 'X\(//\)[^/]' \| \
+        X"$as_myself" : 'X\(//\)$' \| \
+        X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_myself" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)[^/].*/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+  srcdir=$ac_confdir
+  if test ! -r "$srcdir/$ac_unique_file"; then
+    srcdir=..
+  fi
+else
+  ac_srcdir_defaulted=no
+fi
+if test ! -r "$srcdir/$ac_unique_file"; then
+  test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
+  { $as_echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2
+   { (exit 1); exit 1; }; }
+fi
+ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
+ac_abs_confdir=`(
+       cd "$srcdir" && test -r "./$ac_unique_file" || { $as_echo "$as_me: error: $ac_msg" >&2
+   { (exit 1); exit 1; }; }
+       pwd)`
+# When building in place, set srcdir=.
+if test "$ac_abs_confdir" = "$ac_pwd"; then
+  srcdir=.
+fi
+# Remove unnecessary trailing slashes from srcdir.
+# Double slashes in file names in object file debugging info
+# mess up M-x gdb in Emacs.
+case $srcdir in
+*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
+esac
+for ac_var in $ac_precious_vars; do
+  eval ac_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_env_${ac_var}_value=\$${ac_var}
+  eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_cv_env_${ac_var}_value=\$${ac_var}
+done
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+  # Omit some internal or obsolete options to make the list less imposing.
+  # This message is too long to be a string in the A/UX 3.1 sh.
+  cat <<_ACEOF
+\`configure' configures this package to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE.  See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+  -h, --help              display this help and exit
+      --help=short        display options specific to this package
+      --help=recursive    display the short help of all the included packages
+  -V, --version           display version information and exit
+  -q, --quiet, --silent   do not print \`checking...' messages
+      --cache-file=FILE   cache test results in FILE [disabled]
+  -C, --config-cache      alias for \`--cache-file=config.cache'
+  -n, --no-create         do not create output files
+      --srcdir=DIR        find the sources in DIR [configure dir or \`..']
+
+Installation directories:
+  --prefix=PREFIX         install architecture-independent files in PREFIX
+                          [$ac_default_prefix]
+  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
+                          [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc.  You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+  --bindir=DIR            user executables [EPREFIX/bin]
+  --sbindir=DIR           system admin executables [EPREFIX/sbin]
+  --libexecdir=DIR        program executables [EPREFIX/libexec]
+  --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]
+  --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]
+  --localstatedir=DIR     modifiable single-machine data [PREFIX/var]
+  --libdir=DIR            object code libraries [EPREFIX/lib]
+  --includedir=DIR        C header files [PREFIX/include]
+  --oldincludedir=DIR     C header files for non-gcc [/usr/include]
+  --datarootdir=DIR       read-only arch.-independent data root [PREFIX/share]
+  --datadir=DIR           read-only architecture-independent data [DATAROOTDIR]
+  --infodir=DIR           info documentation [DATAROOTDIR/info]
+  --localedir=DIR         locale-dependent data [DATAROOTDIR/locale]
+  --mandir=DIR            man documentation [DATAROOTDIR/man]
+  --docdir=DIR            documentation root [DATAROOTDIR/doc/PACKAGE]
+  --htmldir=DIR           html documentation [DOCDIR]
+  --dvidir=DIR            dvi documentation [DOCDIR]
+  --pdfdir=DIR            pdf documentation [DOCDIR]
+  --psdir=DIR             ps documentation [DOCDIR]
+_ACEOF
+
+  cat <<\_ACEOF
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+
+  cat <<\_ACEOF
+
+Optional Features:
+  --disable-option-checking  ignore unrecognized --enable/--with options
+  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
+  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
+  --enable-ldapmail=yes/no/try       Enable ldap mail address lookups default=no.
+  --enable-ext2direct=yes/no/try     Enable scanning of EXT2/EXT3 filesystem using e2fslib default=try.
+  --enable-netlink=yes/no/try   Compile daemon receiving quota messages via netlink default=no.
+  --enable-altformat=yes/no     Enable alternative format used by edquota default=yes.
+  --enable-rpc=yes/no           Enable RPC support default=yes.
+  --enable-rpcsetquota=yes/no   Use RPC for setting quotas default=no.
+  --enable-xfs_roothack=yes/no  Support old XFS root filesystems default=no.
+  --enable-bsd_behaviour=yes/no Mimic BSD behaviour default=yes.
+  --enable-libefence=yes/no     Use Electric Fence memory checks default=no.
+  --enable-nls=yes/no           Enable gettext default=yes.
+  --enable-rootsbin=yes/no      Use /sbin for some important binaries regardless $prefix default=no.
+  --enable-proc-mounts=path   Use alternate file instead of /etc/mtab default=/proc/mounts.
+
+Some influential environment variables:
+  CC          C compiler command
+  CFLAGS      C compiler flags
+  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
+              nonstandard directory <lib dir>
+  LIBS        libraries to pass to the linker, e.g. -l<library>
+  CPPFLAGS    C/C++/Objective C preprocessor flags, e.g. -I<include dir> if
+              you have headers in a nonstandard directory <include dir>
+  CPP         C preprocessor
+  PKG_CONFIG  path to pkg-config utility
+  DBUS_CFLAGS C compiler flags for DBUS, overriding pkg-config
+  DBUS_LIBS   linker flags for DBUS, overriding pkg-config
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+_ACEOF
+ac_status=$?
+fi
+
+if test "$ac_init_help" = "recursive"; then
+  # If there are subdirs, report their specific --help.
+  for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+    test -d "$ac_dir" ||
+      { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } ||
+      continue
+    ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+  .)  # We are building in place.
+    ac_srcdir=.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+    cd "$ac_dir" || { ac_status=$?; continue; }
+    # Check for guested configure.
+    if test -f "$ac_srcdir/configure.gnu"; then
+      echo &&
+      $SHELL "$ac_srcdir/configure.gnu" --help=recursive
+    elif test -f "$ac_srcdir/configure"; then
+      echo &&
+      $SHELL "$ac_srcdir/configure" --help=recursive
+    else
+      $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+    fi || ac_status=$?
+    cd "$ac_pwd" || { ac_status=$?; break; }
+  done
+fi
+
+test -n "$ac_init_help" && exit $ac_status
+if $ac_init_version; then
+  cat <<\_ACEOF
+configure
+generated by GNU Autoconf 2.63
+
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
+2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+  exit
+fi
+cat >config.log <<_ACEOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by $as_me, which was
+generated by GNU Autoconf 2.63.  Invocation command line was
+
+  $ $0 $@
+
+_ACEOF
+exec 5>>config.log
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`
+
+/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+/usr/bin/hostinfo      = `(/usr/bin/hostinfo) 2>/dev/null      || echo unknown`
+/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`
+/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  $as_echo "PATH: $as_dir"
+done
+IFS=$as_save_IFS
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+  for ac_arg
+  do
+    case $ac_arg in
+    -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+    -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+    | -silent | --silent | --silen | --sile | --sil)
+      continue ;;
+    *\'*)
+      ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    esac
+    case $ac_pass in
+    1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;;
+    2)
+      ac_configure_args1="$ac_configure_args1 '$ac_arg'"
+      if test $ac_must_keep_next = true; then
+       ac_must_keep_next=false # Got value, back to normal.
+      else
+       case $ac_arg in
+         *=* | --config-cache | -C | -disable-* | --disable-* \
+         | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+         | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+         | -with-* | --with-* | -without-* | --without-* | --x)
+           case "$ac_configure_args0 " in
+             "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+           esac
+           ;;
+         -* ) ac_must_keep_next=true ;;
+       esac
+      fi
+      ac_configure_args="$ac_configure_args '$ac_arg'"
+      ;;
+    esac
+  done
+done
+$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; }
+$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; }
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log.  We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Use '\'' to represent an apostrophe within the trap.
+# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
+trap 'exit_status=$?
+  # Save into config.log some information that might help in debugging.
+  {
+    echo
+
+    cat <<\_ASBOX
+## ---------------- ##
+## Cache variables. ##
+## ---------------- ##
+_ASBOX
+    echo
+    # The following way of writing the cache mishandles newlines in values,
+(
+  for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
+    eval ac_val=\$$ac_var
+    case $ac_val in #(
+    *${as_nl}*)
+      case $ac_var in #(
+      *_cv_*) { $as_echo "$as_me:$LINENO: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+      *) $as_unset $ac_var ;;
+      esac ;;
+    esac
+  done
+  (set) 2>&1 |
+    case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
+    *${as_nl}ac_space=\ *)
+      sed -n \
+       "s/'\''/'\''\\\\'\'''\''/g;
+         s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
+      ;; #(
+    *)
+      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+      ;;
+    esac |
+    sort
+)
+    echo
+
+    cat <<\_ASBOX
+## ----------------- ##
+## Output variables. ##
+## ----------------- ##
+_ASBOX
+    echo
+    for ac_var in $ac_subst_vars
+    do
+      eval ac_val=\$$ac_var
+      case $ac_val in
+      *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+      esac
+      $as_echo "$ac_var='\''$ac_val'\''"
+    done | sort
+    echo
+
+    if test -n "$ac_subst_files"; then
+      cat <<\_ASBOX
+## ------------------- ##
+## File substitutions. ##
+## ------------------- ##
+_ASBOX
+      echo
+      for ac_var in $ac_subst_files
+      do
+       eval ac_val=\$$ac_var
+       case $ac_val in
+       *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+       esac
+       $as_echo "$ac_var='\''$ac_val'\''"
+      done | sort
+      echo
+    fi
+
+    if test -s confdefs.h; then
+      cat <<\_ASBOX
+## ----------- ##
+## confdefs.h. ##
+## ----------- ##
+_ASBOX
+      echo
+      cat confdefs.h
+      echo
+    fi
+    test "$ac_signal" != 0 &&
+      $as_echo "$as_me: caught signal $ac_signal"
+    $as_echo "$as_me: exit $exit_status"
+  } >&5
+  rm -f core *.core core.conftest.* &&
+    rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
+    exit $exit_status
+' 0
+for ac_signal in 1 2 13 15; do
+  trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -f -r conftest* confdefs.h
+
+# Predefined preprocessor variables.
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_NAME "$PACKAGE_NAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_VERSION "$PACKAGE_VERSION"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_STRING "$PACKAGE_STRING"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
+_ACEOF
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer an explicitly selected file to automatically selected ones.
+ac_site_file1=NONE
+ac_site_file2=NONE
+if test -n "$CONFIG_SITE"; then
+  ac_site_file1=$CONFIG_SITE
+elif test "x$prefix" != xNONE; then
+  ac_site_file1=$prefix/share/config.site
+  ac_site_file2=$prefix/etc/config.site
+else
+  ac_site_file1=$ac_default_prefix/share/config.site
+  ac_site_file2=$ac_default_prefix/etc/config.site
+fi
+for ac_site_file in "$ac_site_file1" "$ac_site_file2"
+do
+  test "x$ac_site_file" = xNONE && continue
+  if test -r "$ac_site_file"; then
+    { $as_echo "$as_me:$LINENO: loading site script $ac_site_file" >&5
+$as_echo "$as_me: loading site script $ac_site_file" >&6;}
+    sed 's/^/| /' "$ac_site_file" >&5
+    . "$ac_site_file"
+  fi
+done
+
+if test -r "$cache_file"; then
+  # Some versions of bash will fail to source /dev/null (special
+  # files actually), so we avoid doing that.
+  if test -f "$cache_file"; then
+    { $as_echo "$as_me:$LINENO: loading cache $cache_file" >&5
+$as_echo "$as_me: loading cache $cache_file" >&6;}
+    case $cache_file in
+      [\\/]* | ?:[\\/]* ) . "$cache_file";;
+      *)                      . "./$cache_file";;
+    esac
+  fi
+else
+  { $as_echo "$as_me:$LINENO: creating cache $cache_file" >&5
+$as_echo "$as_me: creating cache $cache_file" >&6;}
+  >$cache_file
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in $ac_precious_vars; do
+  eval ac_old_set=\$ac_cv_env_${ac_var}_set
+  eval ac_new_set=\$ac_env_${ac_var}_set
+  eval ac_old_val=\$ac_cv_env_${ac_var}_value
+  eval ac_new_val=\$ac_env_${ac_var}_value
+  case $ac_old_set,$ac_new_set in
+    set,)
+      { $as_echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,set)
+      { $as_echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,);;
+    *)
+      if test "x$ac_old_val" != "x$ac_new_val"; then
+       # differences in whitespace do not lead to failure.
+       ac_old_val_w=`echo x $ac_old_val`
+       ac_new_val_w=`echo x $ac_new_val`
+       if test "$ac_old_val_w" != "$ac_new_val_w"; then
+         { $as_echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5
+$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+         ac_cache_corrupted=:
+       else
+         { $as_echo "$as_me:$LINENO: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
+$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
+         eval $ac_var=\$ac_old_val
+       fi
+       { $as_echo "$as_me:$LINENO:   former value:  \`$ac_old_val'" >&5
+$as_echo "$as_me:   former value:  \`$ac_old_val'" >&2;}
+       { $as_echo "$as_me:$LINENO:   current value: \`$ac_new_val'" >&5
+$as_echo "$as_me:   current value: \`$ac_new_val'" >&2;}
+      fi;;
+  esac
+  # Pass precious variables to config.status.
+  if test "$ac_new_set" = set; then
+    case $ac_new_val in
+    *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+    *) ac_arg=$ac_var=$ac_new_val ;;
+    esac
+    case " $ac_configure_args " in
+      *" '$ac_arg' "*) ;; # Avoid dups.  Use of quotes ensures accuracy.
+      *) ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+    esac
+  fi
+done
+if $ac_cache_corrupted; then
+  { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+  { $as_echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5
+$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+  { { $as_echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5
+$as_echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+ac_config_headers="$ac_config_headers config.h"
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="${ac_tool_prefix}gcc"
+    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:$LINENO: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+  ac_ct_CC=$CC
+  # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_CC="gcc"
+    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { $as_echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+else
+  CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+          if test -n "$ac_tool_prefix"; then
+    # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="${ac_tool_prefix}cc"
+    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:$LINENO: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  fi
+fi
+if test -z "$CC"; then
+  # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+       ac_prog_rejected=yes
+       continue
+     fi
+    ac_cv_prog_CC="cc"
+    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+if test $ac_prog_rejected = yes; then
+  # We found a bogon in the path, so make sure we never use it.
+  set dummy $ac_cv_prog_CC
+  shift
+  if test $# != 0; then
+    # We chose a different compiler from the bogus one.
+    # However, it has the same basename, so the bogon will be chosen
+    # first if we set CC to just the basename; use the full file name.
+    shift
+    ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+  fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:$LINENO: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$CC"; then
+  if test -n "$ac_tool_prefix"; then
+  for ac_prog in cl.exe
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:$LINENO: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    test -n "$CC" && break
+  done
+fi
+if test -z "$CC"; then
+  ac_ct_CC=$CC
+  for ac_prog in cl.exe
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_CC="$ac_prog"
+    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { $as_echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$ac_ct_CC" && break
+done
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+fi
+
+fi
+
+
+test -z "$CC" && { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+{ { $as_echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&5
+$as_echo "$as_me: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }; }
+
+# Provide some information about the compiler.
+$as_echo "$as_me:$LINENO: checking for C compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+{ (ac_try="$ac_compiler --version >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_compiler --version >&5") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (ac_try="$ac_compiler -v >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_compiler -v >&5") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (ac_try="$ac_compiler -V >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_compiler -V >&5") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+{ $as_echo "$as_me:$LINENO: checking for C compiler default output file name" >&5
+$as_echo_n "checking for C compiler default output file name... " >&6; }
+ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+
+# The possible output files:
+ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"
+
+ac_rmfiles=
+for ac_file in $ac_files
+do
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+    * ) ac_rmfiles="$ac_rmfiles $ac_file";;
+  esac
+done
+rm -f $ac_rmfiles
+
+if { (ac_try="$ac_link_default"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_link_default") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
+# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
+# in a Makefile.  We should not override ac_cv_exeext if it was cached,
+# so that the user can short-circuit this test for compilers unknown to
+# Autoconf.
+for ac_file in $ac_files ''
+do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )
+       ;;
+    [ab].out )
+       # We found the default executable, but exeext='' is most
+       # certainly right.
+       break;;
+    *.* )
+        if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
+       then :; else
+          ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+       fi
+       # We set ac_cv_exeext here because the later test for it is not
+       # safe: cross compilers may not add the suffix if given an `-o'
+       # argument, so we may need to know it at that point already.
+       # Even if this section looks crufty: it has the advantage of
+       # actually working.
+       break;;
+    * )
+       break;;
+  esac
+done
+test "$ac_cv_exeext" = no && ac_cv_exeext=
+
+else
+  ac_file=''
+fi
+
+{ $as_echo "$as_me:$LINENO: result: $ac_file" >&5
+$as_echo "$ac_file" >&6; }
+if test -z "$ac_file"; then
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+{ { $as_echo "$as_me:$LINENO: error: C compiler cannot create executables
+See \`config.log' for more details." >&5
+$as_echo "$as_me: error: C compiler cannot create executables
+See \`config.log' for more details." >&2;}
+   { (exit 77); exit 77; }; }; }
+fi
+
+ac_exeext=$ac_cv_exeext
+
+# Check that the compiler produces executables we can run.  If not, either
+# the compiler is broken, or we cross compile.
+{ $as_echo "$as_me:$LINENO: checking whether the C compiler works" >&5
+$as_echo_n "checking whether the C compiler works... " >&6; }
+# FIXME: These cross compiler hacks should be removed for Autoconf 3.0
+# If not cross compiling, check that we can run a simple program.
+if test "$cross_compiling" != yes; then
+  if { ac_try='./$ac_file'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+    cross_compiling=no
+  else
+    if test "$cross_compiling" = maybe; then
+       cross_compiling=yes
+    else
+       { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+{ { $as_echo "$as_me:$LINENO: error: cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." >&5
+$as_echo "$as_me: error: cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }; }
+    fi
+  fi
+fi
+{ $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
+
+rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out
+ac_clean_files=$ac_clean_files_save
+# Check that the compiler produces executables we can run.  If not, either
+# the compiler is broken, or we cross compile.
+{ $as_echo "$as_me:$LINENO: checking whether we are cross compiling" >&5
+$as_echo_n "checking whether we are cross compiling... " >&6; }
+{ $as_echo "$as_me:$LINENO: result: $cross_compiling" >&5
+$as_echo "$cross_compiling" >&6; }
+
+{ $as_echo "$as_me:$LINENO: checking for suffix of executables" >&5
+$as_echo_n "checking for suffix of executables... " >&6; }
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in conftest.exe conftest conftest.*; do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+    *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+         break;;
+    * ) break;;
+  esac
+done
+else
+  { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+{ { $as_echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details." >&5
+$as_echo "$as_me: error: cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }; }
+fi
+
+rm -f conftest$ac_cv_exeext
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5
+$as_echo "$ac_cv_exeext" >&6; }
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+{ $as_echo "$as_me:$LINENO: checking for suffix of object files" >&5
+$as_echo_n "checking for suffix of object files... " >&6; }
+if test "${ac_cv_objext+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_compile") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  for ac_file in conftest.o conftest.obj conftest.*; do
+  test -f "$ac_file" || continue;
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;
+    *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+       break;;
+  esac
+done
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+{ { $as_echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile
+See \`config.log' for more details." >&5
+$as_echo "$as_me: error: cannot compute suffix of object files: cannot compile
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }; }
+fi
+
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_objext" >&5
+$as_echo "$ac_cv_objext" >&6; }
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+{ $as_echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5
+$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
+if test "${ac_cv_c_compiler_gnu+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_compiler_gnu=yes
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_compiler_gnu=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5
+$as_echo "$ac_cv_c_compiler_gnu" >&6; }
+if test $ac_compiler_gnu = yes; then
+  GCC=yes
+else
+  GCC=
+fi
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+{ $as_echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5
+$as_echo_n "checking whether $CC accepts -g... " >&6; }
+if test "${ac_cv_prog_cc_g+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  ac_save_c_werror_flag=$ac_c_werror_flag
+   ac_c_werror_flag=yes
+   ac_cv_prog_cc_g=no
+   CFLAGS="-g"
+   cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_prog_cc_g=yes
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       CFLAGS=""
+      cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  :
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_c_werror_flag=$ac_save_c_werror_flag
+        CFLAGS="-g"
+        cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_prog_cc_g=yes
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   ac_c_werror_flag=$ac_save_c_werror_flag
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5
+$as_echo "$ac_cv_prog_cc_g" >&6; }
+if test "$ac_test_CFLAGS" = set; then
+  CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+  if test "$GCC" = yes; then
+    CFLAGS="-g -O2"
+  else
+    CFLAGS="-g"
+  fi
+else
+  if test "$GCC" = yes; then
+    CFLAGS="-O2"
+  else
+    CFLAGS=
+  fi
+fi
+{ $as_echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5
+$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
+if test "${ac_cv_prog_cc_c89+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  ac_cv_prog_cc_c89=no
+ac_save_CC=$CC
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stdarg.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+     char **p;
+     int i;
+{
+  return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+  char *s;
+  va_list v;
+  va_start (v,p);
+  s = g (p, va_arg (v,int));
+  va_end (v);
+  return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
+   function prototypes and stuff, but not '\xHH' hex character constants.
+   These don't provoke an error unfortunately, instead are silently treated
+   as 'x'.  The following induces an error, until -std is added to get
+   proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
+   array size at least.  It's necessary to write '\x00'==0 to get something
+   that's true only with -std.  */
+int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+   inside strings and character constants.  */
+#define FOO(x) 'x'
+int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
+  ;
+  return 0;
+}
+_ACEOF
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
+       -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+  CC="$ac_save_CC $ac_arg"
+  rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_prog_cc_c89=$ac_arg
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext
+  test "x$ac_cv_prog_cc_c89" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+
+fi
+# AC_CACHE_VAL
+case "x$ac_cv_prog_cc_c89" in
+  x)
+    { $as_echo "$as_me:$LINENO: result: none needed" >&5
+$as_echo "none needed" >&6; } ;;
+  xno)
+    { $as_echo "$as_me:$LINENO: result: unsupported" >&5
+$as_echo "unsupported" >&6; } ;;
+  *)
+    CC="$CC $ac_cv_prog_cc_c89"
+    { $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5
+$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
+esac
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+{ $as_echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5
+$as_echo_n "checking how to run the C preprocessor... " >&6; }
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+  CPP=
+fi
+if test -z "$CPP"; then
+  if test "${ac_cv_prog_CPP+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+      # Double quotes because CPP needs to be expanded
+    for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
+    do
+      ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+                    Syntax error
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+        test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       }; then
+  :
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Broken: fails on valid input.
+continue
+fi
+
+rm -f conftest.err conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+        test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       }; then
+  # Broken: success on invalid input.
+continue
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+  break
+fi
+
+    done
+    ac_cv_prog_CPP=$CPP
+
+fi
+  CPP=$ac_cv_prog_CPP
+else
+  ac_cv_prog_CPP=$CPP
+fi
+{ $as_echo "$as_me:$LINENO: result: $CPP" >&5
+$as_echo "$CPP" >&6; }
+ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+                    Syntax error
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+        test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       }; then
+  :
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Broken: fails on valid input.
+continue
+fi
+
+rm -f conftest.err conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+        test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       }; then
+  # Broken: success on invalid input.
+continue
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+  :
+else
+  { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+{ { $as_echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details." >&5
+$as_echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+{ $as_echo "$as_me:$LINENO: checking for grep that handles long lines and -e" >&5
+$as_echo_n "checking for grep that handles long lines and -e... " >&6; }
+if test "${ac_cv_path_GREP+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$GREP"; then
+  ac_path_GREP_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_prog in grep ggrep; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
+      { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue
+# Check for GNU ac_path_GREP and select it if it is found.
+  # Check for GNU $ac_path_GREP
+case `"$ac_path_GREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo 'GREP' >> "conftest.nl"
+    "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    ac_count=`expr $ac_count + 1`
+    if test $ac_count -gt ${ac_path_GREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_GREP="$ac_path_GREP"
+      ac_path_GREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+      $ac_path_GREP_found && break 3
+    done
+  done
+done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_GREP"; then
+    { { $as_echo "$as_me:$LINENO: error: no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5
+$as_echo "$as_me: error: no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;}
+   { (exit 1); exit 1; }; }
+  fi
+else
+  ac_cv_path_GREP=$GREP
+fi
+
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_path_GREP" >&5
+$as_echo "$ac_cv_path_GREP" >&6; }
+ GREP="$ac_cv_path_GREP"
+
+
+{ $as_echo "$as_me:$LINENO: checking for egrep" >&5
+$as_echo_n "checking for egrep... " >&6; }
+if test "${ac_cv_path_EGREP+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
+   then ac_cv_path_EGREP="$GREP -E"
+   else
+     if test -z "$EGREP"; then
+  ac_path_EGREP_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_prog in egrep; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
+      { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue
+# Check for GNU ac_path_EGREP and select it if it is found.
+  # Check for GNU $ac_path_EGREP
+case `"$ac_path_EGREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo 'EGREP' >> "conftest.nl"
+    "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    ac_count=`expr $ac_count + 1`
+    if test $ac_count -gt ${ac_path_EGREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_EGREP="$ac_path_EGREP"
+      ac_path_EGREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+      $ac_path_EGREP_found && break 3
+    done
+  done
+done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_EGREP"; then
+    { { $as_echo "$as_me:$LINENO: error: no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5
+$as_echo "$as_me: error: no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;}
+   { (exit 1); exit 1; }; }
+  fi
+else
+  ac_cv_path_EGREP=$EGREP
+fi
+
+   fi
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_path_EGREP" >&5
+$as_echo "$ac_cv_path_EGREP" >&6; }
+ EGREP="$ac_cv_path_EGREP"
+
+
+{ $as_echo "$as_me:$LINENO: checking for ANSI C header files" >&5
+$as_echo_n "checking for ANSI C header files... " >&6; }
+if test "${ac_cv_header_stdc+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_header_stdc=yes
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_header_stdc=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+if test $ac_cv_header_stdc = yes; then
+  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <string.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "memchr" >/dev/null 2>&1; then
+  :
+else
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stdlib.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "free" >/dev/null 2>&1; then
+  :
+else
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+  if test "$cross_compiling" = yes; then
+  :
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <ctype.h>
+#include <stdlib.h>
+#if ((' ' & 0x0FF) == 0x020)
+# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#else
+# define ISLOWER(c) \
+                  (('a' <= (c) && (c) <= 'i') \
+                    || ('j' <= (c) && (c) <= 'r') \
+                    || ('s' <= (c) && (c) <= 'z'))
+# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
+#endif
+
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int
+main ()
+{
+  int i;
+  for (i = 0; i < 256; i++)
+    if (XOR (islower (i), ISLOWER (i))
+       || toupper (i) != TOUPPER (i))
+      return 2;
+  return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  :
+else
+  $as_echo "$as_me: program exited with status $ac_status" >&5
+$as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+ac_cv_header_stdc=no
+fi
+rm -rf conftest.dSYM
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+
+
+fi
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5
+$as_echo "$ac_cv_header_stdc" >&6; }
+if test $ac_cv_header_stdc = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define STDC_HEADERS 1
+_ACEOF
+
+fi
+
+ac_aux_dir=
+for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do
+  if test -f "$ac_dir/install-sh"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install-sh -c"
+    break
+  elif test -f "$ac_dir/install.sh"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install.sh -c"
+    break
+  elif test -f "$ac_dir/shtool"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/shtool install -c"
+    break
+  fi
+done
+if test -z "$ac_aux_dir"; then
+  { { $as_echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&5
+$as_echo "$as_me: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+# These three variables are undocumented and unsupported,
+# and are intended to be withdrawn in a future Autoconf release.
+# They can cause serious problems if a builder's source tree is in a directory
+# whose full name contains unusual characters.
+ac_config_guess="$SHELL $ac_aux_dir/config.guess"  # Please don't use this var.
+ac_config_sub="$SHELL $ac_aux_dir/config.sub"  # Please don't use this var.
+ac_configure="$SHELL $ac_aux_dir/configure"  # Please don't use this var.
+
+
+# Find a good install program.  We prefer a C program (faster),
+# so one script is as good as another.  But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# OS/2's system install, which has a completely different semantic
+# ./install, which can be erroneously created by make from ./install.sh.
+# Reject install programs that cannot install multiple files.
+{ $as_echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5
+$as_echo_n "checking for a BSD-compatible install... " >&6; }
+if test -z "$INSTALL"; then
+if test "${ac_cv_path_install+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  # Account for people who put trailing slashes in PATH elements.
+case $as_dir/ in
+  ./ | .// | /cC/* | \
+  /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+  ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \
+  /usr/ucb/* ) ;;
+  *)
+    # OSF1 and SCO ODT 3.0 have their own names for install.
+    # Don't use installbsd from OSF since it installs stuff as root
+    # by default.
+    for ac_prog in ginstall scoinst install; do
+      for ac_exec_ext in '' $ac_executable_extensions; do
+       if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then
+         if test $ac_prog = install &&
+           grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+           # AIX install.  It has an incompatible calling convention.
+           :
+         elif test $ac_prog = install &&
+           grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+           # program-specific install script used by HP pwplus--don't use.
+           :
+         else
+           rm -rf conftest.one conftest.two conftest.dir
+           echo one > conftest.one
+           echo two > conftest.two
+           mkdir conftest.dir
+           if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" &&
+             test -s conftest.one && test -s conftest.two &&
+             test -s conftest.dir/conftest.one &&
+             test -s conftest.dir/conftest.two
+           then
+             ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+             break 3
+           fi
+         fi
+       fi
+      done
+    done
+    ;;
+esac
+
+done
+IFS=$as_save_IFS
+
+rm -rf conftest.one conftest.two conftest.dir
+
+fi
+  if test "${ac_cv_path_install+set}" = set; then
+    INSTALL=$ac_cv_path_install
+  else
+    # As a last resort, use the slow shell script.  Don't cache a
+    # value for INSTALL within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the value is a relative name.
+    INSTALL=$ac_install_sh
+  fi
+fi
+{ $as_echo "$as_me:$LINENO: result: $INSTALL" >&5
+$as_echo "$INSTALL" >&6; }
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+
+{ $as_echo "$as_me:$LINENO: checking whether compiler supports PIE" >&5
+$as_echo_n "checking whether compiler supports PIE... " >&6; }
+oldCFLAGS="$CFLAGS"
+CFLAGS="$CFLAGS -fPIE"
+oldLDFLAGS="$LDFLAGS"
+LDFLAGS="$LDFLAGS -pie"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest$ac_exeext && {
+        test "$cross_compiling" = yes ||
+        $as_test_x conftest$ac_exeext
+       }; then
+  compilepie="yes"
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -rf conftest.dSYM
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+if test "x$compilepie" != "xyes"; then
+       CFLAGS="$oldCFLAGS"
+       LDFLAGS="$oldLDFLAGS"
+       { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+else
+       { $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
+fi
+
+# Check whether --enable-ldapmail was given.
+if test "${enable_ldapmail+set}" = set; then
+  enableval=$enable_ldapmail;
+else
+  enable_ldapmail="no"
+fi
+
+if test "x$enable_ldapmail" != "xno"; then
+       have_new_ldap="no"
+       have_old_ldap="no"
+       { $as_echo "$as_me:$LINENO: checking for ldap_initialize in -lldap" >&5
+$as_echo_n "checking for ldap_initialize in -lldap... " >&6; }
+if test "${ac_cv_lib_ldap_ldap_initialize+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lldap  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldap_initialize ();
+int
+main ()
+{
+return ldap_initialize ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest$ac_exeext && {
+        test "$cross_compiling" = yes ||
+        $as_test_x conftest$ac_exeext
+       }; then
+  ac_cv_lib_ldap_ldap_initialize=yes
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_lib_ldap_ldap_initialize=no
+fi
+
+rm -rf conftest.dSYM
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_ldap_ldap_initialize" >&5
+$as_echo "$ac_cv_lib_ldap_ldap_initialize" >&6; }
+if test "x$ac_cv_lib_ldap_ldap_initialize" = x""yes; then
+  have_new_ldap="yes"
+else
+  { $as_echo "$as_me:$LINENO: checking for ldap_init in -lldap" >&5
+$as_echo_n "checking for ldap_init in -lldap... " >&6; }
+if test "${ac_cv_lib_ldap_ldap_init+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lldap  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldap_init ();
+int
+main ()
+{
+return ldap_init ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest$ac_exeext && {
+        test "$cross_compiling" = yes ||
+        $as_test_x conftest$ac_exeext
+       }; then
+  ac_cv_lib_ldap_ldap_init=yes
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_lib_ldap_ldap_init=no
+fi
+
+rm -rf conftest.dSYM
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_ldap_ldap_init" >&5
+$as_echo "$ac_cv_lib_ldap_ldap_init" >&6; }
+if test "x$ac_cv_lib_ldap_ldap_init" = x""yes; then
+  have_old_ldap="yes"
+fi
+
+fi
+
+       if test "x$have_new_ldap" != "xno" -o "x$have_old_ldap" != "xno"; then
+               LDAPLIBS="-L/usr/lib -lldap -llber"
+
+cat >>confdefs.h <<\_ACEOF
+#define USE_LDAP_MAIL_LOOKUP 1
+_ACEOF
+
+               COMPILE_OPTS="$COMPILE_OPTS USE_LDAP_MAIL_LOOKUP"
+               if test "x$have_new_ldap" = "xyes"; then
+
+cat >>confdefs.h <<\_ACEOF
+#define USE_LDAP_23 1
+_ACEOF
+
+                       { $as_echo "$as_me:$LINENO: checking whether ldap_perror is declared" >&5
+$as_echo_n "checking whether ldap_perror is declared... " >&6; }
+if test "${ac_cv_have_decl_ldap_perror+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <ldap.h>
+
+int
+main ()
+{
+#ifndef ldap_perror
+  (void) ldap_perror;
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_have_decl_ldap_perror=yes
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_have_decl_ldap_perror=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_have_decl_ldap_perror" >&5
+$as_echo "$ac_cv_have_decl_ldap_perror" >&6; }
+if test "x$ac_cv_have_decl_ldap_perror" = x""yes; then
+  :
+else
+
+cat >>confdefs.h <<\_ACEOF
+#define NEED_LDAP_PERROR 1
+_ACEOF
+
+fi
+
+               fi
+       else
+               if test "x$enable_ldapmail" = "xyes"; then
+                       { { $as_echo "$as_me:$LINENO: error: LDAP support required but library not found." >&5
+$as_echo "$as_me: error: LDAP support required but library not found." >&2;}
+   { (exit 1); exit 1; }; };
+               fi
+       fi
+fi
+
+
+
+# On IRIX 5.3, sys/types and inttypes.h are conflicting.
+
+
+
+
+
+
+
+
+
+for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
+                 inttypes.h stdint.h unistd.h
+do
+as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5
+$as_echo_n "checking for $ac_header... " >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  $as_echo_n "(cached) " >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  eval "$as_ac_Header=yes"
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       eval "$as_ac_Header=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+ac_res=`eval 'as_val=${'$as_ac_Header'}
+                $as_echo "$as_val"'`
+              { $as_echo "$as_me:$LINENO: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+as_val=`eval 'as_val=${'$as_ac_Header'}
+                $as_echo "$as_val"'`
+   if test "x$as_val" = x""yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+if test "${ac_cv_header_ext2fs_ext2fs_h+set}" = set; then
+  { $as_echo "$as_me:$LINENO: checking for ext2fs/ext2fs.h" >&5
+$as_echo_n "checking for ext2fs/ext2fs.h... " >&6; }
+if test "${ac_cv_header_ext2fs_ext2fs_h+set}" = set; then
+  $as_echo_n "(cached) " >&6
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_ext2fs_ext2fs_h" >&5
+$as_echo "$ac_cv_header_ext2fs_ext2fs_h" >&6; }
+else
+  # Is the header compilable?
+{ $as_echo "$as_me:$LINENO: checking ext2fs/ext2fs.h usability" >&5
+$as_echo_n "checking ext2fs/ext2fs.h usability... " >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+#include <ext2fs/ext2fs.h>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_header_compiler=yes
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_header_compiler=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+$as_echo "$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ $as_echo "$as_me:$LINENO: checking ext2fs/ext2fs.h presence" >&5
+$as_echo_n "checking ext2fs/ext2fs.h presence... " >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <ext2fs/ext2fs.h>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+        test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       }; then
+  ac_header_preproc=yes
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  ac_header_preproc=no
+fi
+
+rm -f conftest.err conftest.$ac_ext
+{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+$as_echo "$ac_header_preproc" >&6; }
+
+# So?  What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+  yes:no: )
+    { $as_echo "$as_me:$LINENO: WARNING: ext2fs/ext2fs.h: accepted by the compiler, rejected by the preprocessor!" >&5
+$as_echo "$as_me: WARNING: ext2fs/ext2fs.h: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: ext2fs/ext2fs.h: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: ext2fs/ext2fs.h: proceeding with the compiler's result" >&2;}
+    ac_header_preproc=yes
+    ;;
+  no:yes:* )
+    { $as_echo "$as_me:$LINENO: WARNING: ext2fs/ext2fs.h: present but cannot be compiled" >&5
+$as_echo "$as_me: WARNING: ext2fs/ext2fs.h: present but cannot be compiled" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: ext2fs/ext2fs.h:     check for missing prerequisite headers?" >&5
+$as_echo "$as_me: WARNING: ext2fs/ext2fs.h:     check for missing prerequisite headers?" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: ext2fs/ext2fs.h: see the Autoconf documentation" >&5
+$as_echo "$as_me: WARNING: ext2fs/ext2fs.h: see the Autoconf documentation" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: ext2fs/ext2fs.h:     section \"Present But Cannot Be Compiled\"" >&5
+$as_echo "$as_me: WARNING: ext2fs/ext2fs.h:     section \"Present But Cannot Be Compiled\"" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: ext2fs/ext2fs.h: proceeding with the preprocessor's result" >&5
+$as_echo "$as_me: WARNING: ext2fs/ext2fs.h: proceeding with the preprocessor's result" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: ext2fs/ext2fs.h: in the future, the compiler will take precedence" >&5
+$as_echo "$as_me: WARNING: ext2fs/ext2fs.h: in the future, the compiler will take precedence" >&2;}
+
+    ;;
+esac
+{ $as_echo "$as_me:$LINENO: checking for ext2fs/ext2fs.h" >&5
+$as_echo_n "checking for ext2fs/ext2fs.h... " >&6; }
+if test "${ac_cv_header_ext2fs_ext2fs_h+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  ac_cv_header_ext2fs_ext2fs_h=$ac_header_preproc
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_ext2fs_ext2fs_h" >&5
+$as_echo "$ac_cv_header_ext2fs_ext2fs_h" >&6; }
+
+fi
+if test "x$ac_cv_header_ext2fs_ext2fs_h" = x""yes; then
+  ext2fshead="yes"
+fi
+
+
+if test "x$ext2fshead" = "xyes"; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_EXT2_INCLUDE 1
+_ACEOF
+
+       { $as_echo "$as_me:$LINENO: checking for ext2_ino_t" >&5
+$as_echo_n "checking for ext2_ino_t... " >&6; }
+       have_ext2_ino_t="no"
+       cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <ext2fs/ext2fs.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "ext2_ino_t" >/dev/null 2>&1; then
+  have_ext2_ino_t="yes"
+fi
+rm -f conftest*
+
+       if test "x$have_ext2_ino_t" != "xyes"; then
+               { $as_echo "$as_me:$LINENO: result: not found" >&5
+$as_echo "not found" >&6; }
+       else
+               { $as_echo "$as_me:$LINENO: result: found" >&5
+$as_echo "found" >&6; }
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_EXT2_INO_T 1
+_ACEOF
+
+       fi
+fi
+
+# Check whether --enable-ext2direct was given.
+if test "${enable_ext2direct+set}" = set; then
+  enableval=$enable_ext2direct;
+else
+  enable_ext2direct="try"
+fi
+
+if test "x$enable_ext2direct" != "xno"; then
+       { $as_echo "$as_me:$LINENO: checking for com_err in -lcom_err" >&5
+$as_echo_n "checking for com_err in -lcom_err... " >&6; }
+if test "${ac_cv_lib_com_err_com_err+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lcom_err  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char com_err ();
+int
+main ()
+{
+return com_err ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest$ac_exeext && {
+        test "$cross_compiling" = yes ||
+        $as_test_x conftest$ac_exeext
+       }; then
+  ac_cv_lib_com_err_com_err=yes
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_lib_com_err_com_err=no
+fi
+
+rm -rf conftest.dSYM
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_com_err_com_err" >&5
+$as_echo "$ac_cv_lib_com_err_com_err" >&6; }
+if test "x$ac_cv_lib_com_err_com_err" = x""yes; then
+  EXT2LIBS="-lcom_err $EXT2LIBS"
+fi
+
+       { $as_echo "$as_me:$LINENO: checking for ext2fs_initialize in -lext2fs" >&5
+$as_echo_n "checking for ext2fs_initialize in -lext2fs... " >&6; }
+if test "${ac_cv_lib_ext2fs_ext2fs_initialize+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lext2fs "-lcom_err" $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ext2fs_initialize ();
+int
+main ()
+{
+return ext2fs_initialize ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest$ac_exeext && {
+        test "$cross_compiling" = yes ||
+        $as_test_x conftest$ac_exeext
+       }; then
+  ac_cv_lib_ext2fs_ext2fs_initialize=yes
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_lib_ext2fs_ext2fs_initialize=no
+fi
+
+rm -rf conftest.dSYM
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_ext2fs_ext2fs_initialize" >&5
+$as_echo "$ac_cv_lib_ext2fs_ext2fs_initialize" >&6; }
+if test "x$ac_cv_lib_ext2fs_ext2fs_initialize" = x""yes; then
+  EXT2LIBS="-lext2fs $EXT2LIBS"
+fi
+
+       if test "${ac_cv_lib_com_err_com_err}" != "yes" -o "${ac_cv_lib_ext2fs_ext2fs_initialize}" != "yes"; then
+               if test "x$enable_ext2direct" = "xyes"; then
+                       { { $as_echo "$as_me:$LINENO: error: Ext2 direct support required but libraries not found." >&5
+$as_echo "$as_me: error: Ext2 direct support required but libraries not found." >&2;}
+   { (exit 1); exit 1; }; }
+               else
+                       { $as_echo "$as_me:$LINENO: WARNING: Ext2 direct support won't be compiled. Libraries not found." >&5
+$as_echo "$as_me: WARNING: Ext2 direct support won't be compiled. Libraries not found." >&2;}
+               fi
+               enable_ext2direct="no"
+               EXT2LIBS=""
+       else
+               if test "x$ext2fshead" != "xyes"; then
+                       if test "x$enable_ext2direct" = "xyes"; then
+                               { { $as_echo "$as_me:$LINENO: error: Ext2 direct support required but header files not found." >&5
+$as_echo "$as_me: error: Ext2 direct support required but header files not found." >&2;}
+   { (exit 1); exit 1; }; }
+                       else
+                               { $as_echo "$as_me:$LINENO: WARNING: Ext2 direct support won't be compiled. Header files not found." >&5
+$as_echo "$as_me: WARNING: Ext2 direct support won't be compiled. Header files not found." >&2;}
+                       fi
+                       enable_ext2direct="no"
+                       EXT2LIBS=""
+               else
+                       enable_ext2direct="yes"
+               fi
+       fi
+       if test "x$enable_ext2direct" = "xyes"; then
+
+cat >>confdefs.h <<\_ACEOF
+#define EXT2_DIRECT 1
+_ACEOF
+
+               COMPILE_OPTS="$COMPILE_OPTS EXT2_DIRECT"
+       fi
+fi
+
+
+# Check whether --enable-netlink was given.
+if test "${enable_netlink+set}" = set; then
+  enableval=$enable_netlink;
+else
+  enable_netlink="no"
+fi
+
+if test "x$enable_netlink" != "xno"; then
+
+
+if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
+       if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args.
+set dummy ${ac_tool_prefix}pkg-config; ac_word=$2
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_path_PKG_CONFIG+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  case $PKG_CONFIG in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+PKG_CONFIG=$ac_cv_path_PKG_CONFIG
+if test -n "$PKG_CONFIG"; then
+  { $as_echo "$as_me:$LINENO: result: $PKG_CONFIG" >&5
+$as_echo "$PKG_CONFIG" >&6; }
+else
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_path_PKG_CONFIG"; then
+  ac_pt_PKG_CONFIG=$PKG_CONFIG
+  # Extract the first word of "pkg-config", so it can be a program name with args.
+set dummy pkg-config; ac_word=$2
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_path_ac_pt_PKG_CONFIG+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  case $ac_pt_PKG_CONFIG in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG
+if test -n "$ac_pt_PKG_CONFIG"; then
+  { $as_echo "$as_me:$LINENO: result: $ac_pt_PKG_CONFIG" >&5
+$as_echo "$ac_pt_PKG_CONFIG" >&6; }
+else
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_pt_PKG_CONFIG" = x; then
+    PKG_CONFIG=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    PKG_CONFIG=$ac_pt_PKG_CONFIG
+  fi
+else
+  PKG_CONFIG="$ac_cv_path_PKG_CONFIG"
+fi
+
+fi
+if test -n "$PKG_CONFIG"; then
+       _pkg_min_version=0.9.0
+       { $as_echo "$as_me:$LINENO: checking pkg-config is at least version $_pkg_min_version" >&5
+$as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; }
+       if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then
+               { $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
+       else
+               { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+               PKG_CONFIG=""
+       fi
+
+fi
+
+pkg_failed=no
+{ $as_echo "$as_me:$LINENO: checking for DBUS" >&5
+$as_echo_n "checking for DBUS... " >&6; }
+
+if test -n "$PKG_CONFIG"; then
+    if test -n "$DBUS_CFLAGS"; then
+        pkg_cv_DBUS_CFLAGS="$DBUS_CFLAGS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { ($as_echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"dbus-1\"") >&5
+  ($PKG_CONFIG --exists --print-errors "dbus-1") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  pkg_cv_DBUS_CFLAGS=`$PKG_CONFIG --cflags "dbus-1" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+       pkg_failed=untried
+fi
+if test -n "$PKG_CONFIG"; then
+    if test -n "$DBUS_LIBS"; then
+        pkg_cv_DBUS_LIBS="$DBUS_LIBS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { ($as_echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"dbus-1\"") >&5
+  ($PKG_CONFIG --exists --print-errors "dbus-1") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  pkg_cv_DBUS_LIBS=`$PKG_CONFIG --libs "dbus-1" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+       pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+               DBUS_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "dbus-1"`
+        else
+               DBUS_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "dbus-1"`
+        fi
+       # Put the nasty error message in config.log where it belongs
+       echo "$DBUS_PKG_ERRORS" >&5
+
+       { { $as_echo "$as_me:$LINENO: error: Package requirements (dbus-1) were not met:
+
+$DBUS_PKG_ERRORS
+
+Consider adjusting the PKG_CONFIG_PATH environment variable if you
+installed software in a non-standard prefix.
+
+Alternatively, you may set the environment variables DBUS_CFLAGS
+and DBUS_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details.
+" >&5
+$as_echo "$as_me: error: Package requirements (dbus-1) were not met:
+
+$DBUS_PKG_ERRORS
+
+Consider adjusting the PKG_CONFIG_PATH environment variable if you
+installed software in a non-standard prefix.
+
+Alternatively, you may set the environment variables DBUS_CFLAGS
+and DBUS_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details.
+" >&2;}
+   { (exit 1); exit 1; }; }
+elif test $pkg_failed = untried; then
+       { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+{ { $as_echo "$as_me:$LINENO: error: The pkg-config script could not be found or is too old.  Make sure it
+is in your PATH or set the PKG_CONFIG environment variable to the full
+path to pkg-config.
+
+Alternatively, you may set the environment variables DBUS_CFLAGS
+and DBUS_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details.
+
+To get pkg-config, see <http://www.freedesktop.org/software/pkgconfig>.
+See \`config.log' for more details." >&5
+$as_echo "$as_me: error: The pkg-config script could not be found or is too old.  Make sure it
+is in your PATH or set the PKG_CONFIG environment variable to the full
+path to pkg-config.
+
+Alternatively, you may set the environment variables DBUS_CFLAGS
+and DBUS_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details.
+
+To get pkg-config, see <http://www.freedesktop.org/software/pkgconfig>.
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }; }
+else
+       DBUS_CFLAGS=$pkg_cv_DBUS_CFLAGS
+       DBUS_LIBS=$pkg_cv_DBUS_LIBS
+        { $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
+       :
+fi
+
+       { $as_echo "$as_me:$LINENO: checking for genl_register in -lnl" >&5
+$as_echo_n "checking for genl_register in -lnl... " >&6; }
+if test "${ac_cv_lib_nl_genl_register+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lnl  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char genl_register ();
+int
+main ()
+{
+return genl_register ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest$ac_exeext && {
+        test "$cross_compiling" = yes ||
+        $as_test_x conftest$ac_exeext
+       }; then
+  ac_cv_lib_nl_genl_register=yes
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_lib_nl_genl_register=no
+fi
+
+rm -rf conftest.dSYM
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_nl_genl_register" >&5
+$as_echo "$ac_cv_lib_nl_genl_register" >&6; }
+if test "x$ac_cv_lib_nl_genl_register" = x""yes; then
+  NETLINKLIBS="-lnl $DBUS_LIBS"
+fi
+
+       if test -z "$NETLINKLIBS" -o -z "$DBUS_LIBS"; then
+               if test "x$enable_netlink" = "xyes"; then
+                       { { $as_echo "$as_me:$LINENO: error: Required libraries for quota netlink daemon not found." >&5
+$as_echo "$as_me: error: Required libraries for quota netlink daemon not found." >&2;}
+   { (exit 1); exit 1; }; }
+               else
+                       { $as_echo "$as_me:$LINENO: WARNING: Quota netlink daemon won't be compiled. Required libraries not found." >&5
+$as_echo "$as_me: WARNING: Quota netlink daemon won't be compiled. Required libraries not found." >&2;}
+               fi
+               enable_netlink="no"
+               NETLINKLIBS=""
+       else
+               CPPFLAGS="$DBUS_CFLAGS $CPPFLAGS"
+               if test -z "$DBUS_LIBS"; then
+                       if test "x$enable_netlink" = "xyes"; then
+                               { { $as_echo "$as_me:$LINENO: error: Required headers for quota netlink daemon not found." >&5
+$as_echo "$as_me: error: Required headers for quota netlink daemon not found." >&2;}
+   { (exit 1); exit 1; }; }
+                       else
+                               { $as_echo "$as_me:$LINENO: WARNING: Quota netlink daemon won't be compiled. Required headers not found." >&5
+$as_echo "$as_me: WARNING: Quota netlink daemon won't be compiled. Required headers not found." >&2;}
+                       fi
+                       NETLINKLIBS=""
+                       enable_netlink="no"
+               else
+                       QUOTA_NETLINK_PROG=quota_nld
+               fi
+       fi
+fi
+
+
+
+{ $as_echo "$as_me:$LINENO: checking for library containing gethostbyname" >&5
+$as_echo_n "checking for library containing gethostbyname... " >&6; }
+if test "${ac_cv_search_gethostbyname+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  ac_func_search_save_LIBS=$LIBS
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char gethostbyname ();
+int
+main ()
+{
+return gethostbyname ();
+  ;
+  return 0;
+}
+_ACEOF
+for ac_lib in '' nsl; do
+  if test -z "$ac_lib"; then
+    ac_res="none required"
+  else
+    ac_res=-l$ac_lib
+    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
+  fi
+  rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest$ac_exeext && {
+        test "$cross_compiling" = yes ||
+        $as_test_x conftest$ac_exeext
+       }; then
+  ac_cv_search_gethostbyname=$ac_res
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -rf conftest.dSYM
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext
+  if test "${ac_cv_search_gethostbyname+set}" = set; then
+  break
+fi
+done
+if test "${ac_cv_search_gethostbyname+set}" = set; then
+  :
+else
+  ac_cv_search_gethostbyname=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_search_gethostbyname" >&5
+$as_echo "$ac_cv_search_gethostbyname" >&6; }
+ac_res=$ac_cv_search_gethostbyname
+if test "$ac_res" != no; then
+  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+
+fi
+
+{ $as_echo "$as_me:$LINENO: checking for host_access in -lwrap" >&5
+$as_echo_n "checking for host_access in -lwrap... " >&6; }
+if test "${ac_cv_lib_wrap_main+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  saved_LIBS="$LIBS"
+       LIBS="$LIBS -lwrap"
+       cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+       #include <stdio.h>
+       #include <sys/types.h>
+       #include <sys/socket.h>
+       #include <netinet/in.h>
+       #include <tcpd.h>
+       struct request_info request;
+       int deny_severity, allow_severity;
+int
+main ()
+{
+hosts_access(&request);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest$ac_exeext && {
+        test "$cross_compiling" = yes ||
+        $as_test_x conftest$ac_exeext
+       }; then
+       ac_cv_lib_wrap_main=yes; LIBS="$saved_LIBS"; { $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_lib_wrap_main=no; LIBS="$saved_LIBS"; { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+rm -rf conftest.dSYM
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+
+fi
+
+
+if test ${ac_cv_lib_wrap_main} = yes; then
+       if test "${ac_cv_header_tcpd_h+set}" = set; then
+  { $as_echo "$as_me:$LINENO: checking for tcpd.h" >&5
+$as_echo_n "checking for tcpd.h... " >&6; }
+if test "${ac_cv_header_tcpd_h+set}" = set; then
+  $as_echo_n "(cached) " >&6
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_tcpd_h" >&5
+$as_echo "$ac_cv_header_tcpd_h" >&6; }
+else
+  # Is the header compilable?
+{ $as_echo "$as_me:$LINENO: checking tcpd.h usability" >&5
+$as_echo_n "checking tcpd.h usability... " >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+#include <tcpd.h>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_header_compiler=yes
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_header_compiler=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+$as_echo "$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ $as_echo "$as_me:$LINENO: checking tcpd.h presence" >&5
+$as_echo_n "checking tcpd.h presence... " >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <tcpd.h>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+        test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       }; then
+  ac_header_preproc=yes
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  ac_header_preproc=no
+fi
+
+rm -f conftest.err conftest.$ac_ext
+{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+$as_echo "$ac_header_preproc" >&6; }
+
+# So?  What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+  yes:no: )
+    { $as_echo "$as_me:$LINENO: WARNING: tcpd.h: accepted by the compiler, rejected by the preprocessor!" >&5
+$as_echo "$as_me: WARNING: tcpd.h: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: tcpd.h: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: tcpd.h: proceeding with the compiler's result" >&2;}
+    ac_header_preproc=yes
+    ;;
+  no:yes:* )
+    { $as_echo "$as_me:$LINENO: WARNING: tcpd.h: present but cannot be compiled" >&5
+$as_echo "$as_me: WARNING: tcpd.h: present but cannot be compiled" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: tcpd.h:     check for missing prerequisite headers?" >&5
+$as_echo "$as_me: WARNING: tcpd.h:     check for missing prerequisite headers?" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: tcpd.h: see the Autoconf documentation" >&5
+$as_echo "$as_me: WARNING: tcpd.h: see the Autoconf documentation" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: tcpd.h:     section \"Present But Cannot Be Compiled\"" >&5
+$as_echo "$as_me: WARNING: tcpd.h:     section \"Present But Cannot Be Compiled\"" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: tcpd.h: proceeding with the preprocessor's result" >&5
+$as_echo "$as_me: WARNING: tcpd.h: proceeding with the preprocessor's result" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: tcpd.h: in the future, the compiler will take precedence" >&5
+$as_echo "$as_me: WARNING: tcpd.h: in the future, the compiler will take precedence" >&2;}
+
+    ;;
+esac
+{ $as_echo "$as_me:$LINENO: checking for tcpd.h" >&5
+$as_echo_n "checking for tcpd.h... " >&6; }
+if test "${ac_cv_header_tcpd_h+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  ac_cv_header_tcpd_h=$ac_header_preproc
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_tcpd_h" >&5
+$as_echo "$ac_cv_header_tcpd_h" >&6; }
+
+fi
+if test "x$ac_cv_header_tcpd_h" = x""yes; then
+  :
+else
+
+               echo 'ERROR: could not find tcpd.h - missing TCP wrappers package'
+               exit 1
+
+fi
+
+
+       LIBS="$LIBS -lwrap"
+
+cat >>confdefs.h <<\_ACEOF
+#define HOSTS_ACCESS 1
+_ACEOF
+
+       COMPILE_OPTS="$COMPILE_OPTS HOSTS_ACCESS"
+fi
+
+{ $as_echo "$as_me:$LINENO: checking for an ANSI C-conforming const" >&5
+$as_echo_n "checking for an ANSI C-conforming const... " >&6; }
+if test "${ac_cv_c_const+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+/* FIXME: Include the comments suggested by Paul. */
+#ifndef __cplusplus
+  /* Ultrix mips cc rejects this.  */
+  typedef int charset[2];
+  const charset cs;
+  /* SunOS 4.1.1 cc rejects this.  */
+  char const *const *pcpcc;
+  char **ppc;
+  /* NEC SVR4.0.2 mips cc rejects this.  */
+  struct point {int x, y;};
+  static struct point const zero = {0,0};
+  /* AIX XL C 1.02.0.0 rejects this.
+     It does not let you subtract one const X* pointer from another in
+     an arm of an if-expression whose if-part is not a constant
+     expression */
+  const char *g = "string";
+  pcpcc = &g + (g ? g-g : 0);
+  /* HPUX 7.0 cc rejects these. */
+  ++pcpcc;
+  ppc = (char**) pcpcc;
+  pcpcc = (char const *const *) ppc;
+  { /* SCO 3.2v4 cc rejects this.  */
+    char *t;
+    char const *s = 0 ? (char *) 0 : (char const *) 0;
+
+    *t++ = 0;
+    if (s) return 0;
+  }
+  { /* Someone thinks the Sun supposedly-ANSI compiler will reject this.  */
+    int x[] = {25, 17};
+    const int *foo = &x[0];
+    ++foo;
+  }
+  { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */
+    typedef const int *iptr;
+    iptr p = 0;
+    ++p;
+  }
+  { /* AIX XL C 1.02.0.0 rejects this saying
+       "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */
+    struct s { int j; const int *ap[3]; };
+    struct s *b; b->j = 5;
+  }
+  { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */
+    const int foo = 10;
+    if (!foo) return 0;
+  }
+  return !cs[0] && !zero.x;
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_c_const=yes
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_c_const=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_c_const" >&5
+$as_echo "$ac_cv_c_const" >&6; }
+if test $ac_cv_c_const = no; then
+
+cat >>confdefs.h <<\_ACEOF
+#define const /**/
+_ACEOF
+
+fi
+
+{ $as_echo "$as_me:$LINENO: checking for inline" >&5
+$as_echo_n "checking for inline... " >&6; }
+if test "${ac_cv_c_inline+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  ac_cv_c_inline=no
+for ac_kw in inline __inline__ __inline; do
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#ifndef __cplusplus
+typedef int foo_t;
+static $ac_kw foo_t static_foo () {return 0; }
+$ac_kw foo_t foo () {return 0; }
+#endif
+
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_c_inline=$ac_kw
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  test "$ac_cv_c_inline" != no && break
+done
+
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_c_inline" >&5
+$as_echo "$ac_cv_c_inline" >&6; }
+
+
+case $ac_cv_c_inline in
+  inline | yes) ;;
+  *)
+    case $ac_cv_c_inline in
+      no) ac_val=;;
+      *) ac_val=$ac_cv_c_inline;;
+    esac
+    cat >>confdefs.h <<_ACEOF
+#ifndef __cplusplus
+#define inline $ac_val
+#endif
+_ACEOF
+    ;;
+esac
+
+
+# Check whether --enable-altformat was given.
+if test "${enable_altformat+set}" = set; then
+  enableval=$enable_altformat;
+else
+  enable_altformat="yes"
+fi
+
+# Check whether --enable-rpc was given.
+if test "${enable_rpc+set}" = set; then
+  enableval=$enable_rpc;
+else
+  enable_rpc="yes"
+fi
+
+# Check whether --enable-rpcsetquota was given.
+if test "${enable_rpcsetquota+set}" = set; then
+  enableval=$enable_rpcsetquota;
+else
+  enable_rpcsetquota="no"
+fi
+
+# Check whether --enable-xfs_roothack was given.
+if test "${enable_xfs_roothack+set}" = set; then
+  enableval=$enable_xfs_roothack;
+else
+  enable_xfs_roothack="no"
+fi
+
+# Check whether --enable-bsd_behaviour was given.
+if test "${enable_bsd_behaviour+set}" = set; then
+  enableval=$enable_bsd_behaviour;
+else
+  enable_bsd_behaviour="yes"
+fi
+
+# Check whether --enable-libefence was given.
+if test "${enable_libefence+set}" = set; then
+  enableval=$enable_libefence;
+else
+  enable_libefence="no"
+fi
+
+
+# Check whether --enable-nls was given.
+if test "${enable_nls+set}" = set; then
+  enableval=$enable_nls;
+else
+  enable_nls="yes"
+fi
+
+# Check whether --enable-rootsbin was given.
+if test "${enable_rootsbin+set}" = set; then
+  enableval=$enable_rootsbin;
+else
+  enable_rootsbin="no"
+fi
+
+# Check whether --enable-proc-mounts was given.
+if test "${enable_proc_mounts+set}" = set; then
+  enableval=$enable_proc_mounts;
+else
+  enable_proc_mounts="/proc/mounts"
+fi
+
+
+if test "$enable_altformat" = "yes" ; then
+
+cat >>confdefs.h <<\_ACEOF
+#define ALT_FORMAT 1
+_ACEOF
+
+       COMPILE_OPTS="$COMPILE_OPTS ALT_FORMAT"
+fi
+if test "$enable_rpc" = "yes" ; then
+
+cat >>confdefs.h <<\_ACEOF
+#define RPC 1
+_ACEOF
+
+       COMPILE_OPTS="$COMPILE_OPTS RPC"
+fi
+if test "$enable_rpcsetquota" = "yes" ; then
+
+cat >>confdefs.h <<\_ACEOF
+#define RPC_SETQUOTA 1
+_ACEOF
+
+       COMPILE_OPTS="$COMPILE_OPTS RPC_SETQUOTA"
+fi
+if test "$enable_xfs_roothack" = "yes" ; then
+
+cat >>confdefs.h <<\_ACEOF
+#define XFS_ROOTHACK 1
+_ACEOF
+
+       COMPILE_OPTS="$COMPILE_OPTS XFS_ROOTHACK"
+fi
+if test "$enable_bsd_behaviour" = "yes" ; then
+
+cat >>confdefs.h <<\_ACEOF
+#define BSD_BEHAVIOUR 1
+_ACEOF
+
+       COMPILE_OPTS="$COMPILE_OPTS BSD_BEHAVIOUR"
+fi
+if test "$enable_libefence" = "yes" ; then
+       LIBMALLOC="/usr/lib/libefence.a"
+fi
+if test "$enable_nls" = "yes" ; then
+
+cat >>confdefs.h <<\_ACEOF
+#define USE_GETTEXT 1
+_ACEOF
+
+       INSTMO="inst_mo"
+fi
+if test "$enable_proc_mounts" != "no"; then
+
+cat >>confdefs.h <<_ACEOF
+#define ALT_MTAB "$enable_proc_mounts"
+_ACEOF
+
+fi
+if test "$enable_rootsbin" = "yes" ; then
+       ROOTSBIN="/sbin"
+else
+       ROOTSBIN='$(prefix)/sbin'
+fi
+
+
+cat >>confdefs.h <<_ACEOF
+#define COMPILE_OPTS "$COMPILE_OPTS"
+_ACEOF
+
+
+cat >>confdefs.h <<\_ACEOF
+#define PACKAGE_VERSION "4.00-pre1"
+_ACEOF
+
+
+
+
+
+
+
+ac_config_files="$ac_config_files Makefile"
+
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems.  If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, we kill variables containing newlines.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(
+  for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
+    eval ac_val=\$$ac_var
+    case $ac_val in #(
+    *${as_nl}*)
+      case $ac_var in #(
+      *_cv_*) { $as_echo "$as_me:$LINENO: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+      *) $as_unset $ac_var ;;
+      esac ;;
+    esac
+  done
+
+  (set) 2>&1 |
+    case $as_nl`(ac_space=' '; set) 2>&1` in #(
+    *${as_nl}ac_space=\ *)
+      # `set' does not quote correctly, so add quotes (double-quote
+      # substitution turns \\\\ into \\, and sed turns \\ into \).
+      sed -n \
+       "s/'/'\\\\''/g;
+         s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+      ;; #(
+    *)
+      # `set' quotes correctly as required by POSIX, so do not add quotes.
+      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+      ;;
+    esac |
+    sort
+) |
+  sed '
+     /^ac_cv_env_/b end
+     t clear
+     :clear
+     s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+     t end
+     s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+     :end' >>confcache
+if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
+  if test -w "$cache_file"; then
+    test "x$cache_file" != "x/dev/null" &&
+      { $as_echo "$as_me:$LINENO: updating cache $cache_file" >&5
+$as_echo "$as_me: updating cache $cache_file" >&6;}
+    cat confcache >$cache_file
+  else
+    { $as_echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5
+$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
+  fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+DEFS=-DHAVE_CONFIG_H
+
+ac_libobjs=
+ac_ltlibobjs=
+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+  # 1. Remove the extension, and $U if already installed.
+  ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
+  ac_i=`$as_echo "$ac_i" | sed "$ac_script"`
+  # 2. Prepend LIBOBJDIR.  When used with automake>=1.10 LIBOBJDIR
+  #    will be set to the directory where LIBOBJS objects are built.
+  ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext"
+  ac_ltlibobjs="$ac_ltlibobjs \${LIBOBJDIR}$ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+
+: ${CONFIG_STATUS=./config.status}
+ac_write_fail=0
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ $as_echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5
+$as_echo "$as_me: creating $CONFIG_STATUS" >&6;}
+cat >$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+SHELL=\${CONFIG_SHELL-$SHELL}
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+## --------------------- ##
+## M4sh Initialization.  ##
+## --------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in
+  *posix*) set -o posix ;;
+esac
+
+fi
+
+
+
+
+# PATH needs CR
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+if (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='printf %s\n'
+  as_echo_n='printf %s'
+else
+  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+    as_echo_n='/usr/ucb/echo -n'
+  else
+    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+    as_echo_n_body='eval
+      arg=$1;
+      case $arg in
+      *"$as_nl"*)
+       expr "X$arg" : "X\\(.*\\)$as_nl";
+       arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+      esac;
+      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+    '
+    export as_echo_n_body
+    as_echo_n='sh -c $as_echo_n_body as_echo'
+  fi
+  export as_echo_body
+  as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+      PATH_SEPARATOR=';'
+  }
+fi
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  as_unset=unset
+else
+  as_unset=false
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" ""       $as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+case $0 in
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+IFS=$as_save_IFS
+
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  { (exit 1); exit 1; }
+fi
+
+# Work around bugs in pre-3.0 UWIN ksh.
+for as_var in ENV MAIL MAILPATH
+do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+        X"$0" : 'X\(//\)$' \| \
+        X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+           s//\1/
+           q
+         }
+         /^X\/\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\/\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+
+# CDPATH.
+$as_unset CDPATH
+
+
+
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || {
+
+  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+  # uniformly replaced by the line number.  The first 'sed' inserts a
+  # line-number line after each line using $LINENO; the second 'sed'
+  # does the real work.  The second script uses 'N' to pair each
+  # line-number line with the line containing $LINENO, and appends
+  # trailing '-' during substitution so that $LINENO is not a special
+  # case at line end.
+  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+  # scripts with optimization help from Paolo Bonzini.  Blame Lee
+  # E. McMahon (1931-1989) for sed's syntax.  :-)
+  sed -n '
+    p
+    /[$]LINENO/=
+  ' <$as_myself |
+    sed '
+      s/[$]LINENO.*/&-/
+      t lineno
+      b
+      :lineno
+      N
+      :loop
+      s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
+      t loop
+      s/-\n.*//
+    ' >$as_me.lineno &&
+  chmod +x "$as_me.lineno" ||
+    { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
+   { (exit 1); exit 1; }; }
+
+  # Don't try to exec as it changes $[0], causing all sort of problems
+  # (the dirname of $[0] is not the place where we might find the
+  # original and so on.  Autoconf is especially sensitive to this).
+  . "./$as_me.lineno"
+  # Exit status is that of the last command.
+  exit
+}
+
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in
+-n*)
+  case `echo 'x\c'` in
+  *c*) ECHO_T='        ';;     # ECHO_T is single tab character.
+  *)   ECHO_C='\c';;
+  esac;;
+*)
+  ECHO_N='-n';;
+esac
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+  if ln -s conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s='ln -s'
+    # ... but there are two gotchas:
+    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+    # In both cases, we have to default to `cp -p'.
+    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+      as_ln_s='cp -p'
+  elif ln conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s=ln
+  else
+    as_ln_s='cp -p'
+  fi
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p=:
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+if test -x / >/dev/null 2>&1; then
+  as_test_x='test -x'
+else
+  if ls -dL / >/dev/null 2>&1; then
+    as_ls_L_option=L
+  else
+    as_ls_L_option=
+  fi
+  as_test_x='
+    eval sh -c '\''
+      if test -d "$1"; then
+       test -d "$1/.";
+      else
+       case $1 in
+       -*)set "./$1";;
+       esac;
+       case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in
+       ???[sx]*):;;*)false;;esac;fi
+    '\'' sh
+  '
+fi
+as_executable_p=$as_test_x
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+exec 6>&1
+
+# Save the log message, to keep $[0] and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling.
+ac_log="
+This file was extended by $as_me, which was
+generated by GNU Autoconf 2.63.  Invocation command line was
+
+  CONFIG_FILES    = $CONFIG_FILES
+  CONFIG_HEADERS  = $CONFIG_HEADERS
+  CONFIG_LINKS    = $CONFIG_LINKS
+  CONFIG_COMMANDS = $CONFIG_COMMANDS
+  $ $0 $@
+
+on `(hostname || uname -n) 2>/dev/null | sed 1q`
+"
+
+_ACEOF
+
+case $ac_config_files in *"
+"*) set x $ac_config_files; shift; ac_config_files=$*;;
+esac
+
+case $ac_config_headers in *"
+"*) set x $ac_config_headers; shift; ac_config_headers=$*;;
+esac
+
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+# Files that config.status was made for.
+config_files="$ac_config_files"
+config_headers="$ac_config_headers"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+ac_cs_usage="\
+\`$as_me' instantiates files from templates according to the
+current configuration.
+
+Usage: $0 [OPTION]... [FILE]...
+
+  -h, --help       print this help, then exit
+  -V, --version    print version number and configuration settings, then exit
+  -q, --quiet, --silent
+                   do not print progress messages
+  -d, --debug      don't remove temporary files
+      --recheck    update $as_me by reconfiguring in the same conditions
+      --file=FILE[:TEMPLATE]
+                   instantiate the configuration file FILE
+      --header=FILE[:TEMPLATE]
+                   instantiate the configuration header FILE
+
+Configuration files:
+$config_files
+
+Configuration headers:
+$config_headers
+
+Report bugs to <bug-autoconf@gnu.org>."
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_cs_version="\\
+config.status
+configured by $0, generated by GNU Autoconf 2.63,
+  with options \\"`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\"
+
+Copyright (C) 2008 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+
+ac_pwd='$ac_pwd'
+srcdir='$srcdir'
+INSTALL='$INSTALL'
+test -n "\$AWK" || AWK=awk
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# The default lists apply if the user does not specify any file.
+ac_need_defaults=:
+while test $# != 0
+do
+  case $1 in
+  --*=*)
+    ac_option=`expr "X$1" : 'X\([^=]*\)='`
+    ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
+    ac_shift=:
+    ;;
+  *)
+    ac_option=$1
+    ac_optarg=$2
+    ac_shift=shift
+    ;;
+  esac
+
+  case $ac_option in
+  # Handling of the options.
+  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+    ac_cs_recheck=: ;;
+  --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
+    $as_echo "$ac_cs_version"; exit ;;
+  --debug | --debu | --deb | --de | --d | -d )
+    debug=: ;;
+  --file | --fil | --fi | --f )
+    $ac_shift
+    case $ac_optarg in
+    *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    esac
+    CONFIG_FILES="$CONFIG_FILES '$ac_optarg'"
+    ac_need_defaults=false;;
+  --header | --heade | --head | --hea )
+    $ac_shift
+    case $ac_optarg in
+    *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    esac
+    CONFIG_HEADERS="$CONFIG_HEADERS '$ac_optarg'"
+    ac_need_defaults=false;;
+  --he | --h)
+    # Conflict between --help and --header
+    { $as_echo "$as_me: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&2
+   { (exit 1); exit 1; }; };;
+  --help | --hel | -h )
+    $as_echo "$ac_cs_usage"; exit ;;
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil | --si | --s)
+    ac_cs_silent=: ;;
+
+  # This is an error.
+  -*) { $as_echo "$as_me: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&2
+   { (exit 1); exit 1; }; } ;;
+
+  *) ac_config_targets="$ac_config_targets $1"
+     ac_need_defaults=false ;;
+
+  esac
+  shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+  exec 6>/dev/null
+  ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+if \$ac_cs_recheck; then
+  set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+  shift
+  \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
+  CONFIG_SHELL='$SHELL'
+  export CONFIG_SHELL
+  exec "\$@"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+exec 5>>config.log
+{
+  echo
+  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+  $as_echo "$ac_log"
+} >&5
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+
+# Handling of arguments.
+for ac_config_target in $ac_config_targets
+do
+  case $ac_config_target in
+    "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;;
+    "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+
+  *) { { $as_echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5
+$as_echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
+   { (exit 1); exit 1; }; };;
+  esac
+done
+
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used.  Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+  test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+  test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
+fi
+
+# Have a temporary directory for convenience.  Make it in the build tree
+# simply because there is no reason against having it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Hook for its removal unless debugging.
+# Note that there is a small window in which the directory will not be cleaned:
+# after its creation but before its name has been assigned to `$tmp'.
+$debug ||
+{
+  tmp=
+  trap 'exit_status=$?
+  { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status
+' 0
+  trap '{ (exit 1); exit 1; }' 1 2 13 15
+}
+# Create a (secure) tmp directory for tmp files.
+
+{
+  tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
+  test -n "$tmp" && test -d "$tmp"
+}  ||
+{
+  tmp=./conf$$-$RANDOM
+  (umask 077 && mkdir "$tmp")
+} ||
+{
+   $as_echo "$as_me: cannot create a temporary directory in ." >&2
+   { (exit 1); exit 1; }
+}
+
+# Set up the scripts for CONFIG_FILES section.
+# No need to generate them if there are no CONFIG_FILES.
+# This happens for instance with `./config.status config.h'.
+if test -n "$CONFIG_FILES"; then
+
+
+ac_cr='\r'
+ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null`
+if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
+  ac_cs_awk_cr='\\r'
+else
+  ac_cs_awk_cr=$ac_cr
+fi
+
+echo 'BEGIN {' >"$tmp/subs1.awk" &&
+_ACEOF
+
+
+{
+  echo "cat >conf$$subs.awk <<_ACEOF" &&
+  echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' &&
+  echo "_ACEOF"
+} >conf$$subs.sh ||
+  { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
+$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;}
+   { (exit 1); exit 1; }; }
+ac_delim_num=`echo "$ac_subst_vars" | grep -c '$'`
+ac_delim='%!_!# '
+for ac_last_try in false false false false false :; do
+  . ./conf$$subs.sh ||
+    { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
+$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;}
+   { (exit 1); exit 1; }; }
+
+  ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`
+  if test $ac_delim_n = $ac_delim_num; then
+    break
+  elif $ac_last_try; then
+    { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
+$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;}
+   { (exit 1); exit 1; }; }
+  else
+    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+  fi
+done
+rm -f conf$$subs.sh
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+cat >>"\$tmp/subs1.awk" <<\\_ACAWK &&
+_ACEOF
+sed -n '
+h
+s/^/S["/; s/!.*/"]=/
+p
+g
+s/^[^!]*!//
+:repl
+t repl
+s/'"$ac_delim"'$//
+t delim
+:nl
+h
+s/\(.\{148\}\).*/\1/
+t more1
+s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/
+p
+n
+b repl
+:more1
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t nl
+:delim
+h
+s/\(.\{148\}\).*/\1/
+t more2
+s/["\\]/\\&/g; s/^/"/; s/$/"/
+p
+b
+:more2
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t delim
+' <conf$$subs.awk | sed '
+/^[^""]/{
+  N
+  s/\n//
+}
+' >>$CONFIG_STATUS || ac_write_fail=1
+rm -f conf$$subs.awk
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+_ACAWK
+cat >>"\$tmp/subs1.awk" <<_ACAWK &&
+  for (key in S) S_is_set[key] = 1
+  FS = "\a"
+
+}
+{
+  line = $ 0
+  nfields = split(line, field, "@")
+  substed = 0
+  len = length(field[1])
+  for (i = 2; i < nfields; i++) {
+    key = field[i]
+    keylen = length(key)
+    if (S_is_set[key]) {
+      value = S[key]
+      line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3)
+      len += length(value) + length(field[++i])
+      substed = 1
+    } else
+      len += 1 + keylen
+  }
+
+  print line
+}
+
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then
+  sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
+else
+  cat
+fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \
+  || { { $as_echo "$as_me:$LINENO: error: could not setup config files machinery" >&5
+$as_echo "$as_me: error: could not setup config files machinery" >&2;}
+   { (exit 1); exit 1; }; }
+_ACEOF
+
+# VPATH may cause trouble with some makes, so we remove $(srcdir),
+# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+  ac_vpsub='/^[         ]*VPATH[        ]*=/{
+s/:*\$(srcdir):*/:/
+s/:*\${srcdir}:*/:/
+s/:*@srcdir@:*/:/
+s/^\([^=]*=[    ]*\):*/\1/
+s/:*$//
+s/^[^=]*=[      ]*$//
+}'
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+fi # test -n "$CONFIG_FILES"
+
+# Set up the scripts for CONFIG_HEADERS section.
+# No need to generate them if there are no CONFIG_HEADERS.
+# This happens for instance with `./config.status Makefile'.
+if test -n "$CONFIG_HEADERS"; then
+cat >"$tmp/defines.awk" <<\_ACAWK ||
+BEGIN {
+_ACEOF
+
+# Transform confdefs.h into an awk script `defines.awk', embedded as
+# here-document in config.status, that substitutes the proper values into
+# config.h.in to produce config.h.
+
+# Create a delimiter string that does not exist in confdefs.h, to ease
+# handling of long lines.
+ac_delim='%!_!# '
+for ac_last_try in false false :; do
+  ac_t=`sed -n "/$ac_delim/p" confdefs.h`
+  if test -z "$ac_t"; then
+    break
+  elif $ac_last_try; then
+    { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_HEADERS" >&5
+$as_echo "$as_me: error: could not make $CONFIG_HEADERS" >&2;}
+   { (exit 1); exit 1; }; }
+  else
+    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+  fi
+done
+
+# For the awk script, D is an array of macro values keyed by name,
+# likewise P contains macro parameters if any.  Preserve backslash
+# newline sequences.
+
+ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*
+sed -n '
+s/.\{148\}/&'"$ac_delim"'/g
+t rset
+:rset
+s/^[    ]*#[    ]*define[       ][      ]*/ /
+t def
+d
+:def
+s/\\$//
+t bsnl
+s/["\\]/\\&/g
+s/^ \('"$ac_word_re"'\)\(([^()]*)\)[    ]*\(.*\)/P["\1"]="\2"\
+D["\1"]=" \3"/p
+s/^ \('"$ac_word_re"'\)[        ]*\(.*\)/D["\1"]=" \2"/p
+d
+:bsnl
+s/["\\]/\\&/g
+s/^ \('"$ac_word_re"'\)\(([^()]*)\)[    ]*\(.*\)/P["\1"]="\2"\
+D["\1"]=" \3\\\\\\n"\\/p
+t cont
+s/^ \('"$ac_word_re"'\)[        ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p
+t cont
+d
+:cont
+n
+s/.\{148\}/&'"$ac_delim"'/g
+t clear
+:clear
+s/\\$//
+t bsnlc
+s/["\\]/\\&/g; s/^/"/; s/$/"/p
+d
+:bsnlc
+s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p
+b cont
+' <confdefs.h | sed '
+s/'"$ac_delim"'/"\\\
+"/g' >>$CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+  for (key in D) D_is_set[key] = 1
+  FS = "\a"
+}
+/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ {
+  line = \$ 0
+  split(line, arg, " ")
+  if (arg[1] == "#") {
+    defundef = arg[2]
+    mac1 = arg[3]
+  } else {
+    defundef = substr(arg[1], 2)
+    mac1 = arg[2]
+  }
+  split(mac1, mac2, "(") #)
+  macro = mac2[1]
+  prefix = substr(line, 1, index(line, defundef) - 1)
+  if (D_is_set[macro]) {
+    # Preserve the white space surrounding the "#".
+    print prefix "define", macro P[macro] D[macro]
+    next
+  } else {
+    # Replace #undef with comments.  This is necessary, for example,
+    # in the case of _POSIX_SOURCE, which is predefined and required
+    # on some systems where configure will not decide to define it.
+    if (defundef == "undef") {
+      print "/*", prefix defundef, macro, "*/"
+      next
+    }
+  }
+}
+{ print }
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+  { { $as_echo "$as_me:$LINENO: error: could not setup config headers machinery" >&5
+$as_echo "$as_me: error: could not setup config headers machinery" >&2;}
+   { (exit 1); exit 1; }; }
+fi # test -n "$CONFIG_HEADERS"
+
+
+eval set X "  :F $CONFIG_FILES  :H $CONFIG_HEADERS    "
+shift
+for ac_tag
+do
+  case $ac_tag in
+  :[FHLC]) ac_mode=$ac_tag; continue;;
+  esac
+  case $ac_mode$ac_tag in
+  :[FHL]*:*);;
+  :L* | :C*:*) { { $as_echo "$as_me:$LINENO: error: invalid tag $ac_tag" >&5
+$as_echo "$as_me: error: invalid tag $ac_tag" >&2;}
+   { (exit 1); exit 1; }; };;
+  :[FH]-) ac_tag=-:-;;
+  :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
+  esac
+  ac_save_IFS=$IFS
+  IFS=:
+  set x $ac_tag
+  IFS=$ac_save_IFS
+  shift
+  ac_file=$1
+  shift
+
+  case $ac_mode in
+  :L) ac_source=$1;;
+  :[FH])
+    ac_file_inputs=
+    for ac_f
+    do
+      case $ac_f in
+      -) ac_f="$tmp/stdin";;
+      *) # Look for the file first in the build tree, then in the source tree
+        # (if the path is not absolute).  The absolute path cannot be DOS-style,
+        # because $ac_f cannot contain `:'.
+        test -f "$ac_f" ||
+          case $ac_f in
+          [\\/$]*) false;;
+          *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
+          esac ||
+          { { $as_echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5
+$as_echo "$as_me: error: cannot find input file: $ac_f" >&2;}
+   { (exit 1); exit 1; }; };;
+      esac
+      case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
+      ac_file_inputs="$ac_file_inputs '$ac_f'"
+    done
+
+    # Let's still pretend it is `configure' which instantiates (i.e., don't
+    # use $as_me), people would be surprised to read:
+    #    /* config.h.  Generated by config.status.  */
+    configure_input='Generated from '`
+         $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
+       `' by configure.'
+    if test x"$ac_file" != x-; then
+      configure_input="$ac_file.  $configure_input"
+      { $as_echo "$as_me:$LINENO: creating $ac_file" >&5
+$as_echo "$as_me: creating $ac_file" >&6;}
+    fi
+    # Neutralize special characters interpreted by sed in replacement strings.
+    case $configure_input in #(
+    *\&* | *\|* | *\\* )
+       ac_sed_conf_input=`$as_echo "$configure_input" |
+       sed 's/[\\\\&|]/\\\\&/g'`;; #(
+    *) ac_sed_conf_input=$configure_input;;
+    esac
+
+    case $ac_tag in
+    *:-:* | *:-) cat >"$tmp/stdin" \
+      || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5
+$as_echo "$as_me: error: could not create $ac_file" >&2;}
+   { (exit 1); exit 1; }; } ;;
+    esac
+    ;;
+  esac
+
+  ac_dir=`$as_dirname -- "$ac_file" ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$ac_file" : 'X\(//\)[^/]' \| \
+        X"$ac_file" : 'X\(//\)$' \| \
+        X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$ac_file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)[^/].*/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+  { as_dir="$ac_dir"
+  case $as_dir in #(
+  -*) as_dir=./$as_dir;;
+  esac
+  test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || {
+    as_dirs=
+    while :; do
+      case $as_dir in #(
+      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+      *) as_qdir=$as_dir;;
+      esac
+      as_dirs="'$as_qdir' $as_dirs"
+      as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$as_dir" : 'X\(//\)[^/]' \| \
+        X"$as_dir" : 'X\(//\)$' \| \
+        X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)[^/].*/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+      test -d "$as_dir" && break
+    done
+    test -z "$as_dirs" || eval "mkdir $as_dirs"
+  } || test -d "$as_dir" || { { $as_echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5
+$as_echo "$as_me: error: cannot create directory $as_dir" >&2;}
+   { (exit 1); exit 1; }; }; }
+  ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+  .)  # We are building in place.
+    ac_srcdir=.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+
+  case $ac_mode in
+  :F)
+  #
+  # CONFIG_FILE
+  #
+
+  case $INSTALL in
+  [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+  *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;
+  esac
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# If the template does not know about datarootdir, expand it.
+# FIXME: This hack should be removed a few years after 2.60.
+ac_datarootdir_hack=; ac_datarootdir_seen=
+
+ac_sed_dataroot='
+/datarootdir/ {
+  p
+  q
+}
+/@datadir@/p
+/@docdir@/p
+/@infodir@/p
+/@localedir@/p
+/@mandir@/p
+'
+case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
+*datarootdir*) ac_datarootdir_seen=yes;;
+*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
+  { $as_echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+  ac_datarootdir_hack='
+  s&@datadir@&$datadir&g
+  s&@docdir@&$docdir&g
+  s&@infodir@&$infodir&g
+  s&@localedir@&$localedir&g
+  s&@mandir@&$mandir&g
+    s&\\\${datarootdir}&$datarootdir&g' ;;
+esac
+_ACEOF
+
+# Neutralize VPATH when `$srcdir' = `.'.
+# Shell code in configure.ac might set extrasub.
+# FIXME: do we really want to maintain this feature?
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_sed_extra="$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s|@configure_input@|$ac_sed_conf_input|;t t
+s&@top_builddir@&$ac_top_builddir_sub&;t t
+s&@top_build_prefix@&$ac_top_build_prefix&;t t
+s&@srcdir@&$ac_srcdir&;t t
+s&@abs_srcdir@&$ac_abs_srcdir&;t t
+s&@top_srcdir@&$ac_top_srcdir&;t t
+s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
+s&@builddir@&$ac_builddir&;t t
+s&@abs_builddir@&$ac_abs_builddir&;t t
+s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
+s&@INSTALL@&$ac_INSTALL&;t t
+$ac_datarootdir_hack
+"
+eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \
+  || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5
+$as_echo "$as_me: error: could not create $ac_file" >&2;}
+   { (exit 1); exit 1; }; }
+
+test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
+  { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } &&
+  { ac_out=`sed -n '/^[         ]*datarootdir[  ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } &&
+  { $as_echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined." >&5
+$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined." >&2;}
+
+  rm -f "$tmp/stdin"
+  case $ac_file in
+  -) cat "$tmp/out" && rm -f "$tmp/out";;
+  *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";;
+  esac \
+  || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5
+$as_echo "$as_me: error: could not create $ac_file" >&2;}
+   { (exit 1); exit 1; }; }
+ ;;
+  :H)
+  #
+  # CONFIG_HEADER
+  #
+  if test x"$ac_file" != x-; then
+    {
+      $as_echo "/* $configure_input  */" \
+      && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs"
+    } >"$tmp/config.h" \
+      || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5
+$as_echo "$as_me: error: could not create $ac_file" >&2;}
+   { (exit 1); exit 1; }; }
+    if diff "$ac_file" "$tmp/config.h" >/dev/null 2>&1; then
+      { $as_echo "$as_me:$LINENO: $ac_file is unchanged" >&5
+$as_echo "$as_me: $ac_file is unchanged" >&6;}
+    else
+      rm -f "$ac_file"
+      mv "$tmp/config.h" "$ac_file" \
+       || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5
+$as_echo "$as_me: error: could not create $ac_file" >&2;}
+   { (exit 1); exit 1; }; }
+    fi
+  else
+    $as_echo "/* $configure_input  */" \
+      && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" \
+      || { { $as_echo "$as_me:$LINENO: error: could not create -" >&5
+$as_echo "$as_me: error: could not create -" >&2;}
+   { (exit 1); exit 1; }; }
+  fi
+ ;;
+
+
+  esac
+
+done # for ac_tag
+
+
+{ (exit 0); exit 0; }
+_ACEOF
+chmod +x $CONFIG_STATUS
+ac_clean_files=$ac_clean_files_save
+
+test $ac_write_fail = 0 ||
+  { { $as_echo "$as_me:$LINENO: error: write failure creating $CONFIG_STATUS" >&5
+$as_echo "$as_me: error: write failure creating $CONFIG_STATUS" >&2;}
+   { (exit 1); exit 1; }; }
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded.  So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status.  When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+  ac_cs_success=:
+  ac_config_status_args=
+  test "$silent" = yes &&
+    ac_config_status_args="$ac_config_status_args --quiet"
+  exec 5>/dev/null
+  $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
+  exec 5>>config.log
+  # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+  # would make configure fail if this is the last instruction.
+  $ac_cs_success || { (exit 1); exit 1; }
+fi
+if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
+  { $as_echo "$as_me:$LINENO: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
+$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
+fi
+
diff --git a/configure.in b/configure.in
new file mode 100644 (file)
index 0000000..895ee03
--- /dev/null
@@ -0,0 +1,249 @@
+dnl Process this file with autoconf to produce a configure script.
+AC_INIT(quota.c)
+AC_CONFIG_HEADERS([config.h])
+
+dnl Checks for programs.
+AC_PROG_CC
+AC_HEADER_STDC
+AC_PROG_INSTALL
+
+dnl Check for compiler options
+AC_MSG_CHECKING(whether compiler supports PIE)
+oldCFLAGS="$CFLAGS"
+CFLAGS="$CFLAGS -fPIE"
+oldLDFLAGS="$LDFLAGS"
+LDFLAGS="$LDFLAGS -pie"
+AC_LINK_IFELSE([AC_LANG_PROGRAM([[]])], compilepie="yes")
+if test "x$compilepie" != "xyes"; then
+       CFLAGS="$oldCFLAGS"
+       LDFLAGS="$oldLDFLAGS"
+       AC_MSG_RESULT(no)
+else
+       AC_MSG_RESULT(yes)
+fi
+
+dnl Checks for libraries.
+AC_ARG_ENABLE(ldapmail, [  --enable-ldapmail=[yes/no/try]       Enable ldap mail address lookups [default=no].],
+       ,
+       enable_ldapmail="no")
+if test "x$enable_ldapmail" != "xno"; then
+       have_new_ldap="no"
+       have_old_ldap="no"
+       AC_CHECK_LIB(ldap, ldap_initialize, have_new_ldap="yes", AC_CHECK_LIB(ldap, ldap_init, have_old_ldap="yes"))
+       if test "x$have_new_ldap" != "xno" -o "x$have_old_ldap" != "xno"; then
+               LDAPLIBS="-L/usr/lib -lldap -llber"
+               AC_DEFINE([USE_LDAP_MAIL_LOOKUP], 1, [Lookup email address using LDAP])
+               COMPILE_OPTS="$COMPILE_OPTS USE_LDAP_MAIL_LOOKUP"
+               if test "x$have_new_ldap" = "xyes"; then
+                       AC_DEFINE([USE_LDAP_23], 1, [LDAP 2.3 or newer installed])
+                       AC_CHECK_DECL(ldap_perror, ,
+                                     AC_DEFINE([NEED_LDAP_PERROR], 1, [ldap_perror function not declared]),
+                                     [#include <ldap.h>])
+               fi
+       else
+               if test "x$enable_ldapmail" = "xyes"; then
+                       AC_MSG_ERROR([LDAP support required but library not found.]);
+               fi
+       fi
+fi
+AC_SUBST(LDAPLIBS)
+
+       
+AC_CHECK_HEADER(ext2fs/ext2fs.h,ext2fshead="yes")
+if test "x$ext2fshead" = "xyes"; then
+       AC_DEFINE([HAVE_EXT2_INCLUDE], 1, [Header files for e2fslib])
+       AC_MSG_CHECKING([for ext2_ino_t])
+       have_ext2_ino_t="no"
+       AC_EGREP_HEADER(ext2_ino_t, ext2fs/ext2fs.h, have_ext2_ino_t="yes")
+       if test "x$have_ext2_ino_t" != "xyes"; then
+               AC_MSG_RESULT([not found])
+       else
+               AC_MSG_RESULT([found])
+               AC_DEFINE([HAVE_EXT2_INO_T], 1, [ext2fs.h defines ext2_ino_t])
+       fi
+fi
+
+AC_ARG_ENABLE(ext2direct,
+       [  --enable-ext2direct=[yes/no/try]     Enable scanning of EXT2/EXT3 filesystem using e2fslib [default=try].],
+       ,
+       enable_ext2direct="try")
+if test "x$enable_ext2direct" != "xno"; then
+       AC_CHECK_LIB(com_err, com_err, EXT2LIBS="-lcom_err $EXT2LIBS")
+       AC_CHECK_LIB(ext2fs, ext2fs_initialize, EXT2LIBS="-lext2fs $EXT2LIBS",, "-lcom_err")
+       if test "${ac_cv_lib_com_err_com_err}" != "yes" -o "${ac_cv_lib_ext2fs_ext2fs_initialize}" != "yes"; then
+               if test "x$enable_ext2direct" = "xyes"; then
+                       AC_MSG_ERROR([Ext2 direct support required but libraries not found.])
+               else
+                       AC_MSG_WARN([Ext2 direct support won't be compiled. Libraries not found.])
+               fi
+               enable_ext2direct="no"
+               EXT2LIBS=""
+       else
+               if test "x$ext2fshead" != "xyes"; then
+                       if test "x$enable_ext2direct" = "xyes"; then
+                               AC_MSG_ERROR([Ext2 direct support required but header files not found.])
+                       else
+                               AC_MSG_WARN([Ext2 direct support won't be compiled. Header files not found.])
+                       fi
+                       enable_ext2direct="no"
+                       EXT2LIBS=""
+               else
+                       enable_ext2direct="yes"
+               fi
+       fi
+       if test "x$enable_ext2direct" = "xyes"; then
+               AC_DEFINE([EXT2_DIRECT], 1, [Scanning of ext? filesystems using e2fslib])
+               COMPILE_OPTS="$COMPILE_OPTS EXT2_DIRECT"
+       fi
+fi
+AC_SUBST(EXT2LIBS)
+
+AC_ARG_ENABLE(netlink,
+       [  --enable-netlink=[yes/no/try]   Compile daemon receiving quota messages via netlink [default=no].],
+       ,
+       enable_netlink="no")
+if test "x$enable_netlink" != "xno"; then
+       PKG_CHECK_MODULES([DBUS], [dbus-1])
+
+       AC_CHECK_LIB(nl, genl_register, NETLINKLIBS="-lnl $DBUS_LIBS")
+       if test -z "$NETLINKLIBS" -o -z "$DBUS_LIBS"; then
+               if test "x$enable_netlink" = "xyes"; then
+                       AC_MSG_ERROR([Required libraries for quota netlink daemon not found.])
+               else
+                       AC_MSG_WARN([Quota netlink daemon won't be compiled. Required libraries not found.])
+               fi
+               enable_netlink="no"
+               NETLINKLIBS=""
+       else
+               CPPFLAGS="$DBUS_CFLAGS $CPPFLAGS"
+               if test -z "$DBUS_LIBS"; then
+                       if test "x$enable_netlink" = "xyes"; then
+                               AC_MSG_ERROR([Required headers for quota netlink daemon not found.])
+                       else
+                               AC_MSG_WARN([Quota netlink daemon won't be compiled. Required headers not found.])
+                       fi
+                       NETLINKLIBS=""
+                       enable_netlink="no"
+               else
+                       QUOTA_NETLINK_PROG=quota_nld
+               fi
+       fi
+fi
+AC_SUBST(QUOTA_NETLINK_PROG)
+AC_SUBST(NETLINKLIBS)
+
+AC_SEARCH_LIBS(gethostbyname, nsl)
+AC_MSG_CHECKING(for host_access in -lwrap)
+AC_CACHE_VAL(ac_cv_lib_wrap_main,
+       saved_LIBS="$LIBS"
+       LIBS="$LIBS -lwrap"
+       [AC_LINK_IFELSE([AC_LANG_PROGRAM([[
+       #include <stdio.h>
+       #include <sys/types.h>
+       #include <sys/socket.h>
+       #include <netinet/in.h>
+       #include <tcpd.h>
+       struct request_info request;
+       int deny_severity, allow_severity;]],[[hosts_access(&request);]])],
+       dnl We always restore LIBS as we add -lwrap in the next check
+       [ac_cv_lib_wrap_main=yes; LIBS="$saved_LIBS"; AC_MSG_RESULT(yes)],
+       [ac_cv_lib_wrap_main=no; LIBS="$saved_LIBS"; AC_MSG_RESULT(no)])
+       ])
+
+if test ${ac_cv_lib_wrap_main} = yes; then
+       AC_CHECK_HEADER(tcpd.h,, [
+               echo 'ERROR: could not find tcpd.h - missing TCP wrappers package'
+               exit 1
+       ])
+       LIBS="$LIBS -lwrap"
+       AC_DEFINE([HOSTS_ACCESS], 1, [Use hosts.allow and hosts.deny for access checking of rpc.rquotad])
+       COMPILE_OPTS="$COMPILE_OPTS HOSTS_ACCESS"
+fi
+
+dnl Checks for typedefs, structures, and compiler characteristics.
+AC_C_CONST
+AC_C_INLINE
+
+AC_ARG_ENABLE(altformat,
+       [  --enable-altformat=[yes/no]     Enable alternative format used by edquota [default=yes].],
+       ,
+       enable_altformat="yes")
+AC_ARG_ENABLE(rpc,
+       [  --enable-rpc=[yes/no]           Enable RPC support [default=yes].],
+       ,
+       enable_rpc="yes")
+AC_ARG_ENABLE(rpcsetquota,
+       [  --enable-rpcsetquota=[yes/no]   Use RPC for setting quotas [default=no].],
+       ,
+       enable_rpcsetquota="no")
+AC_ARG_ENABLE(xfs_roothack,
+       [  --enable-xfs_roothack=[yes/no]  Support old XFS root filesystems [default=no].],
+       ,
+       enable_xfs_roothack="no")
+AC_ARG_ENABLE(bsd_behaviour,
+       [  --enable-bsd_behaviour=[yes/no] Mimic BSD behaviour [default=yes].],
+       ,
+       enable_bsd_behaviour="yes")
+AC_ARG_ENABLE(libefence,
+       [  --enable-libefence=[yes/no]     Use Electric Fence memory checks [default=no].],
+       ,
+       enable_libefence="no")
+
+AC_ARG_ENABLE(nls,
+       [  --enable-nls=[yes/no]           Enable gettext [default=yes].],
+       ,
+       enable_nls="yes")
+AC_ARG_ENABLE(rootsbin,
+       [  --enable-rootsbin=[yes/no]      Use /sbin for some important binaries regardless $prefix [default=no].],
+       ,
+       enable_rootsbin="no")
+AC_ARG_ENABLE(proc-mounts,
+       [  --enable-proc-mounts=[path]   Use alternate file instead of /etc/mtab [default=/proc/mounts].],
+       ,
+       enable_proc_mounts="/proc/mounts")
+
+if test "$enable_altformat" = "yes" ; then
+       AC_DEFINE([ALT_FORMAT], 1, [Alternative file format of edquota])
+       COMPILE_OPTS="$COMPILE_OPTS ALT_FORMAT"
+fi
+if test "$enable_rpc" = "yes" ; then
+       AC_DEFINE([RPC], 1, [Support for RPC])
+       COMPILE_OPTS="$COMPILE_OPTS RPC"
+fi
+if test "$enable_rpcsetquota" = "yes" ; then
+       AC_DEFINE([RPC_SETQUOTA], 1, [Allow setting of quotas over RPC])
+       COMPILE_OPTS="$COMPILE_OPTS RPC_SETQUOTA"
+fi
+if test "$enable_xfs_roothack" = "yes" ; then
+       AC_DEFINE([XFS_ROOTHACK], 1, [Assume quota mount options for root filesystem])
+       COMPILE_OPTS="$COMPILE_OPTS XFS_ROOTHACK"
+fi
+if test "$enable_bsd_behaviour" = "yes" ; then
+       AC_DEFINE([BSD_BEHAVIOUR], 1, [Check rights to query / set quotas before calling quotactl])
+       COMPILE_OPTS="$COMPILE_OPTS BSD_BEHAVIOUR"
+fi
+if test "$enable_libefence" = "yes" ; then
+       LIBMALLOC="/usr/lib/libefence.a"
+fi
+if test "$enable_nls" = "yes" ; then
+       AC_DEFINE([USE_GETTEXT], 1, [Use gettext to translate messages])
+       INSTMO="inst_mo"
+fi
+if test "$enable_proc_mounts" != "no"; then
+       AC_DEFINE_UNQUOTED([ALT_MTAB], ["$enable_proc_mounts"], [File with mounted filesystems])
+fi
+if test "$enable_rootsbin" = "yes" ; then
+       ROOTSBIN="/sbin"
+else
+       ROOTSBIN='$(prefix)/sbin'
+fi
+
+AC_DEFINE_UNQUOTED([COMPILE_OPTS], ["$COMPILE_OPTS"], [Configuration options])
+AC_DEFINE([PACKAGE_VERSION], ["4.00-pre1"], [Version of quota tools])
+
+AC_SUBST(LIBMALLOC)
+AC_SUBST(INSTMO)
+AC_SUBST(ROOTSBIN)
+AC_SUBST(CPPFLAGS)
+
+AC_OUTPUT(Makefile)
diff --git a/convertquota.8 b/convertquota.8
new file mode 100644 (file)
index 0000000..5313c7e
--- /dev/null
@@ -0,0 +1,73 @@
+.TH CONVERTQUOTA 8 "Fri Aug 20 1999"
+.UC 4
+.SH NAME
+convertquota \- convert quota from old file format to new one
+.SH SYNOPSIS
+.B convertquota
+[
+.B -ug
+] 
+.B -e
+.I filesystem
+.LP
+.B convertquota
+[
+.B -ug
+] 
+.B -f
+.IR oldformat , newformat
+.I filesystem
+.SH DESCRIPTION
+.B convertquota
+converts old quota files
+.BR quota.user
+and
+.BR quota.group
+to files
+.BR aquota.user
+and
+.BR aquota.group
+in new format currently used by 2.4.0-ac? and newer or by SuSE or Red Hat Linux 2.4 kernels on
+.IR filesystem .
+.PP
+New file format allows using quotas for 32-bit uids / gids, setting quotas for root,
+accounting used space in bytes (and so allowing use of quotas in ReiserFS) and it
+is also architecture independent. This format introduces Radix Tree (a simple form of tree
+structure) to quota file.
+.SH OPTIONS
+.TP
+.B -u, --user
+convert user quota file. This is the default.
+.TP
+.B -g, --group
+convert group quota file.
+.TP
+.B -f, --convert-format \f2oldformat,newformat\f1
+convert quota file from
+.I oldformat
+to
+.IR newformat .
+.TP
+.B -e, --convert-endian
+convert vfsv0 file format from big endian to little endian (old kernels had
+a bug and did not store quota files in little endian format).
+.TP
+.B -V, --version
+print version information.
+.SH FILES
+.TP 20
+.B aquota.user
+new user quota file
+.TP
+.B aquota.group
+new group quota file
+.SH "SEE ALSO"
+.BR quota (1),
+.BR setquota (8),
+.BR edquota (8),
+.BR quotacheck (8),
+.BR quotaon (8),
+.BR repquota (8)
+.SH AUTHOR
+Jan Kara \<jack@suse.cz\>
+
diff --git a/convertquota.c b/convertquota.c
new file mode 100644 (file)
index 0000000..ab16193
--- /dev/null
@@ -0,0 +1,409 @@
+/*
+ *
+ *     Utility for converting quota file from old to new format
+ *
+ *     Sponsored by SuSE CR
+ */
+
+#include "config.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <getopt.h>
+
+#include <asm/byteorder.h>
+
+#include "pot.h"
+#include "common.h"
+#include "quotaio.h"
+#include "quotasys.h"
+#include "quota.h"
+#include "bylabel.h"
+#include "quotaio_v2.h"
+#include "dqblk_v2.h"
+
+#define ACT_FORMAT 1           /* Convert format from old to new */
+#define ACT_ENDIAN 2           /* Convert endianity */
+
+char *mntpoint;
+char *progname;
+int ucv, gcv;
+struct quota_handle *qn;       /* Handle of new file */
+int action;                    /* Action to be performed */
+int infmt, outfmt;
+
+static void usage(void)
+{
+       errstr(_("Utility for converting quota files.\nUsage:\n\t%s [options] mountpoint\n\n\
+-u, --user                          convert user quota file\n\
+-g, --group                         convert group quota file\n\
+-e, --convert-endian                convert quota file to correct endianity\n\
+-f, --convert-format oldfmt,newfmt  convert from old to VFSv0 quota format\n\
+-h, --help                          show this help text and exit\n\
+-V, --version                       output version information and exit\n\n"), progname);
+       errstr(_("Bugs to %s\n"), MY_EMAIL);
+       exit(1);
+}
+
+static inline unsigned int min(unsigned a, unsigned b)
+{
+       if (a < b)
+               return a;
+       return b;
+}
+
+#define MAX_FMTNAME_LEN 32
+
+static void parse_options(int argcnt, char **argstr)
+{
+       int ret;
+       struct option long_opts[] = {
+               { "help", 0, NULL, 'h'},
+               { "version", 0, NULL, 'V'},
+               { "user", 0, NULL, 'u'},
+               { "group", 0, NULL, 'g'},
+               { "convert-endian", 0, NULL, 'e'},
+               { "convert-format", 1, NULL, 'f'},
+               { NULL, 0, NULL, 0}
+       };
+       char *comma;
+       char fmtbuf[MAX_FMTNAME_LEN];
+
+       while ((ret = getopt_long(argcnt, argstr, "Vugef:h", long_opts, NULL)) != -1) {
+               switch (ret) {
+                       case '?':
+                       case 'h':
+                               usage();
+                       case 'V':
+                               version();
+                               exit(0);
+                       case 'u':
+                               ucv = 1;
+                               break;
+                       case 'g':
+                               gcv = 1;
+                               break;
+                       case 'e':
+                               action = ACT_ENDIAN;
+                               break;
+                       case 'f':
+                               action = ACT_FORMAT;
+                               comma = strchr(optarg, ',');
+                               if (!comma) {
+                                       errstr(_("You have to specify source and target format of conversion.\n"));
+                                       usage();
+                               }
+                               sstrncpy(fmtbuf, optarg, min(comma - optarg + 1, MAX_FMTNAME_LEN));
+                               infmt = name2fmt(fmtbuf);
+                               if (infmt == QF_ERROR)
+                                       usage();
+                               outfmt = name2fmt(comma + 1);
+                               if (outfmt == QF_ERROR)
+                                       usage();
+                               break;
+               }
+       }
+
+       if (optind + 1 != argcnt) {
+               errstr(_("Bad number of arguments.\n"));
+               usage();
+       }
+
+       if (!(ucv | gcv))
+               ucv = 1;
+       if (!action) {
+               errstr(_("You have to specify action to perform.\n"));
+               usage();
+       }
+
+       mntpoint = argstr[optind];
+}
+
+/*
+ *     Implementation of endian conversion
+ */
+
+typedef char *dqbuf_t;
+
+#define set_bit(bmp, ind) ((bmp)[(ind) >> 3] |= (1 << ((ind) & 7)))
+#define get_bit(bmp, ind) ((bmp)[(ind) >> 3] & (1 << ((ind) & 7)))
+
+#define getdqbuf() smalloc(QT_BLKSIZE)
+#define freedqbuf(buf) free(buf)
+
+static inline void endian_disk2memdqblk(struct util_dqblk *m, struct v2r0_disk_dqblk *d)
+{
+       m->dqb_ihardlimit = __be32_to_cpu(d->dqb_ihardlimit);
+       m->dqb_isoftlimit = __be32_to_cpu(d->dqb_isoftlimit);
+       m->dqb_bhardlimit = __be32_to_cpu(d->dqb_bhardlimit);
+       m->dqb_bsoftlimit = __be32_to_cpu(d->dqb_bsoftlimit);
+       m->dqb_curinodes = __be32_to_cpu(d->dqb_curinodes);
+       m->dqb_curspace = __be64_to_cpu(d->dqb_curspace);
+       m->dqb_itime = __be64_to_cpu(d->dqb_itime);
+       m->dqb_btime = __be64_to_cpu(d->dqb_btime);
+}
+
+/* Is given dquot empty? */
+static int endian_empty_dquot(struct v2r0_disk_dqblk *d)
+{
+       static struct v2r0_disk_dqblk fakedquot;
+
+       return !memcmp(d, &fakedquot, sizeof(fakedquot));
+}
+
+/* Read given block */
+static void read_blk(int fd, uint blk, dqbuf_t buf)
+{
+       int err;
+
+       lseek(fd, blk << QT_BLKSIZE_BITS, SEEK_SET);
+       err = read(fd, buf, QT_BLKSIZE);
+       if (err < 0)
+               die(2, _("Cannot read block %u: %s\n"), blk, strerror(errno));
+       else if (err != QT_BLKSIZE)
+               memset(buf + err, 0, QT_BLKSIZE - err);
+}
+
+static void endian_report_block(int fd, uint blk, char *bitmap)
+{
+       dqbuf_t buf = getdqbuf();
+       struct qt_disk_dqdbheader *dh;
+       struct v2r0_disk_dqblk *ddata;
+       struct dquot dquot;
+       struct qtree_mem_dqinfo *info = &qn->qh_info.u.v2_mdqi.dqi_qtree;
+       int i;
+
+       set_bit(bitmap, blk);
+       read_blk(fd, blk, buf);
+       dh = (struct qt_disk_dqdbheader *)buf;
+       ddata = (struct v2r0_disk_dqblk *)(dh + 1);
+       for (i = 0; i < qtree_dqstr_in_blk(info); i++)
+               if (!endian_empty_dquot(ddata + i)) {
+                       memset(&dquot, 0, sizeof(dquot));
+                       dquot.dq_h = qn;
+                       endian_disk2memdqblk(&dquot.dq_dqb, ddata + i);
+                       dquot.dq_id = __be32_to_cpu(ddata[i].dqb_id);
+                       if (qn->qh_ops->commit_dquot(&dquot, COMMIT_ALL) < 0)
+                               errstr(_("Cannot commit dquot for id %u: %s\n"),
+                                       (uint)dquot.dq_id, strerror(errno));
+               }
+       freedqbuf(buf);
+}
+
+static void endian_report_tree(int fd, uint blk, int depth, char *bitmap)
+{
+       int i;
+       dqbuf_t buf = getdqbuf();
+       u_int32_t *ref = (u_int32_t *) buf;
+
+       read_blk(fd, blk, buf);
+       if (depth == QT_TREEDEPTH - 1) {
+               for (i = 0; i < QT_BLKSIZE >> 2; i++) {
+                       blk = __be32_to_cpu(ref[i]);
+                       if (blk && !get_bit(bitmap, blk))
+                               endian_report_block(fd, blk, bitmap);
+               }
+       }
+       else {
+               for (i = 0; i < QT_BLKSIZE >> 2; i++)
+                       if ((blk = __be32_to_cpu(ref[i])))
+                               endian_report_tree(fd, blk, depth + 1, bitmap);
+       }
+       freedqbuf(buf);
+}
+
+static int endian_scan_structures(int fd, int type)
+{
+       char *bitmap;
+       loff_t blocks = (lseek(fd, 0, SEEK_END) + QT_BLKSIZE - 1) >> QT_BLKSIZE_BITS;
+
+       bitmap = smalloc((blocks + 7) >> 3);
+       memset(bitmap, 0, (blocks + 7) >> 3);
+       endian_report_tree(fd, QT_TREEOFF, 0, bitmap);
+       free(bitmap);
+       return 0;
+}
+
+static int endian_check_header(int fd, int type)
+{
+       struct v2_disk_dqheader head;
+       u_int32_t file_magics[] = INITQMAGICS;
+       u_int32_t known_versions[] = INIT_V2_VERSIONS;
+
+       lseek(fd, 0, SEEK_SET);
+       if (read(fd, &head, sizeof(head)) != sizeof(head)) {
+               errstr(_("Cannot read header of old quotafile.\n"));
+               return -1;
+       }
+       if (__be32_to_cpu(head.dqh_magic) != file_magics[type] || __be32_to_cpu(head.dqh_version) > known_versions[type]) {
+               errstr(_("Bad file magic or version (probably not quotafile with bad endianity).\n"));
+               return -1;
+       }
+       return 0;
+}
+
+static int endian_load_info(int fd, int type)
+{
+       struct v2_disk_dqinfo dinfo;
+
+       if (read(fd, &dinfo, sizeof(dinfo)) != sizeof(dinfo)) {
+               errstr(_("Cannot read information about old quotafile.\n"));
+               return -1;
+       }
+       qn->qh_info.u.v2_mdqi.dqi_flags = __be32_to_cpu(dinfo.dqi_flags);
+       qn->qh_info.dqi_bgrace = __be32_to_cpu(dinfo.dqi_bgrace);
+       qn->qh_info.dqi_igrace = __be32_to_cpu(dinfo.dqi_igrace);
+       return 0;
+}
+
+/*
+ *     End of endian conversion
+ */
+
+static int convert_dquot(struct dquot *dquot, char *name)
+{
+       struct dquot newdquot;
+
+       memset(&newdquot, 0, sizeof(newdquot));
+       newdquot.dq_id = dquot->dq_id;
+       newdquot.dq_h = qn;
+       newdquot.dq_dqb.dqb_ihardlimit = dquot->dq_dqb.dqb_ihardlimit;
+       newdquot.dq_dqb.dqb_isoftlimit = dquot->dq_dqb.dqb_isoftlimit;
+       newdquot.dq_dqb.dqb_curinodes = dquot->dq_dqb.dqb_curinodes;
+       newdquot.dq_dqb.dqb_bhardlimit = dquot->dq_dqb.dqb_bhardlimit;
+       newdquot.dq_dqb.dqb_bsoftlimit = dquot->dq_dqb.dqb_bsoftlimit;
+       newdquot.dq_dqb.dqb_curspace = dquot->dq_dqb.dqb_curspace;
+       newdquot.dq_dqb.dqb_btime = dquot->dq_dqb.dqb_btime;
+       newdquot.dq_dqb.dqb_itime = dquot->dq_dqb.dqb_itime;
+       if (qn->qh_ops->commit_dquot(&newdquot, COMMIT_ALL) < 0) {
+               errstr(_("Cannot commit dquot for id %u: %s\n"),
+                       (uint)dquot->dq_id, strerror(errno));
+               return -1;
+       }
+       return 0;
+}
+
+static int rename_file(int type, int fmt, struct mntent *mnt)
+{
+       char *qfname, namebuf[PATH_MAX];
+       int ret = 0;
+
+       if (get_qf_name(mnt, type, fmt, 0, &qfname) < 0) {
+               errstr(_("Cannot get name of new quotafile.\n"));
+               return -1;
+       }
+       strcpy(namebuf, qfname);
+       sstrncat(namebuf, ".new", sizeof(namebuf));
+       if (rename(namebuf, qfname) < 0) {
+               errstr(_("Cannot rename new quotafile %s to name %s: %s\n"),
+                       namebuf, qfname, strerror(errno));
+               ret = -1;
+       }
+       free(qfname);
+       return ret;
+}
+
+static int convert_format(int type, struct mntent *mnt)
+{
+       struct quota_handle *qo;
+       int ret = 0;
+       
+       if (!(qo = init_io(mnt, type, infmt, IOI_OPENFILE))) {
+               errstr(_("Cannot open old format file for %ss on %s\n"),
+                       type2name(type), mnt->mnt_dir);
+               return -1;
+       }
+       if (!(qn = new_io(mnt, type, outfmt))) {
+               errstr(_("Cannot create file for %ss for new format on %s: %s\n"),
+                       type2name(type), mnt->mnt_dir, strerror(errno));
+               end_io(qo);
+               return -1;
+       }
+       if (qo->qh_ops->scan_dquots(qo, convert_dquot) >= 0)    /* Conversion succeeded? */
+               ret = rename_file(type, outfmt, mnt);
+       else
+               ret = -1;
+       end_io(qo);
+       end_io(qn);
+       return ret;
+}
+
+static int convert_endian(int type, struct mntent *mnt)
+{
+       int ret = 0;
+       int ofd;
+       char *qfname;
+
+       if (get_qf_name(mnt, type, QF_VFSV0, NF_EXIST, &qfname) < 0)
+               return -1;
+       if ((ofd = open(qfname, O_RDONLY)) < 0) {
+               errstr(_("Cannot open old quota file on %s: %s\n"), mnt->mnt_dir, strerror(errno));
+               free(qfname);
+               return -1;
+       }
+       free(qfname);
+       if (endian_check_header(ofd, type) < 0) {
+               close(ofd);
+               return -1;
+       }
+       if (!(qn = new_io(mnt, type, QF_VFSV0))) {
+               errstr(_("Cannot create file for %ss for new format on %s: %s\n"),
+                       type2name(type), mnt->mnt_dir, strerror(errno));
+               close(ofd);
+               return -1;
+       }
+       if (endian_load_info(ofd, type) < 0) {
+               end_io(qn);
+               close(ofd);
+               return -1;
+       }
+       ret = endian_scan_structures(ofd, type);
+       end_io(qn);
+       if (ret < 0)
+               return ret;
+       
+       return rename_file(type, QF_VFSV0, mnt);
+}
+
+static int convert_file(int type, struct mntent *mnt)
+{
+       switch (action) {
+               case ACT_FORMAT:
+                       return convert_format(type, mnt);
+               case ACT_ENDIAN:
+                       return convert_endian(type, mnt);
+       }
+       errstr(_("Unknown action should be performed.\n"));
+       return -1;
+}
+
+int main(int argc, char **argv)
+{
+       struct mntent *mnt;
+       int ret = 0;
+       
+       gettexton();
+       progname = basename(argv[0]);
+
+       parse_options(argc, argv);
+       init_kernel_interface();
+       if (init_mounts_scan(1, &mntpoint, 0) < 0)
+               return 1;
+       if (!(mnt = get_next_mount())) {
+               end_mounts_scan();
+               return 1;
+       }
+       if (ucv)
+               ret |= convert_file(USRQUOTA, mnt);
+       if (gcv)
+               ret |= convert_file(GRPQUOTA, mnt);
+       end_mounts_scan();
+
+       if (ret)
+               return 1;
+       return 0;
+}
diff --git a/doc/CVS/Entries b/doc/CVS/Entries
new file mode 100644 (file)
index 0000000..fc29a60
--- /dev/null
@@ -0,0 +1,5 @@
+/quotadoc.sgml/1.5/Mon Oct 13 17:29:18 2008//
+/quotas-1.eps/1.1.1.1/Mon Oct 13 17:29:18 2008//
+/quotas.ms/1.1.1.1/Mon Oct 13 17:29:18 2008//
+/quotas.preformated/1.1.1.1/Mon Oct 13 17:29:18 2008//
+D
diff --git a/doc/CVS/Repository b/doc/CVS/Repository
new file mode 100644 (file)
index 0000000..9ca943d
--- /dev/null
@@ -0,0 +1 @@
+quota-tools/doc
diff --git a/doc/CVS/Root b/doc/CVS/Root
new file mode 100644 (file)
index 0000000..3d66810
--- /dev/null
@@ -0,0 +1 @@
+jkar8572@linuxquota.cvs.sf.net:/cvsroot/linuxquota/
diff --git a/doc/quotadoc.sgml b/doc/quotadoc.sgml
new file mode 100644 (file)
index 0000000..ff724bd
--- /dev/null
@@ -0,0 +1,221 @@
+<!doctype linuxdoc system>
+
+<!--
+       Documentation of quota utilities
+-->
+
+<article>
+
+<title>Disk quota system for Linux
+<author>Jan Kara <tt/jack@suse.cz/
+
+<date>2000-2004
+<abstract>
+This document contains documentation of Linux quota disk formats and appropriate quota utilities
+(currently in version 3.12).
+</abstract>
+
+<!-- Table of contents -->
+<toc>
+<!-- Document begins -->
+
+<sect>Introduction
+<label id="intro">
+<p>
+Quota subsystem allows system administrator to set limits on used space and
+number of used inodes (<it/inode/ is a filesystem structure which is associated
+which each file or directory) for users and/or groups. For both used space and
+number of used inodes there are actually two limits. The first one is called
+<it/softlimit/ and the second one <it/hardlimit/.  An user can never exceed a
+hardlimit for any resource. When an user exceeds a softlimit (s)he is warned
+that (s)he uses more space than (s)he should but space/inode is allocated (of
+course only if an user also does not exceed the hardlimit). If an user is
+exceeding softlimit for specified period of time (this period is called
+<it/grace time/) (s)he is not allowed to allocate more resources (so (s)he must
+free some space/inodes to get under softlimit).
+<p>
+Quota limits are set independently for each filesystem. Currently following
+filesystems are supporting quota: Ext2, Ext3, ReiserFS, XFS.
+
+<label id="config">
+<sect>Configuration
+<label id="new_quota">
+<sect1>Setting up new quota
+<p>
+In order for quota subsystem to work you have to have quota compiled in a
+kernel and configured appropriately. That means that the filesystem on which
+you want to use quotas must be mounted with quota options so that quota tools
+recognize the filesystems to work with (and also a filesystem itself might use
+the information).  Currently there are following quota options (note that XFS
+uses completely different quota system and these information does not apply to
+it):
+<itemize>
+<item><tt/usrquota/ or <tt/quota/ or <tt/usrjquota=filename/ if you want to use
+limits for users
+<item><tt/grpquota/ or <tt/grpjquota=filename/ if you want to use limits for
+groups
+</itemize>
+The <tt/usrquota/ and <tt/grpquota/ options have also alternative with
+<tt/=filename/ appended. <tt/filename/ is then used as a name (together with
+path) of quota file to use. But note that by this you prevent quota utilities
+to do some useful autodetection. <tt/jquota/ mount options tell the tools and
+also the filesystem that it should journal the quota. That basically means that
+quota on disk is updated together with filesystem's metadata and hence you do
+not need to run <tt/quotacheck(8)/ after an unclean shutdown. For these options
+specifying of filename is mandatory (because filesystem also needs to know the
+file with quota information) and <tt/filename/ must specify a file in the root
+directory of a filesystem. When any of <tt/jquota/ options is specified
+additional option <tt/jqfmt=format/ must be also specified where <tt/format/ is
+a format of quota files. As journaled quota is currently supported only for
+<tt/vfsv0/ format the value of format must be <tt/vfsv0/. Journaled quota
+is currently (as of July 2005) supported for Ext3 and Reiserfs filesystems
+and you need to have at least 2.6.11 kernel.
+<p>
+For each filesystem with quotas you have to have files with quota data. The
+name of these quota files depends on <ref id="quota_formats" name="quota
+format"> and you can even specify the filenames by yourself by adding
+<tt/=filename/ to <tt/usrquota/ or <tt/grpquota/ options -- e.g.
+<tt/usrquota=file.quota/. But note that by this you prevent quota utilities to
+do some useful autodetection. The quota files can be created by
+<tt/quotacheck(8)/ utility. When you have successfully created quota files you
+can turn quotas on (ie. system will start tracking how much each user uses and
+will check set limits). This is done by <tt/quotaon(8)/ program.
+<label id="converting_quota">
+<sect1>Converting quota formats
+<p>
+When you already have working quota subsystem but you want to use newer quota format
+you have to convert quota files. This can be done by <tt/convertquota(8)/ utility.
+<label id="setting_limits">
+<sect1>Setting user limits
+<p>
+You can edit user (group) limits by <tt/edquota(8)/ or <tt/setquota(8)/ programs.
+By these programs you can also set grace times.
+
+<label id="quota_formats">
+<sect>Quota formats
+<label id="quota_format_old">
+<sect1>Original quota format
+<p>
+Original quota format was the only one available in kernels up to 2.4.21 Linux
+kernels (note that vendors such as <it/RedHat/ or <it/SuSE/ have included quota
+format patches into their kernels earlier and use <ref id="quota_format_v0"
+name="newer quota format">).  This quota format is in manpages and quota utils
+called <tt/vfsold/.
+<p>
+Data for this format are usually stored in files <tt/quota.user/ (for user quotas) and
+<tt/quota.group/ (for group quotas). Both files have the same structure. They are just
+the arrays of following structures:
+<code>
+struct v1_disk_dqblk {
+        u_int32_t dqb_bhardlimit;       /* Absolute limit on disk blks alloc */
+        u_int32_t dqb_bsoftlimit;       /* Preferred limit on disk blks */
+        u_int32_t dqb_curblocks;        /* Current block count */
+        u_int32_t dqb_ihardlimit;       /* Maximum # allocated inodes */
+        u_int32_t dqb_isoftlimit;       /* Preferred limit on inodes */
+        u_int32_t dqb_curinodes;        /* Current # allocated inodes */
+        time_t dqb_btime;       /* Time limit for excessive disk use */
+        time_t dqb_itime;       /* Time limit for excessive files */
+};
+</code>
+Structure for user (group) with id <tt/N/ is stored as <tt/N/-th structure in file.
+In fields <tt/dqb_btime/ and <tt/dqb_itime/ of first structure (id = 0) are stored
+grace times for this filesystem.
+<label id="quota_format_v0">
+<sect1>V0 quota format
+<p>
+This quota format is currently available in 2.4.22 and newer kernels. Also
+kernels distributed by RedHat (>= 7.1) and SuSE (>= 7.2) contain support for
+this quota format.  This format is called <tt/vfsv0/ in manpages and utilities
+and quota files are usually called <tt/aquota.user/ and <tt/aquota.group/.
+<p>
+This quota format has following advantages against old quota format:
+<itemize>
+<item>It allows 32-bit UIDs/GIDs.
+<item>Used space is stored in bytes and so ReiserFS can do precise accounting.
+<item>UID/GID 0 is no longer special (grace times are stored independently).
+<item>Header which allows quota format and version detection was added.
+</itemize>
+<p>
+Format of quota file is the following:
+In the beginning of quota file there is a generic header which is intended to be present
+in every quota file in future. The header has the following structure:
+<code>
+struct disk_dqheader {
+  __u32 dqh_magic;        /* Magic number identifying file */
+  __u32 dqh_version;      /* File version */
+};
+</code>
+From this header any utility or a kernel code should be able to recognize whether they
+understand a format of file and eventually refuse to continue.
+<p>
+Following header might be specific for quota type and version (currently this
+header is the same for user and group quota and there is only one version of
+quota file format).
+<code>
+struct disk_dqinfo {
+  __u32 dqi_bgrace;     /* Time before block soft limit becomes hard limit - in seconds */
+  __u32 dqi_igrace;     /* Time before inode soft limit becomes hard limit - in seconds */
+  __u32 dqi_flags;      /* Flags for quota file (DQF_*) (currently there are no ondisk flags) */
+  __u32 dqi_blocks;     /* Number of blocks in file */
+  __u32 dqi_free_blk;   /* Number of first free block in the list */
+  __u32 dqi_free_entry; /* Number of block with at least one free entry */
+};
+</code>
+There are two linked lists of blocks in a quota file. The first linked list is
+used to link all blocks that are completely unused (<tt/dqi_free_blk/ points to
+the first element of this list). The second linked list is used to link all
+<it/data blocks/ which have at least one entry free and which also have at
+least one used entry.  The beginning of the list is pointed by
+<tt/dqi_free_entry/.
+<p>
+The rest of a file (starting at 1KB) is divided into 1KB blocks. In these
+blocks is stored a radix tree with quotas. The key for the radix tree is UID or
+GID (I will use just ID in the following text) depending on a quota file type.
+One node of the tree is 1KB block so there are up to 256 references to the sons.
+At each level we choose reference corresponding to one byte of ID so having
+four-level radix tree we can support 32-bit IDs.  Reference from the last level
+points to <it/data block/ which contains quota structure for proper ID.
+<p>
+<it/Data block/ has following structure: In the beginning there is a header
+with the following structure:
+<code>
+struct disk_dqdbheader {
+  __u32 dqdh_next_free;   /* Number of next block with free entry */
+  __u32 dqdh_prev_free;   /* Number of previous block with free entry */
+  __u16 dqdh_entries;     /* Number of valid entries in block */
+  __u16 dqdh_pad1;
+  __u32 dqdh_pad2;
+};
+</code>
+Entries <tt/dqdh_next_free/ and <tt/dqdh_prev_free/ are used only if the block
+has at least one free and one used entry. If it has no free entry these
+references are set to 0. When block is completely free only <tt/dqdh_next_free/
+is used for linked list of free blocks.
+<p>
+The rest of the block is divided into 21 quota entries. Unused entry is entry
+that contains only zeros. Note that used entries might be freely scattered in
+the block. Quota entry has the following structure:
+<code>
+struct disk_dqblk {
+        __u32 dqb_id;           /* id this quota applies to */
+        __u32 dqb_ihardlimit;   /* absolute limit on allocated inodes */
+        __u32 dqb_isoftlimit;   /* preferred inode limit */
+        __u32 dqb_curinodes;    /* current # allocated inodes */
+        __u32 dqb_bhardlimit;   /* absolute limit on disk space (in kb) */
+        __u32 dqb_bsoftlimit;   /* preferred limit on disk space (in kb) */
+        __u64 dqb_curspace;     /* current space occupied (in bytes) */
+        __u64 dqb_btime;        /* time limit for excessive disk use */
+        __u64 dqb_itime;        /* time limit for excessive inode use */
+};
+</code>
+<label id="utils">
+<sect>Utilities
+<p>
+As of version 3.01 quota utilities support original, vfsv0 and xfs quota format.
+You can download latest version of utils from <tt>http://www.sf.net/projects/linuxquota/</tt>.
+<p>
+Utils try to do autodetection of currently used quota format (i.e. they detect which
+format is compiled into kernel and they try to use this one). Anytime you can
+force utils to use different format by specifying <tt>-F &lt;format&gt;</tt>. More information
+about quota utils can be found in appropriate manpages.
+</article>
diff --git a/doc/quotas-1.eps b/doc/quotas-1.eps
new file mode 100644 (file)
index 0000000..84a858d
--- /dev/null
@@ -0,0 +1,3716 @@
+%!PS-Adobe-3.0 EPSF-2.0
+%%Creator: Windows PSCRIPT
+%%Title: PowerPoint - QUOTAS.PPT
+%%DocumentNeededResources: (atend)
+%%DocumentSuppliedResources: (atend)
+%%Pages: 0
+%%BeginResource: procset Win35Dict 3 1
+%%BoundingBox: 10 13 832 577
+%%EndComments
+%%BeginProcSet: epsffit 1 0
+gsave
+842.000 0.000 translate
+90 rotate
+1.000 1.000 scale
+%%EndProcSet
+/Win35Dict 290 dict def Win35Dict begin/bd{bind def}bind def/in{72
+mul}bd/ed{exch def}bd/ld{load def}bd/tr/translate ld/gs/gsave ld/gr
+/grestore ld/M/moveto ld/L/lineto ld/rmt/rmoveto ld/rlt/rlineto ld
+/rct/rcurveto ld/st/stroke ld/n/newpath ld/sm/setmatrix ld/cm/currentmatrix
+ld/cp/closepath ld/ARC/arcn ld/TR{65536 div}bd/lj/setlinejoin ld/lc
+/setlinecap ld/ml/setmiterlimit ld/sl/setlinewidth ld/scignore false
+def/sc{scignore{pop pop pop}{0 index 2 index eq 2 index 4 index eq
+and{pop pop 255 div setgray}{3{255 div 3 1 roll}repeat setrgbcolor}ifelse}ifelse}bd
+/FC{bR bG bB sc}bd/fC{/bB ed/bG ed/bR ed}bd/HC{hR hG hB sc}bd/hC{
+/hB ed/hG ed/hR ed}bd/PC{pR pG pB sc}bd/pC{/pB ed/pG ed/pR ed}bd/sM
+matrix def/PenW 1 def/iPen 5 def/mxF matrix def/mxE matrix def/mxUE
+matrix def/mxUF matrix def/fBE false def/iDevRes 72 0 matrix defaultmatrix
+dtransform dup mul exch dup mul add sqrt def/fPP false def/SS{fPP{
+/SV save def}{gs}ifelse}bd/RS{fPP{SV restore}{gr}ifelse}bd/EJ{gsave
+showpage grestore}bd/#C{userdict begin/#copies ed end}bd/FEbuf 2 string
+def/FEglyph(G  )def/FE{1 exch{dup 16 FEbuf cvrs FEglyph exch 1 exch
+putinterval 1 index exch FEglyph cvn put}for}bd/SM{/iRes ed/cyP ed
+/cxPg ed/cyM ed/cxM ed 72 100 div dup scale dup 0 ne{90 eq{cyM exch
+0 eq{cxM exch tr -90 rotate -1 1 scale}{cxM cxPg add exch tr +90 rotate}ifelse}{cyP
+cyM sub exch 0 ne{cxM exch tr -90 rotate}{cxM cxPg add exch tr -90
+rotate 1 -1 scale}ifelse}ifelse}{pop cyP cyM sub exch 0 ne{cxM cxPg
+add exch tr 180 rotate}{cxM exch tr 1 -1 scale}ifelse}ifelse 100 iRes
+div dup scale 0 0 transform .25 add round .25 sub exch .25 add round
+.25 sub exch itransform translate}bd/SJ{1 index 0 eq{pop pop/fBE false
+def}{1 index/Break ed div/dxBreak ed/fBE true def}ifelse}bd/ANSIVec[
+16#0/grave 16#1/acute 16#2/circumflex 16#3/tilde 16#4/macron 16#5/breve
+16#6/dotaccent 16#7/dieresis 16#8/ring 16#9/cedilla 16#A/hungarumlaut
+16#B/ogonek 16#C/caron 16#D/dotlessi 16#27/quotesingle 16#60/grave
+16#7C/bar 16#82/quotesinglbase 16#83/florin 16#84/quotedblbase 16#85
+/ellipsis 16#86/dagger 16#87/daggerdbl 16#88/circumflex 16#89/perthousand
+16#8A/Scaron 16#8B/guilsinglleft 16#8C/OE 16#91/quoteleft 16#92/quoteright
+16#93/quotedblleft 16#94/quotedblright 16#95/bullet 16#96/endash 16#97
+/emdash 16#98/tilde 16#99/trademark 16#9A/scaron 16#9B/guilsinglright
+16#9C/oe 16#9F/Ydieresis 16#A0/space 16#A1/exclamdown 16#A4/currency
+16#A5/yen 16#A6/brokenbar 16#A7/section 16#A8/dieresis 16#A9/copyright
+16#AA/ordfeminine 16#AB/guillemotleft 16#AC/logicalnot 16#AD/hyphen
+16#AE/registered 16#AF/macron 16#B0/degree 16#B1/plusminus 16#B2/twosuperior
+16#B3/threesuperior 16#B4/acute 16#B5/mu 16#B6/paragraph 16#B7/periodcentered
+16#B8/cedilla 16#B9/onesuperior 16#BA/ordmasculine 16#BB/guillemotright
+16#BC/onequarter 16#BD/onehalf 16#BE/threequarters 16#BF/questiondown
+16#C0/Agrave 16#C1/Aacute 16#C2/Acircumflex 16#C3/Atilde 16#C4/Adieresis
+16#C5/Aring 16#C6/AE 16#C7/Ccedilla 16#C8/Egrave 16#C9/Eacute 16#CA
+/Ecircumflex 16#CB/Edieresis 16#CC/Igrave 16#CD/Iacute 16#CE/Icircumflex
+16#CF/Idieresis 16#D0/Eth 16#D1/Ntilde 16#D2/Ograve 16#D3/Oacute 16#D4
+/Ocircumflex 16#D5/Otilde 16#D6/Odieresis 16#D7/multiply 16#D8/Oslash
+16#D9/Ugrave 16#DA/Uacute 16#DB/Ucircumflex 16#DC/Udieresis 16#DD/Yacute
+16#DE/Thorn 16#DF/germandbls 16#E0/agrave 16#E1/aacute 16#E2/acircumflex
+16#E3/atilde 16#E4/adieresis 16#E5/aring 16#E6/ae 16#E7/ccedilla 16#E8
+/egrave 16#E9/eacute 16#EA/ecircumflex 16#EB/edieresis 16#EC/igrave
+16#ED/iacute 16#EE/icircumflex 16#EF/idieresis 16#F0/eth 16#F1/ntilde
+16#F2/ograve 16#F3/oacute 16#F4/ocircumflex 16#F5/otilde 16#F6/odieresis
+16#F7/divide 16#F8/oslash 16#F9/ugrave 16#FA/uacute 16#FB/ucircumflex
+16#FC/udieresis 16#FD/yacute 16#FE/thorn 16#FF/ydieresis ] def/reencdict
+12 dict def/IsChar{basefontdict/CharStrings get exch known}bd/MapCh{dup
+IsChar not{pop/bullet}if newfont/Encoding get 3 1 roll put}bd/MapDegree{16#b0
+/degree IsChar{/degree}{/ring}ifelse MapCh}bd/MapBB{16#a6/brokenbar
+IsChar{/brokenbar}{/bar}ifelse MapCh}bd/ANSIFont{reencdict begin/newfontname
+ed/basefontname ed FontDirectory newfontname known not{/basefontdict
+basefontname findfont def/newfont basefontdict maxlength dict def basefontdict{exch
+dup/FID ne{dup/Encoding eq{exch dup length array copy newfont 3 1 roll
+put}{exch newfont 3 1 roll put}ifelse}{pop pop}ifelse}forall newfont
+/FontName newfontname put 127 1 159{newfont/Encoding get exch/bullet
+put}for ANSIVec aload pop ANSIVec length 2 idiv{MapCh}repeat MapDegree
+MapBB newfontname newfont definefont pop}if newfontname end}bd/SB{FC
+/ULlen ed/str ed str length fBE not{dup 1 gt{1 sub}if}if/cbStr ed
+/dxGdi ed/y0 ed/x0 ed str stringwidth dup 0 ne{/y1 ed/x1 ed y1 y1
+mul x1 x1 mul add sqrt dxGdi exch div 1 sub dup x1 mul cbStr div exch
+y1 mul cbStr div}{exch abs neg dxGdi add cbStr div exch}ifelse/dyExtra
+ed/dxExtra ed x0 y0 M fBE{dxBreak 0 BCh dxExtra dyExtra str awidthshow}{dxExtra
+dyExtra str ashow}ifelse fUL{x0 y0 M dxUL dyUL rmt ULlen fBE{Break
+add}if 0 mxUE transform gs rlt cyUL sl [] 0 setdash st gr}if fSO{x0
+y0 M dxSO dySO rmt ULlen fBE{Break add}if 0 mxUE transform gs rlt cyUL
+sl [] 0 setdash st gr}if n/fBE false def}bd/font{/name ed/Ascent ed
+0 ne/fT3 ed 0 ne/fSO ed 0 ne/fUL ed/Sy ed/Sx ed 10.0 div/ori ed -10.0
+div/esc ed/BCh ed name findfont/xAscent 0 def/yAscent Ascent def/ULesc
+esc def ULesc mxUE rotate pop fT3{/esc 0 def xAscent yAscent mxUE transform
+/yAscent ed/xAscent ed}if [Sx 0 0 Sy neg xAscent yAscent] esc mxE
+rotate mxF concatmatrix makefont setfont [Sx 0 0 Sy neg 0 Ascent] mxUE
+mxUF concatmatrix pop fUL{currentfont dup/FontInfo get/UnderlinePosition
+known not{pop/Courier findfont}if/FontInfo get/UnderlinePosition get
+1000 div 0 exch mxUF transform/dyUL ed/dxUL ed}if fSO{0 .3 mxUF transform
+/dySO ed/dxSO ed}if fUL fSO or{currentfont dup/FontInfo get/UnderlineThickness
+known not{pop/Courier findfont}if/FontInfo get/UnderlineThickness get
+1000 div Sy mul/cyUL ed}if}bd/min{2 copy gt{exch}if pop}bd/max{2 copy
+lt{exch}if pop}bd/CP{/ft ed{{ft 0 eq{clip}{eoclip}ifelse}stopped{currentflat
+1 add setflat}{exit}ifelse}loop}bd/patfont 10 dict def patfont begin
+/FontType 3 def/FontMatrix [1 0 0 -1 0 0] def/FontBBox [0 0 16 16]
+def/Encoding StandardEncoding def/BuildChar{pop pop 16 0 0 0 16 16
+setcachedevice 16 16 false [1 0 0 1 .25 .25]{pat}imagemask}bd end/p{
+/pat 32 string def{}forall 0 1 7{dup 2 mul pat exch 3 index put dup
+2 mul 1 add pat exch 3 index put dup 2 mul 16 add pat exch 3 index
+put 2 mul 17 add pat exch 2 index put pop}for}bd/pfill{/PatFont patfont
+definefont setfont/ch(AAAA)def X0 64 X1{Y1 -16 Y0{1 index exch M ch
+show}for pop}for}bd/vert{X0 w X1{dup Y0 M Y1 L st}for}bd/horz{Y0 w
+Y1{dup X0 exch M X1 exch L st}for}bd/fdiag{X0 w X1{Y0 M X1 X0 sub dup
+rlt st}for Y0 w Y1{X0 exch M Y1 Y0 sub dup rlt st}for}bd/bdiag{X0 w
+X1{Y1 M X1 X0 sub dup neg rlt st}for Y0 w Y1{X0 exch M Y1 Y0 sub dup
+neg rlt st}for}bd/AU{1 add cvi 15 or}bd/AD{1 sub cvi -16 and}bd/SHR{pathbbox
+AU/Y1 ed AU/X1 ed AD/Y0 ed AD/X0 ed}bd/hfill{/w iRes 37.5 div round
+def 0.1 sl [] 0 setdash n dup 0 eq{horz}if dup 1 eq{vert}if dup 2 eq{fdiag}if
+dup 3 eq{bdiag}if dup 4 eq{horz vert}if 5 eq{fdiag bdiag}if}bd/F{/ft
+ed fm 256 and 0 ne{gs FC ft 0 eq{fill}{eofill}ifelse gr}if fm 1536
+and 0 ne{SHR gs HC ft CP fm 1024 and 0 ne{/Tmp save def pfill Tmp restore}{fm
+15 and hfill}ifelse gr}if}bd/S{PenW sl PC st}bd/m matrix def/GW{iRes
+12 div PenW add cvi}bd/DoW{iRes 50 div PenW add cvi}bd/DW{iRes 8 div
+PenW add cvi}bd/SP{/PenW ed/iPen ed iPen 0 eq iPen 6 eq or{[] 0 setdash}if
+iPen 1 eq{[DW GW] 0 setdash}if iPen 2 eq{[DoW GW] 0 setdash}if iPen
+3 eq{[DW GW DoW GW] 0 setdash}if iPen 4 eq{[DW GW DoW GW DoW GW] 0
+setdash}if}bd/E{m cm pop tr scale 1 0 moveto 0 0 1 0 360 arc cp m sm}bd
+/AG{/sy ed/sx ed sx div 4 1 roll sy div 4 1 roll sx div 4 1 roll sy
+div 4 1 roll atan/a2 ed atan/a1 ed sx sy scale a1 a2 ARC}def/A{m cm
+pop tr AG m sm}def/P{m cm pop tr 0 0 M AG cp m sm}def/RRect{n 4 copy
+M 3 1 roll exch L 4 2 roll L L cp}bd/RRCC{/r ed/y1 ed/x1 ed/y0 ed/x0
+ed x0 x1 add 2 div y0 M x1 y0 x1 y1 r arcto 4{pop}repeat x1 y1 x0 y1
+r arcto 4{pop}repeat x0 y1 x0 y0 r arcto 4{pop}repeat x0 y0 x1 y0 r
+arcto 4{pop}repeat cp}bd/RR{2 copy 0 eq exch 0 eq or{pop pop RRect}{2
+copy eq{pop RRCC}{m cm pop/y2 ed/x2 ed/ys y2 x2 div 1 max def/xs x2
+y2 div 1 max def/y1 exch ys div def/x1 exch xs div def/y0 exch ys div
+def/x0 exch xs div def/r2 x2 y2 min def xs ys scale x0 x1 add 2 div
+y0 M x1 y0 x1 y1 r2 arcto 4{pop}repeat x1 y1 x0 y1 r2 arcto 4{pop}repeat
+x0 y1 x0 y0 r2 arcto 4{pop}repeat x0 y0 x1 y0 r2 arcto 4{pop}repeat
+m sm cp}ifelse}ifelse}bd/PP{{rlt}repeat}bd/OB{gs 0 ne{7 3 roll/y ed
+/x ed x y translate ULesc rotate x neg y neg translate x y 7 -3 roll}if
+sc B fill gr}bd/B{M/dy ed/dx ed dx 0 rlt 0 dy rlt dx neg 0 rlt cp}bd
+/CB{B clip n}bd/ErrHandler{errordict dup maxlength exch length gt
+dup{errordict begin}if/errhelpdict 12 dict def errhelpdict begin/stackunderflow(operand stack underflow)def
+/undefined(this name is not defined in a dictionary)def/VMerror(you have used up all the printer's memory)def
+/typecheck(operator was expecting a different type of operand)def
+/ioerror(input/output error occured)def end{end}if errordict begin
+/handleerror{$error begin newerror{/newerror false def showpage 72
+72 scale/x .25 def/y 9.6 def/Helvetica findfont .2 scalefont setfont
+x y moveto(Offending Command = )show/command load{dup type/stringtype
+ne{(max err string)cvs}if show}exec/y y .2 sub def x y moveto(Error = )show
+errorname{dup type dup( max err string )cvs show( : )show/stringtype
+ne{( max err string )cvs}if show}exec errordict begin errhelpdict errorname
+known{x 1 add y .2 sub moveto errhelpdict errorname get show}if end
+/y y .4 sub def x y moveto(Stack =)show ostack{/y y .2 sub def x 1
+add y moveto dup type/stringtype ne{( max err string )cvs}if show}forall
+showpage}if end}def end}bd end
+%%EndResource
+/SVDoc save def
+%%EndProlog
+%%BeginSetup
+Win35Dict begin
+ErrHandler
+%%EndSetup
+SS
+0 0 18 13 783 1169 300 SM
+255 255 255 fC
+/fm 256 def
+3250 2250 88 49 B
+1 F
+n
+1 lc
+1 lj
+0 0 0 pC
+6 17 SP
+gs 2857 2349 88 0 CB
+-2765 499 M 8559 0 1 PP
+S
+n
+gr
+
+%%BeginResource: font MSTT31c1bc
+/GreNewFont{10 dict dup 3 1 roll def dup begin 6 1 roll/FontType 3
+def/FontMatrix exch def/FontBBox exch def/FontInfo 2 dict def FontInfo
+/UnderlinePosition 3 -1 roll put FontInfo/UnderlineThickness 3 -1
+roll put/Encoding 256 array def 0 1 255{Encoding exch/.notdef put}for
+/CharProcs 256 dict def CharProcs/.notdef{}put/Metrics 256 dict def
+Metrics/.notdef 3 -1 roll put/BuildChar{/char exch def/fontdict exch
+def/charname fontdict/Encoding get char get def fontdict/Metrics get
+charname get aload pop setcachedevice fontdict begin Encoding char
+get CharProcs exch get end exec}def end definefont pop}def/AddChar{begin
+Encoding 3 1 roll put CharProcs 3 1 roll put Metrics 3 1 roll put end}def
+/MSTT31c1bc [58.0 0 0 0 0 0] 51 -102 [-58.0 -58.0 58.0 58.0] [1 58 div 0 0 1 58 div 0 0] /MSTT31c1bc GreNewFont
+%%EndResource
+
+32 0 0 58 58 0 0 1 53 /MSTT31c1bc font
+
+%%BeginResource: font MSTT31c1bc
+/G54 [35.0 0.0 2.0 0.0 33.0 39.0]
+/G54 {
+    31 39 true [1 0 0 -1 -2.0 39.0] {<fffffffefffffffef807c03ee007c00ec007c006c007c0068007c0028007c0028007c0020007c000
+0007c0000007c0000007c0000007c0000007c0000007c0000007c0000007c0000007c0000007c000
+0007c0000007c0000007c0000007c0000007c0000007c0000007c0000007c0000007c0000007c000
+0007c0000007c0000007c0000007c0000007c0000007c000000fe000001ff00001ffff00>} imagemask 
+  }
+  84 /G54 MSTT31c1bc AddChar
+/G68 [28.0 0.0 0.0 0.0 28.0 41.0]
+/G68 {
+    28 41 true [1 0 0 -1 0.0 41.0] {<038000000f8000007f800000ff8000000f8000000f8000000f8000000f8000000f8000000f800000
+0f8000000f8000000f8000000f8000000f81f0000f87f8000f8ffc000f987e000fa03e000fc03f00
+0f801f000f801f000f801f000f801f000f801f000f801f000f801f000f801f000f801f000f801f00
+0f801f000f801f000f801f000f801f000f801f000f801f000f801f000f801f000f801f001fc03f80
+fff9fff0>} imagemask 
+  }
+  104 /G68 MSTT31c1bc AddChar
+/G69 [15.0 0.0 1.0 0.0 14.0 41.0]
+/G69 {
+    13 41 true [1 0 0 -1 -1.0 41.0] {<038007c007c007c0038000000000000000000000000000000000000003800f807f80ff800f800f80
+0f800f800f800f800f800f800f800f800f800f800f800f800f800f800f800f800f800f800f801fc0
+fff8>} imagemask 
+  }
+  105 /G69 MSTT31c1bc AddChar
+/G72 [19.0 0.0 0.0 0.0 19.0 27.0]
+/G72 {
+    19 27 true [1 0 0 -1 0.0 27.0] {<0187c00f8fe07f9fe0ffb3e00fe1c00fc0000fc0000f80000f80000f80000f80000f80000f80000f
+80000f80000f80000f80000f80000f80000f80000f80000f80000f80000f80000fc0001fe000fff8
+00>} imagemask 
+  }
+  114 /G72 MSTT31c1bc AddChar
+/G64 [29.0 0.0 2.0 -1.0 29.0 41.0]
+/G64 {
+    27 42 true [1 0 0 -1 -2.0 41.0] {<00000e0000003e000001fe000003fe0000003e0000003e0000003e0000003e0000003e0000003e00
+00003e0000003e0000003e0000003e00007e3e0001ffbe0003c3fe000f00fe000e007e001e007e00
+3c007e003c003e007c003e0078003e0078003e00f8003e00f8003e00f8003e00f8003e00f8003e00
+f8003e00f8003e00fc003e007c003e007e003e007e003e003f007e003f80fe001fe1bfe00fffbfc0
+03fe3e0000f83800>} imagemask 
+  }
+  100 /G64 MSTT31c1bc AddChar
+/G20 [15.0 0.0 0.0 0.0 0.0 0.0]
+/G20 {
+} 
+  32 /G20 MSTT31c1bc AddChar
+/G49 [19.0 0.0 1.0 0.0 18.0 39.0]
+/G49 {
+    17 39 true [1 0 0 -1 -1.0 39.0] {<ffff800ff80007f00003e00003e00003e00003e00003e00003e00003e00003e00003e00003e00003
+e00003e00003e00003e00003e00003e00003e00003e00003e00003e00003e00003e00003e00003e0
+0003e00003e00003e00003e00003e00003e00003e00003e00003e00007f0000ff800ffff80>} imagemask 
+  }
+  73 /G49 MSTT31c1bc AddChar
+/G6e [28.0 0.0 0.0 0.0 28.0 27.0]
+/G6e {
+    28 27 true [1 0 0 -1 0.0 27.0] {<0381f0000f87fc007f8ffc00ff987e000fa03e000fc03f000f801f000f801f000f801f000f801f00
+0f801f000f801f000f801f000f801f000f801f000f801f000f801f000f801f000f801f000f801f00
+0f801f000f801f000f801f000f801f000f801f001fc03f80fff9fff0>} imagemask 
+  }
+  110 /G6e MSTT31c1bc AddChar
+/G74 [16.0 0.0 0.0 -1.0 16.0 35.0]
+/G74 {
+    16 36 true [1 0 0 -1 0.0 35.0] {<0080018001800380038007800f801f803f807ffefffe0f800f800f800f800f800f800f800f800f80
+0f800f800f800f800f800f800f800f800f800f800f800f810fc207fc03f801f0>} imagemask 
+  }
+  116 /G74 MSTT31c1bc AddChar
+/G65 [26.0 0.0 2.0 -1.0 24.0 27.0]
+/G65 {
+    22 28 true [1 0 0 -1 -2.0 27.0] {<00fe0003ff80070fe00e03f01c01f03801f83800f87000fc7000fc7ffffcfffffcf00000f00000f0
+0000f00000f80000f80000f80004fc000c7e000c7f00187f80383fe0f01ffff00fffe007ffc003ff
+8000fc00>} imagemask 
+  }
+  101 /G65 MSTT31c1bc AddChar
+/G61 [26.0 0.0 2.0 -1.0 26.0 27.0]
+/G61 {
+    24 28 true [1 0 0 -1 -2.0 27.0] {<01fe000fff801f0fc03c03e07c03f07c01f07c01f07c01f03801f00001f00003f0001ff0007df003
+e1f00781f01f01f03e01f07c01f07801f0f801f0f801f0f801f0fc03f0fc07f17e1df37ff9fe3fe1
+fc0f80f0>} imagemask 
+  }
+  97 /G61 MSTT31c1bc AddChar
+/G6f [29.0 0.0 2.0 -1.0 27.0 27.0]
+/G6f {
+    25 28 true [1 0 0 -1 -2.0 27.0] {<007f000001ffc0000783f0000f00f8001e007c001c007e003c003e003c003f0078001f0078001f00
+f8001f80f8000f80f8000f80f8000f80f8000f80f8000f80f8000f80fc000f007c000f007c000f00
+7e000e003e001e003f001c001f003c000f80780007e0f00003ffc000007f0000>} imagemask 
+  }
+  111 /G6f MSTT31c1bc AddChar
+/G6c [15.0 0.0 1.0 0.0 14.0 41.0]
+/G6c {
+    13 41 true [1 0 0 -1 -1.0 41.0] {<03800f807f80ff800f800f800f800f800f800f800f800f800f800f800f800f800f800f800f800f80
+0f800f800f800f800f800f800f800f800f800f800f800f800f800f800f800f800f800f800f801fc0
+fff8>} imagemask 
+  }
+  108 /G6c MSTT31c1bc AddChar
+/G4c [34.0 0.0 0.0 0.0 33.0 39.0]
+/G4c {
+    33 39 true [1 0 0 -1 0.0 39.0] {<ffff8000000ff800000007f000000003e000000003e000000003e000000003e000000003e0000000
+03e000000003e000000003e000000003e000000003e000000003e000000003e000000003e0000000
+03e000000003e000000003e000000003e000000003e000000003e000000003e000000003e0000000
+03e000000003e000000003e000000003e000000003e000008003e000018003e000010003e0000300
+03e000030003e000070003e0000e0003e0001e0007f0007e000ffffffc00fffffffc00>} imagemask 
+  }
+  76 /G4c MSTT31c1bc AddChar
+/G75 [28.0 0.0 0.0 -1.0 28.0 26.0]
+/G75 {
+    28 27 true [1 0 0 -1 0.0 26.0] {<ff81ff001f803f000f801f000f801f000f801f000f801f000f801f000f801f000f801f000f801f00
+0f801f000f801f000f801f000f801f000f801f000f801f000f801f000f801f000f801f000f801f00
+0f801f000f803f0007c05f0007e19ff003ff1fe001fe1f0000f81c00>} imagemask 
+  }
+  117 /G75 MSTT31c1bc AddChar
+/G78 [28.0 0.0 0.0 0.0 28.0 26.0]
+/G78 {
+    28 26 true [1 0 0 -1 0.0 26.0] {<fff07fc03fc01f000fc01e000fc01c0007e0380003f0300001f8600001f8c00000fd8000007f8000
+007f0000003f0000001f8000001f8000001fc0000037e0000063f00000c3f0000181f8000300fc00
+0300fc0006007e000c003f001c003f803e007fc07f81fff0>} imagemask 
+  }
+  120 /G78 MSTT31c1bc AddChar
+/G43 [39.0 0.0 2.0 -1.0 37.0 40.0]
+/G43 {
+    35 41 true [1 0 0 -1 -2.0 40.0] {<0001ff0080000ffff180003f00ff80007c003f8001f0000f8003e000078007c00003c00f800001c0
+0f800001c01f000000c01f000000c03e000000c03e000000407e000000007e000000007c00000000
+fc00000000fc00000000fc00000000fc00000000fc00000000fc00000000fc00000000fc00000000
+fc00000000fc000000007e000000007e000000007e000000003f000000003f000000201f80000040
+1f800000c00fc000018007e000030007f000060003fc001c0000ff807800007ffff000001fffc000
+0003fe0000>} imagemask 
+  }
+  67 /G43 MSTT31c1bc AddChar
+/G66 [18.0 0.0 1.0 0.0 24.0 41.0]
+/G66 {
+    23 41 true [1 0 0 -1 -1.0 41.0] {<0007e0003ff80070fc00e07e01e03e01c03e03c01c03c00003c00007c00007c00007c00007c00007
+c00007c000ffff80ffff8007c00007c00007c00007c00007c00007c00007c00007c00007c00007c0
+0007c00007c00007c00007c00007c00007c00007c00007c00007c00007c00007c0000fe0001ff000
+ffff00>} imagemask 
+  }
+  102 /G66 MSTT31c1bc AddChar
+/G63 [26.0 0.0 2.0 -1.0 24.0 27.0]
+/G63 {
+    22 28 true [1 0 0 -1 -2.0 27.0] {<007f0001ffc00783e00f01f01e01f03c01f83c00f87c00f8780070780000f80000f80000f80000f8
+0000f80000fc0000fc0004fc000cfe000c7e00087f00183f80383fe0f01fffe00fffe007ffc003ff
+0000fc00>} imagemask 
+  }
+  99 /G63 MSTT31c1bc AddChar
+/G2d [19.0 0.0 2.0 11.0 17.0 16.0]
+/G2d {
+    15 5 true [1 0 0 -1 -2.0 16.0] {<fffefffefffefffefffe>} imagemask 
+  }
+  45 /G2d MSTT31c1bc AddChar
+/G42 [38.0 0.0 0.0 0.0 35.0 39.0]
+/G42 {
+    35 39 true [1 0 0 -1 0.0 39.0] {<fffffe00000fffffe00007f00ff80003e001fc0003e000fe0003e0007f0003e0003f0003e0003f80
+03e0001f8003e0001f8003e0001f8003e0001f8003e0001f8003e0003f0003e0003f0003e0007e00
+03e000fe0003e003f80003fffff00003ffffe00003e007fc0003e000ff0003e0007f8003e0001fc0
+03e0001fc003e0000fe003e00007e003e00007e003e00007e003e00007e003e00007e003e0000fc0
+03e0000fc003e0001f8003e0003f8003e0007f0007f803fe000ffffff800ffffff8000>} imagemask 
+  }
+  66 /G42 MSTT31c1bc AddChar
+/G4d [52.0 0.0 0.0 0.0 52.0 39.0]
+/G4d {
+    52 39 true [1 0 0 -1 0.0 39.0] {<fff00000007ff00ff0000000ff0007f8000000fe0003f8000001fc0003fc000001fc0003fc000003
+fc0003fe000003fc0003be0000077c0003bf0000077c00039f00000e7c00039f80000e7c00038f80
+000e7c00038fc0001c7c000387c0001c7c000387e000387c000383e000387c000383e000707c0003
+81f000707c000381f000e07c000381f800e07c000380f801c07c000380fc01c07c0003807c01c07c
+0003807e03807c0003803e03807c0003803f07007c0003801f07007c0003801f8e007c0003800f8e
+007c0003800fdc007c00038007dc007c00038007f8007c00038003f8007c00038003f8007c000380
+01f0007c00038001f0007c0007c000e000fe000fe000e001ff00fffe00401ffff0>} imagemask 
+  }
+  77 /G4d MSTT31c1bc AddChar
+/G79 [28.0 0.0 0.0 -12.0 28.0 26.0]
+/G79 {
+    28 38 true [1 0 0 -1 0.0 26.0] {<fff00ff07fc003c03f8003801f8003800f8003000fc0030007c0060007e0060003e0060003f00c00
+01f00c0001f8180000f8180000fc1800007c3000007c3000003e6000003e6000003f6000001fc000
+001fc000000f8000000f8000000780000007000000030000000600000006000000060000000c0000
+000c000000180000001800003c3000007ff000007fe000007f8000001e000000>} imagemask 
+  }
+  121 /G79 MSTT31c1bc AddChar
+/G39 [29.0 0.0 2.0 0.0 26.0 40.0]
+/G39 {
+    24 40 true [1 0 0 -1 -2.0 40.0] {<007e0003ff800783c00f01f01e00f03c00783c007c78003c78003e78003ef8001ef8001ff8001ff8
+001ff8001ff8001ffc001f7c001f7c001f7e003f3e003f1f007e0fc3fe07ff7e01f87c00007c0000
+fc0000f80001f00001f00003e00007c00007c0000f80001f00003c0000780001e00007c0007e0000
+>} imagemask 
+  }
+  57 /G39 MSTT31c1bc AddChar
+/G36 [29.0 0.0 2.0 0.0 26.0 40.0]
+/G36 {
+    24 40 true [1 0 0 -1 -2.0 40.0] {<00003e0003f0000f80001e00003c0000f80001f00001e00003c00007c0000f80000f80001f00003f
+00003e00003e1f807effe07f83f07e00f8fc00fcfc007efc003ef8003ef8003ff8001ff8001ff800
+1ff8001ff8001f78001f7c001e7c001e3c001e3e003c1e003c0f00780f80f007c1e001ffc0007e00
+>} imagemask 
+  }
+  54 /G36 MSTT31c1bc AddChar
+%%EndResource
+
+0 0 0 fC
+25 8 SJ
+153 2191 1278 (Third International Linux Conference - Berlin - May 96) 1278 SB
+
+%%BeginResource: font MSTT31c1bc
+/G31 [29.0 0.0 6.0 0.0 22.0 40.0]
+/G31 {
+    16 40 true [1 0 0 -1 -6.0 40.0] {<006003e00fe07fe0c7e003e003e003e003e003e003e003e003e003e003e003e003e003e003e003e0
+03e003e003e003e003e003e003e003e003e003e003e003e003e003e003e003e003e003e007f07fff
+>} imagemask 
+  }
+  49 /G31 MSTT31c1bc AddChar
+%%EndResource
+
+2919 2191 29 (1) 29 SB
+
+%%BeginResource: font MSTT31c1c9
+11 dict begin
+/FontInfo 8 dict dup begin
+/FullName (MSTT31c1c9) def
+/FamilyName (MSTT31c1c9) def
+/Weight (Normal) def
+/ItalicAngle 0 def
+/isFixedPitch false def
+/UnderlinePosition -109 def
+/UnderlineThickness 49 def
+end def
+/FontName /MSTT31c1c9 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [1 2048 div 0 0 1 2048 div 0 0] def
+/Encoding 256 array
+0 1 255 { 1 index exch /.notdef put } for
+30 255 FE
+def
+/FontBBox { 0 0 0 0 } def
+currentdict end
+currentfile eexec
+9e67edc6f3ddb54d987dfb0ad4392351758038a4ddcd7496126caebf3c4b776a9348fe88419c70c199dfed3be58c5559d44f85ed1b3b2d48c178aedfd3de0022
+1e04c6d4d0f48db1093382653d5c4a389b722bcd118482d76f60847858ee2b7fec8602e8fe84654d4a23e6e5b0a6a07705c6bdece2812668fa8d0c1c49883c1f
+ed5ef1fdceb49b11bd5c332ead97409150c8af0e5e03714ae6a229de223eb4d5df5f7ab0118978c08a67ebecb1283fb8e39fb2db8e5600d202b2909bfbdaa269
+abe5b36800302965c990a082835f3ac6efc9d64fe188cac4bb439c5f84ad8b5731ddb08c0b1aace01863a3d07f18d467b74f78e9d59d6f8dbb3c02ff1f33e752
+fcafa6b90648c821a1c6a6996ce5ab2f5507fbd175bf3a4b32a289ea31054444a2d44fcbaf008e1127661229de7dc37108848f4e9d4faf147cc1e00ac8048f85
+d0c3563f9385d8e93c91dc7fc9631ce01da924ff3d51539c2e089feace7a3708e9d2522cd0c4d5cdce2bbeccd30fdee2b9e98a6f99b1f22257b7
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+
+cleartomark
+%%EndResource
+
+32 0 0 167 167 0 0 0 150 /MSTT31c1c9 font
+%%BeginResource: font MSTT31c1c9
+currentfile eexec
+9e67edc6b858a3e762244b628fb7f6f6b82db3d80533f85f9af7ec02fa0992f446e47e7476690365d15488a3d0557140c554c35b60083b9bf344ec199d995ff7
+cd974526686a837538b7a59d07d79b775d66db7f06b827e8ff4a2eb8a86a8433f9bba3a08ac51527ba66676ba5e87a8c35863c1d300d30244be0d12343c25ffa
+9f4d05d39ff23460fb3d423dc49c437f6bb9da6732dfcaf8d49f73ecfd0a2cea4b81f4830b5a5141dba90708e5b839ec4995bd45e8afeb94764a0f8aa57ef193
+428bbd3ae615cf958f6d9d734c885a4f29abf4504548ac5a355cb17006a16fdb9408bc90b2dfd2fc1387d824f1debaaa3987bd287feff105b69d7fe93ef6883b
+e0af2d2940ca07eb27030f4c14a8450cb52a98ce2500efd110cd8b3ea886053ead9bd5cacec38b807b3fbc94030f664f10b682be9a44509ba251515def870572
+1d26ca3aad2c32bebc5ccee3d18d95267bb565a655cd5ed0ab3a9e405c3eea95f233c357933db74f3a38eee1d08bf0b21ffe1aeacb490e977f4f7584539a1e19
+4c07b8d2e7dbfda90a5904ba54699c108acf1ba19892f8355e4d24639459b4518615fbee2122d9da66f42615386f5ee7925da010effed50b528057fd8f814b55
+b0de7c96c8b2ba89688fc49900ed140cf762bcaab025e4c5238166ea7ee7dac63774dcd1273a5519476b9de552f327588cbd15028562b1f2865acfa2f4ebe964
+15a7797feebc4a244649f27c987a80aac7dfdcb83ded53f98f579846d252ed9ca464e3e02d4d2ca61e0d7ac74b4d21c7b8e8dea84c3190c121b9120a9db2c539
+870be51291b34f801213611c24aa6f704d5c7aa827802af2fede4901f3a5e40c50ee8995745bd2a1fab16b1c3968bfa2454a9f8990036151d9464cddcefe41a1
+9b8bff464e2cf751d3968de0bba7336103fa2be945c74230c360d195a77173fe9e8c90e89ff0908f11381f5ccc9913be734b95d922dfd7a24cce2c2dfee3c400
+eefe54dfe3c5262449debb38fe06d6356cbdc79a707677a9ee854c5fa7a372def6fe9a1fd6fce94f3c73bff36a3e9886953c29dad84b51a55fb29e4aee39bb61
+aa4ee7727b9be20c1dd95828f1e7beb4c63ce43c5c4b5857c8abe1ed4cea10208d1a8bc832e19d32f8ebf5717ac9ba4c99d4607754d5d16229304ba1efa37632
+e6733c0bb38d5b9bac4cda3d111425156fb5da060eef679fd02e5db0aa3ebd42e68485b3835fb33095460cb3d7d33379c65fff26a3972f4eada94b1ccb8b0c53
+9b1a1ed9af028bb2e4aa9a9bbf4eac5ef0ef30c99a07766731df7a7d2cbc2aeba8e813d13f1806b733882dde18d76be093cc4127073081b7f3df1a8b6e40ec83
+506bb12716c247508084301940a874e192125fae70e15e423796cb9e35d45660ddc4e87a78ca22970105b6bb49ccb7e0f25ebd728af622d7298a0816dc6b6767
+3bd4c6c11960cc1a258149bc8bf078c023a283f1479157b66365c4adc8cf9521e696a13ae71466faa926191c6005bcd33075dd7c6cb07c0b822b1262c5cf767e
+1b296056976de0d0b744b6f540de9901670a590010ab28d5b2ee9f3c667bb1b76e4ba590daf4029f6829e146ac4293464b19833a2cf1a7c794c73e64f7c82ad1
+a5c1a0fb6f29d70df2201744772878fede649d7a444d479c786009b0b3221fe4c62665daf8ad8b7a160ecd05eeaed8bf1532c13a01467fcd2d95a05e681e1e52
+469bab6485b3d5b2d069d189f051c76a04b3ceed83b0a0f37ffdd8e92698e24ddd12a5b2dd3c9a6fd8db0d5a47629dbb5279a611383b087c971638aec6aa56e0
+84a83ef5589a664941c82ccafaa198c874e85892e67fc685e2a939485e57df8473b7e53cf97f03f2b666dac319895f02b1f167b74f12fcb7104eae01b10c1320
+de826cd4dc760ee59113ec742a7d74ce5c4f9741d3cb13fedadcb71067ad820f92e2b4aa5539707fe3cd6060993ab0d9c95ea8d8349e2fbfde8a05ac7e6fe34c
+1dadb4a14df7166de443467a39c7741ae9e1a59cbdf8733cfd5b64bfbf12d37ef50f4a9a765c7bf87079b046828793a5792193fd8985393a9db373c0650306e8
+4ef33c82937580b036eee02ebeea82c84c58552f7c52cf0ef43814cc1b1e9e8908d1150e5d7bbf2ce0e8ac497b04bd310ffdeb76b2d94e3c0a797cab4a992de6
+5858c95ceee596507da6b0896517a13778d028831e02b3059ae80a479f8e0d6a3763b402ed8286329f95ab006611b5fc7502f32e093751cd6bfe3e564078ca23
+504db2e91efa9dee56ac9c1a17a682e99ee9e36221d506fb0a1fc3fb5fb0521cc99b2d4c2d22f284d9cc0aea65a937b7424cc62e4e3815722400a3b8cb0058e6
+695fe0bca7b6d947c89570772e9367bbed7bd86c1c819cfc45d76fe8a6d39edc9d70dd1ffe266ac48c1ea72be9d36850b07cd1ddbedac72d40440cd40808ef58
+cf76954afc94cb71c25297234464c94eed023e49e3f6613f506fab97213a3281cb6a0b58157c6077edf84624eb9c79526ace10116d095e349a71f249d2559c8b
+a3b9377d49adc86e27abc0b12c70b8c962ae344c791241359e09504dbe3948b70f5a3e4874b9f0c7824d7fa22db2b93877b31cb9f71df8472fcd23ac7dc46e21
+4aafcfd8d41b80a9d027553a457199ff15ac580547d4db485c7750bddffad0d26fe90668afc59c612d9f4e388c676628118a1d2f977c70a6cb046c710437ce20
+b06af40524ad07e6b40d324e8d6964ab15ea9d6e745f1db5b7b194bfe0f08bc7310a9c41d79e8a34279f5c84988ccd53ad2aa17d82b8c1162e250ec3dadd48b4
+cabb848b84a64d587304eccc885e417a751a3bacdecd49e24163025611497d8734737194a45846f47fbaefe6be519819ba35a562d99808821ced8fc5f8870a03
+22d2015aafcb05ef5c0218cc61802c75cffef07165b98f9c72c0b8c2c09e6302f20465501c66cec8588351b7ebda0309015ef4bcbb1ec92ff2e76cb4a7615ab1
+6495f73631dbfb0c2c4bcd7a0d391cadb9d395e5b9d05a60f16b13317778c03dbd5e9549351f9544ce546f4fe065fe1293fbda5107f133552c0deba970cd47da
+9add288cdc884129e8c2f41c96b86955072370a13739df1d8571fde3d2841319c711ad53724cd1f8c5fb5f310d03ac8d8d68e98069a6792f9abf33c32a45dc0f
+83c4e02542af6b57ac09d4af238e63458802a95a462241c14139a475335bbe2bde73af860d7dbcf475ff6f35a3e1899a4a4d5085c590c05c84dcf4f35df534a0
+8d1736481a0d22a4408c3ca996e127547352788a7a8b4059fb4f22c8c215c64ac947d46fcc1ab3f87fd3f77040e93630a48ff52ea5c4687d7ab4afb6974a4b3e
+d53004e6584a3c3d0a5521180ecebd0f3eceabd76cc46136e7ced8aef737a883422e8e2557c67d46acb63ca2dfc0a9772cbc9f5a6472d2a1395b587b8859ee4e
+a41566f7709a78c314e257cf06b1f0d8dffa2116727132af174ea3cbfe255f0ccae43b587f9d9274b4e62d060253327df4ca4f12acaf7e5c7ad603aa44563b1c
+2d1073112be1696a9e3bc20d1b06a80dec85b944dc2992cc1e069ee2488f720fa1eaca5e5be9b13870b5a139fdfe917672c78c320594d9a38ef66f00458d5b70
+fad00e5cd296b83df525bc52c14ae625c68cdf9e446ff9ec912b3861d0e6ad408342785b3990afa28877887739420cc3414b0ffbf53e444add20541b0e6e1e86
+32e8cf6ebf640ff1152d1d1bc42df59e4deeee02be60841901a9ca18e811e29c0105034aa87d9359342d6cd08240fbca3ff1ba7e79a70d64c8af8fbb29346a62
+15fa6beab840a28b746462a12e2ea63683079e1ae67db3dd20f55543706eb784875a308ab44ad82eb34dda904501ba6e6798030941545b7515a9457ee6bf926f
+247d11735f995c242801c480afd57d7b79ae00c159613807e6280f7f370b3929de9d
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+
+cleartomark
+%%EndResource
+-3 1 SJ
+851 796 1387 (Quotas Management) 1387 SB
+
+%%BeginResource: font MSTT31c1d6
+11 dict begin
+/FontInfo 8 dict dup begin
+/FullName (MSTT31c1d6) def
+/FamilyName (MSTT31c1d6) def
+/Weight (Normal) def
+/ItalicAngle 0 def
+/isFixedPitch false def
+/UnderlinePosition -109 def
+/UnderlineThickness 49 def
+end def
+/FontName /MSTT31c1d6 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [1 2048 div 0 0 1 2048 div 0 0] def
+/Encoding 256 array
+0 1 255 { 1 index exch /.notdef put } for
+30 255 FE
+def
+/FontBBox { 0 0 0 0 } def
+currentdict end
+currentfile eexec
+9e67edc6f3ddb54d987dfb0ad4392351758038a4ddcd7496126caebf3c4b776a9348fe88419c70c199dfed3be58c5559d44f85ed1b3b2d48c178aedfd3de0022
+1e04c6d4d0f48db1093382653d5c4a389b722bcd118482d76f60847858ee2b7fec8602e8fe84654d4a23e6e5b0a6a07705c6bdece2812668fa8d0c1c49883c1f
+ed5ef1fdceb49b11bd5c332ead97409150c8af0e5e03714ae6a229de223eb4d5df5f7ab0118978c08a67ebecb1283fb8e39fb2db8e5600d202b2909bfbdaa269
+abe5b36800302965c990a082835f3ac6efc9d64fe188cac4bb439c5f84ad8b5731ddb08c0b1aace01863a3d07f18d467b74f78e9d59d6f8dbb3c02ff1f33e752
+fcafa6b90648c821a1c6a6996ce5ab2f5507fbd175bf3a4b32a289ea31054444a2d44fcbaf008e1127661229de7dc37108848f4e9d4faf147cc1e00ac8048f85
+d0c3563f9385d8e93c91dc7fc9631ce01da924ff3d51539c2e089feace7a3708e9d2522cd0c4d5cdce2bbeccd30fdee2b9e98a6f99b1f22257b7
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+
+cleartomark
+%%EndResource
+
+32 0 0 150 150 0 0 0 134 /MSTT31c1d6 font
+%%BeginResource: font MSTT31c1d6
+currentfile eexec
+9e67edc6b858a3e762244b628fb01cf58f07fd3c01ea854585188a66a8f12aa17a95328b3ac7a563452355cdf678c51a4bd3287a046903abe9db4db7daee86d4
+aee44d97fdc85665066b373c0792e435f219551d1b381c469ea92e4ab34b9cf795f06a025e57d038642fbb46bf3d97ce665b4953318c1a4d0b1e84550ff76556
+5e97303458a9a8c72b9c1c85a1f761b3fafb37f172c6d3e4df174826bc2941e412e5cb3ed4d0ac348381fe6d1c11d07f669981e211812e3ebeffb1906914748d
+fbeae9ad08622df9c8908991684159d0842814d75741ba962c8dad83e6181fd23644266c2302745f433b949d1695beda980a6c47e997fcf53026e9b40af29b0d
+3ea5f5d4a6e9f971d4418b4055584386c498cafe2148f3ac9ae0c79b7fba7e0959e48e2c6a8383995003ec2b90f602f46626f3374925d020c0405bf51ce9eec5
+ce9343477b8c2736bd6894ce1bbbbe9beb6101d80b1f4f63d63334c4045c2426596e994ffe3c36fa7f3adaa39b3ef93106dd774c7f270779a898aa66754f5c52
+690bdae6a204aa4f61efef8f2bb9a72584fc8fc81ee62e3e42378e83753bea564c275fb3662ad1e72ca1623d304c711c7aacc6cea03d6cc24827b0f37dcf82e9
+67362aa9fdd3c5cde7b4ab202acf0a05decf30ab4a5fa2edee73e0e2848351e6e06eeb9bba82744b1a47738896af84b6bf490c479c601f2e6d3abf792667ec4d
+17218121218e67ce24323878a663fba773d8460438b0331f727aed6fb7582efafaabebb282ea590ea3af5e1ad02738272586c5de9f881a56b61942fee714f11e
+bae04cb115f5f2f69c0ab4ff07faae9d4e7b4ddc6c97cbe0a93c1650f2bd05b6f7363fc395fa7dce160c201534acb0b0c3a5a144d3971aea6a854aba5a70086d
+30f20e07a2b7e06e26183c04d88a5de3bca7b245dc79481e693fe24a0d2fc1b5157d9be970905cac9b3cb683f12795e54110b3f8af334b3e2d43689e87a43879
+a0ec0140016e5bf0b954f785adf177e1ddaee7154bd37c9c7814c5d75fde747357e83de8384d06323a2d39654585e6e914bc35b5ecb1fd8c7ab08174de73c86c
+5f809a35103df8eddee503cd9d93729ce4cde2e7f70da6bf42f74762ac997262e15bcc4de700145c8950ee8b6a191a6f11b58431edbbe9e6a553ae4c18151cc7
+3137547830daa00df1c47932e85eb2f047e0d26494711f2b3c2069038ce66c1b83fe2e78dacc09599e1d2e6a403b3638a44661461595f7d39486a0c580781dbd
+edca70b836e6c4a8003ca70bf2e0528bfa27930c6e54aa458f670ee710ac0e6e06e66dd45c2e6de096ab627509091c5366773a42041bebdeac5fc8e187097288
+1fd06cbb241c402036a5b1604286ba94e61194312ce573b2f97e7ec8e869839bece474f34f158336df468f557cd7b6826f9cc1b05425228a8ca35b7c2075a463
+ef3fde8f1b210a0068a23de1531043ee3ad3916dcc2809ed2c2792bf7b7b28a9a9eb4373f313239573ebb81bcf59ce04525a437f04bacb25d11b10da0d8b2792
+3caffa9f1ed84c3747cf515a8dcd1389a2b01675fe31e21ec54cb395a29b532ca8c51d8002ed87d8b3386de94c7006b6eab7d7093106047ec358e45914918e53
+7786252cd87ce758393ab6101b6da3baaad98db8ea61db22c6d0083646bc00e55b481f91391ef371d6f56fee94350a9d77f45ca5c3315120ceb0873529e463fe
+c9236c31fe3fb5866b79d4cd79a52eb6fa9a52cd609e5ca13b1486fd0f05c34cc7cbd139653324ab3eb05081e5abb5b3e1813374a97e8f0a73c0168a2635d5e5
+14de857d3bb39fb208389cffd99ceb7318fd110e543fb58595825c87f0234d97b649f568cdfd32cce2e8f3c6436edd8366193c0a6046b5b19ea6e703fc681fe0
+c1a1edc98389f8f56bf31a0a70149bc5c0618576798edea239fd9baeacb4973a0edfa947ed3934876fd8663deb6164a180b0a19ad1bc268f0084648c4ca2a1e9
+848cb645ab16be2cacc42ae81b22aade1267f4b46a5fef5839a4419457256730d8ab39acc12540d748a49a823731632d452b8ffc10e7c0ce9ca6687cdb5d399d
+60fa214693f775f82c7901172520e8bce058193b4e60ac7d656cd7a46973732f329bd6bc2ab5e84a57957eb1aa661c4cafc8566b84b20b988999f664b4a27327
+80f33e0d7c4d418ebe9c9cf09e8c6bf517cbb6bf0b2f70f7efbb81108e59fd17aa1d0428c65988928c03c1ecfb42fb3d02b450651bdc0711e530ee2db6557918
+07fbbd7229ec3b54a0f994f88a410e0fc15544832e7b2324e89e7583069d405eac6dde1898789fd56871bdb8ef6af1103c94a6f9dad0274486a0b4fef6544a9c
+8a5a5a8efcdb26569518af945c2819559ae3a1d3e9f0a551e8ea33f3596ebcc11841a811e89034d7ce5621b360f37144e8324d195f3d831b143a28642485ca31
+50e75a876356fec8fb67759efae1bc320162ef7c0431a331a2604a841539010380f7d1a0119a5ac540bbbe04191e7d2097120e124f92916a90d097e325760bc1
+bbdd3978d40787dea9fb014ac2f38a4f85ceff87ff1742908f68633b66b8238bc957c9260d60d8797ba59e4ceaa35417d0cae12261929adcf93cdccbee80f3d7
+b41e2dd5cae13a7a23dcf7e078d19d201f935c64f4309a6d93780da46677fc138a5c1d0ec924cc7cca1efe8c0febbaea1dcd75881f5ad600bc8e3bbcf8362596
+97bad5ae3b15df0ef9e526541f5cae399f26fcc51898fe034a23cb377e7182ed68780450ca3dd264b308e8414be3c306ad83370182e900d46f9acf5ff8339c43
+37d49d9249ccefeafe185fcfeabfbe6bc37bfd717fd5c9cec5d27852a45ce7835ca0691887935114be9cbfa2bfe4058cb06c0bf01810c1fae466284233438a2e
+85ef0b276e04bb2c014c51b7e41e07490cf1bde5aade06c2ec1724db884b4a1bcc16b9356872c11fd1d68d0ce070a44ac4769afb6addfb03c2fb1bdbffa86e14
+7f66f7303715b68460bc6f16346543a64fd502ba34eb6849e32bd4466a3e72792d6b7fdffd08ebc11c291286196e49112c05904894aabf9f4e65241605d96d68
+36f3f88cea29b18c07dfe391a17c7d9846eb3d56bb79d08788f4ba52f110058ae2e8ca05a36a5fbdebc60f8372dec37f4fa69ebea445db249511e890b924189d
+64f63e0a4ef68acab678ac1dd02499458a63ac9cd933301ac4021cbbfb561da87239312a0f0e54581d952f5e13d2ddb1b5129198eb0e5b180ac5ec495e4dd937
+299002257bb65fc6beac7c58cda87d285e1ad077d2f4ac5de141448d876a97e745fb30fb30a1739e447640962d7586e5fca87e326758fc08cca0e33fe35fc28f
+4b1fc6743df8410c4f56d5a621678f5d1aaea549142c900a5bc16000b9409a3100b88a6a2dda20de4d3748433a0bedebff9a457811fe10b47aa459e165c94dfd
+9aef1a03128fe57c534119a318251bf8dbdfe096129a81a817f2da16be22fd08e20deae0ca528ce847a0654a40d662572f75650c441527ec864e74e386cef6a4
+572e4678e7a27fc6012d7998d242242e9c5025c5ccd236f5ee9c26682dd476b3f4cdd67e1029f66f100a9c453cee95882a787000ad50313cbeffb728821a8803
+77c5ef67bbd05cf84b5d0a174c321fe523f2838959f21b9b887eaed8194a13df6ed58925d3644787355009950b3cc923c4005588eb72b1948c95634dae8cada2
+a1546a85e4f9ba9e23a85d3448ca1d44f4a960ba33e70c7e5ff991118af2ab4867e86ccbc2c1d377cdc447e4eba65c7e3b353b0f1976a1f45dbe366d9db79c0d
+3c77d2f9dad803d120cadd32a5693bee656f5103df4a1b7d9acf67a025603211238d594f5002a1c3f77b12a23dc88d9e6188e2b080d9be48c59eb2d84ed45c51
+cdb0e7041e0221625332d32004df7218d16b1ac59ce8a3d67a6142be7a4d6ac36354b83327b2d0b13c692fda4a440e6d25d78a7787336f64a69b697a4ff4eb56
+d117a877ca60403b49141fd8804e71a8cc050e111ebb03adac4a9232f61ce5e8b6c3ef6acdbb4b85a2023b914c6cd9874531c0633b7fce488a2c54dff63e32b5
+00fa11accac7ef454f4c37b802f315f356fef1f9e81236b70a838e3f737e98c9105ece262566ff77ba49d385d7502c493c0df5af28590fc31f89e4b13456187d
+6c1b13bdad9808ca54425b3ca7b909dcfd2efd8f85eae95da7aafb51b2c9a7873665ff14a3c435e1a0d5760b4572ec7a4b7fb1d657cfeb0206e2d9dd84e0a918
+9f40b8510afe50e376b6e19f9ab26e8cc3d078e448ed2d9b7577d9385012a623c687c2d3fd4ccb61ccccda1bd706b7d1ab69790ee7c62010633890ddb8c51ce5
+9997acf6c27052fe3ff554293279290194ae4dec105ed66f0cc8a28409b6f031579ee147574967e7839bbec5a1d5cecdb7152d672a85c85923042d4e6453b0b0
+2b528e31a7820996715aada0af88a73382525d11e3bbcd30a90bb91de040042f694b83ec58b625ede1d1cd7d5d3f34ab287155cc9ed25fbe4597ebb3fba7e1c6
+311d4a51603880fb0700f7f7d7af34776d11b0509fb392d47062b97a20f4a2d0a7882783eb1b1b474f0b5b5c38bbe0ab2a6273326c5b7a434042a2e9cf757067
+ae4a7ab78d9452f8d1695c2beaad2ede70eb76deefb0b4e06dda99d787dc62fb6f6b4e216d5594a8886cdf010b6b9ef4399ddab645a423ce8522ca392983dbcd
+e9cf950838daa0fc96301eb7fd82f000c614ab8d977b5569582f4a07432ff9ed0afe2d02b1d4aa400dfa20f552e3f2e56e4ebb4762841a8d5fa13b5218e4b702
+6b07df026de2bf55a00052445468924dd022f9154820a9b8f025f3b7447f6705ccf4b8f70e6a35209bf7d3bb325409154508ae26a51b460ce53fa16b7e0a3a7d
+818f8aa445abf2f117cfc0c77c12aafdcd7f3bd30342fea51d4708c0dfec89af089ca8ee924b4669c870562e76c61ccc75de41038bfb27fcde0d1f2d5fc3e0a7
+5516941e7dfd5c48b4fde5b9fe1306714a78a42efde303ed37f55e60a8f40eb43a85655c8da893d267d4808ed8b68c615b3399fcd41e20aaf2eabdec02f400ed
+a615940ebf0a01c196b06ed1afb8f18b016362cf4ceeac6a4aaa69824a93577a73c51cdcc74593aaeab758efaedd7d1b68fe185c2ab45fdedf2e1bd7d6335a18
+ff074a447ea06d098c17fd14e03f9cc2d2303c3d57c389880529b0d0177de9871ef27564d1dea98b2369f827f1e810677303c5a7d88a73edcf5ab4834f18d23e
+b55e8dd5d6899e7309cb8c425caee5843894f691a80cfb0f2ffa3675f17fcb3dbdde0c44c5a15282a5069471f9658c816258dfcd5a77fc68170d51bdf2bc2225
+f3e012d1a5a70b3d3bc79998656a81a262809bafc4037a3d07a78773d8b0f01266d8438ba0325ccdd02ba692282ec66a4ce4f4773abb43b00566351cd50623d5
+76876a3978017d40e5e5ef536974d6c8dbd7cf9e9d7e00bc8b89179d0cd9948f8b02c9e4eab5d8be491ebb66dce1b8a9fb4fba6a11c1c0dd211428d7db28239a
+eb31796198e525ae3bb1cbe28d0d3ee9680610c0e97569207ae5d03042494a83cd4fe924dad70b3e85eb24f02ff529968f7735fef9a9f8c2ae3e3bcdcbf14fa9
+de29d6807d6f5937534c93744863e38b59e4f122abe50700148187b8211576097195d82bedddfa5bc61bc9bcca3fa498fe8a9f6966ce63c044f5c9e2c1ff4fd9
+5ad124ef9fbd324ec5f11eb1f3c882c25487a95f8e84d9b8fc579837136f7ea5400d9c900f77bdffe4ab148d20a8ae6d6668c9021495a800c4e53ecbf8e3fc5b
+7f2f57daec9304fb648ab8e05ba9e6566f9dcf552092a73e06d644ac32a445a46ad67d250a2b05e28c6d9395701b563edf11d205c62bdda805e8b7521ff39f7f
+515235c13f28f92df2cc2715bfbc3e749baa6bebe253a6d591fcfa35a81ef542b8a662a3130611f331826b1960c1376f716ac214dc9d093399189f8801b4e3d8
+a54c4b38b96a6b681316709ecb90c2187b021323978d1fe6e2cdd99d0cbc2709ea767d26bdb7ede04add2b158fc881ee2900575cf2e1c1519c67fd3174c01474
+977f55e41272a1fa952f96bae267d1fffeecd3083027f6c9df0fdcbaed5b58a2f33f9de42d995b54429e396cdb5950fafb3ff988526ae6dba5985085e868302c
+eb553c63daeeef9a08d58f724f51fbad4b1bf53c6b17d59afb92a869b705538590f4b9ca0c1392146122a7c53f76f06d8a7c4b6d55761ee0de89afa6848da5a0
+600a083b2155ff6e2f340dee71e3e9e996db0805075a311d0a7f19c8c7dc24245ad9561c6329aa6315ef611f78c7958d18775e110bf8fd0710a935
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+
+cleartomark
+%%EndResource
+610 998 1870 (\(Big Brother finally hits Linux\)) 1870 SB
+32 0 0 117 117 0 0 0 104 /MSTT31c1c9 font
+%%BeginResource: font MSTT31c1c9
+currentfile eexec
+9e67edc6b858a3e762244b628fb7f6f6b82db3d80533f85f9af7ec02fa0992f446e47e7476690365d15488a3d0557140c554c35b60083b9bf344ec199d995ff7
+cd974526686a837538b7a59d07d46fc97f64034f7316f286161df977422c4d4c0134696d3bc14d42a5196465b793903cbaef39f544b1ad2677617c3d7e7c7411
+44760ec4c558100f8d5150125bff221a8d8da1c78d036ae5d0ae1e5b46f2648b1738778da432f2e0a79098c0ab9bc73558835ae1fef4f1844107ef1919c93b0c
+b64aae6608a9fc951cd895a6b3f3e90b8e89304f12a55c7de79fe0bc6eceb3abda8db51431b753678b3817f478d9f366b7750a607d8c079f73d8c5e56e068fba
+5c63518263c5958057e03a4ba68be49c1abbbc6adc111544551d33c27152a5671bd06bd87987c94f41546459ad4f67e540d8cec6c2662fa09a888fcadff5763a
+ddc06e460f56a44cf58f036f265c29ff21007faeb386dc99302fb0c75ec3af2d623b6a9ee8fdc0930d2900a8a0b9485c95943acc8b7144032f285865e89eaf54
+f9489a0aec81c7baff9c82a84b4d36f53c63e16a1b0ba314c92122139d3f1a30663a99febda776f3a5b09f58f3d737c4f97231796513983e74b04468f5e52254
+f96a494e30e009344faadbf40da0a3df5894c843e2c62eb2ed15ba09c643f590ea45c08441ad235a12bc9c8396b5c431b942a496a1135d09cd0f97df836419fd
+3262b756126f193819ea64caf51a91c848562fde8e35f695218a75506a7bad9918eec09b13c0b5b50403eec5da0b3e58feed5202207d7224d199f5e6a4ed96b5
+e7f1b4fd4e7346d8d51d4ad11f6001b58242aed085deca4241fad480c8575b56fdef53291f0d4452328374c7a58e5b6caafbc80ec9623be7c85438cea66dda08
+fd1aa589af6b29384796377df9a3bbfbe204f740c572bb1074305a774dd30656a2aa2e1d9b1c0ba7454e81fc0d8a76f20dcfd29525365d5ce4165a7738a4cd6c
+0075f2074f3d69ffa948d84e7707e13055c4b9a98a131e7fc595008a6d27350694b44ff7638da1adf4af8a800034b6a67227eba2bfd5365057eb8bba15dc362a
+38b23966b57fd5a0d9b85b17910d13f78b357b14380ab23f50e621689bd4fa7c22956258469740feb8b58ffefebc8ace84fd883c822292033f12a2d16aabb3ae
+f236023254fefdf6cdf01fcbc61dafd6a55ae23ca0b4ff4cce608f3081b122c411afa788634f11968afaaa7a773d7175da7907d308714ce8e3c39a17920b52e1
+e27fcbba78e824072b162bd0ab6d0826cb0e5d51f2d7437535726aa2b48c6658b4ae98d35e45c285f60cfe4885e5f54b36b4a9f9a740d2203b44cfabebfdbd24
+76fe5d6ed793306e4a9afbda3812514148b680a5c8b96a0499082f5edb83c3a44be7a8c2343f9abeab596d6d07fb252a9d5c1fbce4a9b9404e64ebeb153f89b7
+cdbded7e60aaf93a93bdb0fd19b7f97a4bcf8fdc10be826f733efd9b54af79ed02588e5922c92b79db886d5f68ebaf69e3ec25a0ee3e463ad2d68d3906831ccd
+fea8ccc36fdd81934ff30689dc4dc2ceba3566a902aa9b6b2c841ee21c4026fb6cb91abe9d7c17c004ab60eedf8ceba17fb1e7b6df34261f180c1b7be2e6615f
+91eb33d8516566c788082983b544b47f94395145b17fc7ce6027029e9111c577c52be631dcef1f6539d76acb3887c258eb017070133424e2ff9433d1738b2d0e
+5a98d4eaa9d2f59f5bff8dc52be413ee31f2d9d5f2b8dbcb948b8483eb5b2310b4ddb742920d7466a6c76ad24ffea84db6a7c23de1f5db442e64f715de5d0f34
+2215a008e93426cf76a68e891a542178a9ae7a56bd5e268306a3f96fb2b2a4998c69edb1636255affffe4c65e47626a004a355ad5c1e42cc0dbdac265b27922c
+492efb97a21591b0ed96c00148b52390da02edbfe77d173aa2499b4b2a58c7898aaf75ed363330456ae71fe8204c445bd0d12406410ef1c9a935dfbb68
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+
+cleartomark
+%%EndResource
+-1 1 SJ
+1351 1340 535 (R\351my Card) 535 SB
+%%BeginResource: font MSTT31c1c9
+currentfile eexec
+9e67edc6b858a3e762244b628fb7f6f6b82db3d80533f85f9af7ec02fa0992f446e47e7476690365d15488a3d0557140c554c35b60083b9bf344ec199d995ff7
+cd974526686a837538b7a59d0448bcdaf2881ea6472bde411d75ff8378c7389b65a1c39cec9312676c8e2b3872d24b1120f81ccbcfaa1a021ebd657347ad9b3a
+25a5feba0fed91bf6050489e080e699eac3ff41fd0001afe42e9ff70df6702e91b80c1177cd67f0a885c54b0c6b4eb135acfcd7d8692bafe81b24b78debbb0ce
+f5abdb21d9f47ba04d95f4fc9d6d2b0954c04a3fefb6c62aa930b483a5c25c7f0dd61a16733c26008660fec0e413fd51a21264ffd0d6937b113fd314ee1017fc
+5dbb10aa8ae6c448992468de3166ddf2ddebe662beed4ccf3c4b905db473fae6e98e56570a34e453ae7e96551b5ce6fecc9892c8f6ab0f30ac94b3f9ac13572e
+643c39532c61e72c55fc424a0eaefbcc008eacb07e46f31eada1364a19b316a613c3b59e43c75416d474a8fe4a2355e91a3c9d138c49b3c648aa29d1de834b36
+05f9b104ee2d15a150bed4e0692b562bf866d4a92f3e29ee75608fa3708c799d664220409ee157de6f9830cedaa4ff9a53a0681e55a1b5243b14362ba104143c
+d8013ca0ccbb8dc6b3eeecf6bd5d46c3b570ad8fa27a5d0955419b7712941e8677e54fec3580e56d24501b7994395fe19d09230d576918b3ba1763710d0b5e79
+a22a5e73385df5d0a49bdd5537c66520da770173078f784181e3d5d78d5a96f3669cebe588fd60d47bbbf49b30883362e10c4cfd18f30c1283741776f510a394
+89db102e681f8922908cce16341b00c6f7ff3cc48b721f329c2fc45485b235c3c3f97ab6521682eaff9d41fb397c028408615a36ad0f4ea2a638b75a7aacdb5f
+7e4fab5e62934289a76dcd109b2bc76fa249996d8cd664e1ece142e04a4b30799e6eb469328dfff6f2e5d73f24e3f8748b3b5370e060bb45ab41c0ae1058c4aa
+2cc86efc1bc74d8bdad4e963814ee168ac31af24d74fbb319ad078e08c1cb6b8b4a20c34b3db418f4854bd8a9975dc252a718890ecd206b81c11068887994f8c
+fcc12cab7d1d6e7f2ac0b5eb22d5bf57dc4a95877baa293f59815372747501b696f789c1b9a73b30a0a6c0a9406587d35ff5ba009e88a6474acbe8f8fae479fa
+9818551348de2f0ac7fe08adbdb5b7fb93e1e101f0ce440b93c035287ff328580520407d2d69a613fc29386a5a3acf42d0ce61315b7caacbce1502158c738641
+a99cf38a32ec1b7daeb408044b3f96c4c9819bc2ea25885b6384bf3420c93d26b31a713a7aa5e5ae66651e96675818982849892b4b2e36b3225e95832285e45e
+64474235c0f8f22952804c33581f456c8c75c6f4b3cde3bc7124fbd6f8e0d5afd0afdf95c7a30acdc3f418d9b8ee456ecdcf732fd17c4e7b51720342ac6115d2
+7ec7ef7a1b289f7455d28c1b67ffb8c4e0098ba829bc9b98f6fa4d4f4e1f422d2c2695b2a0583a4d73cd7b9195d284336e275aeecfd0b946f12832341c270ebc
+82dcf74e3bb39f384db6563524a0673dd89bd980087543228309d43570e573ef4517496a8f55a1551df3c274fb8ed76e4d7f7e60ab84a7be265f1a72ea11adb3
+183c94f15c27da85467ab0a82e6853116cfb513cef1d4ff13c69b2bca8c14dacd849457d5c477599e297aa882141aa5810366aaf21df11a2da129bfc9012b86b
+b04970b544660af9f14d58469aaa4e9dafd128903407546d326095dffaf59898f42c6149ff89f3ba7f51b0783324efef4cee3bfadc43261b7ebac69841c203b5
+98ca01488501df66639fad874d4a65497f77855f36d801e6a04eebd15da373bb79d1c3f94e9b5ea0436db50dd9f7d2c0ccba41aa97ef92c1ec3d4ddc67569197
+050e70236832839b79eab2e9dbfa1e14f46d86d88cccc549070b6a49e429837bb9716f91b09149b52132752507e4f3730c42faa725574b54b0322252729280f7
+76eb7cc1338d6b783249b2b0fc16aff94c6ee02835ad14897576c4d550e5cd871d805d9a86451270ce1cd07b86e5c49f9857af5623260d99860130762948e357
+d8c12871c526705394732e0f497a01c2bb8d12e10620741653a5a3a2c45c847ec86befc0c20ec653fb0b052e85a7c119a8fdc64b21070738c445b4934ef838af
+b3fb7e772fb842ef97f1f58d21c226cd31bfe040f39053f1883f9918242e4ea610349ccbd940ab10c957c56ea5b139e22c69864e7cd0e58c6f48d9c6ce56ed52
+519f32cde31069201b2aaf86a7b1e2dd9b7f1484e18989cdaf60b39df3d56058218177229d749332108017ed803b0e0ea1a442f8f858a8c4fad02e8d9f2f0aad
+d881e0fde6b0667c277b6d08fd2e9f19decd3359956d5a2177b3d1b49eb5a89a0cecc34bb3d927e988b4f851f92135ccbbaf1c1cef76799e051d745eee9ae5d0
+10599510376287bcbb255661713ed444199b5551b95596c307b8da70cc304fec8f6668e3c8ddf212ecfe12d0e0f6a625ec3301a90c78992cca3937538327d7e5
+6427bbe4704706763c563ba520a468bf6b18533f68ee5593f52d602e216412cab9b3e91a1d6bf2b4d6a39fe07d7df3b75d1cd58ec23d90e88b36539cd199116a
+adb476387999b1014549b62fe175a349dcef6a6f105f7fd8fb70923f2d77de2427f3eb4db383f35bc8aec742fb5732e7879dc7ae90e53c0d21b1ba7fd0d04a72
+05e8834226d06a386bbddc257a6f576b94ac7fba2eb353d71041944503aebed5b43c1d1bd1d481009bbb903bf114a6e93ee6d65f974d2146ce3d305d2043aea4
+42b6dbdf556a5c62c6e2912969dd46efd9db94acd1b39d0d000db989d4d4ace46072b658c1a1c1eb0a0c14693616f3d0560c8dfe861da170d4c935b182b47d37
+7f8e693e87ab147a1ee48edbe91c7917d84aa2fecd97ed787174286d9647d8624955683f1d2f9fda1e92c2ff0996ea4cf3d16b
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+
+cleartomark
+%%EndResource
+1104 1509 143 (car) 142 SB
+1246 1509 167 (d@) 166 SB
+1412 1509 111 (ex) 110 SB
+1522 1509 137 (cal) 136 SB
+1658 1509 33 (i) 32 SB
+1690 1509 118 (bu) 117 SB
+1807 1509 160 (r.ib) 159 SB
+1966 1509 59 (p) 58 SB
+2024 1509 68 (.f) 69 SB
+2093 1509 39 (r) 38 SB
+%%BeginResource: font MSTT31c1c9
+currentfile eexec
+9e67edc6b858a3e762244b628fb7f6f6b82db3d80533f85f9af7ec02fa0992f446e47e7476690365d15488a3d0557140c554c35b60083b9bf344ec199d995ff7
+cd974526686a837538b7a59d062efa8542d7e1727190148f267200f4b0f0b312c62fcf16c9bb3a1ed1ca5003235e108bace76f8cd465fb73141b6671457bfe24
+d3087a80e96a143127f065efd5a70426d02c648a5b6713f0ef8b187b09d22d417b6ec735e018df5521efb68bb7945d3b436b5504e18950cdc524c91cdfbaa538
+ff53cd9c5b23847e32038edcbbcfe0020d30c34229eacea8dceedcdb57e1bd2059b524307421fd01f6e08138e547f0f548bb5753c08a4ce11186ab148affe57d
+f211a4012da0db12a069f6d3965954caace909c813406571df2dbee0d1a866fb218c8f0ad696e67512cf4ac2fa5bd89767b80b9c03b44be00729814896ee417a
+79b0fd3cdb52a01cde8f32c4270ccb5fd17d506867be5d8851fd986beea38a00770f89ae5f25f4e05a074afc5861e07d3e15c7d8aea289157f8052a04aa74ee8
+3db9f8fa655ca2485e12dc74b08c4b67b131babf237a5b7606839c2dc79b5e57f5bc0fa459a94fca2bb520c6e0906f98f047d163787827c957ad081d640f998e
+6ee4374d20b63638a61791971bc7678c8aaeb7fcfdf3b39743047a113562ec98cc58bfd3438b8ab84bdb5d15bd0752135bae7d3baf2837b986bb0d86357e262b
+1fb3ccebf477f1b9c92b09a4aa8da142c4cb98800ba8fb79bd201fd60e169056c5e4970ef0d0de7e89456ff11ce40bd20e7075a6786465e0d11327d736480c67
+128c4b87c9fa3fd047d7a4941889822bf4400fe4f65f8ccdc71bff70e6b882ddcbc34c36c06340f9ed5f977141ba4471747fac0d0ab4ea50def3e9561d933230
+36dc2ca89bdbe6cd831bcf9f9376f10210d80be8d0728ab562fb79f92d20774cfc020a8b1c58b8aefbebae453224ce042076267c159a0321913c7432001ae486
+895a6127b493200e04ede57a8d700f22567eac
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+
+cleartomark
+%%EndResource
+-8 2 SJ
+1128 1677 987 (Institut Blaise Pascal) 987 SB
+%%BeginResource: font MSTT31c1c9
+currentfile eexec
+9e67edc6b858a3e762244b628fb7f6f6b82db3d80533f85f9af7ec02fa0992f446e47e7476690365d15488a3d0557140c554c35b60083b9bf344ec199d995ff7
+cd974526686a837538b7a59d07d3a1806c63b82e1b0b6863860613ea7c0c2019c973386b8303b2b57a3f751027c7e560901b4a11ecebb6fe5e635fc9cd65b36a
+4824b23b464204a5a4e29f389c8782be9a0cc48546e8ff276eb1572e8040eebc12bec610990c830312fc89edd1773d6d686d3f1bc4d6425e4aae6a205c14e756
+ea8ed91a68fafeaa1789dfd79db78443d34fe0725a574387554d4b289736e90d30096822f8efb359ea3b7fed82e0f52581b661100703d0df3898fdf4a901c1c1
+c4607acf54796e8c1e1ef17999d7e6711cac0e56f68eb1d7440d4dea08a4890db7bc1a2becd33a6a398c390129a6a7c36a1e80f10929a8348d9c8c1c88ec2711
+8582773e34254a453ba45989289e36f29d62a9c6dff3b47589a15f9f0d2a761b214e710ca70c124c45b1b84d3c14bec2d979a7ff3fda0dac0cad0de30ed6d15b
+0e6f30ed55c4bd7dd45ba7eb7cc447d23c380473efaf740f3290e20609e88fb8f7d237e49ac14a03c9c459683c8acf3bbde20bdd1982eada1b226115528b995b
+f886f2f612fa9e7f97a06ae9dbc6beb350f8801f33bba0024c4bf80b11d8fd3e1433157c962b85cab7bd26d3d16c88076246a5e4bc8dbc147282c9a57bc60c1a
+9ffe52d1ce9ecde0d29bc4e87aceeb157e452421c33e35fd06e5d752fbb1be789515c546f58f949b9df8b5e49e2dab0710c06a5278e9f5f9b08c19d934c0f50b
+a36cda7d90da9c09c983bf49906c97f0cb5c7c499393ba1b0e582fee7093bee4e5013dc3ab78554c1a4af4a0b80237ae22117f28cc652d21191681db064d2c40
+5cc5fed5a1e6fe7bd2cd3abd612c08501d4528cd59769cebb478fc107360517360e288958c74da5cb92a0d922f2e3b70f6bbbf4817c0390b7dcd4f22aebe8259
+8a9d20aaf21d0027b6549d854a4464d4839b0103cc49294e1bd647c7176ee6236908a4011c12dfc3a76121bf1f35e4a3bbebf94fb8be94d8b2c82fcea2dee861
+d01ffe47264ba069a35f17a67ad5aaf697f1962189f8f3522c22918259e3b179e20f6546b183611bae6a3a74cdc9ff0b104275dc74950d6450bcc94e968bf7b8
+cdf0614ed7dc490a1d6c79e9e55adbf20e55ddc515f9af27e448a89577081e7f73fc88316a8dc7bdc93482da7e0c0035d4312467579bc3f4e833b1d39fcfb422
+73df4a6aafafc00f19352cf0ff6cfa34addfbac1d9ceaf9942
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+
+cleartomark
+%%EndResource
+-6 6 SJ
+620 1845 2006 (Universit\351 Pierre et Marie Curie \(Paris VI\)) 2006 SB
+EJ RS
+%%PageTrailer
+SS
+0 0 18 13 783 1169 300 SM
+255 255 255 fC
+/fm 256 def
+3250 2250 88 49 B
+1 F
+n
+1 lc
+1 lj
+0 0 0 pC
+6 17 SP
+gs 2857 2349 88 0 CB
+-2765 499 M 8559 0 1 PP
+S
+n
+gr
+32 0 0 58 58 0 0 1 53 /MSTT31c1bc font
+0 0 0 fC
+25 8 SJ
+153 2191 1278 (Third International Linux Conference - Berlin - May 96) 1278 SB
+
+%%BeginResource: font MSTT31c1bc
+/G32 [29.0 0.0 1.0 0.0 26.0 40.0]
+/G32 {
+    25 40 true [1 0 0 -1 -1.0 40.0] {<007e000003ffc00007ffe0000ffff0001e07f8003801fc003000fc002000fc0060007e0040007e00
+00003e0000003e0000003e0000003e0000003c0000003c0000003c00000078000000780000007000
+0000e0000000e0000001c000000380000003800000070000000e0000001c00000038000000300000
+0060000000c000000180000003000080060001000c0007001fffff003ffffe007ffffe00fffffe00
+>} imagemask 
+  }
+  50 /G32 MSTT31c1bc AddChar
+%%EndResource
+
+2919 2191 29 (2) 29 SB
+32 0 0 167 167 0 0 0 150 /MSTT31c1c9 font
+%%BeginResource: font MSTT31c1c9
+currentfile eexec
+9e67edc6b858a3e762244b628fb7f6f6b82db3d80533f85f9af7ec02fa0992f446e47e7476690365d15488a3d0557140c554c35b60083b9bf344ec199d995ff7
+cd974526686a837538b7a59d065133686e273aea657ad4eeb667942355bbf44e5b3127dd61797055dbc6ed38d13c364ca31df6a437b2bf27d1c5ce57b92472fd
+0567e62f9d7879b144ad348a752c6f7184215c65c061058bd12a587f902784eb4707535b56e1e47bd57dca41ec9fc95977b30f7236b89bcec1494ae659e38595
+c723fd50fafd771309d4a66d686ddb4ff76f707d181c2ac6702ce5f87481cf81d8bc400f3ab2da3db762d0e5be70030f6d87b568891a899af8427f17634ed0d3
+98a8df688b1d9b939e9e2e34819b1802edc1c2a594a13ab439c605efe344e7186cff66259b040b6e47bb55554272bc496f41bde84e
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+
+cleartomark
+%%EndResource
+256 284 121 (O) 120 SB
+376 284 222 (utli) 223 SB
+599 284 84 (n) 83 SB
+682 284 74 (e) 74 SB
+32 0 0 88 88 0 0 0 71 /ZapfDingbats font
+473 648 69 (u) 69 SB
+32 0 0 117 117 0 0 0 104 /MSTT31c1c9 font
+%%BeginResource: font MSTT31c1c9
+currentfile eexec
+9e67edc6b858a3e762244b628fb7f6f6b82db3d80533f85f9af7ec02fa0992f446e47e7476690365d15488a3d0557140c554c35b60083b9bf344ec199d995ff7
+cd974526686a837538b7a59d0578cb0186d4620ef95432fd6faeca0fca7737f96247536631e5e6575a357bcc6c8b4d0c3576fcdf4cf885af2848d87a8abae2eb
+7f3f61e803ddbf80caa5712c69691e95d423c96c736ba2cf6a4c589d8afbc9b67365a82aa1e7bd7932238a52abd053e77ca9f2bb3e3af59955ec981c48f64f6b
+ef6b6bad5cb0045916060c29795a6a926a9c36958eed0f5e8447dad65a8b2ccbc3a3331eb99c2b4583fbbca75e26226faec4986c28b27517922f6938c3213d95
+4aba452879ee9dafb095476c97deeecfa06d2267046077586fdbcdeabf034fab3472ab8e3d18461c4dffafb40e1f7cfb2334599ec32505654c69dc5d25a82323
+eb5cef1487d3946135a2ac75c70f4c758679017c8a8ec2
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+
+cleartomark
+%%EndResource
+-8 2 SJ
+586 615 935 (Principles of quotas) 935 SB
+32 0 0 88 88 0 0 0 71 /ZapfDingbats font
+473 817 69 (u) 69 SB
+32 0 0 117 117 0 0 0 104 /MSTT31c1c9 font
+%%BeginResource: font MSTT31c1c9
+currentfile eexec
+9e67edc6b858a3e762244b628fb7f6f6b82db3d80533f85f9af7ec02fa0992f446e47e7476690365d15488a3d0557140c554c35b60083b9bf344ec199d995ff7
+cd974526686a837538b7a59d0443b441567658a6856e7adbc62baedf12261c9875c4762d5f6b143a52c4aa4ce21dbb4ff936839757b4a3c065a07fe502a0354a
+8ce25f6c10920e15983484eb48cfc7a939fda22bc4a6ec91fbb4b0916edba2f6a514b086eb443fb3eb38b361d95d5feaa9e01aaa83e5d9b36d92e37e0aa4672a
+89deaae53dcf2e752fa2ebdbc2e862110838defe717b3c44128d33f2928ece139ecc87804fb5ff9fe84675bea7d752a54cfa1400fd4977c2964b88944a337035
+5e729793e549c5d06a7bfc35000ef31d552db250a6ebc2350ea3429c390fa173091de36f683677c2966043917abad1efb0d0647a850d23f51849151115030860
+e072a1c992b8665630f1bc48dd3f1d2c61d3586e21db6c44ad5816dc55ba1e1b11a17ab27cc66220f2899c6c4a7df9656ec21641de780ffdd7137b6db97e666e
+25cd3864ff63039b0f60df920af85299b29c
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+
+cleartomark
+%%EndResource
+-15 3 SJ
+586 784 1645 (Configuration of the quota-support) 1645 SB
+32 0 0 88 88 0 0 0 71 /ZapfDingbats font
+473 985 69 (u) 69 SB
+32 0 0 117 117 0 0 0 104 /MSTT31c1c9 font
+%%BeginResource: font MSTT31c1c9
+currentfile eexec
+9e67edc6b858a3e762244b628fb7f6f6b82db3d80533f85f9af7ec02fa0992f446e47e7476690365d15488a3d0557140c554c35b60083b9bf344ec199d995ff7
+cd974526686a837538b7a59d062647bb1263d8c25299774bfe585fa96223d906032043f9df53b5ea93f1d9c8fe6050ea78c741e63c84b69a755949e25da8285d
+1dbcc8d56b993b784ee792db023d6f938f8c3704820cc30539a588b5c33a9da56c2ee373f843867ab024e73d847b9cfe7c27c0baed1952d3f0c7bccca7c01bab
+3fbbf1afe64aaaf40492500433a866ee9c4c101976c667778e555af1ace42c5bcf80221cc89566b89aae50c40422326c935dd6998f7048f941418f6c2a7fd903
+284d3b582fe90315
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+
+cleartomark
+%%EndResource
+-12 4 SJ
+586 952 1821 (Administration of the quota subsystem) 1821 SB
+32 0 0 88 88 0 0 0 71 /ZapfDingbats font
+473 1153 69 (u) 69 SB
+32 0 0 117 117 0 0 0 104 /MSTT31c1c9 font
+-2 1 SJ
+586 1120 504 (Quota API) 504 SB
+32 0 0 88 88 0 0 0 71 /ZapfDingbats font
+473 1321 69 (u) 69 SB
+32 0 0 117 117 0 0 0 104 /MSTT31c1c9 font
+-12 4 SJ
+586 1288 1717 (Implementation of the quota support) 1717 SB
+32 0 0 88 88 0 0 0 71 /ZapfDingbats font
+473 1489 69 (u) 69 SB
+32 0 0 117 117 0 0 0 104 /MSTT31c1c9 font
+586 1456 137 (Co) 136 SB
+722 1456 59 (n) 58 SB
+780 1456 144 (clu) 143 SB
+923 1456 46 (s) 45 SB
+968 1456 92 (io) 91 SB
+1059 1456 59 (n) 58 SB
+EJ RS
+%%PageTrailer
+SS
+0 0 18 13 783 1169 300 SM
+255 255 255 fC
+/fm 256 def
+3250 2250 88 49 B
+1 F
+n
+1 lc
+1 lj
+0 0 0 pC
+6 17 SP
+gs 2857 2349 88 0 CB
+-2765 499 M 8559 0 1 PP
+S
+n
+gr
+32 0 0 58 58 0 0 1 53 /MSTT31c1bc font
+0 0 0 fC
+25 8 SJ
+153 2191 1278 (Third International Linux Conference - Berlin - May 96) 1278 SB
+
+%%BeginResource: font MSTT31c1bc
+/G33 [29.0 0.0 2.0 0.0 24.0 40.0]
+/G33 {
+    22 40 true [1 0 0 -1 -2.0 40.0] {<00fe0003ff8007ffc00fffe01e0fe03803f03001f06001f00000f00000f00000e00000e00000c000
+01c0000180000300000600001f80007fc003ffe0003ff00007f80001f80000fc0000fc00007c0000
+7c00003c00003c00003c0000380000380000380000700000607000e0fc01c0ff07007ffc003fe000
+>} imagemask 
+  }
+  51 /G33 MSTT31c1bc AddChar
+%%EndResource
+
+2919 2191 29 (3) 29 SB
+32 0 0 167 167 0 0 0 150 /MSTT31c1c9 font
+256 284 140 (In) 139 SB
+395 284 186 (tro) 185 SB
+580 284 84 (d) 83 SB
+663 284 418 (uction) 417 SB
+32 0 0 75 75 0 0 0 60 /ZapfDingbats font
+473 644 59 (u) 59 SB
+
+%%BeginResource: font MSTT31c1f0
+/MSTT31c1f0 [100.0 0 0 0 0 0] 50 -110 [-100.0 -100.0 100.0 100.0] [1 100 div 0 0 1 100 div 0 0] /MSTT31c1f0 GreNewFont
+%%EndResource
+
+32 0 0 100 100 0 0 1 90 /MSTT31c1f0 font
+
+%%BeginResource: font MSTT31c1f0
+/G44 [72.0 0.0 2.0 0.0 68.0 67.0]
+/G44 {
+    66 67 true [1 0 0 -1 -2.0 67.0] {<fffffffff800000000ffffffffffe000000007fffffffffe00000001fffe003fff80000000ffc000
+07ffe0000000ffc00000fff80000007fc000003ffc0000007fc000001ffe0000007fc0000007ff00
+00007fc0000003ff8000007fc0000001ffc000007fc0000000ffe000007fc00000007ff000007fc0
+0000007ff800007fc00000003ff800007fc00000001ffc00007fc00000001ffc00007fc00000000f
+fe00007fc00000000ffe00007fc000000007ff00007fc000000007ff00007fc000000007ff00007f
+c000000003ff80007fc000000003ff80007fc000000003ff80007fc000000003ff80007fc0000000
+03ff80007fc000000001ffc0007fc000000001ffc0007fc000000001ffc0007fc000000001ffc000
+7fc000000001ffc0007fc000000001ffc0007fc000000001ffc0007fc000000001ffc0007fc00000
+0001ffc0007fc000000001ffc0007fc000000001ffc0007fc000000001ffc0007fc000000001ffc0
+007fc000000003ff80007fc000000003ff80007fc000000003ff80007fc000000003ff80007fc000
+000003ff00007fc000000007ff00007fc000000007ff00007fc000000007fe00007fc00000000ffe
+00007fc00000000ffc00007fc00000001ffc00007fc00000001ff800007fc00000003ff800007fc0
+0000007ff000007fc00000007fe000007fc0000000ffe000007fc0000001ffc000007fc0000003ff
+8000007fc0000007ff0000007fc000001ffe0000007fc000003ff8000000ffc00000fff0000000ff
+c00007ffc0000001fffe003fff00000007fffffffffc000000ffffffffffc0000000fffffffff800
+000000>} imagemask 
+  }
+  68 /G44 MSTT31c1f0 AddChar
+/G69 [28.0 0.0 3.0 0.0 25.0 70.0]
+/G69 {
+    22 70 true [1 0 0 -1 -3.0 70.0] {<00f80001fc0003fe0007ff0007ff0007ff0007ff0007ff0003fe0001fc0000f80000000000000000
+0000000000000000000000000000000000000000000000000000000000000000000e00007e0003fe
+000ffe007ffe00fffe00c7fe0003fe0003fe0001fe0001fe0001fe0001fe0001fe0001fe0001fe00
+01fe0001fe0001fe0001fe0001fe0001fe0001fe0001fe0001fe0001fe0001fe0001fe0001fe0001
+fe0001fe0001fe0001fe0001fe0001fe0001fe0001fe0001fe0001fe0001fe0001fe0003ff0003ff
+000fffc0fffffcfffffc>} imagemask 
+  }
+  105 /G69 MSTT31c1f0 AddChar
+/G73 [39.0 0.0 5.0 -1.0 36.0 46.0]
+/G73 {
+    31 47 true [1 0 0 -1 -5.0 46.0] {<003fc03001fff87007fffff00fc07ff01f800ff03e0007f03e0003f07c0001f07c0001f0fc0000f0
+fc0000f0fc000070fe000070ff000030ff800030ffc000007ff000007ffc00003fff00001fffc000
+0ffff00007fffc0003ffff0000ffff80003fffe0000ffff00003fff80000fff800003ffc00001ffc
+000007fe000003fec00001fec00001fee00000fee00000fef00000fef00000fcf80000fcfc0000fc
+fe0001f8ff0003f0ffc007e0fff81fc0ffffff80e3fffe00c01ff000>} imagemask 
+  }
+  115 /G73 MSTT31c1f0 AddChar
+/G6b [50.0 0.0 1.0 0.0 50.0 70.0]
+/G6b {
+    49 70 true [1 0 0 -1 -1.0 70.0] {<000e0000000000007e000000000003fe00000000000ffe00000000007ffe0000000000fffe000000
+000047fe000000000003fe000000000001fe000000000001fe000000000001fe000000000001fe00
+0000000001fe000000000001fe000000000001fe000000000001fe000000000001fe000000000001
+fe000000000001fe000000000001fe000000000001fe000000000001fe000000000001fe00000000
+0001fe000000000001fe000000000001fe000ffffe0001fe000fffe00001fe0003ff000001fe0001
+fc000001fe0001f8000001fe0001e0000001fe0003c0000001fe000780000001fe000f00000001fe
+001e00000001fe003c00000001fe00f800000001fe01e000000001fe03c000000001fe0780000000
+01fe0f0000000001fe1e0000000001fe3e0000000001fe7f0000000001feff8000000001ffff8000
+000001feffc000000001fe7fe000000001fe3ff000000001fe1ff800000001fe1ff800000001fe0f
+fc00000001fe07fe00000001fe03ff00000001fe01ff80000001fe01ff80000001fe00ffc0000001
+fe007fe0000001fe003ff0000001fe001ff8000001fe001ff8000001fe000ffc000001fe0007fe00
+0001fe0003ff000001fe0003ff800003ff0001ffc00003ff0001ffe0000fffc003fff800fffffc0f
+ffff80fffffc0fffff80>} imagemask 
+  }
+  107 /G6b MSTT31c1f0 AddChar
+/G20 [25.0 0.0 0.0 0.0 0.0 0.0]
+/G20 {
+} 
+  32 /G20 MSTT31c1f0 AddChar
+/G70 [50.0 0.0 0.0 -21.0 47.0 46.0]
+/G70 {
+    47 67 true [1 0 0 -1 0.0 46.0] {<0007001fc000003f00fff80000ff01fffc0007ff07ffff003fff0fffff807fff0fffffc063ff1fff
+ffc001ff3f03ffe000ff7800fff000ff70007ff000ffe0003ff800ffc0001ff800ff80000ffc00ff
+00000ffc00ff000007fc00ff000007fc00ff000003fe00ff000003fe00ff000003fe00ff000003fe
+00ff000001fe00ff000001fe00ff000001fe00ff000001fe00ff000001fe00ff000001fe00ff0000
+01fe00ff000001fe00ff000001fc00ff000001fc00ff000001fc00ff000001fc00ff000003f800ff
+000003f800ff000003f000ff000003f000ff000007e000ff800007e000ff80000fc000ffc0001f80
+00ffc0001f8000ffe0003f0000fff800fe0000ff7e03fc0000ff3ffff00000ff1fffc00000ff03fe
+000000ff0000000000ff0000000000ff0000000000ff0000000000ff0000000000ff0000000000ff
+0000000000ff0000000000ff0000000000ff0000000000ff0000000000ff0000000000ff00000000
+00ff0000000000ff0000000001ff8000000001ff8000000007ffe0000000fffffe000000fffffe00
+0000>} imagemask 
+  }
+  112 /G70 MSTT31c1f0 AddChar
+/G61 [44.0 0.0 3.0 -1.0 45.0 46.0]
+/G61 {
+    42 47 true [1 0 0 -1 -3.0 46.0] {<0007ff000000003ffff0000000fffffc000003fc07fe000007f001ff00000fe000ff00000fc0007f
+80001fc0007f80001fc0007fc0003fc0003fc0003fc0003fc0003fc0003fc0003fc0003fc0003fc0
+003fc0001f80003fc0000f00003fc0000000007fc000000003ffc00000001fffc00000007fbfc000
+0003fc3fc000000fe03fc000003f803fc00000fe003fc00001f8003fc00007f0003fc0000fe0003f
+c0001fc0003fc0003f80003fc0003f80003fc0007f00003fc0007f00003fc000ff00003fc000ff00
+003fc000ff00003fc000ff00003fc000ff80007fc000ff8000ffc000ffc003ffc0407fe007ffe0c0
+7ff83f3fe3c07ffffe3fff803ffffc3fff001ffff01ffe000fffe01ffc0007ff800ff00000fe0007
+c000>} imagemask 
+  }
+  97 /G61 MSTT31c1f0 AddChar
+/G63 [44.0 0.0 3.0 -1.0 41.0 46.0]
+/G63 {
+    38 47 true [1 0 0 -1 -3.0 46.0] {<00007fc0000007fff800001ffffc00003f01ff0000fc00ff8001f8007fc003f0003fe007e0003fe0
+07e0003ff00fc0003ff01fc0003ff01f80001ff03f80001ff03f80000fe07f000007c07f00000000
+7f000000007f00000000ff00000000ff00000000ff00000000ff00000000ff00000000ff00000000
+ff80000000ff80000000ff80000000ff80000000ffc00000047fc000000c7fe000000c7fe0000018
+7ff00000183ff00000383ff80000703ffc0000701ffe0001e01fff8003e00fffe01fc007ffffffc0
+03ffffff8001ffffff0000fffffe00007ffffc00003ffff000000fffc0000001fe0000>} imagemask 
+  }
+  99 /G63 MSTT31c1f0 AddChar
+/G65 [44.0 0.0 3.0 -1.0 41.0 46.0]
+/G65 {
+    38 47 true [1 0 0 -1 -3.0 46.0] {<0000ff80000007fff000001ffffc00007e07ff0000f801ff8001f000ffc003e0007fe007c0003fe0
+0f80001ff00f00001ff01f00001ff83f00000ff83e00000ff83e00000ffc7e00000ffc7ffffffffc
+7ffffffffc7ffffffffcfe00000000fe00000000fe00000000fe00000000fe00000000fe00000000
+ff00000000ff00000000ff00000000ff00000000ff80000000ff800000047fc000000c7fc000000c
+7fe00000187ff00000183ff80000383ffc0000701ffe0000f01fff8003e00ffff00fe007ffffffc0
+03ffffff8003ffffff0000fffffe00007ffffc00003ffff800000fffe0000001ff0000>} imagemask 
+  }
+  101 /G65 MSTT31c1f0 AddChar
+/G6e [50.0 0.0 1.0 0.0 50.0 46.0]
+/G6e {
+    49 46 true [1 0 0 -1 -1.0 46.0] {<000e001fc00000007e00fff0000003fe01fff800000ffe07fffc00007ffe0ffffe0000fffe1fffff
+000047fe3f03ff000003fe7801ff800001fee000ff800001ffc0007f800001ff80007fc00001ff00
+007fc00001fe00003fc00001fe00003fc00001fe00003fc00001fe00003fc00001fe00003fc00001
+fe00003fc00001fe00003fc00001fe00003fc00001fe00003fc00001fe00003fc00001fe00003fc0
+0001fe00003fc00001fe00003fc00001fe00003fc00001fe00003fc00001fe00003fc00001fe0000
+3fc00001fe00003fc00001fe00003fc00001fe00003fc00001fe00003fc00001fe00003fc00001fe
+00003fc00001fe00003fc00001fe00003fc00001fe00003fc00001fe00003fc00001fe00003fc000
+01fe00003fc00003ff00007fe00003ff00007fe0000fffc001fff800fffffc1fffff80fffffc1fff
+ff80>} imagemask 
+  }
+  110 /G6e MSTT31c1f0 AddChar
+/G6f [50.0 0.0 3.0 -1.0 46.0 46.0]
+/G6f {
+    43 47 true [1 0 0 -1 -3.0 46.0] {<00007fc000000003fffc0000000fffff0000003f81ff8000007e003fe00000f8001ff00001f8000f
+f80003f00007fc0007e00007fc000fe00003fe000fc00001ff001fc00001ff001fc00000ff803f80
+0000ff803f800000ffc07f8000007fc07f8000007fc07f8000007fc07f8000007fe0ff8000003fe0
+ff8000003fe0ff8000003fe0ff8000003fe0ff8000003fe0ff8000003fe0ff8000003fe0ff800000
+3fe0ffc000003fc0ffc000003fc07fc000003fc07fc000003fc07fe000003f807fe000003f803fe0
+00003f803ff000007f001ff000007f001ff800007e000ff80000fe0007fc0000fc0007fe0001f800
+03fe0001f00001ff0003e00000ffc00fc000003ff03f8000001ffffe00000007fff800000000ffc0
+0000>} imagemask 
+  }
+  111 /G6f MSTT31c1f0 AddChar
+/G74 [28.0 0.0 0.0 -1.0 28.0 60.0]
+/G74 {
+    28 61 true [1 0 0 -1 0.0 60.0] {<0001000000030000000300000007000000070000000f0000000f0000001f0000001f0000003f0000
+007f000000ff000001ff000003ff00000fff00003fffffc0ffffffc0ffffffc000ff000000ff0000
+00ff000000ff000000ff000000ff000000ff000000ff000000ff000000ff000000ff000000ff0000
+00ff000000ff000000ff000000ff000000ff000000ff000000ff000000ff000000ff000000ff0000
+00ff000000ff000000ff000000ff000000ff000000ff000000ff000000ff000000ff000000ff0000
+00ff000000ff000000ff803000ff8060007fe1e0007fffc0007fff80003fff80001ffe00000ffc00
+0003f000>} imagemask 
+  }
+  116 /G74 MSTT31c1f0 AddChar
+/G66 [33.0 0.0 3.0 0.0 43.0 70.0]
+/G66 {
+    40 70 true [1 0 0 -1 -3.0 70.0] {<000000fe0000000fffc000003ffff00000783ff80000f00ffe0001e007fe0003c003ff0007c003ff
+000fc001ff000f8000ff001f80007e001f80003c003f800000003f800000003f800000003f800000
+007f800000007f800000007f800000007f800000007f800000007f800000007f800000007f800000
+007f800000fffffff800fffffff800fffffff800007f800000007f800000007f800000007f800000
+007f800000007f800000007f800000007f800000007f800000007f800000007f800000007f800000
+007f800000007f800000007f800000007f800000007f800000007f800000007f800000007f800000
+007f800000007f800000007f800000007f800000007f800000007f800000007f800000007f800000
+007f800000007f800000007f800000007f800000007f800000007f800000007f800000007f800000
+00ffc0000000ffc0000001ffe0000007fff00000ffffffe000ffffffe000>} imagemask 
+  }
+  102 /G66 MSTT31c1f0 AddChar
+%%EndResource
+
+586 614 994 (Disk space is not infinite) 994 SB
+32 0 0 75 75 0 0 0 60 /ZapfDingbats font
+473 788 59 (u) 59 SB
+32 0 0 100 100 0 0 1 90 /MSTT31c1f0 font
+
+%%BeginResource: font MSTT31c1f0
+/G53 [56.0 0.0 6.0 -1.0 50.0 68.0]
+/G53 {
+    44 69 true [1 0 0 -1 -6.0 68.0] {<0001ff000300001ffff00300007ffffc070000ff00ff8f0003fc001fff0007f00007ff000fe00003
+ff001fc00001ff001f800000ff003f8000007f003f8000003f007f0000001f007f0000001f00ff00
+00000f00ff0000000f00ff0000000f00ff8000000700ff8000000700ffc000000700ffe000000700
+fff0000003007ff8000003007ffc000003007ffe000000003fff800000003fffe00000001ffff000
+00000ffffc00000007ffff00000007ffffc0000001ffffe0000000fffff80000007ffffe0000001f
+ffff8000000fffffc0000003fffff0000000fffff80000003ffffc0000001ffffe00000007ffff00
+000001ffff800000007fff800000001fffc00000000fffc000000003ffe000000001ffe060000000
+fff0600000007ff0600000003ff0700000001ff0700000001ff0700000001ff0700000000ff07800
+00000ff0780000000ff07c0000000fe07c0000000fe07e0000000fe07e0000001fc07f0000001fc0
+7f8000003f807fc000003f007fe000007e007ff80001fc007ffe0003f80070ffc01ff000700fffff
+c0006003ffff000060003ff00000>} imagemask 
+  }
+  83 /G53 MSTT31c1f0 AddChar
+/G6d [78.0 0.0 1.0 0.0 77.0 46.0]
+/G6d {
+    76 46 true [1 0 0 -1 -1.0 46.0] {<000e001fc00003f80000007e00fff0001ffe000003fe01fffc007fff00000ffe07fffe00ffff8000
+7ffe0fffff01ffffc000fffe1fffff03ffffe00047fe3e07ff87c07fe00003fe7801ff8f003ff000
+03fee000ff9c001ff00001ffc0007ff8000ff00001ff80007ff0000ff80001ff00007fe00007f800
+01fe00003fc00007f80001fe00003fc00007f80001fe00003fc00007f80001fe00003fc00007f800
+01fe00003fc00007f80001fe00003fc00007f80001fe00003fc00007f80001fe00003fc00007f800
+01fe00003fc00007f80001fe00003fc00007f80001fe00003fc00007f80001fe00003fc00007f800
+01fe00003fc00007f80001fe00003fc00007f80001fe00003fc00007f80001fe00003fc00007f800
+01fe00003fc00007f80001fe00003fc00007f80001fe00003fc00007f80001fe00003fc00007f800
+01fe00003fc00007f80001fe00003fc00007f80001fe00003fc00007f80001fe00003fc00007f800
+01fe00003fc00007f80001fe00003fc00007f80001fe00003fc00007f80001fe00003fc00007f800
+01fe00003fc00007f80003ff00007fe0000ffc0003ff00007fe0000ffc000fffc001fff8003fff00
+fffffc1fffff83fffff0fffffc1fffff83fffff0>} imagemask 
+  }
+  109 /G6d MSTT31c1f0 AddChar
+/G6c [28.0 0.0 3.0 0.0 25.0 70.0]
+/G6c {
+    22 70 true [1 0 0 -1 -3.0 70.0] {<000e00007e0003fe000ffe007ffe00fffe0047fe0003fe0001fe0001fe0001fe0001fe0001fe0001
+fe0001fe0001fe0001fe0001fe0001fe0001fe0001fe0001fe0001fe0001fe0001fe0001fe0001fe
+0001fe0001fe0001fe0001fe0001fe0001fe0001fe0001fe0001fe0001fe0001fe0001fe0001fe00
+01fe0001fe0001fe0001fe0001fe0001fe0001fe0001fe0001fe0001fe0001fe0001fe0001fe0001
+fe0001fe0001fe0001fe0001fe0001fe0001fe0001fe0001fe0001fe0001fe0001fe0003ff0003ff
+000fffc0fffffcfffffc>} imagemask 
+  }
+  108 /G6c MSTT31c1f0 AddChar
+/G64 [50.0 0.0 3.0 -1.0 49.0 70.0]
+/G64 {
+    46 71 true [1 0 0 -1 -3.0 70.0] {<000000000e00000000007e0000000003fe000000000ffe000000007ffe00000000fffe00000000c7
+fe0000000003fe0000000003fe0000000001fe0000000001fe0000000001fe0000000001fe000000
+0001fe0000000001fe0000000001fe0000000001fe0000000001fe0000000001fe0000000001fe00
+00000001fe0000000001fe0000000001fe0000000001fe0000007f81fe000003fff1fe00000ffff9
+fe00003f81fdfe00007e007ffe0000fc001ffe0001f8000ffe0003f00007fe0003e00007fe0007e0
+0003fe000fc00003fe000fc00003fe001f800001fe001f800001fe003f800001fe003f000001fe00
+7f000001fe007f000001fe007f000001fe007f000001fe00ff000001fe00ff000001fe00ff000001
+fe00ff000001fe00ff000001fe00ff000001fe00ff000001fe00ff800001fe00ff800001fe00ff80
+0001fe00ff800001fe007fc00001fe007fc00001fe007fe00001fe003fe00001fe003ff00001fe00
+3ff80001fe001ffc0003fe000ffe0007ff000fff801fff0007ffe07dff8c03fffff9fffc01fffff1
+fff800ffffe1ffc0003fffc1ff00001fff01f8000003fc01c000>} imagemask 
+  }
+  100 /G64 MSTT31c1f0 AddChar
+/G68 [50.0 0.0 1.0 0.0 50.0 70.0]
+/G68 {
+    49 70 true [1 0 0 -1 -1.0 70.0] {<000e0000000000007e000000000003fe00000000000ffe00000000007ffe0000000000fffe000000
+0000c7fe000000000003fe000000000001fe000000000001fe000000000001fe000000000001fe00
+0000000001fe000000000001fe000000000001fe000000000001fe000000000001fe000000000001
+fe000000000001fe000000000001fe000000000001fe000000000001fe000000000001fe00000000
+0001fe000000000001fe001fc0000001fe00fff0000001fe03fff8000001fe07fffc000001fe0fff
+fe000001fe1fffff000001fe3e07ff000001fe7801ff800001fee000ff800001ffc0007f800001ff
+80007f800001ff00007fc00001fe00003fc00001fe00003fc00001fe00003fc00001fe00003fc000
+01fe00003fc00001fe00003fc00001fe00003fc00001fe00003fc00001fe00003fc00001fe00003f
+c00001fe00003fc00001fe00003fc00001fe00003fc00001fe00003fc00001fe00003fc00001fe00
+003fc00001fe00003fc00001fe00003fc00001fe00003fc00001fe00003fc00001fe00003fc00001
+fe00003fc00001fe00003fc00001fe00003fc00001fe00003fc00001fe00003fc00001fe00003fc0
+0001fe00003fc00001fe00003fc00003ff00007fe00003ff00007fe0000fffc001fff800fffffc1f
+ffff80fffffc1fffff80>} imagemask 
+  }
+  104 /G68 MSTT31c1f0 AddChar
+/G72 [33.0 0.0 1.0 0.0 33.0 46.0]
+/G72 {
+    32 46 true [1 0 0 -1 -1.0 46.0] {<000e00f0007e03fc01fe07fe0ffe0ffe7ffe1ffffffe3fffc7fe3fff03fe71ff01fee0fe01fec07e
+01ffc01c01ff800001ff000001ff000001fe000001fe000001fe000001fe000001fe000001fe0000
+01fe000001fe000001fe000001fe000001fe000001fe000001fe000001fe000001fe000001fe0000
+01fe000001fe000001fe000001fe000001fe000001fe000001fe000001fe000001fe000001fe0000
+01ff000003ff000003ff80000fffe000fffffe00fffffe00>} imagemask 
+  }
+  114 /G72 MSTT31c1f0 AddChar
+%%EndResource
+
+1 7 SJ
+586 758 2329 (Some installations need a mechanism to control allocation) 2329 SB
+1 2 SJ
+586 878 521 (of disk space) 521 SB
+32 0 0 75 75 0 0 0 60 /ZapfDingbats font
+473 1051 59 (u) 59 SB
+32 0 0 100 100 0 0 1 90 /MSTT31c1f0 font
+
+%%BeginResource: font MSTT31c1f0
+/G71 [50.0 0.0 3.0 -21.0 49.0 46.0]
+/G71 {
+    46 67 true [1 0 0 -1 -3.0 46.0] {<00003fe00e000001fffc1e000007ffff7e00001fc07ffe00003f001ffe0000fc000ffe0001f80007
+fe0003f00003fe0007e00003fe0007e00001fe000fc00001fe001fc00001fe001f800001fe003f80
+0001fe003f800001fe003f800001fe007f000001fe007f000001fe007f000001fe007f000001fe00
+ff000001fe00ff000001fe00ff000001fe00ff000001fe00ff000001fe00ff000001fe00ff000001
+fe00ff800001fe00ff800001fe00ff800001fe00ff800001fe007fc00001fe007fc00001fe007fe0
+0001fe007fe00001fe003ff00003fe003ff80003fe001ffc0007fe001fff001dfe000fffc079fe00
+07fffff9fe0007fffff1fe0003ffffe1fe0001ffff81fe00007fff01fe00003ffc01fe000007f001
+fe0000000001fe0000000001fe0000000001fe0000000001fe0000000001fe0000000001fe000000
+0001fe0000000001fe0000000001fe0000000001fe0000000001fe0000000001fe0000000001fe00
+00000001fe0000000001fe0000000003ff0000000003ff000000000fffc0000000fffffc000000ff
+fffc>} imagemask 
+  }
+  113 /G71 MSTT31c1f0 AddChar
+/G75 [50.0 0.0 1.0 -1.0 50.0 45.0]
+/G75 {
+    49 46 true [1 0 0 -1 -1.0 45.0] {<fffe001fffc000fffe001fffc0000ffe0001ffc00003fe00007fc00003fe00007fc00001fe00003f
+c00001fe00003fc00001fe00003fc00001fe00003fc00001fe00003fc00001fe00003fc00001fe00
+003fc00001fe00003fc00001fe00003fc00001fe00003fc00001fe00003fc00001fe00003fc00001
+fe00003fc00001fe00003fc00001fe00003fc00001fe00003fc00001fe00003fc00001fe00003fc0
+0001fe00003fc00001fe00003fc00001fe00003fc00001fe00003fc00001fe00003fc00001fe0000
+3fc00001fe00003fc00001fe00003fc00001fe00003fc00001fe00003fc00001fe00003fc00001fe
+00007fc00001ff0000ffc00000ff0001ffc00000ff8007bfe00000ffc00f3fe000007ff07e3ff180
+007ffffc3fff80003ffff83fff00001ffff03ff800000fffe03fe0000007ff803f00000001fc0038
+0000>} imagemask 
+  }
+  117 /G75 MSTT31c1f0 AddChar
+/G77 [72.0 0.0 1.0 -1.0 73.0 45.0]
+/G77 {
+    72 46 true [1 0 0 -1 -1.0 45.0] {<ffffe01ffffc003fffffffe01ffffc003fff3fff0003fff00003fc0ffe0000ffe00000f007fe0000
+7fc00000e003fe00007fc00000e003fe00003fc00001c001fe00003fe000018001ff00001fe00003
+8001ff00001fe000038000ff00000ff000070000ff80000ff0000700007f80000ff8000700007fc0
+000ff8000e00007fc0001ffc000e00003fc0001ffc000e00003fe0003ffc001c00001fe0003bfe00
+1c00001ff00079fe001c00001ff00071ff003800000ff000f0ff003800000ff800e0ff0038000007
+f801e0ff8070000007fc01c07f8070000007fc03c07fc0f0000003fc03803fc0e0000003fe07803f
+e0e0000001fe07003fe1e0000001fe0f001fe1c0000001ff0e001ff1c0000000ff1e000ff3c00000
+00ff9c000ffb800000007fbc0007fb800000007fb80007ff800000007ff80007ff000000003ff000
+03ff000000003ff00003ff000000001fe00001fe000000001fe00001fe000000001fc00001fc0000
+00000fc00000fc000000000f800000fc000000000780000078000000000700000078000000000700
+0000780000000002000000300000>} imagemask 
+  }
+  119 /G77 MSTT31c1f0 AddChar
+%%EndResource
+
+586 1021 2192 (Disk quotas allow the administrator to set limits on the) 2192 SB
+
+%%BeginResource: font MSTT31c1f0
+/G62 [50.0 0.0 1.0 -1.0 47.0 70.0]
+/G62 {
+    46 71 true [1 0 0 -1 -1.0 70.0] {<000e00000000007e0000000003fe000000000ffe000000007ffe00000000fffe00000000c7fe0000
+000003fe0000000001fe0000000001fe0000000001fe0000000001fe0000000001fe0000000001fe
+0000000001fe0000000001fe0000000001fe0000000001fe0000000001fe0000000001fe00000000
+01fe0000000001fe0000000001fe0000000001fe0000000001fe003f800001fe01ffe00001fe07ff
+f80001fe0ffffe0001fe1fffff0001fe3fffff8001fe7fffff8001fefc0fffc001fff001ffe001ff
+c000ffe001ff80007ff001ff00003ff001fe00001ff801fe00001ff801fe00000ff801fe00000ff8
+01fe000007fc01fe000007fc01fe000007fc01fe000003fc01fe000003fc01fe000003fc01fe0000
+03fc01fe000003fc01fe000003fc01fe000003fc01fe000003fc01fe000003f801fe000003f801fe
+000003f801fe000003f801fe000007f001fe000007f001fe000007f001fe000007e001fe00000fc0
+01fe00000fc001fe00001f8001fe00001f0001fe00003e0001ff80007c0001ffc000f80000fff001
+f000003ffc0fe000000fffff80000001fffe000000003ff00000>} imagemask 
+  }
+  98 /G62 MSTT31c1f0 AddChar
+/G2f [28.0 0.0 0.0 -1.0 28.0 70.0]
+/G2f {
+    28 71 true [1 0 0 -1 0.0 70.0] {<000000f0000001f0000001e0000001e0000003e0000003c0000003c0000007c00000078000000780
+00000f8000000f0000000f0000001f0000001e0000001e0000003e0000003c0000003c0000007c00
+00007800000078000000f8000000f0000000f0000001f0000001e0000001e0000003e0000003c000
+0003c0000007c0000007800000078000000f0000000f0000000f0000001e0000001e0000001e0000
+003c0000003c0000003c000000780000007800000078000000f0000000f0000000f0000001e00000
+01e0000001e0000003c0000003c0000003c000000780000007800000078000000f0000000f000000
+0f0000001e0000001e0000001e0000003c0000003c0000003c000000780000007800000078000000
+f0000000>} imagemask 
+  }
+  47 /G2f MSTT31c1f0 AddChar
+/G3a [28.0 0.0 9.0 -1.0 20.0 46.0]
+/G3a {
+    11 47 true [1 0 0 -1 -9.0 46.0] {<1f003f807fc0ffe0ffe0ffe0ffe0ffe07fc03f801f00000000000000000000000000000000000000
+00000000000000000000000000000000000000000000000000000000000000001f003f807fc0ffe0
+ffe0ffe0ffe0ffe07fc03f801f00>} imagemask 
+  }
+  58 /G3a MSTT31c1f0 AddChar
+%%EndResource
+
+2 5 SJ
+586 1141 1589 (number of allocated blocks and/or files:) 1589 SB
+
+%%BeginResource: font MSTT31c1fd
+/MSTT31c1fd [75.0 0 0 0 0 0] 53 -104 [-75.0 -75.0 75.0 75.0] [1 75 div 0 0 1 75 div 0 0] /MSTT31c1fd GreNewFont
+%%EndResource
+
+32 0 0 75 75 0 0 1 67 /MSTT31c1fd font
+
+%%BeginResource: font MSTT31c1fd
+/G96 [38.0 0.0 -1.0 17.0 39.0 20.0]
+/G96 {
+    40 3 true [1 0 0 -1 1.0 20.0] {<ffffffffffffffffffffffffffffff>} imagemask 
+  }
+  150 /G96 MSTT31c1fd AddChar
+%%EndResource
+
+623 1280 38 (\226) 38 SB
+
+%%BeginResource: font MSTT31c1fd
+/G6c [21.0 0.0 3.0 0.0 19.0 52.0]
+/G6c {
+    16 52 true [1 0 0 -1 -3.0 52.0] {<00e003e00fe07fe0dfe00fe007e007e007e007e007e007e007e007e007e007e007e007e007e007e0
+07e007e007e007e007e007e007e007e007e007e007e007e007e007e007e007e007e007e007e007e0
+07e007e007e007e007e007e007e007e007e00ff01ff8ffff>} imagemask 
+  }
+  108 /G6c MSTT31c1fd AddChar
+/G69 [21.0 0.0 3.0 0.0 19.0 52.0]
+/G69 {
+    16 52 true [1 0 0 -1 -3.0 52.0] {<03c007e00ff00ff00ff00ff007e003c000000000000000000000000000000000000000e003e00fe0
+7fe0dfe00fe007e007e007e007e007e007e007e007e007e007e007e007e007e007e007e007e007e0
+07e007e007e007e007e007e007e007e007e00ff01ff8ffff>} imagemask 
+  }
+  105 /G69 MSTT31c1fd AddChar
+/G6d [57.0 0.0 1.0 0.0 57.0 35.0]
+/G6d {
+    56 35 true [1 0 0 -1 -1.0 35.0] {<00e00fc001f80003e07fe007fe000fe0fff81fff007fe3fff83fff80dfe783fc783fc00fee01fce0
+1fc007f800ffc00fc007f000ff000fe007e0007e0007e007e0007e0007e007e0007e0007e007e000
+7e0007e007e0007e0007e007e0007e0007e007e0007e0007e007e0007e0007e007e0007e0007e007
+e0007e0007e007e0007e0007e007e0007e0007e007e0007e0007e007e0007e0007e007e0007e0007
+e007e0007e0007e007e0007e0007e007e0007e0007e007e0007e0007e007e0007e0007e007e0007e
+0007e007e0007e0007e007e0007e0007e007e0007e0007e00ff000ff000ff01ff801ff801ff8ffff
+0ffff0ffff>} imagemask 
+  }
+  109 /G6d MSTT31c1fd AddChar
+/G74 [21.0 0.0 0.0 -1.0 21.0 45.0]
+/G74 {
+    21 46 true [1 0 0 -1 0.0 45.0] {<00100000300000300000700000700000f00000f00001f00003f00007f0001ff0007ffff0fffff003
+f00003f00003f00003f00003f00003f00003f00003f00003f00003f00003f00003f00003f00003f0
+0003f00003f00003f00003f00003f00003f00003f00003f00003f00003f00003f00003f00003f018
+03f83001fc7001ffe000ffc000ff80003e00>} imagemask 
+  }
+  116 /G74 MSTT31c1fd AddChar
+/G73 [29.0 0.0 4.0 -1.0 27.0 35.0]
+/G73 {
+    23 36 true [1 0 0 -1 -4.0 35.0] {<01fe0807fff81e03f83c00f8780078700038700038f00018f00018f80008fc0008fe00007f80007f
+e0003ff8001ffe000fff0003ffc001ffe0007ff0001ff80007fc0001fc0000fe00007e80007e8000
+3ec0003ec0003ee0003cf0003cf80078fc00f0ff81e0ffff8083fe00>} imagemask 
+  }
+  115 /G73 MSTT31c1fd AddChar
+/G20 [19.0 0.0 0.0 0.0 0.0 0.0]
+/G20 {
+} 
+  32 /G20 MSTT31c1fd AddChar
+/G61 [33.0 0.0 3.0 -1.0 34.0 35.0]
+/G61 {
+    31 36 true [1 0 0 -1 -3.0 35.0] {<007fc00003fff80007c1fc001f007e003e003f003e003f007e001f807e001f807e001f807e001f80
+7e001f803c001f8000003f800001ff800007df80003f1f8000f81f8001e01f8007c01f800f801f80
+1f001f803e001f807e001f807c001f80fc001f80fc001f80fc001f80fc001f80fe003f80fe007f82
+7f00ff867f83dfce3fff1ffc3ffe1ff81ff80fe007e00780>} imagemask 
+  }
+  97 /G61 MSTT31c1fd AddChar
+/G72 [25.0 0.0 1.0 0.0 25.0 35.0]
+/G72 {
+    24 35 true [1 0 0 -1 -1.0 35.0] {<00e07c03e0fe0fe1ff7fe3ffdfe7ff0fee7f07ec3e07f80e07f00007f00007e00007e00007e00007
+e00007e00007e00007e00007e00007e00007e00007e00007e00007e00007e00007e00007e00007e0
+0007e00007e00007e00007e00007f0000ff0001ffc00ffff00>} imagemask 
+  }
+  114 /G72 MSTT31c1fd AddChar
+/G65 [33.0 0.0 3.0 -1.0 31.0 35.0]
+/G65 {
+    28 36 true [1 0 0 -1 -3.0 35.0] {<001fe000007ffc0001c1fe0003807f0007003f800e001fc01c001fe03c000fe038000fe038000ff0
+78000ff07ffffff07ffffff0f8000000f8000000f8000000f8000000f8000000fc000000fc000000
+fc000000fc000000fe000010fe0000307f0000307f8000607fc000603fe000e03ff001c01ffc07c0
+0fffff8007ffff0003fffe0001fffc0000fff800001fc000>} imagemask 
+  }
+  101 /G65 MSTT31c1fd AddChar
+/G6e [38.0 0.0 1.0 0.0 37.0 35.0]
+/G6e {
+    36 35 true [1 0 0 -1 -1.0 35.0] {<00e01f800003e07fe0000fe0fff0007fe3fff800dfe783fc000fee01fc0007fc00fc0007f000fe00
+07e0007e0007e0007e0007e0007e0007e0007e0007e0007e0007e0007e0007e0007e0007e0007e00
+07e0007e0007e0007e0007e0007e0007e0007e0007e0007e0007e0007e0007e0007e0007e0007e00
+07e0007e0007e0007e0007e0007e0007e0007e0007e0007e0007e0007e0007e0007e0007e0007e00
+0ff000ff001ff801ff80ffff0ffff0>} imagemask 
+  }
+  110 /G6e MSTT31c1fd AddChar
+/G67 [37.0 0.0 2.0 -16.0 36.0 35.0]
+/G67 {
+    34 51 true [1 0 0 -1 -2.0 35.0] {<000ff00000003ffc000000f83f000001f00fffc003e00fffc007c007e0000fc003f0000f8003f000
+0f8003f8001f8001f8001f8001f8001f8001f8001f8001f8001f8001f8001f8001f8001fc001f800
+0fc001f0000fc003f00007e003e00003e007c00001f007800000fc1f0000007ffe000000eff00000
+01c0000000038000000007000000000f000000000f000000001f800000001ffff000001ffffff800
+0ffffffe0007ffffff0003ffffff800307ffff800600000fc00e000001c01c000000c038000000c0
+38000000c07800000080f800000180fc00000300fe00000600ff80001c007ff000f8003ffffff000
+0fffffc00003ffff0000003ff00000>} imagemask 
+  }
+  103 /G67 MSTT31c1fd AddChar
+/G64 [38.0 0.0 3.0 -1.0 37.0 52.0]
+/G64 {
+    34 53 true [1 0 0 -1 -3.0 52.0] {<0000003800000000f800000003f80000001ff800000037f800000003f800000001f800000001f800
+000001f800000001f800000001f800000001f800000001f800000001f800000001f800000001f800
+000001f800000fe1f800003ff9f80000f83df80001e01ff80003c00ff800078007f8000f0003f800
+1f0003f8001e0001f8003e0001f8003e0001f8007c0001f8007c0001f8007c0001f8007c0001f800
+fc0001f800fc0001f800fc0001f800fc0001f800fc0001f800fc0001f800fc0001f800fe0001f800
+fe0001f8007e0001f8007f0001f8007f0001f8003f8001f8003fc001f8001fe003f8001ff00ffc00
+0ffc1dfec007fff9ff8003fff1fc0000ffe1f000003f81c000>} imagemask 
+  }
+  100 /G64 MSTT31c1fd AddChar
+/G6f [38.0 0.0 3.0 -1.0 35.0 35.0]
+/G6f {
+    32 36 true [1 0 0 -1 -3.0 35.0] {<000ff000003ffe0000f83f8003e01fc007c00fe0078007f00f0003f81f0003f81f0001fc3e0001fc
+3e0000fe7e0000fe7e0000fe7e00007ffe00007ffe00007ffe00007ffe00007ffe00007ffe00007f
+fe00007ffe00007fff00007e7f00007e7f00007e7f00007c3f80007c3f8000f81fc000f81fc000f0
+0fe001e007f003e003f8078001fe0f00007ffc00000ff000>} imagemask 
+  }
+  111 /G6f MSTT31c1fd AddChar
+/G66 [24.0 0.0 2.0 0.0 32.0 52.0]
+/G66 {
+    30 52 true [1 0 0 -1 -2.0 52.0] {<00007f000001ffc000070ff0000e07f8001c03fc003c01fc007800fc007800fc00f8003800f80000
+00f8000001f8000001f8000001f8000001f8000001f8000001f8000001f80000fffffc00fffffc00
+01f8000001f8000001f8000001f8000001f8000001f8000001f8000001f8000001f8000001f80000
+01f8000001f8000001f8000001f8000001f8000001f8000001f8000001f8000001f8000001f80000
+01f8000001f8000001f8000001f8000001f8000001f8000001f8000001f8000003fc000007fc0000
+0fff0000fffff800>} imagemask 
+  }
+  102 /G66 MSTT31c1fd AddChar
+/G79 [36.0 0.0 0.0 -16.0 36.0 34.0]
+/G79 {
+    36 50 true [1 0 0 -1 0.0 34.0] {<ffff003ff03ff80007c01ff00003800ff000030007f000070007f000060003f000060003f8000e00
+01f8000c0001fc000c0000fc00180000fe001800007e003800007f003000003f003000003f806000
+001f806000001fc0c000000fc0c000000fe0c0000007e180000007f180000003f300000003fb0000
+0001ff00000001fe00000000fe00000000fc000000007c0000000078000000003800000000380000
+00003000000000300000000060000000006000000000e000000000c000000000c000000001800000
+000380000000030000001f0f0000003ffe0000007ffe0000007ffc0000007ff80000003ff0000000
+3fe00000000f80000000>} imagemask 
+  }
+  121 /G79 MSTT31c1fd AddChar
+/G62 [38.0 0.0 1.0 -1.0 35.0 52.0]
+/G62 {
+    34 53 true [1 0 0 -1 -1.0 52.0] {<00e000000003e00000000fe00000007fe0000000dfe00000000fe000000007e000000007e0000000
+07e000000007e000000007e000000007e000000007e000000007e000000007e000000007e0000000
+07e000000007e03f800007e0ffe00007e1fff00007e3fff80007e7fffc0007ef07fe0007fc01ff00
+07f800ff0007f0007f8007e0003f8007e0003f8007e0001f8007e0001fc007e0001fc007e0000fc0
+07e0000fc007e0000fc007e0000fc007e0000fc007e0000fc007e0000fc007e0000fc007e0000f80
+07e0000f8007e0001f8007e0001f0007e0001f0007e0001e0007e0003e0007e0003c0007e0007800
+07f800f00007fc01e00001ff078000003ffe00000007f80000>} imagemask 
+  }
+  98 /G62 MSTT31c1fd AddChar
+%%EndResource
+
+5 7 SJ
+717 1280 1226 (limits are managed on a file system basis) 1226 SB
+623 1388 38 (\226) 38 SB
+
+%%BeginResource: font MSTT31c1fd
+/G71 [38.0 0.0 3.0 -16.0 37.0 35.0]
+/G71 {
+    34 51 true [1 0 0 -1 -3.0 35.0] {<0007f81800003ffe780000f81ff80001e00ff80003c007f800078003f8000f0003f8001f0001f800
+1e0001f8003e0001f8003e0001f8007c0001f8007c0001f8007c0001f800fc0001f800fc0001f800
+fc0001f800fc0001f800fc0001f800fc0001f800fc0001f800fc0001f800fe0001f800fe0001f800
+fe0001f8007f0001f8007f0001f8007f8001f8003fc003f8003fe007f8001ff81df8000ffff9f800
+07fff1f80003ffe1f80001ff81f800007e01f800000001f800000001f800000001f800000001f800
+000001f800000001f800000001f800000001f800000001f800000001f800000001f800000001f800
+000003fc00000007fe0000003fffc0>} imagemask 
+  }
+  113 /G71 MSTT31c1fd AddChar
+/G75 [38.0 0.0 1.0 -1.0 37.0 34.0]
+/G75 {
+    36 35 true [1 0 0 -1 -1.0 34.0] {<ffe00ffe001fe001fe000fe000fe0007e0007e0007e0007e0007e0007e0007e0007e0007e0007e00
+07e0007e0007e0007e0007e0007e0007e0007e0007e0007e0007e0007e0007e0007e0007e0007e00
+07e0007e0007e0007e0007e0007e0007e0007e0007e0007e0007e0007e0007e0007e0007e0007e00
+07e0007e0007e0007e0007e0007e0007f000fe0003f003fe0003f8077f0003fc1e7fb001fffc7fe0
+00fff07f00007fe07c00001f807000>} imagemask 
+  }
+  117 /G75 MSTT31c1fd AddChar
+/G63 [33.0 0.0 3.0 -1.0 31.0 35.0]
+/G63 {
+    28 36 true [1 0 0 -1 -3.0 35.0] {<000ff000007ffc0000f07f0003c03f8007801fc00f001fc01f000fe01e000fe03e000fe03e0007e0
+7c0003c07c0000007c000000fc000000fc000000fc000000fc000000fc000000fc000000fe000000
+fe000000fe000000ff0000107f0000307f0000307f8000607fc000603fe000c03ff001c01ffc0f80
+0fffff8007ffff0003fffe0001fffc0000fff000001f8000>} imagemask 
+  }
+  99 /G63 MSTT31c1fd AddChar
+/G77 [53.0 0.0 1.0 -1.0 53.0 34.0]
+/G77 {
+    52 35 true [1 0 0 -1 -1.0 34.0] {<fffc0fffc03ff07ff003ff0007e01fe000fe0003800fe000fe0003000fe0007e00030007e0007e00
+060007e0003f00060007f0003f00060003f0003f000c0003f0003f800c0001f8003f800c0001f800
+7fc0180001fc006fc0180000fc00efc0180000fc00cfe0300000fe00c7e03000007e0187e0300000
+7e0183f06000003f0303f06000003f0303f8e000003f8601f8c000001f8601f8c000001f8c01fdc0
+00001fcc00fd8000000fd800fd8000000fd8007f80000007f8007f00000007f0007f00000007f000
+3e00000003e0003e00000003e0003e00000003c0001c00000001c0001c0000000180001c00000000
+8000080000>} imagemask 
+  }
+  119 /G77 MSTT31c1fd AddChar
+/G68 [38.0 0.0 1.0 0.0 37.0 52.0]
+/G68 {
+    36 52 true [1 0 0 -1 -1.0 52.0] {<00e000000003e00000000fe00000007fe0000000dfe00000000fe000000007e000000007e0000000
+07e000000007e000000007e000000007e000000007e000000007e000000007e000000007e0000000
+07e000000007e01f800007e07fe00007e0fff00007e3fff80007e783f80007ee01fc0007fc00fc00
+07f000fe0007e0007e0007e0007e0007e0007e0007e0007e0007e0007e0007e0007e0007e0007e00
+07e0007e0007e0007e0007e0007e0007e0007e0007e0007e0007e0007e0007e0007e0007e0007e00
+07e0007e0007e0007e0007e0007e0007e0007e0007e0007e0007e0007e0007e0007e0007e0007e00
+07e0007e000ff000ff001ff801ff80ffff0ffff0>} imagemask 
+  }
+  104 /G68 MSTT31c1fd AddChar
+/G70 [38.0 0.0 1.0 -16.0 35.0 35.0]
+/G70 {
+    34 51 true [1 0 0 -1 -1.0 35.0] {<00e01f800003e07fe0000fe1fff0007fe3fff800ffe7fffc000fef07fe0007ee01ff0007f800ff00
+07f0007f8007e0003f8007e0003f8007e0001f8007e0001fc007e0001fc007e0001fc007e0000fc0
+07e0000fc007e0000fc007e0000fc007e0000fc007e0000fc007e0000fc007e0000f8007e0000f80
+07e0000f8007e0001f0007e0001f0007e0001f0007e0003e0007f0003c0007f0007c0007f8007800
+07fc00f00007ff03e00007e7ff800007e1fe000007e000000007e000000007e000000007e0000000
+07e000000007e000000007e000000007e000000007e000000007e000000007e000000007e0000000
+0ff00000001ff8000000ffff000000>} imagemask 
+  }
+  112 /G70 MSTT31c1fd AddChar
+%%EndResource
+
+717 1388 1558 (quotas can be associated with users and user groups) 1558 SB
+EJ RS
+%%PageTrailer
+SS
+0 0 18 13 783 1169 300 SM
+255 255 255 fC
+/fm 256 def
+3250 2250 88 49 B
+1 F
+n
+1 lc
+1 lj
+0 0 0 pC
+6 17 SP
+gs 2857 2349 88 0 CB
+-2765 499 M 8559 0 1 PP
+S
+n
+gr
+32 0 0 58 58 0 0 1 53 /MSTT31c1bc font
+0 0 0 fC
+25 8 SJ
+153 2191 1278 (Third International Linux Conference - Berlin - May 96) 1278 SB
+
+%%BeginResource: font MSTT31c1bc
+/G34 [29.0 0.0 1.0 0.0 26.0 40.0]
+/G34 {
+    25 40 true [1 0 0 -1 -1.0 40.0] {<0000f0000000f0000001f0000001f0000003f0000007f0000007f000000df000001df0000019f000
+0031f0000031f0000061f00000e1f00000c1f0000181f0000181f0000301f0000701f0000601f000
+0c01f0000c01f0001801f0003801f0003001f0006001f000e001f000ffffff80ffffff80ffffff80
+0001f0000001f0000001f0000001f0000001f0000001f0000001f0000001f0000001f0000001f000
+>} imagemask 
+  }
+  52 /G34 MSTT31c1bc AddChar
+%%EndResource
+
+2919 2191 29 (4) 29 SB
+32 0 0 167 167 0 0 0 150 /MSTT31c1c9 font
+%%BeginResource: font MSTT31c1c9
+currentfile eexec
+9e67edc6b858a3e762244b628fb7f6f6b82db3d80533f85f9af7ec02fa0992f446e47e7476690365d15488a3d0557140c554c35b60083b9bf344ec199d995ff7
+cd974526686a837538b7a59d0439a4b687a9024e596c4b1dde5fe3f345cafae8cf4c808fb96646624e02e6ffc7fee976c6bc04297090beef82b38032beb8ee2f
+6bc81681d15818312c65bab2e7a843bdd3f258a0a30ee0b1c119aff67bb748720cea1369ef4bc2b2aa5b4c1af425550815b3e5607df8333913f207b8e5750be8
+ea52046b1728bbe207ca2300df72213da0e76feaea3f072404ebb5a7d7c446ac0c712bebbc02a47962fbd614355b5948e7d659101d06ea214be3a60a4699f41f
+ba51b6a14fd6436539f3f3f178ea676bf5eb0ccb02b42c86d0ea544cefcebaf0d98921a2ccdf71b977889a5a877dbe0dad197f68c7b9d48da8c3268038eb4550
+7174185a8934678b3172e281758f08f294af4f839c9cba87637bf400551254e6e21cda
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+
+cleartomark
+%%EndResource
+-6 3 SJ
+256 284 1650 (Principles of disk quotas) 1650 SB
+32 0 0 75 75 0 0 0 60 /ZapfDingbats font
+473 644 59 (u) 59 SB
+32 0 0 100 100 0 0 1 90 /MSTT31c1f0 font
+
+%%BeginResource: font MSTT31c1f0
+/G67 [49.0 0.0 3.0 -21.0 47.0 46.0]
+/G67 {
+    44 67 true [1 0 0 -1 -3.0 46.0] {<0000ff8000000007fff80000001f81fe0000003e007ffff000fc003ffff001f8001ffff001f8001f
+f00003f0000ff00007f0000ff80007e00007f8000fe00007f8000fe00007fc000fe00003fc001fe0
+0003fc001fe00003fc001fe00003fc001fe00003fc001fe00003fc001fe00003fc001fe00003fc00
+1ff00003f8000ff00003f8000ff00003f80007f80007f00007f80007e00003fc0007e00003fc000f
+c00001fe001f8000007f003f0000003fc0fc0000001ffff000000038ff80000000700000000000e0
+0000000003e00000000007c00000000007c0000000000fc0000000001ff0000000001fffffc00000
+1ffffffff0001ffffffffe000fffffffff0007ffffffff8003ffffffffc000ffffffffe001c0ffff
+ffe003c000001ff00780000001f00700000000f00f00000000701e00000000703e00000000703e00
+000000607e00000000e07e00000000e0ff00000001c0ff8000000380ffe000000f00fff800003e00
+7fff8003fc003ffffffff8001ffffffff00007ffffffc00001ffffff0000007ffff800000007ff80
+0000>} imagemask 
+  }
+  103 /G67 MSTT31c1f0 AddChar
+%%EndResource
+
+4 9 SJ
+586 614 2281 (Disk quotas can be associated with users and user groups) 2281 SB
+32 0 0 75 75 0 0 0 60 /ZapfDingbats font
+473 788 59 (u) 59 SB
+32 0 0 100 100 0 0 1 90 /MSTT31c1f0 font
+
+%%BeginResource: font MSTT31c1f0
+/G54 [61.0 0.0 3.0 0.0 59.0 67.0]
+/G54 {
+    56 67 true [1 0 0 -1 -3.0 67.0] {<7ffffffffffffe7ffffffffffffe7ffffffffffffe7f8001ff0003fe7e0001ff00007e7c0001ff00
+003e780001ff00001ef00001ff00000fe00001ff000007e00001ff000007e00001ff000007c00001
+ff000003c00001ff000003c00001ff000003000001ff000000000001ff000000000001ff00000000
+0001ff000000000001ff000000000001ff000000000001ff000000000001ff000000000001ff0000
+00000001ff000000000001ff000000000001ff000000000001ff000000000001ff000000000001ff
+000000000001ff000000000001ff000000000001ff000000000001ff000000000001ff0000000000
+01ff000000000001ff000000000001ff000000000001ff000000000001ff000000000001ff000000
+000001ff000000000001ff000000000001ff000000000001ff000000000001ff000000000001ff00
+0000000001ff000000000001ff000000000001ff000000000001ff000000000001ff000000000001
+ff000000000001ff000000000001ff000000000001ff000000000001ff000000000001ff00000000
+0001ff000000000001ff000000000001ff000000000001ff000000000003ff800000000003ff8000
+00000007ffc0000000001ffff000000003ffffff80000003ffffff8000>} imagemask 
+  }
+  84 /G54 MSTT31c1f0 AddChar
+/G79 [47.0 0.0 0.0 -21.0 47.0 45.0]
+/G79 {
+    47 66 true [1 0 0 -1 0.0 45.0] {<fffff8007ffefffff8007ffe3fff800007f00fff000003e007fe000003c007fe0000038003ff0000
+038001ff0000070001ff0000070000ff80000f0000ff80000e00007fc0000e00007fc0001c00003f
+e0001c00003fe0003c00001ff0003800001ff0003800000ff0007000000ff80070000007f800f000
+0007fc00e0000003fc00e0000003fe01c0000001fe01c0000001ff01c0000000ff0380000000ff83
+80000000ff87800000007fc7000000007fc7000000003fee000000003fee000000001ffe00000000
+1ffc000000000ffc000000000ff80000000007f80000000007f80000000003f00000000003f00000
+000001e00000000001e00000000001e00000000001c00000000001c0000000000380000000000380
+000000000780000000000700000000000700000000000e00000000000e00000000001e0000000000
+1c00000000003c00000007c0780000001ff0f80000001ffff00000003ffff00000003fffe0000000
+3fffc00000003fff800000001fff000000001ffe000000000ff80000000003e000000000>} imagemask 
+  }
+  121 /G79 MSTT31c1f0 AddChar
+%%EndResource
+
+5 10 SJ
+586 758 2328 (They limit the number of blocks and the number of inodes) 2328 SB
+
+%%BeginResource: font MSTT31c1f0
+/G28 [33.0 0.0 4.0 -21.0 31.0 69.0]
+/G28 {
+    27 90 true [1 0 0 -1 -4.0 69.0] {<00000020000000e0000003c00000078000001e0000003c00000078000000f0000001e0000003c000
+00078000000f8000001f0000003e0000003e0000007c000000fc000000f8000001f8000003f80000
+03f0000007f0000007f000000fe000000fe000000fe000001fe000001fe000001fc000003fc00000
+3fc000003fc000007fc000007fc000007f8000007f8000007f8000007f800000ff800000ff800000
+ff800000ff800000ff800000ff800000ff800000ff800000ff800000ff800000ff800000ff800000
+ff800000ff8000007f8000007f8000007fc000007fc000007fc000007fc000003fc000003fc00000
+3fc000001fc000001fe000001fe000000fe000000fe0000007f0000007f0000007f0000003f00000
+03f8000001f8000000fc000000fc0000007c0000003e0000003f0000001f0000000f80000007c000
+0003c0000001e0000000f0000000780000003c0000000f0000000780000001c0000000e000000020
+>} imagemask 
+  }
+  40 /G28 MSTT31c1f0 AddChar
+/G29 [33.0 0.0 2.0 -21.0 29.0 69.0]
+/G29 {
+    27 90 true [1 0 0 -1 -2.0 69.0] {<80000000e0000000780000003c0000001f0000000780000003c0000001e0000000f0000000780000
+007c0000003e0000001f0000001f8000000f80000007c0000007e0000003e0000003f0000003f800
+0001f8000001fc000001fc000001fc000000fe000000fe000000ff000000ff0000007f0000007f80
+00007f8000007f8000007fc000007fc000007fc000007fc000003fc000003fc000003fe000003fe0
+00003fe000003fe000003fe000003fe000003fe000003fe000003fe000003fe000003fe000003fe0
+00003fe000003fe000003fc000003fc000003fc000003fc000007fc000007fc000007f8000007f80
+00007f8000007f000000ff000000ff000000fe000000fe000000fe000001fc000001fc000001f800
+0003f8000003f0000003e0000007e0000007c000000f8000000f8000001f0000003e0000003c0000
+0078000000f0000001e0000003c00000078000000f0000003c00000078000000e000000080000000
+>} imagemask 
+  }
+  41 /G29 MSTT31c1f0 AddChar
+%%EndResource
+
+4 7 SJ
+586 878 1804 (\(files\) that a user/group is allowed to allocate) 1804 SB
+32 0 0 75 75 0 0 0 60 /ZapfDingbats font
+473 1051 59 (u) 59 SB
+32 0 0 100 100 0 0 1 90 /MSTT31c1f0 font
+
+%%BeginResource: font MSTT31c1f0
+/G4c [59.0 0.0 2.0 0.0 57.0 67.0]
+/G4c {
+    55 67 true [1 0 0 -1 -2.0 67.0] {<fffffff8000000fffffff800000007fffe0000000001fff80000000000ffe00000000000ffe00000
+0000007fc000000000007fc000000000007fc000000000007fc000000000007fc000000000007fc0
+00000000007fc000000000007fc000000000007fc000000000007fc000000000007fc00000000000
+7fc000000000007fc000000000007fc000000000007fc000000000007fc000000000007fc0000000
+00007fc000000000007fc000000000007fc000000000007fc000000000007fc000000000007fc000
+000000007fc000000000007fc000000000007fc000000000007fc000000000007fc000000000007f
+c000000000007fc000000000007fc000000000007fc000000000007fc000000000007fc000000000
+007fc000000000007fc000000000007fc000000000007fc000000000007fc000000000007fc00000
+0000007fc000000000007fc000000000007fc000000000007fc000000006007fc00000000e007fc0
+0000000c007fc00000000c007fc00000001c007fc00000001c007fc000000038007fc00000003800
+7fc000000078007fc0000000f0007fc0000001f0007fc0000003f000ffe0000007f000ffe000001f
+e001fff80000ffe007ffffffffffe0ffffffffffffc0ffffffffffffc0>} imagemask 
+  }
+  76 /G4c MSTT31c1f0 AddChar
+%%EndResource
+
+586 1021 288 (Limits:) 288 SB
+32 0 0 75 75 0 0 1 67 /MSTT31c1fd font
+623 1160 38 (\226) 38 SB
+717 1160 402 (current usage) 402 SB
+623 1268 38 (\226) 38 SB
+
+%%BeginResource: font MSTT31c1fd
+/G3a [21.0 0.0 7.0 -1.0 15.0 35.0]
+/G3a {
+    8 36 true [1 0 0 -1 -7.0 35.0] {<3c7effffffff7e3c00000000000000000000000000000000000000003c7effffffff7e3c>} imagemask 
+  }
+  58 /G3a MSTT31c1fd AddChar
+/G78 [37.0 0.0 0.0 0.0 37.0 34.0]
+/G78 {
+    37 34 true [1 0 0 -1 0.0 34.0] {<ffff01ffc01ffc007f000ff8003c0007f800380003f800300001fc00700000fe00600000fe00c000
+007f018000003f830000003fc70000001fee0000000fec00000007f800000007f000000003f80000
+0001fc00000001fe00000001fe000000037f000000063f8000000c3f8000001c1fc00000380fe000
+00300ff000006007f00000c003f80001c003fc00038001fc00030000fe00070000ff000f0000ff80
+1fc001ffe07ff007fff8>} imagemask 
+  }
+  120 /G78 MSTT31c1fd AddChar
+/G6b [37.0 0.0 1.0 0.0 37.0 52.0]
+/G6b {
+    36 52 true [1 0 0 -1 -1.0 52.0] {<00e000000003e00000000fe00000007fe0000000dfe00000000fe000000007e000000007e0000000
+07e000000007e000000007e000000007e000000007e000000007e000000007e000000007e0000000
+07e000000007e000000007e007ffe007e003fe0007e001f00007e001e00007e001c00007e0030000
+07e006000007e00c000007e038000007e070000007e0e0000007e1c0000007e380000007e7800000
+07efc0000007ffe0000007efe0000007e7f0000007e3f8000007e3fc000007e1fe000007e0fe0000
+07e07f000007e03f800007e03fc00007e01fe00007e00fe00007e007f00007e003f80007e003fc00
+07e001fe000ff001ff801ff801fff0ffff07fff0>} imagemask 
+  }
+  107 /G6b MSTT31c1fd AddChar
+/G2f [21.0 0.0 0.0 -1.0 21.0 52.0]
+/G2f {
+    21 53 true [1 0 0 -1 0.0 52.0] {<0000380000780000700000700000e00000e00000e00001c00001c00001c000038000038000038000
+0700000700000700000e00000e00000e00001c00001c00001c000038000038000038000070000070
+0000700000e00000e00000e00001c00001c00001c000038000038000038000070000070000070000
+0e00000e00000e00001c00001c00001c0000380000380000380000700000700000700000e00000>} imagemask 
+  }
+  47 /G2f MSTT31c1fd AddChar
+%%EndResource
+
+717 1268 2212 (soft limit: maximal number of blocks/inodes that a user/group is expected) 2212 SB
+-1 1 SJ
+717 1359 220 (to need) 220 SB
+623 1467 38 (\226) 38 SB
+717 1467 2205 (hard limit: maximal number of blocks/inodes that a user/group is allowed) 2205 SB
+-1 1 SJ
+717 1557 311 (to allocate) 311 SB
+EJ RS
+%%PageTrailer
+SS
+0 0 18 13 783 1169 300 SM
+255 255 255 fC
+/fm 256 def
+3250 2250 88 49 B
+1 F
+n
+1 lc
+1 lj
+0 0 0 pC
+6 17 SP
+gs 2857 2349 88 0 CB
+-2765 499 M 8559 0 1 PP
+S
+n
+gr
+32 0 0 58 58 0 0 1 53 /MSTT31c1bc font
+0 0 0 fC
+25 8 SJ
+153 2191 1278 (Third International Linux Conference - Berlin - May 96) 1278 SB
+
+%%BeginResource: font MSTT31c1bc
+/G35 [29.0 0.0 3.0 0.0 25.0 39.0]
+/G35 {
+    22 39 true [1 0 0 -1 -3.0 39.0] {<00fffc00fff801fff801fff003fff00300000600000600000c00000c00001f80001ff0003ffc003f
+fe007fff8003ffc0007fc0001fe00007f00003f00001f00000f80000f80000780000780000780000
+780000780000700000700000700000e00000c00001c0700380fc0f00fffc007ff8001fc000>} imagemask 
+  }
+  53 /G35 MSTT31c1bc AddChar
+%%EndResource
+
+2919 2191 29 (5) 29 SB
+32 0 0 150 150 0 0 0 134 /MSTT31c1c9 font
+%%BeginResource: font MSTT31c1c9
+currentfile eexec
+9e67edc6b858a3e762244b628fb7f6f6b82db3d80533f85f9af7ec02fa0992f446e47e7476690365d15488a3d0557140c554c35b60083b9bf344ec199d995ff7
+cd974526686a837538b7a59d013dcfd52cf6001bd0d7663003bf0bea02713009112d390690aa8cec87224298d4c086f147a6b31276874f777b1552311010bf1a
+02aa65d153b06e732c7e0ffde68b3179b32ebd2d3d8bc355078d5346e8a53371f430cca006c34facac0d84562ed903c711b1506f186956159070ec7f114ff4d3
+59e5ee8ff1d184226fed9ea73198dfc19f44a91fe1380a15adaabcc4c52aa3c0690bcddedd640992169f01e19541e67a31503a333d47c5bde2cf24604721b6f0
+be8540fe1805b6425f3999bf18b8b12287e1ba05c78f36d229d0
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+
+cleartomark
+%%EndResource
+256 305 1695 (Principles of disk quotas \(2\)) 1695 SB
+32 0 0 75 75 0 0 0 60 /ZapfDingbats font
+473 644 59 (u) 59 SB
+32 0 0 100 100 0 0 1 90 /MSTT31c1f0 font
+
+%%BeginResource: font MSTT31c1f0
+/G57 [95.0 0.0 3.0 -1.0 94.0 67.0]
+/G57 {
+    91 68 true [1 0 0 -1 -3.0 67.0] {<ffffff03fffffe0000ffffe0ffffff03fffffe0000ffffe00ffff0007fffe000000fff0007ffe000
+1fff80000003fc0003ffc0000fff80000001f80001ffc00007ff00000001f80000ffc00007ff0000
+0001f00000ffc00003ff00000001f00000ffc00003ff80000001e000007fc00001ff80000001e000
+007fe00001ff80000001c000007fe00000ff80000003c000003fe00000ffc0000003c000003ff000
+00ffc00000038000001ff000007fc00000078000001ff000007fe00000078000001ff800007fe000
+00070000000ff800003fe000000f0000000ff800003ff000000f0000000ffc00003ff000000e0000
+0007fc00001ff000001e00000007fc00001ff800001c00000007fe00001ff800003c00000003fe00
+003ff800003c00000003fe00003ffc00003800000001ff00003ffc00007800000001ff00007ffc00
+007800000001ff00007ffe0000f000000000ff80007bfe0000f000000000ff80007bff0000e00000
+0000ffc000fbff0001e0000000007fc000f1ff0001e0000000007fc000f1ff8001c0000000007fe0
+01f1ff8003c0000000003fe001e0ff8003c0000000003fe001e0ffc00780000000001ff003e0ffc0
+0780000000001ff003c07fc00700000000001ff003c07fe00f00000000000ff803c03fe00f000000
+00000ff807c03fe00e00000000000ff807803ff01e000000000007fc07801ff01e000000000007fc
+0f801ff03c000000000007fe0f001ff83c000000000003fe0f000ff838000000000003fe1f000ffc
+78000000000001ff1e000ffc78000000000001ff1e0007fc70000000000001ff3e0007fef0000000
+000000ffbc0007fef0000000000000ffbc0003ffe0000000000000ffbc0003ffe00000000000007f
+f80001ffc00000000000007ff80001ffc00000000000007ff80001ffc00000000000003ff80000ff
+800000000000003ff00000ff800000000000001ff00000ff800000000000001ff000007f00000000
+0000001fe000007f000000000000000fe000007f000000000000000fe000003e000000000000000f
+c000003e0000000000000007c000003c0000000000000007c000001c00000000000000078000001c
+00000000000000038000000800000000>} imagemask 
+  }
+  87 /G57 MSTT31c1f0 AddChar
+/G2c [25.0 0.0 5.0 -16.0 20.0 10.0]
+/G2c {
+    15 26 true [1 0 0 -1 -5.0 10.0] {<0f803fe07ff0fff8fffcfffcfffcfffe7ffe3ffe1f0e000e000e000e001c001c00180038007000e0
+01c003800f007c00f0008000>} imagemask 
+  }
+  44 /G2c MSTT31c1f0 AddChar
+%%EndResource
+
+4 9 SJ
+586 614 2101 (When the soft limit is reached, a warning message is) 2101 SB
+586 734 283 (printed) 283 SB
+32 0 0 75 75 0 0 0 60 /ZapfDingbats font
+473 908 59 (u) 59 SB
+32 0 0 100 100 0 0 1 90 /MSTT31c1f0 font
+
+%%BeginResource: font MSTT31c1f0
+/G78 [51.0 0.0 1.0 0.0 49.0 45.0]
+/G78 {
+    48 45 true [1 0 0 -1 -1.0 45.0] {<ffffe007fff8ffffe007fff81fff8000ffc007ff00007f0003ff00007e0001ff00007c0000ff8000
+780000ffc000f000007fe001e000003fe001c000003ff003c000001ff8078000000ffc0f00000007
+fe1e00000007fe1c00000003ff3800000001fff800000000fff000000000ffe0000000007fe00000
+00003ff0000000001ff0000000001ff8000000001ffc000000003ffe000000003bfe0000000073ff
+00000000e1ff80000001e0ff80000003c07fc0000007807fe0000007003ff000000e001ff000001c
+001ff800003c000ffc0000780007fe0000700003fe0000f00003ff0001e00001ff8003e00000ffc0
+07e00000ffc00ff00000ffe01ff80003fff87fff001fffff7fff001fffff>} imagemask 
+  }
+  120 /G78 MSTT31c1f0 AddChar
+%%EndResource
+
+6 9 SJ
+586 878 2329 (The hard limit cannot be exceeded \(system calls return the) 2329 SB
+2 1 SJ
+586 998 218 (error ) 218 SB
+32 0 0 100 100 0 0 0 86 /Courier-Bold /font9 ANSIFont font
+806 1002 360 (EDQUOT) 360 SB
+32 0 0 100 100 0 0 1 90 /MSTT31c1f0 font
+1166 998 33 (\)) 33 SB
+32 0 0 75 75 0 0 0 60 /ZapfDingbats font
+473 1171 59 (u) 59 SB
+32 0 0 100 100 0 0 1 90 /MSTT31c1f0 font
+
+%%BeginResource: font MSTT31c1f0
+/G47 [72.0 0.0 4.0 -1.0 71.0 68.0]
+/G47 {
+    67 69 true [1 0 0 -1 -4.0 68.0] {<0000000fff00030000000001fffff0030000000007fffffe03000000001ffc00ffc7000000007fc0
+001fff00000001ff000007ff80000003fe000001ff80000007f8000000ff8000000ff00000007f80
+00001fe00000003f8000003fc00000001f8000007f800000000f800000ff800000000f800001ff00
+00000007800001ff0000000007800003fe0000000003800007fc0000000003c00007fc0000000001
+c0000ffc0000000001c0000ff80000000000c0001ff80000000000c0001ff8000000000000003ff0
+000000000000003ff0000000000000003ff0000000000000007ff0000000000000007ff000000000
+0000007fe0000000000000007fe0000000000000007fe000000000000000ffe000000000000000ff
+e00000007fffffe0ffe00000007fffffe0ffe000000003fffe00ffe000000000fff800ffe0000000
+007ff000ffe0000000007ff000ffe0000000003fe000ffe0000000003fe000ffe0000000003fe000
+fff0000000003fe000fff0000000003fe0007ff0000000003fe0007ff0000000003fe0007ff00000
+00003fe0007ff8000000003fe0003ff8000000003fe0003ff8000000003fe0001ffc000000003fe0
+001ffc000000003fe0001ffe000000003fe0000ffe000000003fe0000fff000000003fe00007ff00
+0000003fe00003ff800000003fe00003ff800000003fe00001ffc00000003fe00000ffe00000003f
+e000007ff00000003fe000003ff80000003fe000001ffc0000003fe000000ffe0000003fe0000007
+ff8000003fe0000001ffc00000ffc00000007ff80007ff000000001fff003ffc0000000007ffffff
+f00000000000ffffff00000000000007ffe0000000>} imagemask 
+  }
+  71 /G47 MSTT31c1f0 AddChar
+%%EndResource
+
+2 1 SJ
+586 1141 545 (Grace period:) 545 SB
+32 0 0 75 75 0 0 1 67 /MSTT31c1fd font
+623 1280 38 (\226) 38 SB
+
+%%BeginResource: font MSTT31c1fd
+/G37 [38.0 0.0 3.0 -1.0 35.0 50.0]
+/G37 {
+    32 51 true [1 0 0 -1 -3.0 50.0] {<07ffffff0fffffff0fffffff0ffffffe1ffffffe1ffffffe3ffffffc3e00003c3800007c70000078
+60000078400000f8c00000f0000000f0000001f0000001e0000001e0000003e0000003c0000003c0
+00000780000007800000078000000f0000000f0000000f0000001e0000001e0000001e0000003c00
+00003c0000003c000000780000007800000078000000f0000000f0000000f0000001e0000001e000
+0003e0000003c0000003c0000007c0000007800000078000000f8000000f0000000f0000001f0000
+001e0000>} imagemask 
+  }
+  55 /G37 MSTT31c1fd AddChar
+%%EndResource
+
+2 3 SJ
+717 1280 513 (7 days by default) 513 SB
+623 1388 38 (\226) 38 SB
+
+%%BeginResource: font MSTT31c1fd
+/G57 [70.0 0.0 2.0 -1.0 70.0 50.0]
+/G57 {
+    68 51 true [1 0 0 -1 -2.0 50.0] {<ffffc1ffffc007fff01ffe007ffc00007f800ffc001ff800003f0007f8000ff800001e0003f8000f
+f800001c0003fc0007f800001c0003fc0007f80000180001fc0003f80000380001fc0003f8000038
+0001fe0003fc0000300000fe0001fc0000700000fe0001fc0000700000ff0001fe00006000007f00
+00fe0000e000007f0000fe0000e000007f8000ff0000c000003f8000ff0001c000003f8001ff0001
+c000003fc001ff80018000001fc001ff80038000001fc003ff80038000001fe0039fc0030000000f
+e0039fc0070000000fe0079fe0070000000ff0070fe00600000007f0070fe00e00000007f0070ff0
+0e00000007f80e07f00c00000003f80e07f01c00000003f80e07f81c00000003fc1c03f818000000
+01fc1c03f83800000001fc1c03fc3800000001fe3801fc3000000000fe3801fc7000000000fe3801
+fe70000000007f7000fee0000000007f7000fee0000000007f70007fe0000000003fe0007fc00000
+00003fe0007fc0000000003fe0003fc0000000001fc0003f80000000001fc0003f80000000001fc0
+001f00000000000f80001f00000000000f80001f00000000000f80000e00000000000700000e0000
+0000000700000e000000000007000004000000>} imagemask 
+  }
+  87 /G57 MSTT31c1fd AddChar
+/G76 [37.0 0.0 1.0 -1.0 36.0 34.0]
+/G76 {
+    35 35 true [1 0 0 -1 -1.0 34.0] {<ffff007fe03ff8000f800ff800070007f000060007f800060003f8000e0003f8000c0001f8001c00
+01fc00180001fc00180000fe00380000fe003000007e007000007f006000007f006000003f80e000
+003f80c000001f81c000001fc18000000fc18000000fe38000000fe300000007e300000007f70000
+0003f600000003fe00000003fc00000001fc00000001fc00000000f800000000f800000000f00000
+000070000000007000000000200000>} imagemask 
+  }
+  118 /G76 MSTT31c1fd AddChar
+/G2c [19.0 0.0 3.0 -12.0 14.0 7.0]
+/G2c {
+    11 19 true [1 0 0 -1 -3.0 7.0] {<1e007f80ff80ffc0ffe0ffe07fe03c6000600060004000c000c0018003000e001800f0008000>} imagemask 
+  }
+  44 /G2c MSTT31c1fd AddChar
+/G28 [25.0 0.0 3.0 -16.0 23.0 52.0]
+/G28 {
+    20 68 true [1 0 0 -1 -3.0 52.0] {<0000100000600000c0000380000600000e00001c0000380000700000f00001e00001e00003c00007
+c00007c0000f80000f80001f80001f80001f00003f00003f00003f00007f00007f00007e00007e00
+007e0000fe0000fe0000fe0000fe0000fe0000fe0000fe0000fe0000fe0000fe0000fe0000fe0000
+7e00007e00007f00007f00007f00003f00003f00003f00001f00001f80000f80000f80000f800007
+c00003c00003c00001e00000e00000f000007800003800001c00000e000007000003800000c00000
+60000010>} imagemask 
+  }
+  40 /G28 MSTT31c1fd AddChar
+%%EndResource
+
+717 1388 2078 (When this period is over, the soft limit is treated as the hard limit \(no) 2078 SB
+
+%%BeginResource: font MSTT31c1fd
+/G29 [25.0 0.0 2.0 -16.0 22.0 52.0]
+/G29 {
+    20 68 true [1 0 0 -1 -2.0 52.0] {<8000006000003000001c00000e000007000003800001c00001e00000f000007800007800003c0000
+3c00003e00001f00001f00001f80001f80000f80000fc0000fc0000fc0000fe0000fe0000fe00007
+e00007e00007f00007f00007f00007f00007f00007f00007f00007f00007f00007f00007f00007f0
+0007e00007e00007e0000fe0000fe0000fc0000fc0000fc0000f80001f80001f80001f00001f0000
+3e00003e00003c0000780000780000f00000e00001c0000380000700000600001c00003000006000
+00800000>} imagemask 
+  }
+  41 /G29 MSTT31c1fd AddChar
+%%EndResource
+
+-3 3 SJ
+717 1478 942 (blocks/inodes can be allocated\)) 942 SB
+623 1587 38 (\226) 38 SB
+
+%%BeginResource: font MSTT31c1fd
+/G54 [45.0 0.0 2.0 0.0 44.0 50.0]
+/G54 {
+    42 50 true [1 0 0 -1 -2.0 50.0] {<7fffffffff807fffffffff807c007f001f8078007f00078070007f000380e0007f0001c0c0007f00
+00c0c0007f0000c0c0007f0000c0c0007f0000c080007f00004000007f00000000007f0000000000
+7f00000000007f00000000007f00000000007f00000000007f00000000007f00000000007f000000
+00007f00000000007f00000000007f00000000007f00000000007f00000000007f00000000007f00
+000000007f00000000007f00000000007f00000000007f00000000007f00000000007f0000000000
+7f00000000007f00000000007f00000000007f00000000007f00000000007f00000000007f000000
+00007f00000000007f00000000007f00000000007f00000000007f00000000007f0000000000ff80
+00000000ff8000000003ffe00000003ffffe0000>} imagemask 
+  }
+  84 /G54 MSTT31c1fd AddChar
+%%EndResource
+
+717 1587 1652 (The current usage must be reduced below the soft limit) 1652 SB
+EJ RS
+%%PageTrailer
+SS
+0 0 18 13 783 1169 300 SM
+255 255 255 fC
+/fm 256 def
+3250 2250 88 49 B
+1 F
+n
+1 lc
+1 lj
+0 0 0 pC
+6 17 SP
+gs 2857 2349 88 0 CB
+-2765 499 M 8559 0 1 PP
+S
+n
+gr
+32 0 0 58 58 0 0 1 53 /MSTT31c1bc font
+0 0 0 fC
+25 8 SJ
+153 2191 1278 (Third International Linux Conference - Berlin - May 96) 1278 SB
+2919 2191 29 (6) 29 SB
+32 0 0 167 167 0 0 0 150 /MSTT31c1c9 font
+-12 3 SJ
+256 284 2340 (Configuration of the quota-support) 2340 SB
+32 0 0 75 75 0 0 0 60 /ZapfDingbats font
+473 644 59 (u) 59 SB
+32 0 0 100 100 0 0 1 90 /MSTT31c1f0 font
+
+%%BeginResource: font MSTT31c1f0
+/G76 [50.0 0.0 1.0 -1.0 49.0 45.0]
+/G76 {
+    48 46 true [1 0 0 -1 -1.0 45.0] {<fffff8003ffffffff8003fff3fffc00003f80fff800001f003ff000001e003ff000001e001ff0000
+01c001ff000003c000ff8000038000ff80000380007f80000700007fc0000700003fc0000f00003f
+e0000e00003fe0000e00001ff0001c00001ff0001c00000ff0003c00000ff80038000007f8003800
+0007fc0070000007fc0070000003fe00e0000003fe00e0000001fe01e0000001ff01c0000000ff01
+c0000000ff8380000000ff83800000007fc7800000007fc7000000003fc7000000003fee00000000
+1fee000000001ffe000000001ffc000000000ffc000000000ff80000000007f80000000007f80000
+000003f00000000003f00000000003e00000000001e00000000001c00000000000c00000>} imagemask 
+  }
+  118 /G76 MSTT31c1f0 AddChar
+%%EndResource
+
+9 10 SJ
+586 614 2351 (Disk quotas have been available as a kernel patch for years) 2351 SB
+32 0 0 75 75 0 0 0 60 /ZapfDingbats font
+473 788 59 (u) 59 SB
+32 0 0 100 100 0 0 1 90 /MSTT31c1f0 font
+
+%%BeginResource: font MSTT31c1f0
+/G42 [66.0 0.0 2.0 0.0 61.0 67.0]
+/G42 {
+    59 67 true [1 0 0 -1 -2.0 67.0] {<fffffffff0000000ffffffffff80000007fffffffff0000001fff800fffc000000ffc0001fff0000
+00ffc00007ff8000007fc00001ffc000007fc00000ffe000007fc000007ff000007fc000003ff800
+007fc000003ff800007fc000001ffc00007fc000001ffc00007fc000001ffc00007fc000000ffe00
+007fc000000ffe00007fc000000ffe00007fc000000ffe00007fc000000ffe00007fc000000ffe00
+007fc000000ffe00007fc000000ffe00007fc000001ffc00007fc000001ffc00007fc000001ffc00
+007fc000003ff800007fc000003ff000007fc000007ff000007fc00000ffe000007fc00003ffc000
+007fe0003fff0000007ffffffffe0000007ffffffff00000007ffffffffe0000007fc0007fffc000
+007fc00007fff000007fc00001fff800007fc000007ffc00007fc000001ffe00007fc000000fff00
+007fc0000007ff80007fc0000007ff80007fc0000003ffc0007fc0000001ffc0007fc0000001ffc0
+007fc0000001ffe0007fc0000000ffe0007fc0000000ffe0007fc0000000ffe0007fc0000000ffe0
+007fc0000000ffe0007fc0000000ffe0007fc0000000ffc0007fc0000001ffc0007fc0000001ffc0
+007fc0000001ff80007fc0000003ff80007fc0000007ff00007fc0000007ff00007fc000000ffe00
+007fc000003ffc0000ffc000007ff80000ffc00001fff00001fffe001fffc00007ffffffffff0000
+fffffffffffc0000ffffffffff000000>} imagemask 
+  }
+  66 /G42 MSTT31c1f0 AddChar
+%%EndResource
+
+10 8 SJ
+586 758 1973 (But they were not fully tested and contained bugs) 1973 SB
+32 0 0 75 75 0 0 0 60 /ZapfDingbats font
+473 932 59 (u) 59 SB
+32 0 0 100 100 0 0 1 90 /MSTT31c1f0 font
+
+%%BeginResource: font MSTT31c1f0
+/G41 [72.0 0.0 1.0 0.0 71.0 68.0]
+/G41 {
+    70 68 true [1 0 0 -1 -1.0 68.0] {<00000000100000000000000000380000000000000000380000000000000000780000000000000000
+7c0000000000000000fc0000000000000000fe0000000000000000fe0000000000000001fe000000
+0000000001ff0000000000000003ff0000000000000003ff8000000000000007ff80000000000000
+07ffc00000000000000fffc00000000000000f7fc00000000000000f7fe00000000000001e3fe000
+00000000001e3ff00000000000003c3ff00000000000003c1ff00000000000007c1ff80000000000
+00780ff8000000000000f80ffc000000000000f007fc000000000000f007fe000000000001e007fe
+000000000001e003fe000000000003c003ff000000000003c001ff000000000007c001ff80000000
+00078001ff80000000000f8000ff80000000000f0000ffc0000000001f00007fc0000000001e0000
+7fe0000000001e00007fe0000000003c00003ff0000000003c00003ff0000000007c00001ff00000
+00007800001ff800000000f800000ff800000000f000000ffc00000001fffffffffc00000001ffff
+fffffc00000001fffffffffe00000003c0000003fe00000003c0000003ff0000000780000003ff00
+00000780000001ff8000000f80000001ff8000000f00000000ff8000001f00000000ffc000001e00
+0000007fc000001e000000007fe000003c000000007fe000003c000000003ff000007c000000003f
+f0000078000000003ff00000f8000000001ff80000f8000000001ffc0001f0000000001ffc0003f0
+000000001ffe0003f8000000001fff000ffc000000003fff803fff00000000ffffe0fffff000000f
+fffffcfffff000000ffffffc>} imagemask 
+  }
+  65 /G41 MSTT31c1f0 AddChar
+/G31 [50.0 0.0 11.0 0.0 37.0 68.0]
+/G31 {
+    26 68 true [1 0 0 -1 -11.0 68.0] {<0001c0000007c000001fc000007fc00001ffc00007ffc0001fffc0007fffc000ffffc000407fc000
+007fc000003fc000003fc000003fc000003fc000003fc000003fc000003fc000003fc000003fc000
+003fc000003fc000003fc000003fc000003fc000003fc000003fc000003fc000003fc000003fc000
+003fc000003fc000003fc000003fc000003fc000003fc000003fc000003fc000003fc000003fc000
+003fc000003fc000003fc000003fc000003fc000003fc000003fc000003fc000003fc000003fc000
+003fc000003fc000003fc000003fc000003fc000003fc000003fc000003fc000003fc000003fc000
+003fc000003fc000003fc000007fe000007fe00001fff8003fffffc03fffffc0>} imagemask 
+  }
+  49 /G31 MSTT31c1f0 AddChar
+/G2e [25.0 0.0 7.0 -1.0 18.0 10.0]
+/G2e {
+    11 11 true [1 0 0 -1 -7.0 10.0] {<1f003f807fc0ffe0ffe0ffe0ffe0ffe07fc03f801f00>} imagemask 
+  }
+  46 /G2e MSTT31c1f0 AddChar
+/G33 [50.0 0.0 4.0 -1.0 41.0 68.0]
+/G33 {
+    37 69 true [1 0 0 -1 -4.0 68.0] {<0003fe0000001fffc000003ffff00000fffff80001fffffc0003fffffe0007ffffff0007f01fff00
+0f8003ff801f0001ff801c0000ffc03800007fc03000003fc07000003fc02000003fc00000001fc0
+0000001fc00000001f800000001f800000001f000000001f000000001e000000003e000000003c00
+000000380000000070000000006000000000c0000000018000000003e00000000ff80000001ffc00
+0000fffe000003ffff00001fffff8000007fffc000000fffe0000003ffe0000001fff00000007ff0
+0000003ff00000001ff80000001ff80000000ff80000000ff800000007f800000007f800000007f8
+00000003f800000003f800000003f800000003f000000003f000000003f000000003e000000003e0
+00000007c000000007c00000000f800000000f800000001f003e00003e007f80007c00ffe001f800
+fffc07f000ffffffc0007fffff00003ffff8000007ff800000>} imagemask 
+  }
+  51 /G33 MSTT31c1f0 AddChar
+/G34 [50.0 0.0 2.0 0.0 46.0 68.0]
+/G34 {
+    44 68 true [1 0 0 -1 -2.0 68.0] {<00000007e00000000007e0000000000fe0000000001fe0000000001fe0000000003fe0000000007f
+e0000000007fe000000000ffe000000001ffe000000001dfe0000000039fe0000000079fe0000000
+071fe00000000e1fe00000001e1fe00000003c1fe0000000381fe0000000781fe0000000f01fe000
+0000e01fe0000001e01fe0000003c01fe0000003801fe0000007801fe000000f001fe000000e001f
+e000001e001fe000003c001fe0000038001fe0000078001fe00000f0001fe00000f0001fe00001e0
+001fe00003c0001fe00003c0001fe0000780001fe0000f00001fe0000f00001fe0001e00001fe000
+3c00001fe0007c00001fe0007800001fe000fffffffffff0fffffffffff0fffffffffff0ffffffff
+fff0fffffffffff0fffffffffff0fffffffffff00000001fe0000000001fe0000000001fe0000000
+001fe0000000001fe0000000001fe0000000001fe0000000001fe0000000001fe0000000001fe000
+0000001fe0000000001fe0000000001fe0000000001fe0000000001fe0000000001fe0000000001f
+e0000000001fe000>} imagemask 
+  }
+  52 /G34 MSTT31c1f0 AddChar
+/G36 [50.0 0.0 4.0 -1.0 46.0 68.0]
+/G36 {
+    42 69 true [1 0 0 -1 -4.0 68.0] {<000000007f8000000007ff800000003ff800000000ff8000000003fc000000000ff0000000001fe0
+000000007f8000000000ff0000000001fe0000000003fc0000000007f8000000000ff0000000001f
+e0000000003fc0000000007fc0000000007f8000000000ff0000000001ff0000000001fe00000000
+03fe0000000007fc0000000007fc000000000ff8000000000ff8000000001ff0000000001ff00ff8
+00001ff07fff00003fe1ffff80003fe7ffffe0003fff81fff0007ffe003ff8007ff8001ffc007fe0
+000ffe007fc00007fe00ffc00007ff00ffc00003ff00ffc00003ff80ff800001ff80ff800001ff80
+ff800000ff80ff800000ffc0ff800000ffc0ff800000ffc0ff8000007fc0ff8000007fc0ff800000
+7fc0ff8000007fc07f8000007fc07f8000007fc07fc000007fc07fc000007f803fc000007f803fc0
+00007f803fe000007f001fe000007f001fe00000fe000ff00000fe000ff00000fc0007f80001fc00
+03f80001f80001fc0003f00001fe0007e00000ff000fe000007f801f8000003fe07f0000000ffffe
+00000003fff8000000007fc00000>} imagemask 
+  }
+  54 /G36 MSTT31c1f0 AddChar
+%%EndResource
+
+5 8 SJ
+586 902 2139 (A revised version has been integrated in Linux 1.3.46) 2139 SB
+32 0 0 75 75 0 0 0 60 /ZapfDingbats font
+473 1075 59 (u) 59 SB
+32 0 0 100 100 0 0 1 90 /MSTT31c1f0 font
+4 4 SJ
+586 1045 993 (To use quotas, you need:) 993 SB
+32 0 0 75 75 0 0 1 67 /MSTT31c1fd font
+623 1184 38 (\226) 38 SB
+
+%%BeginResource: font MSTT31c1fd
+/G31 [38.0 0.0 9.0 0.0 29.0 51.0]
+/G31 {
+    20 51 true [1 0 0 -1 -9.0 51.0] {<000c00007c0001fc0007fc001ffc007ffc00c3fc0003fc0001fc0001fc0001fc0001fc0001fc0001
+fc0001fc0001fc0001fc0001fc0001fc0001fc0001fc0001fc0001fc0001fc0001fc0001fc0001fc
+0001fc0001fc0001fc0001fc0001fc0001fc0001fc0001fc0001fc0001fc0001fc0001fc0001fc00
+01fc0001fc0001fc0001fc0001fc0001fc0001fc0001fc0003fe0007ff007ffff0>} imagemask 
+  }
+  49 /G31 MSTT31c1fd AddChar
+/G2e [19.0 0.0 5.0 -1.0 13.0 7.0]
+/G2e {
+    8 8 true [1 0 0 -1 -5.0 7.0] {<3c7effffffff7e3c>} imagemask 
+  }
+  46 /G2e MSTT31c1fd AddChar
+/G33 [38.0 0.0 3.0 -1.0 31.0 51.0]
+/G33 {
+    28 52 true [1 0 0 -1 -3.0 51.0] {<001fc00000fff80001fffc0007fffe000fffff000f81ff801c007f8038003fc030001fc060001fc0
+00000fc000000fc000000fc000000f8000000f8000000f0000000f0000001e0000001c0000003800
+000070000000e0000001f8000007fe00003fff0000ffff800007ffc00001ffc000007fe000003fe0
+00001fe000000ff000000ff0000007f0000007f0000003f0000003f0000003f0000003f0000003e0
+000003e0000003e0000007c0000007c000000f8078000f00fe001e00ff003c00ffc0f8007fffe000
+3fff80000ffc0000>} imagemask 
+  }
+  51 /G33 MSTT31c1fd AddChar
+/G34 [38.0 0.0 2.0 0.0 35.0 51.0]
+/G34 {
+    33 51 true [1 0 0 -1 -2.0 51.0] {<000007c00000000fc00000000fc00000001fc00000001fc00000003fc00000007fc00000007fc000
+0000dfc0000001dfc00000019fc00000039fc00000031fc00000061fc000000e1fc000000c1fc000
+001c1fc00000381fc00000301fc00000701fc00000601fc00000e01fc00001c01fc00001801fc000
+03801fc00003001fc00007001fc0000e001fc0000c001fc0001c001fc00038001fc00038001fc000
+70001fc00070001fc000ffffffff80ffffffff80ffffffff80ffffffff8000001fc00000001fc000
+00001fc00000001fc00000001fc00000001fc00000001fc00000001fc00000001fc00000001fc000
+00001fc00000001fc00000001fc000>} imagemask 
+  }
+  52 /G34 MSTT31c1fd AddChar
+/G36 [38.0 0.0 3.0 -1.0 35.0 51.0]
+/G36 {
+    32 52 true [1 0 0 -1 -3.0 51.0] {<000000fe000007f000003f000000fc000001f8000007e000000fc000001f8000003f0000007e0000
+00fc000001fc000003f8000003f0000007f000000fe000000fe000001fe000001fc000003fc00000
+3f81fe003f8fff807fbfffe07ff83ff07fe00ff87f8007f8ff0003fcff0001feff0001fefe0001fe
+fe0000fffe0000fffe0000fffe00007ffe00007ffe00007ffe00007f7e00007f7e00007f7f00007e
+3f00007e3f00007e3f80007c1f8000fc0f8000f80fc001f007e001f003e003e001f007c000fc1f00
+003ffe00000ff000>} imagemask 
+  }
+  54 /G36 MSTT31c1fd AddChar
+/G2b [42.0 0.0 1.0 5.0 40.0 44.0]
+/G2b {
+    39 39 true [1 0 0 -1 -1.0 44.0] {<00003800000000380000000038000000003800000000380000000038000000003800000000380000
+00003800000000380000000038000000003800000000380000000038000000003800000000380000
+00003800000000380000fffffffffefffffffffefffffffffe000038000000003800000000380000
+00003800000000380000000038000000003800000000380000000038000000003800000000380000
+0000380000000038000000003800000000380000000038000000003800000000380000>} imagemask 
+  }
+  43 /G2b MSTT31c1fd AddChar
+/G93 [33.0 0.0 2.0 32.0 30.0 51.0]
+/G93 {
+    28 19 true [1 0 0 -1 -2.0 51.0] {<00800040038001c00e0007001c000c0010001800200010006000300040002000c0006000c0006000
+c0006000ef8077c0ffc07fe0ffe07ff0ffe07ff07fe03ff03fe01ff01fc00fe00f800780>} imagemask 
+  }
+  147 /G93 MSTT31c1fd AddChar
+/G94 [33.0 0.0 2.0 32.0 30.0 51.0]
+/G94 {
+    28 19 true [1 0 0 -1 -2.0 51.0] {<1e001f007f003f80ff807fc0ffc07fe0ffe07fe0ffe07ff07fe03ff03ee01f700060003000600030
+006000300040002000c000600080004001800080070003800e00070038001c0020001000>} imagemask 
+  }
+  148 /G94 MSTT31c1fd AddChar
+/G51 [54.0 0.0 3.0 -14.0 51.0 51.0]
+/G51 {
+    48 65 true [1 0 0 -1 -3.0 51.0] {<00001ff800000000ffff00000003f00fe000000f8003f000003f0000fc00007c00007e0000f80000
+3f0001f800001f8003f000000fc007e000000fe007e0000007f00fc0000007f01fc0000003f81fc0
+000003f83f80000003fc3f80000001fc7f80000001fe7f80000001fe7f00000001fe7f00000000fe
+ff00000000ffff00000000ffff00000000ffff00000000ffff00000000ffff00000000ffff000000
+00ffff00000000ffff00000000ffff00000000ffff00000000ff7f00000000fe7f80000000fe7f80
+000001fe7f80000001fe3f80000001fc3f80000001fc3fc0000003fc1fc0000003f81fe0000003f0
+0fe0000007f007f0000007e007f000000fc003f800001fc001fc00001f8000fe00003f00007f0000
+fc00001f8001f8000007f00ff0000001ffffc00000007ffe000000001ffc000000000ffe00000000
+07fe0000000003ff0000000001ff8000000000ffc0000000003fc0000000001fe00000000007f000
+00000001fc00000000007e00000000001f800000000003f000000000001e>} imagemask 
+  }
+  81 /G51 MSTT31c1fd AddChar
+%%EndResource
+
+717 1184 2057 (a recent \(1.3.46+\) kernel \(answer \223y\224 to \223Quota support\224 during the ) 2057 SB
+32 0 0 75 75 0 0 0 64 /Courier-Bold /font9 ANSIFont font
+2774 1187 180 (make) 180 SB
+717 1277 270 (config) 270 SB
+32 0 0 75 75 0 0 1 67 /MSTT31c1fd font
+-1 1 SJ
+987 1274 165 ( step\)) 165 SB
+623 1383 38 (\226) 38 SB
+-2 2 SJ
+717 1383 545 (the quota utilities:) 545 SB
+
+%%BeginResource: font MSTT31c1fd
+/Gbb [35.0 0.0 2.0 0.0 32.0 35.0]
+/Gbb {
+    30 35 true [1 0 0 -1 -2.0 35.0] {<c00180006000c0007000e00038007000380070001c0038001e003c000f001e000f001e0007800f00
+07c00f8003e007c003e007c001f003e001f803f000f801f000fc01f8007e00fc007c00f800fc01f8
+01f803f001f003e003e007c003e007c007c00f8007800f000f001e000f001e001e003c001c003800
+38007000380070007000e0006000c000c0018000>} imagemask 
+  }
+  187 /Gbb MSTT31c1fd AddChar
+%%EndResource
+
+773 1491 35 (\273) 35 SB
+
+%%BeginResource: font MSTT31c1fd
+/G4c [45.0 0.0 1.0 0.0 43.0 50.0]
+/G4c {
+    42 50 true [1 0 0 -1 -1.0 50.0] {<fffff80000000fff8000000003fe0000000003fe0000000001fc0000000001fc0000000001fc0000
+000001fc0000000001fc0000000001fc0000000001fc0000000001fc0000000001fc0000000001fc
+0000000001fc0000000001fc0000000001fc0000000001fc0000000001fc0000000001fc00000000
+01fc0000000001fc0000000001fc0000000001fc0000000001fc0000000001fc0000000001fc0000
+000001fc0000000001fc0000000001fc0000000001fc0000000001fc0000000001fc0000000001fc
+0000000001fc0000000001fc0000000001fc0000000001fc000000c001fc000001c001fc00000180
+01fc0000038001fc0000038001fc0000070001fc0000070001fc00000f0001fc00001e0003fe0000
+3e0003ff0001fe000ffffffffc00fffffffffc00>} imagemask 
+  }
+  76 /G4c MSTT31c1fd AddChar
+/G50 [43.0 0.0 1.0 0.0 40.0 50.0]
+/G50 {
+    39 50 true [1 0 0 -1 -1.0 50.0] {<ffffffc0000ffffffc0003fe01ff0003fc003fc001fc001fe001fc000ff001fc0007f801fc0007f8
+01fc0003fc01fc0003fc01fc0001fe01fc0001fe01fc0001fe01fc0001fe01fc0001fe01fc0001fe
+01fc0001fe01fc0003fc01fc0003fc01fc0003fc01fc0007f801fc000ff001fc001ff001fc003fc0
+01ff00ff8001fffffe0001fcfff00001fc00000001fc00000001fc00000001fc00000001fc000000
+01fc00000001fc00000001fc00000001fc00000001fc00000001fc00000001fc00000001fc000000
+01fc00000001fc00000001fc00000001fc00000001fc00000001fc00000003fe00000003fe000000
+0fff800000fffff80000>} imagemask 
+  }
+  80 /G50 MSTT31c1fd AddChar
+/G45 [46.0 0.0 1.0 0.0 44.0 50.0]
+/G45 {
+    43 50 true [1 0 0 -1 -1.0 50.0] {<fffffffffc0007fffffffc0003fc0000fc0003fc00003c0001fc00001c0001fc00000e0001fc0000
+0e0001fc00000e0001fc00000e0001fc0000060001fc0000060001fc0000000001fc0000000001fc
+0000000001fc0000000001fc0000000001fc0000800001fc0000800001fc0000800001fc00018000
+01fc0001800001fc0003800001fc000f800001ffffff800001ffffff800001fc000f800001fc0003
+800001fc0001800001fc0001800001fc0000800001fc0000800001fc0000800001fc0000000001fc
+0000000001fc0000000001fc0000000001fc0000000001fc0000006001fc000000c001fc000000c0
+01fc000001c001fc0000018001fc0000038001fc0000078001fc0000070001fc00000f0003fc0000
+3f0003fe0000fe000ffffffffe00fffffffffe00>} imagemask 
+  }
+  69 /G45 MSTT31c1fd AddChar
+/G4f [54.0 0.0 3.0 -1.0 51.0 51.0]
+/G4f {
+    48 52 true [1 0 0 -1 -3.0 51.0] {<00001ff800000000ffff80000003f00fe000000f8001f000003f0000fc00007e00007e0000fc0000
+3f0001f800001f8003f000000fc007e000000fe00fe0000007f00fc0000007f01fc0000003f81fc0
+000003f83f80000001fc3f80000001fc7f80000001fe7f80000001fe7f80000001fe7f00000000fe
+ff00000000ffff00000000ffff00000000ffff00000000ffff00000000ffff00000000ffff000000
+00ffff00000000ffff00000000ffff00000000ffff00000000ffff00000000fe7f00000000fe7f80
+000000fe7f80000001fe7f80000001fc3f80000001fc3fc0000001fc1fc0000003f81fc0000003f8
+0fe0000003f00fe0000007e007f0000007e003f000000fc001f800001f8000fc00003f00007e0000
+7e00003f0000fc00001f8003f0000007f00fc0000001ffff000000001ff80000>} imagemask 
+  }
+  79 /G4f MSTT31c1fd AddChar
+%%EndResource
+
+848 1491 24 (f) 25 SB
+873 1491 59 (tp) 58 SB
+931 1491 87 (://f) 88 SB
+1019 1491 59 (tp) 58 SB
+1077 1491 43 (.f) 44 SB
+1121 1491 38 (u) 37 SB
+1158 1491 135 (net.f) 136 SB
+1294 1491 80 (i/p) 79 SB
+1373 1491 76 (ub) 75 SB
+1448 1491 66 (/L) 67 SB
+1515 1491 59 (in) 58 SB
+1573 1491 139 (ux/P) 138 SB
+1711 1491 46 (E) 45 SB
+1756 1491 54 (O) 55 SB
+1811 1491 43 (P) 41 SB
+1852 1491 45 (L) 46 SB
+1898 1491 112 (E/L) 113 SB
+2011 1491 21 (i) 20 SB
+2031 1491 76 (nu) 75 SB
+2106 1491 29 (s) 30 SB
+2136 1491 21 (/) 20 SB
+2156 1491 29 (s) 30 SB
+2186 1491 38 (u) 37 SB
+2223 1491 103 (bsy) 104 SB
+2327 1491 83 (ste) 84 SB
+2411 1491 57 (m) 58 SB
+2469 1491 88 (s/q) 87 SB
+2556 1491 76 (uo) 75 SB
+2631 1491 54 (ta) 55 SB
+773 1599 35 (\273) 35 SB
+848 1599 24 (f) 25 SB
+873 1599 59 (tp) 58 SB
+931 1599 87 (://f) 88 SB
+1019 1599 59 (tp) 58 SB
+1077 1599 224 (.cistron) 223 SB
+1300 1599 57 (.n) 56 SB
+1356 1599 118 (l/pu) 117 SB
+1473 1599 59 (b/) 58 SB
+1531 1599 43 (P) 42 SB
+1573 1599 109 (eop) 108 SB
+1681 1599 54 (le) 55 SB
+1736 1599 21 (/) 20 SB
+1756 1599 57 (m) 59 SB
+1815 1599 163 (vw/qu) 162 SB
+1977 1599 92 (ota) 92 SB
+EJ RS
+%%PageTrailer
+SS
+0 0 18 13 783 1169 300 SM
+255 255 255 fC
+/fm 256 def
+3250 2250 88 49 B
+1 F
+n
+1 lc
+1 lj
+0 0 0 pC
+6 17 SP
+gs 2857 2349 88 0 CB
+-2765 499 M 8559 0 1 PP
+S
+n
+gr
+32 0 0 58 58 0 0 1 53 /MSTT31c1bc font
+0 0 0 fC
+25 8 SJ
+153 2191 1278 (Third International Linux Conference - Berlin - May 96) 1278 SB
+
+%%BeginResource: font MSTT31c1bc
+/G37 [29.0 0.0 2.0 0.0 25.0 39.0]
+/G37 {
+    23 39 true [1 0 0 -1 -2.0 39.0] {<0ffffe1ffffe1ffffe1ffffe3ffffc38001c60001c400038c0003880003800007000007000007000
+00e00000e00000e00001c00001c00001c0000380000380000380000700000700000700000e00000e
+00000e00001c00001c00001c0000380000380000380000700000700000700000e00000e000>} imagemask 
+  }
+  55 /G37 MSTT31c1bc AddChar
+%%EndResource
+
+2919 2191 29 (7) 29 SB
+32 0 0 167 167 0 0 0 150 /MSTT31c1c9 font
+-6 3 SJ
+256 84 1853 (Administration of the quota) 1853 SB
+256 284 149 (su) 148 SB
+404 284 149 (bs) 148 SB
+552 284 398 (ystem) 398 SB
+32 0 0 88 88 0 0 0 71 /ZapfDingbats font
+473 648 69 (u) 69 SB
+32 0 0 117 117 0 0 0 104 /MSTT31c1c9 font
+%%BeginResource: font MSTT31c1c9
+currentfile eexec
+9e67edc6b858a3e762244b628fb7f6f6b82db3d80533f85f9af7ec02fa0992f446e47e7476690365d15488a3d0557140c554c35b60083b9bf344ec199d995ff7
+cd974526686a837538b7a59d057ee26f8d6945ed4a734c986bacc9c4e9146c536d435a3f6fe0bdd7292c545882f15c502251ef625c374cd766ecd6c027e94c0d
+02455a20a915ae7e602e4ce476c48af63ce8881e74c11919ef36f4173b1c5093a5c28b8b51817b3b2d6208d608bd4a83e1e281bccf58e2e3167313817edb8130
+3e3a3ed7fd80096a1582c85560de49313e80c9450fa16756be238e37e4e1e782239b6ef0c45e4d6a4990e6b587e1f1a8a85e38db96ba259d8b88453f687fa358
+5489f868f8cfb10e7ab8f3fe7b10d998cf8058e0ec33100415a1c7d9dcff19037c7b759645e8f5273270f67ab6adacb319ab
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+
+cleartomark
+%%EndResource
+-15 5 SJ
+586 615 1756 (installing a kernel with quota support) 1756 SB
+32 0 0 88 88 0 0 0 71 /ZapfDingbats font
+473 817 69 (u) 69 SB
+32 0 0 117 117 0 0 0 104 /MSTT31c1c9 font
+-15 3 SJ
+586 784 1288 (installing the quota utilities) 1288 SB
+32 0 0 88 88 0 0 0 71 /ZapfDingbats font
+473 985 69 (u) 69 SB
+32 0 0 117 117 0 0 0 104 /MSTT31c1c9 font
+-12 4 SJ
+586 952 1732 (activating disk quotas on filesystems) 1732 SB
+32 0 0 88 88 0 0 0 71 /ZapfDingbats font
+473 1153 69 (u) 69 SB
+32 0 0 117 117 0 0 0 104 /MSTT31c1c9 font
+%%BeginResource: font MSTT31c1c9
+currentfile eexec
+9e67edc6b858a3e762244b628fb7f6f6b82db3d80533f85f9af7ec02fa0992f446e47e7476690365d15488a3d0557140c554c35b60083b9bf344ec199d995ff7
+cd974526686a837538b7a59d0007e93fb06c6a176f2b56dd99c207c01444802de9e7bcfa5f1fa63880cc63e67df2094a85d91cac055b75fb839d00387733a140
+30015b397949b626fa6b1885d027fa05dcf0eb8fe9dc385e89a67d0f95d954dc
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+
+cleartomark
+%%EndResource
+-16 4 SJ
+586 1120 1669 (setting disk quotas for users/groups) 1669 SB
+32 0 0 88 88 0 0 0 71 /ZapfDingbats font
+473 1321 69 (u) 69 SB
+32 0 0 117 117 0 0 0 104 /MSTT31c1c9 font
+-9 3 SJ
+586 1288 1114 (checking for disk usage) 1114 SB
+32 0 0 88 88 0 0 0 71 /ZapfDingbats font
+473 1489 69 (u) 69 SB
+32 0 0 117 117 0 0 0 104 /MSTT31c1c9 font
+-10 2 SJ
+586 1456 1294 (checking quota consistency) 1294 SB
+EJ RS
+%%PageTrailer
+SS
+0 0 18 13 783 1169 300 SM
+255 255 255 fC
+/fm 256 def
+3250 2250 88 49 B
+1 F
+n
+1 lc
+1 lj
+0 0 0 pC
+6 17 SP
+gs 2857 2349 88 0 CB
+-2765 499 M 8559 0 1 PP
+S
+n
+gr
+32 0 0 58 58 0 0 1 53 /MSTT31c1bc font
+0 0 0 fC
+25 8 SJ
+153 2191 1278 (Third International Linux Conference - Berlin - May 96) 1278 SB
+
+%%BeginResource: font MSTT31c1bc
+/G38 [29.0 0.0 3.0 0.0 26.0 40.0]
+/G38 {
+    23 40 true [1 0 0 -1 -3.0 40.0] {<00fe0003ffc00f83e01f01f03e00f83c00783c007c7c007c7c007c7c007c7e007c7e00783f00f83f
+80f03fc1e01fe3c00ff78007fe0003fc0001fe0000ff8003ffc0073fe00e0ff01e07f83c03f87c01
+fc7800fcf8007ef8007ef8003ef8003ef8003e78003c7c003c3e00783f00f01f83e007ffc001fe00
+>} imagemask 
+  }
+  56 /G38 MSTT31c1bc AddChar
+%%EndResource
+
+2919 2191 29 (8) 29 SB
+32 0 0 150 150 0 0 0 134 /MSTT31c1c9 font
+-4 4 SJ
+256 305 1789 (Installing the kernel and tools) 1789 SB
+32 0 0 75 75 0 0 0 60 /ZapfDingbats font
+473 644 59 (u) 59 SB
+32 0 0 100 100 0 0 1 90 /MSTT31c1f0 font
+
+%%BeginResource: font MSTT31c1f0
+/G4b [72.0 0.0 2.0 0.0 72.0 67.0]
+/G4b {
+    70 67 true [1 0 0 -1 -2.0 67.0] {<ffffffe003fffffc00ffffffe003fffffc0007fffc00001fffc00001fff000000fff000000ffe000
+000ffc000000ffe000000ff00000007fc000000fe00000007fc000001f800000007fc000001f0000
+00007fc000003e000000007fc000007c000000007fc00000f8000000007fc00001f0000000007fc0
+0003e0000000007fc00007c0000000007fc0000f80000000007fc0001f00000000007fc0003e0000
+0000007fc0007c00000000007fc000f800000000007fc001f000000000007fc003e000000000007f
+c007c000000000007fc00f8000000000007fc01f0000000000007fc03e0000000000007fc07c0000
+000000007fc0f80000000000007fc1f00000000000007fc3e00000000000007fcfe0000000000000
+7fdff00000000000007ffff80000000000007ffffc0000000000007fdffe0000000000007fcfff00
+00000000007fc7ff8000000000007fc3ffc000000000007fc1ffe000000000007fc0fff000000000
+007fc07ff800000000007fc03ffc00000000007fc01fff00000000007fc00fff80000000007fc007
+ffc0000000007fc003ffe0000000007fc001fff0000000007fc000fff8000000007fc0007ffc0000
+00007fc0003ffe000000007fc0001fff000000007fc0000fff800000007fc00007ffc00000007fc0
+0003ffe00000007fc00001fff00000007fc00000fff80000007fc000003ffc0000007fc000001ffe
+0000007fc000001fff0000007fc000000fffc000007fc0000007ffe00000ffe0000007fff00000ff
+e0000007fffc0001fff000000fffff0007fffc00001fffffe0ffffffe000fffffffcffffffe000ff
+fffffc>} imagemask 
+  }
+  75 /G4b MSTT31c1f0 AddChar
+/G6a [28.0 0.0 -8.0 -21.0 18.0 70.0]
+/G6a {
+    26 91 true [1 0 0 -1 8.0 70.0] {<00003e0000007f000000ff800001ffc00001ffc00001ffc00001ffc00001ffc00000ff8000007f00
+00003e00000000000000000000000000000000000000000000000000000000000000000000000000
+00000000000000000000000000000000000001c000000fc000007fc00001ffc0000fffc0001fffc0
+0018ffc000007fc000007fc000003fc000003fc000003fc000003fc000003fc000003fc000003fc0
+00003fc000003fc000003fc000003fc000003fc000003fc000003fc000003fc000003fc000003fc0
+00003fc000003fc000003fc000003fc000003fc000003fc000003fc000003fc000003fc000003fc0
+00003fc000003fc000003fc000003fc000003fc000003fc000003fc000003fc000003fc000003fc0
+00003fc000003fc000003fc000003fc000003fc000003f8000003f8000003f8000003f8000003f00
+00003f0000003f003c003e007f003e00ff807c00ff807800ffc0f000fff1e0007fffc0003fff0000
+07f80000>} imagemask 
+  }
+  106 /G6a MSTT31c1f0 AddChar
+/G93 [44.0 0.0 3.0 42.0 41.0 68.0]
+/G93 {
+    38 26 true [1 0 0 -1 -3.0 68.0] {<001000002000700000e001f00003c003c00007800700000e000e00001c001c000038001800007000
+3000006000700000e000600000c000600000c000e00001c000e00001c000e00001c000f3f001e7e0
+fff801fff0fffc01fff8fffe01fffc7ffe00fffc7ffe00fffc7ffe00fffc3ffc007ff81ffc003ff8
+0ff8001ff003e00007c0>} imagemask 
+  }
+  147 /G93 MSTT31c1f0 AddChar
+/G94 [44.0 0.0 3.0 42.0 41.0 68.0]
+/G94 {
+    38 26 true [1 0 0 -1 -3.0 68.0] {<0f80001f003fe0007fc07ff000ffe07ff800fff0fffc01fff8fffc01fff8fffc01fff8fffe01fffc
+7ffe00fffc3ffe007ffc1f9e003f3c000e00001c000e00001c000e00001c000c000018000c000018
+001c0000380018000030003800006000700000e000e00001c001c00003800780000f001f00003e00
+1c000038001000002000>} imagemask 
+  }
+  148 /G94 MSTT31c1f0 AddChar
+/G51 [72.0 0.0 4.0 -19.0 68.0 68.0]
+/G51 {
+    64 87 true [1 0 0 -1 -4.0 68.0] {<0000001ffc000000000001ffffc0000000000ffffff8000000003fe00ffe00000000ff0001ff0000
+0003fc00007fc0000007f800001fe000000ff000000ff000001fe0000007f800003fc0000003fc00
+007f80000001fe0000ff00000001ff0001ff00000000ff8003fe000000007fc003fe000000007fc0
+07fc000000003fe00ffc000000003ff00ff8000000003ff01ff8000000001ff81ff8000000001ff8
+3ff0000000001ffc3ff0000000001ffc3ff0000000000ffc7ff0000000000ffe7ff0000000000ffe
+7ff0000000000ffe7fe0000000000ffe7fe00000000007feffe00000000007ffffe00000000007ff
+ffe00000000007ffffe00000000007ffffe00000000007ffffe00000000007ffffe00000000007ff
+ffe00000000007ffffe00000000007ffffe00000000007ffffe00000000007ffffe00000000007ff
+ffe00000000007ff7fe00000000007fe7ff00000000007fe7ff00000000007fe7ff0000000000ffe
+7ff0000000000ffc3ff0000000000ffc3ff0000000000ffc3ff8000000000ff81ff8000000001ff8
+1ff8000000001ff00ffc000000001ff00ffc000000003fe007fc000000003fe007fe000000007fc0
+03fe000000007f8001ff00000000ff8000ff80000000ff00007f80000001fe00007fc0000003fc00
+001fe0000007f800000ff000000ff0000007f800001fe0000003fe00003f80000000ff8000ff0000
+00003fe00ffc000000000ffffff00000000003ffff800000000000ffff0000000000007fff800000
+0000003fff8000000000001fffc000000000000fffe0000000000007fff0000000000001fff00000
+00000000fff80000000000007ffc0000000000001ffe0000000000000fff00000000000003ff8000
+0000000000ffc00000000000003ff00000000000000ffc00000000000001ff000000000000003ff0
+00000000000007fe000000000000003e>} imagemask 
+  }
+  81 /G51 MSTT31c1f0 AddChar
+%%EndResource
+
+6 7 SJ
+586 614 2118 (Kernel: just answer \223y\224 to \223Quota support\224, compile,) 2118 SB
+1 3 SJ
+586 734 971 (install the kernel, reboot) 971 SB
+32 0 0 75 75 0 0 0 60 /ZapfDingbats font
+473 908 59 (u) 59 SB
+32 0 0 100 100 0 0 1 90 /MSTT31c1f0 font
+1 3 SJ
+586 878 689 (Tools: just type \223) 689 SB
+32 0 0 100 100 0 0 0 86 /Courier-Bold /font9 ANSIFont font
+1 2 SJ
+1277 882 1080 (make; make install) 1080 SB
+32 0 0 100 100 0 0 1 90 /MSTT31c1f0 font
+1 2 SJ
+2358 878 297 (\224 but ...) 297 SB
+32 0 0 75 75 0 0 0 60 /ZapfDingbats font
+473 1051 59 (u) 59 SB
+32 0 0 100 100 0 0 1 90 /MSTT31c1f0 font
+
+%%BeginResource: font MSTT31c1f0
+/G45 [61.0 0.0 2.0 0.0 59.0 67.0]
+/G45 {
+    57 67 true [1 0 0 -1 -2.0 67.0] {<ffffffffffffe000ffffffffffffe00003ffffffffffe00001ffc000001fe00000ffc0000007e000
+00ffc0000003e000007fc0000001e000007fc0000000f000007fc0000000f000007fc00000007000
+007fc00000007000007fc00000007000007fc00000007000007fc00000003000007fc00000003000
+007fc00000000000007fc00000000000007fc00000000000007fc00000000000007fc00000000000
+007fc00000000000007fc00000000000007fc00000180000007fc00000180000007fc00000180000
+007fc00000380000007fc00000380000007fc00000380000007fc00000780000007fc00000f80000
+007fc00003f80000007ffffffff80000007ffffffff80000007ffffffff80000007fc00003f80000
+007fc00000f80000007fc00000780000007fc00000380000007fc00000380000007fc00000380000
+007fc00000180000007fc00000180000007fc00000180000007fc00000000000007fc00000000000
+007fc00000000000007fc00000000000007fc00000000000007fc00000000000007fc00000000000
+007fc00000000180007fc00000000300007fc00000000300007fc00000000700007fc00000000600
+007fc00000000e00007fc00000001e00007fc00000001c00007fc00000003c00007fc00000007c00
+007fc0000000f80000ffc0000001f80000ffe0000007f80001fff000003ff00007fffffffffff000
+fffffffffffff000ffffffffffffe000>} imagemask 
+  }
+  69 /G45 MSTT31c1f0 AddChar
+/G32 [50.0 0.0 2.0 0.0 46.0 68.0]
+/G32 {
+    44 68 true [1 0 0 -1 -2.0 68.0] {<0000ff8000000007fff80000003ffffe0000007fffff000000ffffffc00001ffffffe00003ffffff
+f00007fc03fff0000fe000fff8000f80003ffc001f00001ffc001e00000ffe003c000007fe003800
+0003fe0038000003ff0070000001ff0070000001ff0060000001ff0000000000ff0000000000ff00
+00000000ff0000000000ff0000000000fe0000000000fe0000000000fe0000000000fe0000000000
+fc0000000001fc0000000001f80000000001f80000000003f00000000003f00000000003e0000000
+0007c00000000007c0000000000f80000000001f00000000001f00000000003e00000000003c0000
+000000780000000000f00000000001f00000000001e00000000003c0000000000780000000000f00
+000000001e00000000003c0000000000780000000000f00000000001e00000000003c00000000007
+80000000000700000000000e00000000003c0000007000780000006000f0000000e001e0000003e0
+03c000001fc007ffffffffc00fffffffff801fffffffff803fffffffff807fffffffff00ffffffff
+ff00ffffffffff00>} imagemask 
+  }
+  50 /G32 MSTT31c1f0 AddChar
+%%EndResource
+
+6 8 SJ
+586 1021 2024 (... you may want to include special Ext2fs support:) 2024 SB
+32 0 0 75 75 0 0 0 64 /Courier-Bold /font9 ANSIFont font
+623 1163 45 (\226) 45 SB
+717 1163 450 (quotacheck) 450 SB
+32 0 0 75 75 0 0 1 67 /MSTT31c1fd font
+
+%%BeginResource: font MSTT31c1fd
+/G32 [38.0 0.0 2.0 0.0 35.0 51.0]
+/G32 {
+    33 51 true [1 0 0 -1 -2.0 51.0] {<001ff00000007ffc000001ffff000003ffff800007ffffc0000fffffe0001fc0fff0001f003ff800
+3c000ff800380007f800300007fc00700003fc00600003fc00600001fc00000001fc00000001fc00
+000001fc00000001f800000001f800000001f800000001f000000003f000000003e000000003e000
+000007c000000007c00000000f800000000f000000001e000000003e000000003c00000000780000
+0000f000000001e000000001c0000000038000000007000000000e000000001c0000000038000000
+007000000000e000008001c000010003800003000700000f000ffffffe001ffffffe003ffffffe00
+7ffffffc00fffffffc00fffffffc00>} imagemask 
+  }
+  50 /G32 MSTT31c1fd AddChar
+/G92 [25.0 0.0 7.0 32.0 18.0 51.0]
+/G92 {
+    11 19 true [1 0 0 -1 -7.0 51.0] {<3e007f00ff80ffc0ffe0ffe07fe03ee0006000600040004000c00180030006001c0038002000>} imagemask 
+  }
+  146 /G92 MSTT31c1fd AddChar
+%%EndResource
+
+1 8 SJ
+1167 1160 1478 ( uses the Ext2fs library written by Theodore Ts\222o) 1478 SB
+623 1268 38 (\226) 38 SB
+717 1268 921 (This is much faster than using ) 921 SB
+32 0 0 75 75 0 0 0 64 /Courier-Bold /font9 ANSIFont font
+1638 1271 405 (readdir\(\)) 405 SB
+32 0 0 75 75 0 0 0 60 /ZapfDingbats font
+473 1412 59 (u) 59 SB
+32 0 0 100 100 0 0 1 90 /MSTT31c1f0 font
+586 1382 1036 (To enable Ext2fs support:) 1036 SB
+32 0 0 75 75 0 0 1 67 /MSTT31c1fd font
+623 1521 38 (\226) 38 SB
+717 1521 128 (add ) 128 SB
+32 0 0 75 75 0 0 0 64 /Courier-Bold /font9 ANSIFont font
+845 1524 630 (-DEXT2_DIRECT ) 630 SB
+32 0 0 75 75 0 0 1 67 /MSTT31c1fd font
+1475 1521 78 (to ) 78 SB
+32 0 0 75 75 0 0 0 64 /Courier-Bold /font9 ANSIFont font
+1553 1524 270 (CFLAGS) 270 SB
+32 0 0 75 75 0 0 1 67 /MSTT31c1fd font
+623 1629 38 (\226) 38 SB
+717 1629 128 (add ) 128 SB
+32 0 0 75 75 0 0 0 64 /Courier-Bold /font9 ANSIFont font
+845 1632 405 (-lext2fs ) 405 SB
+32 0 0 75 75 0 0 1 67 /MSTT31c1fd font
+1250 1629 78 (to ) 78 SB
+32 0 0 75 75 0 0 0 64 /Courier-Bold /font9 ANSIFont font
+1328 1632 315 (LDFLAGS) 315 SB
+EJ RS
+%%PageTrailer
+SS
+0 0 18 13 783 1169 300 SM
+255 255 255 fC
+/fm 256 def
+3250 2250 88 49 B
+1 F
+n
+1 lc
+1 lj
+0 0 0 pC
+6 17 SP
+gs 2857 2349 88 0 CB
+-2765 499 M 8559 0 1 PP
+S
+n
+gr
+32 0 0 58 58 0 0 1 53 /MSTT31c1bc font
+0 0 0 fC
+25 8 SJ
+153 2191 1278 (Third International Linux Conference - Berlin - May 96) 1278 SB
+2919 2191 29 (9) 29 SB
+32 0 0 150 150 0 0 0 134 /MSTT31c1c9 font
+%%BeginResource: font MSTT31c1c9
+currentfile eexec
+9e67edc6b858a3e762244b628fb7f6f6b82db3d80533f85f9af7ec02fa0992f446e47e7476690365d15488a3d0557140c554c35b60083b9bf344ec199d995ff7
+cd974526686a837538b7a59d06220d6e2b623024556ea2a939cb367d2285f7b04631175ab33f2e59099e861b3f875c7fac9020d1ef6efbe9487d5c5b60b1182e
+1d16965caac24d6041f6f39b7cd58549c9d14c1662f11e111e33b800e8ce1d96a9f15bc4ce0b7da824583f92dceeb4d299415c584f549bd2e98ffd8078fa1235
+c39cf7fa50fd5046a9ff05ab034b9277a9a7eec0341469664499fc5d03bb261786df4623ec9dbd2dfe7a56b7b2d3476013d5286fd827fa31f4b64ef3cbde3e63
+d1c8da84fbe462d36d55b82375491a6e16e964229cce8719aa830a4ea277345799016cd9bcca9a6daf9cb9ec5b10300d750aaea0d792e6d6d33efb3ef209261f
+698d71fcb0172c34c6737c
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+
+cleartomark
+%%EndResource
+-5 5 SJ
+256 305 2204 (Enabling disk quotas on file systems) 2204 SB
+32 0 0 75 75 0 0 0 60 /ZapfDingbats font
+473 644 59 (u) 59 SB
+32 0 0 100 100 0 0 1 90 /MSTT31c1f0 font
+7 7 SJ
+586 614 1690 (Quotas are managed on a file system basis) 1690 SB
+32 0 0 75 75 0 0 0 60 /ZapfDingbats font
+473 788 59 (u) 59 SB
+32 0 0 100 100 0 0 1 90 /MSTT31c1f0 font
+586 758 1369 (Two fstab options control quotas: ) 1369 SB
+32 0 0 100 100 0 0 0 86 /Courier-Bold /font9 ANSIFont font
+1955 762 480 (usrquota) 480 SB
+32 0 0 100 100 0 0 1 90 /MSTT31c1f0 font
+2435 758 169 ( and) 169 SB
+32 0 0 100 100 0 0 0 86 /Courier-Bold /font9 ANSIFont font
+586 882 480 (grpquota) 480 SB
+32 0 0 75 75 0 0 0 60 /ZapfDingbats font
+473 1051 59 (u) 59 SB
+32 0 0 100 100 0 0 1 90 /MSTT31c1f0 font
+586 1021 883 (Example of /etc/fstab:) 883 SB
+32 0 0 67 67 0 0 0 57 /Courier-Bold /font9 ANSIFont font
+586 1145 2280 (/dev/hda2 /        ext2 defaults,rw                   0 1) 2280 SB
+586 1225 2280 (/dev/hdb2 /home    ext2 defaults,rw,usrquota,grpquota 0 2) 2280 SB
+586 1305 2280 (/dev/sda1 /usr/src ext2 default,usrquota              0 2) 2280 SB
+586 1385 2280 (none      /proc    proc defaults,rw                   0 0) 2280 SB
+586 1465 2280 (/dev/hda3 none     swap sw                            0 0) 2280 SB
+32 0 0 75 75 0 0 0 60 /ZapfDingbats font
+473 1596 59 (u) 59 SB
+32 0 0 100 100 0 0 1 90 /MSTT31c1f0 font
+586 1566 1042 (Quotas are activated with ) 1042 SB
+32 0 0 100 100 0 0 0 86 /Courier-Bold /font9 ANSIFont font
+1628 1570 420 (quotaon) 420 SB
+32 0 0 100 100 0 0 1 90 /MSTT31c1f0 font
+2048 1566 28 (:) 28 SB
+32 0 0 100 100 0 0 0 86 /Courier-Bold /font9 ANSIFont font
+586 1690 1380 (/usr/sbin/quotaon -avug) 1380 SB
+EJ RS
+%%PageTrailer
+SS
+0 0 18 13 783 1169 300 SM
+255 255 255 fC
+/fm 256 def
+3250 2250 88 49 B
+1 F
+n
+1 lc
+1 lj
+0 0 0 pC
+6 17 SP
+gs 2857 2349 88 0 CB
+-2765 499 M 8559 0 1 PP
+S
+n
+gr
+32 0 0 58 58 0 0 1 53 /MSTT31c1bc font
+0 0 0 fC
+25 8 SJ
+153 2191 1278 (Third International Linux Conference - Berlin - May 96) 1278 SB
+
+%%BeginResource: font MSTT31c1bc
+/G30 [29.0 0.0 2.0 0.0 26.0 40.0]
+/G30 {
+    24 40 true [1 0 0 -1 -2.0 40.0] {<007e0000ff8003c3c00780e00f00f00e00701e00781e003c3c003c3c003c7c003e7c001e7c001e78
+001ef8001ff8001ff8001ff8001ff8001ff8001ff8001ff8001ff8001ff8001ff8001ff8001f7800
+1e78001e7c003e7c003e3c003c3c003c3e00381e00780e00700f00f00781e003c3c001ff00007c00
+>} imagemask 
+  }
+  48 /G30 MSTT31c1bc AddChar
+%%EndResource
+
+2890 2191 58 (10) 58 SB
+32 0 0 150 150 0 0 0 134 /MSTT31c1c9 font
+%%BeginResource: font MSTT31c1c9
+currentfile eexec
+9e67edc6b858a3e762244b628fb7f6f6b82db3d80533f85f9af7ec02fa0992f446e47e7476690365d15488a3d0557140c554c35b60083b9bf344ec199d995ff7
+cd974526686a837538b7a59d07d53e21b3fa3313fbd1f7f7696e463c6e9f4dd81a178f4cd84a9c664c8ed3ec336fd6fb9e483f3302eeb5fe4637dfe6d10e7ba4
+f53e92bb2bbdcd0a388c0136f8906ca645dc0a64a817eca590cd187ecf50e06f833cc7154aaca53c69bc3b1326502d3bbeefe3c6ca245a19007872ec8da89685
+56eb3a6dfbb3acb8151d12382ee5a80c2afd576ac183cde8d7eab3e403805ee0e68a511f2d65ee2ed6124ccd69dfee6b3e8ceb1b0708a1183f6fb7e85a1f2038
+dbdf9ef86f77652226e8a4109784e077e9d3a78d5c34c01f0b4d377941e119ddace546b11dd90abf5f228925ffb99beaf6fd83aed87d08f3849c79e7acd19a06
+2022d0a0c0082055a16412d5e30b81adcb81bf0742acf8c198c2266ef5e1cf7b86096cc517bb37e3a9dc8d3733b4135c34ed46f4d1bc36446ef1bc30ed48e948
+a8612262f068a2e3119be1286861e7a0e5
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+
+cleartomark
+%%EndResource
+-4 2 SJ
+256 305 1504 (Setting individual quotas) 1504 SB
+32 0 0 75 75 0 0 0 60 /ZapfDingbats font
+473 644 59 (u) 59 SB
+32 0 0 100 100 0 0 1 90 /MSTT31c1f0 font
+
+%%BeginResource: font MSTT31c1f0
+/G49 [31.0 0.0 2.0 0.0 29.0 67.0]
+/G49 {
+    27 67 true [1 0 0 -1 -2.0 67.0] {<ffffffe0ffffffe007fffc0001fff00000ffe00000ffe000007fc000007fc000007fc000007fc000
+007fc000007fc000007fc000007fc000007fc000007fc000007fc000007fc000007fc000007fc000
+007fc000007fc000007fc000007fc000007fc000007fc000007fc000007fc000007fc000007fc000
+007fc000007fc000007fc000007fc000007fc000007fc000007fc000007fc000007fc000007fc000
+007fc000007fc000007fc000007fc000007fc000007fc000007fc000007fc000007fc000007fc000
+007fc000007fc000007fc000007fc000007fc000007fc000007fc000007fc000007fc000007fc000
+007fc00000ffe00000ffe00001fff00007fffc00ffffffe0ffffffe0>} imagemask 
+  }
+  73 /G49 MSTT31c1f0 AddChar
+%%EndResource
+
+2 8 SJ
+586 614 1680 (Individual disk quotas can be set with the ) 1680 SB
+32 0 0 100 100 0 0 0 86 /Courier-Bold /font9 ANSIFont font
+2268 618 420 (edquota) 420 SB
+32 0 0 100 100 0 0 1 90 /MSTT31c1f0 font
+2688 614 181 ( tool) 181 SB
+32 0 0 75 75 0 0 0 60 /ZapfDingbats font
+473 788 59 (u) 59 SB
+32 0 0 100 100 0 0 1 90 /MSTT31c1f0 font
+6 9 SJ
+586 758 2274 (The administrator can specify the soft and hard limits for) 2274 SB
+1 1 SJ
+586 878 263 (users \() 263 SB
+32 0 0 100 100 0 0 0 86 /Courier-Bold /font9 ANSIFont font
+849 882 120 (-u) 120 SB
+32 0 0 100 100 0 0 1 90 /MSTT31c1f0 font
+2 3 SJ
+969 878 556 (\) and groups \() 556 SB
+32 0 0 100 100 0 0 0 86 /Courier-Bold /font9 ANSIFont font
+1527 882 120 (-g) 120 SB
+32 0 0 100 100 0 0 1 90 /MSTT31c1f0 font
+1647 878 33 (\)) 33 SB
+32 0 0 75 75 0 0 0 60 /ZapfDingbats font
+473 1051 59 (u) 59 SB
+32 0 0 100 100 0 0 1 90 /MSTT31c1f0 font
+586 1021 414 (Example \() 414 SB
+32 0 0 100 100 0 0 0 86 /Courier-Bold /font9 ANSIFont font
+1000 1025 1080 (edquota -u dugenou) 1080 SB
+32 0 0 100 100 0 0 1 90 /MSTT31c1f0 font
+2080 1021 61 (\):) 61 SB
+32 0 0 58 58 0 0 0 50 /Courier-Bold /font9 ANSIFont font
+586 1144 840 (Quotas for user dugenou:) 840 SB
+586 1214 2240 (/dev/hdb2: blocks in use: 16, limits \(soft = 5000, hard = 6000\) ) 2240 SB
+773 1283 1960 (      inodes in use: 11, limits \(soft = 100, hard = 110\)) 1960 SB
+586 1353 1995 (/dev/sda1: blocks in use: 0, limits \(soft = 0, hard = 0\) ) 1995 SB
+773 1423 1785 (      inodes in use: 0, limits \(soft = 0, hard = 0\)) 1785 SB
+32 0 0 75 75 0 0 0 60 /ZapfDingbats font
+473 1544 59 (u) 59 SB
+32 0 0 100 100 0 0 1 90 /MSTT31c1f0 font
+6 10 SJ
+586 1514 2265 (edquota can also copy disk quotas from a user to another) 2265 SB
+586 1634 172 (one:) 172 SB
+32 0 0 100 100 0 0 0 86 /Courier-Bold /font9 ANSIFont font
+586 1758 1800 (edquota -p prototype_user user) 1800 SB
+EJ RS
+%%PageTrailer
+SS
+0 0 18 13 783 1169 300 SM
+255 255 255 fC
+/fm 256 def
+3250 2250 88 49 B
+1 F
+n
+1 lc
+1 lj
+0 0 0 pC
+6 17 SP
+gs 2857 2349 88 0 CB
+-2765 499 M 8559 0 1 PP
+S
+n
+gr
+32 0 0 58 58 0 0 1 53 /MSTT31c1bc font
+0 0 0 fC
+25 8 SJ
+153 2191 1278 (Third International Linux Conference - Berlin - May 96) 1278 SB
+2890 2191 58 (11) 58 SB
+32 0 0 150 150 0 0 0 134 /MSTT31c1c9 font
+-2 2 SJ
+256 305 1244 (Checking disk usage) 1244 SB
+32 0 0 75 75 0 0 0 60 /ZapfDingbats font
+473 644 59 (u) 59 SB
+32 0 0 100 100 0 0 1 90 /MSTT31c1f0 font
+1 1 SJ
+586 614 180 (The ) 180 SB
+32 0 0 100 100 0 0 0 86 /Courier-Bold /font9 ANSIFont font
+766 618 480 (repquota) 480 SB
+32 0 0 100 100 0 0 1 90 /MSTT31c1f0 font
+3 6 SJ
+1246 614 1435 ( command prints a summary of disk) 1435 SB
+586 734 254 (usage:) 254 SB
+32 0 0 58 58 0 0 0 50 /Courier-Bold /font9 ANSIFont font
+773 894 1645 (*** Report for user quotas on /dev/hdb2 \(/home\)) 1645 SB
+1073 976 1505 (     Block limits               File limits) 1505 SB
+586 1046 2345 (User          used   soft    hard  grace    used  soft  hard  grace) 2345 SB
+586 1116 2065 (root     --     19      0       0             2     0     0) 2065 SB
+586 1185 2065 (bin      --      3      0       0             3     0     0) 2065 SB
+586 1255 2065 (news     --  31691      0       0         11846     0     0) 2065 SB
+586 1325 2065 (card     -- 111498      0       0          8673     0     0) 2065 SB
+586 1395 2065 (dugenou  --     16   5000    6000            11   100   110) 2065 SB
+586 1465 2065 (melanie  --      6   5000    6000             7   100   110) 2065 SB
+32 0 0 75 75 0 0 0 60 /ZapfDingbats font
+473 1586 59 (u) 59 SB
+32 0 0 100 100 0 0 1 90 /MSTT31c1f0 font
+3 9 SJ
+586 1556 1961 (The quota command can also be used to print the) 1961 SB
+586 1676 2013 (individual quota associated with a user or a group:) 2013 SB
+32 0 0 58 58 0 0 0 50 /Courier-Bold /font9 ANSIFont font
+586 1798 2030 (Disk quotas for user dugenou \(uid 1004\):                  ) 2030 SB
+773 1868 2170 (Filesystem blocks quota limit grace  files quota limit   grace) 2170 SB
+773 1938 1855 (/dev/hdb2     16  5000  6000           11   100   110) 1855 SB
+EJ RS
+%%PageTrailer
+SS
+0 0 18 13 783 1169 300 SM
+255 255 255 fC
+/fm 256 def
+3250 2250 88 49 B
+1 F
+n
+1 lc
+1 lj
+0 0 0 pC
+6 17 SP
+gs 2857 2349 88 0 CB
+-2765 499 M 8559 0 1 PP
+S
+n
+gr
+32 0 0 58 58 0 0 1 53 /MSTT31c1bc font
+0 0 0 fC
+25 8 SJ
+153 2191 1278 (Third International Linux Conference - Berlin - May 96) 1278 SB
+2890 2191 58 (12) 58 SB
+32 0 0 150 150 0 0 0 134 /MSTT31c1c9 font
+-6 2 SJ
+256 305 1690 (Checking quota consistency) 1690 SB
+32 0 0 75 75 0 0 0 60 /ZapfDingbats font
+473 644 59 (u) 59 SB
+32 0 0 100 100 0 0 1 90 /MSTT31c1f0 font
+9 9 SJ
+586 614 2243 (Disk quota descriptors are kept in memory by the kernel) 2243 SB
+32 0 0 75 75 0 0 0 60 /ZapfDingbats font
+473 788 59 (u) 59 SB
+32 0 0 100 100 0 0 1 90 /MSTT31c1f0 font
+9 7 SJ
+586 758 1810 (They are periodically written back to the disk) 1810 SB
+32 0 0 75 75 0 0 0 60 /ZapfDingbats font
+473 932 59 (u) 59 SB
+32 0 0 100 100 0 0 1 90 /MSTT31c1f0 font
+9 7 SJ
+586 902 2182 (They can become corrupted after an unclean shutdown) 2182 SB
+32 0 0 75 75 0 0 0 60 /ZapfDingbats font
+473 1075 59 (u) 59 SB
+32 0 0 100 100 0 0 0 86 /Courier-Bold /font9 ANSIFont font
+586 1049 600 (quotacheck) 600 SB
+32 0 0 100 100 0 0 1 90 /MSTT31c1f0 font
+4 6 SJ
+1186 1045 1545 ( checks the consistency of disk quotas:) 1545 SB
+32 0 0 100 100 0 0 0 86 /Courier-Bold /font9 ANSIFont font
+586 1169 1560 (/usr/sbin/quotacheck -avug) 1560 SB
+32 0 0 75 75 0 0 0 60 /ZapfDingbats font
+473 1339 59 (u) 59 SB
+32 0 0 100 100 0 0 1 90 /MSTT31c1f0 font
+586 1309 2266 (Be sure to compile the quota tools with Ext2fs support if) 2266 SB
+
+%%BeginResource: font MSTT31c1f0
+/G21 [33.0 0.0 11.0 -1.0 22.0 68.0]
+/G21 {
+    11 69 true [1 0 0 -1 -11.0 68.0] {<1f003f807fc07fc0ffe0ffe0ffe0ffe0ffe0ffe0ffe0ffe0ffe07fc07fc07fc07fc07fc07fc07fc0
+7fc07f807f807f803f803f803f803f803f803f003f003f003f003f001f001f001f001f001e001e00
+1e001e001e001e001e000e000c000c000c000c00000000000000000000000000000000001f003f80
+7fc0ffe0ffe0ffe0ffe0ffe07fc03f801f00>} imagemask 
+  }
+  33 /G21 MSTT31c1f0 AddChar
+%%EndResource
+
+4 5 SJ
+586 1429 910 (you want it to run fast!) 910 SB
+EJ RS
+%%PageTrailer
+SS
+0 0 18 13 783 1169 300 SM
+255 255 255 fC
+/fm 256 def
+3250 2250 88 49 B
+1 F
+n
+1 lc
+1 lj
+0 0 0 pC
+6 17 SP
+gs 2857 2349 88 0 CB
+-2765 499 M 8559 0 1 PP
+S
+n
+gr
+32 0 0 58 58 0 0 1 53 /MSTT31c1bc font
+0 0 0 fC
+25 8 SJ
+153 2191 1278 (Third International Linux Conference - Berlin - May 96) 1278 SB
+2890 2191 58 (13) 58 SB
+32 0 0 167 167 0 0 0 150 /MSTT31c1c9 font
+-3 1 SJ
+256 284 721 (Quota API) 721 SB
+32 0 0 75 75 0 0 0 60 /ZapfDingbats font
+473 644 59 (u) 59 SB
+32 0 0 100 100 0 0 1 90 /MSTT31c1f0 font
+5 8 SJ
+586 614 1850 (A system call can be used to manipulate quota) 1850 SB
+32 0 0 63 63 0 0 0 50 /ZapfDingbats font
+473 779 50 (u) 50 SB
+32 0 0 83 83 0 0 0 71 /Courier-Bold /font9 ANSIFont font
+586 758 2250 (int quotactl \(int cmd, char *special, int id,) 2250 SB
+586 858 650 (caddr_t addr\)) 650 SB
+32 0 0 75 75 0 0 0 60 /ZapfDingbats font
+473 1008 59 (u) 59 SB
+32 0 0 100 100 0 0 1 90 /MSTT31c1f0 font
+
+%%BeginResource: font MSTT31c1f0
+/G43 [67.0 0.0 4.0 -1.0 63.0 68.0]
+/G43 {
+    59 69 true [1 0 0 -1 -4.0 68.0] {<0000001ffc000600000001ffffc00e0000000ffffff80e0000003ff803fe1e000000ffc0007ffe00
+0001ff00000ffe000007fc000007ff00000ff8000003ff00001fe0000001ff00003fc0000000ff00
+007fc00000007f0000ff800000003f0001ff000000001f0001ff000000001f0003fe000000000f00
+07fe000000000f0007fc0000000007000ffc0000000007800ff80000000003801ff8000000000380
+1ff80000000003803ff80000000001803ff00000000001803ff00000000000007ff0000000000000
+7ff00000000000007ff00000000000007fe00000000000007fe0000000000000ffe0000000000000
+ffe0000000000000ffe0000000000000ffe0000000000000ffe0000000000000ffe0000000000000
+ffe0000000000000ffe0000000000000ffe0000000000000ffe0000000000000ffe0000000000000
+ffe0000000000000ffe00000000000007fe00000000000007ff00000000000007ff0000000000000
+7ff00000000000003ff00000000000003ff80000000000003ff80000000000001ff8000000000000
+1ffc0000000000001ffc0000000000000ffc00000000004007fe0000000000e007ff0000000000c0
+03ff00000000018003ff80000000038001ffc0000000070000ffe00000000e00007ff00000001c00
+003ff80000003800001ffe000000f000000fff000003e0000007ffe0000fc0000001fffc007f8000
+00007ffffffe000000001ffffff80000000003ffffc000000000003ffc000000>} imagemask 
+  }
+  67 /G43 MSTT31c1f0 AddChar
+%%EndResource
+
+586 978 509 (Commands: ) 509 SB
+32 0 0 100 100 0 0 0 86 /Courier-Bold /font9 ANSIFont font
+1095 982 1260 (QCMD\(operation, type\)) 1260 SB
+32 0 0 75 75 0 0 0 60 /ZapfDingbats font
+473 1152 59 (u) 59 SB
+32 0 0 100 100 0 0 1 90 /MSTT31c1f0 font
+
+%%BeginResource: font MSTT31c1f0
+/G4f [72.0 0.0 4.0 -1.0 68.0 68.0]
+/G4f {
+    64 69 true [1 0 0 -1 -4.0 68.0] {<0000001ffc000000000001ffffc0000000000ffffff8000000003fe00ffe00000000ff0000ff0000
+0001fc00003fc0000007f800001fe000000ff000000ff000001fe0000007f800003fc0000003fc00
+007f80000001fe0000ff00000000ff0001ff00000000ff8003fe000000007fc003fe000000007fc0
+07fc000000003fe00ffc000000003ff00ff8000000003ff01ff8000000001ff81ff8000000001ff8
+3ff8000000001ffc3ff0000000000ffc3ff0000000000ffc7ff0000000000ffe7ff0000000000ffe
+7ff0000000000ffe7fe0000000000ffe7fe00000000007feffe00000000007ffffe00000000007ff
+ffe00000000007ffffe00000000007ffffe00000000007ffffe00000000007ffffe00000000007ff
+ffe00000000007ffffe00000000007ffffe00000000007ffffe00000000007ffffe00000000007ff
+ffe00000000007ff7fe00000000007fe7ff00000000007fe7ff00000000007fe7ff0000000000ffe
+7ff0000000000ffc3ff0000000000ffc3ff0000000000ffc3ff8000000000ff81ff8000000001ff8
+1ff8000000001ff80ffc000000001ff00ffc000000003fe007fc000000003fe007fe000000003fc0
+03fe000000007fc001ff00000000ff8000ff80000000ff0000ff80000001fe00007fc0000003fc00
+003fe0000007f800001ff000000ff0000007f800001fe0000003fe00007fc0000000ff0001ff0000
+00007fe00ffc000000001ffffff00000000003ffffc000000000003ff8000000>} imagemask 
+  }
+  79 /G4f MSTT31c1f0 AddChar
+%%EndResource
+
+586 1122 466 (Operations:) 466 SB
+32 0 0 75 75 0 0 0 64 /Courier-Bold /font9 ANSIFont font
+623 1263 45 (\226) 45 SB
+717 1263 405 (Q_QUOTAON) 405 SB
+32 0 0 75 75 0 0 1 67 /MSTT31c1fd font
+1122 1260 38 (, ) 38 SB
+32 0 0 75 75 0 0 0 64 /Courier-Bold /font9 ANSIFont font
+1160 1263 450 (Q_QUOTAOFF) 450 SB
+32 0 0 75 75 0 0 1 67 /MSTT31c1fd font
+1610 1260 1128 (: activate or deactivate quota on a file) 1128 SB
+717 1350 205 (system) 205 SB
+32 0 0 75 75 0 0 0 64 /Courier-Bold /font9 ANSIFont font
+623 1462 45 (\226) 45 SB
+717 1462 450 (Q_GETQUOTA) 450 SB
+32 0 0 75 75 0 0 1 67 /MSTT31c1fd font
+1167 1459 38 (, ) 38 SB
+32 0 0 75 75 0 0 0 64 /Courier-Bold /font9 ANSIFont font
+1205 1462 450 (Q_SETQUOTA) 450 SB
+32 0 0 75 75 0 0 1 67 /MSTT31c1fd font
+1655 1459 821 (: get or set usage and limits) 821 SB
+32 0 0 75 75 0 0 0 64 /Courier-Bold /font9 ANSIFont font
+623 1570 45 (\226) 45 SB
+717 1570 360 (Q_SETLIM) 360 SB
+32 0 0 75 75 0 0 1 67 /MSTT31c1fd font
+1077 1567 38 (, ) 38 SB
+32 0 0 75 75 0 0 0 64 /Courier-Bold /font9 ANSIFont font
+1115 1570 360 (Q_SETUSE) 360 SB
+32 0 0 75 75 0 0 1 67 /MSTT31c1fd font
+1475 1567 629 (: set limits and usage) 629 SB
+32 0 0 75 75 0 0 0 64 /Courier-Bold /font9 ANSIFont font
+623 1678 45 (\226) 45 SB
+717 1678 270 (Q_SYNC) 270 SB
+32 0 0 75 75 0 0 1 67 /MSTT31c1fd font
+987 1675 791 (: write quotas back to disk) 791 SB
+32 0 0 75 75 0 0 0 64 /Courier-Bold /font9 ANSIFont font
+623 1787 45 (\226) 45 SB
+717 1787 450 (Q_GETSTATS) 450 SB
+32 0 0 75 75 0 0 1 67 /MSTT31c1fd font
+1167 1784 408 (: get statistics) 408 SB
+EJ RS
+%%PageTrailer
+SS
+0 0 18 13 783 1169 300 SM
+255 255 255 fC
+/fm 256 def
+3250 2250 88 49 B
+1 F
+n
+1 lc
+1 lj
+0 0 0 pC
+6 17 SP
+gs 2857 2349 88 0 CB
+-2765 499 M 8559 0 1 PP
+S
+n
+gr
+32 0 0 58 58 0 0 1 53 /MSTT31c1bc font
+0 0 0 fC
+25 8 SJ
+153 2191 1278 (Third International Linux Conference - Berlin - May 96) 1278 SB
+2890 2191 58 (14) 58 SB
+32 0 0 150 150 0 0 0 134 /MSTT31c1c9 font
+256 305 589 (Structure ) 589 SB
+32 0 0 150 150 0 0 0 128 /Courier-Bold /font9 ANSIFont font
+845 311 450 (dqblk) 450 SB
+32 0 0 75 75 0 0 0 60 /ZapfDingbats font
+473 644 59 (u) 59 SB
+32 0 0 100 100 0 0 0 86 /Courier-Bold /font9 ANSIFont font
+586 618 840 (dqb_bhardlimit) 840 SB
+32 0 0 100 100 0 0 1 90 /MSTT31c1f0 font
+1426 614 856 (: hard limit on blocks) 856 SB
+32 0 0 75 75 0 0 0 60 /ZapfDingbats font
+473 788 59 (u) 59 SB
+32 0 0 100 100 0 0 0 86 /Courier-Bold /font9 ANSIFont font
+586 762 840 (dqb_bsoftlimit) 840 SB
+32 0 0 100 100 0 0 1 90 /MSTT31c1f0 font
+1426 758 829 (: soft limit on blocks) 829 SB
+32 0 0 75 75 0 0 0 60 /ZapfDingbats font
+473 932 59 (u) 59 SB
+32 0 0 100 100 0 0 0 86 /Courier-Bold /font9 ANSIFont font
+586 906 780 (dqb_curblocks) 780 SB
+32 0 0 100 100 0 0 1 90 /MSTT31c1f0 font
+3 3 SJ
+1366 902 872 (: current blocks usage) 872 SB
+32 0 0 75 75 0 0 0 60 /ZapfDingbats font
+473 1075 59 (u) 59 SB
+32 0 0 100 100 0 0 0 86 /Courier-Bold /font9 ANSIFont font
+586 1049 840 (dqb_ihardlimit) 840 SB
+32 0 0 100 100 0 0 1 90 /MSTT31c1f0 font
+1426 1045 856 (: hard limit on inodes) 856 SB
+32 0 0 75 75 0 0 0 60 /ZapfDingbats font
+473 1219 59 (u) 59 SB
+32 0 0 100 100 0 0 0 86 /Courier-Bold /font9 ANSIFont font
+586 1193 840 (dqb_isoftlimit) 840 SB
+32 0 0 100 100 0 0 1 90 /MSTT31c1f0 font
+1426 1189 829 (: soft limit on inodes) 829 SB
+32 0 0 75 75 0 0 0 60 /ZapfDingbats font
+473 1363 59 (u) 59 SB
+32 0 0 100 100 0 0 0 86 /Courier-Bold /font9 ANSIFont font
+586 1337 780 (dqb_curinodes) 780 SB
+32 0 0 100 100 0 0 1 90 /MSTT31c1f0 font
+3 3 SJ
+1366 1333 872 (: current inodes usage) 872 SB
+32 0 0 75 75 0 0 0 60 /ZapfDingbats font
+473 1507 59 (u) 59 SB
+32 0 0 100 100 0 0 0 86 /Courier-Bold /font9 ANSIFont font
+586 1481 540 (dqb_btime) 540 SB
+32 0 0 100 100 0 0 1 90 /MSTT31c1f0 font
+3 7 SJ
+1126 1477 1794 (: grace period associated with the block limit) 1794 SB
+32 0 0 75 75 0 0 0 60 /ZapfDingbats font
+473 1650 59 (u) 59 SB
+32 0 0 100 100 0 0 0 86 /Courier-Bold /font9 ANSIFont font
+586 1624 540 (dqb_inode) 540 SB
+32 0 0 100 100 0 0 1 90 /MSTT31c1f0 font
+3 7 SJ
+1126 1620 1794 (: grace period associated with the inode limit) 1794 SB
+EJ RS
+%%PageTrailer
+SS
+0 0 18 13 783 1169 300 SM
+255 255 255 fC
+/fm 256 def
+3250 2250 88 49 B
+1 F
+n
+1 lc
+1 lj
+0 0 0 pC
+6 17 SP
+gs 2857 2349 88 0 CB
+-2765 499 M 8559 0 1 PP
+S
+n
+gr
+32 0 0 58 58 0 0 1 53 /MSTT31c1bc font
+0 0 0 fC
+25 8 SJ
+153 2191 1278 (Third International Linux Conference - Berlin - May 96) 1278 SB
+2890 2191 58 (15) 58 SB
+32 0 0 167 167 0 0 0 150 /MSTT31c1c9 font
+-6 3 SJ
+256 284 2038 (Implementation of disk quotas) 2038 SB
+32 0 0 75 75 0 0 0 60 /ZapfDingbats font
+473 644 59 (u) 59 SB
+32 0 0 100 100 0 0 1 90 /MSTT31c1f0 font
+586 614 1495 (Disk quotas are stored in quota files \() 1495 SB
+32 0 0 100 100 0 0 0 86 /Courier-Bold /font9 ANSIFont font
+2081 618 600 (quota.user) 600 SB
+32 0 0 100 100 0 0 1 90 /MSTT31c1f0 font
+2681 614 169 ( and) 169 SB
+32 0 0 100 100 0 0 0 86 /Courier-Bold /font9 ANSIFont font
+586 738 660 (quota.group) 660 SB
+32 0 0 100 100 0 0 1 90 /MSTT31c1f0 font
+5 7 SJ
+1246 734 1430 (\) located in the root directory of file) 1430 SB
+586 854 314 (systems) 314 SB
+32 0 0 75 75 0 0 0 60 /ZapfDingbats font
+473 1028 59 (u) 59 SB
+32 0 0 100 100 0 0 1 90 /MSTT31c1f0 font
+586 998 1897 (Each quota file is seen as an array of structures ) 1897 SB
+32 0 0 100 100 0 0 0 86 /Courier-Bold /font9 ANSIFont font
+2483 1002 360 (struct) 360 SB
+586 1121 300 (dqblk) 300 SB
+32 0 0 100 100 0 0 1 90 /MSTT31c1f0 font
+4 7 SJ
+886 1117 1685 (, that describe the current usage and limits) 1685 SB
+3 4 SJ
+586 1237 1247 (associated with users or groups) 1247 SB
+32 0 0 75 75 0 0 0 60 /ZapfDingbats font
+473 1411 59 (u) 59 SB
+32 0 0 100 100 0 0 1 90 /MSTT31c1f0 font
+6 14 SJ
+586 1381 2271 (The user id or group id is used as an index in the array to) 2271 SB
+4 4 SJ
+586 1501 1551 (access the appropriate quota descriptor) 1551 SB
+EJ RS
+%%PageTrailer
+SS
+0 0 18 13 783 1169 300 SM
+255 255 255 fC
+/fm 256 def
+3250 2250 88 49 B
+1 F
+n
+1 lc
+1 lj
+0 0 0 pC
+6 17 SP
+gs 2857 2349 88 0 CB
+-2765 499 M 8559 0 1 PP
+S
+n
+gr
+32 0 0 58 58 0 0 1 53 /MSTT31c1bc font
+0 0 0 fC
+25 8 SJ
+153 2191 1278 (Third International Linux Conference - Berlin - May 96) 1278 SB
+2890 2191 58 (16) 58 SB
+32 0 0 150 150 0 0 0 134 /MSTT31c1c9 font
+-2 1 SJ
+256 305 1064 (Quota descriptors) 1064 SB
+32 0 0 75 75 0 0 0 60 /ZapfDingbats font
+473 644 59 (u) 59 SB
+32 0 0 100 100 0 0 1 90 /MSTT31c1f0 font
+5 9 SJ
+586 614 2336 (The kernel maintains a list of quota descriptors in memory) 2336 SB
+586 734 33 (\() 33 SB
+32 0 0 100 100 0 0 0 86 /Courier-Bold /font9 ANSIFont font
+619 738 720 (struct dquot) 720 SB
+32 0 0 100 100 0 0 1 90 /MSTT31c1f0 font
+1339 734 33 (\)) 33 SB
+32 0 0 75 75 0 0 0 60 /ZapfDingbats font
+473 908 59 (u) 59 SB
+32 0 0 100 100 0 0 1 90 /MSTT31c1f0 font
+1 6 SJ
+586 878 1598 (The descriptors are stored in linked lists) 1598 SB
+32 0 0 75 75 0 0 0 60 /ZapfDingbats font
+473 1051 59 (u) 59 SB
+32 0 0 100 100 0 0 1 90 /MSTT31c1f0 font
+4 5 SJ
+586 1021 1765 (Inodes contain pointers on quota descriptors) 1765 SB
+32 0 0 75 75 0 0 0 60 /ZapfDingbats font
+473 1195 59 (u) 59 SB
+32 0 0 100 100 0 0 1 90 /MSTT31c1f0 font
+6 7 SJ
+586 1165 2341 (Quota operations are associated with mounted file systems) 2341 SB
+586 1285 33 (\() 33 SB
+32 0 0 100 100 0 0 0 86 /Courier-Bold /font9 ANSIFont font
+619 1289 1020 (struct superblock) 1020 SB
+32 0 0 100 100 0 0 1 90 /MSTT31c1f0 font
+1639 1285 33 (\)) 33 SB
+EJ RS
+%%PageTrailer
+SS
+0 0 18 13 783 1169 300 SM
+255 255 255 fC
+/fm 256 def
+3250 2250 88 49 B
+1 F
+n
+1 lc
+1 lj
+0 0 0 pC
+6 17 SP
+gs 2857 2349 88 0 CB
+-2765 499 M 8559 0 1 PP
+S
+n
+gr
+32 0 0 58 58 0 0 1 53 /MSTT31c1bc font
+0 0 0 fC
+25 8 SJ
+153 2191 1278 (Third International Linux Conference - Berlin - May 96) 1278 SB
+2890 2191 58 (17) 58 SB
+32 0 0 150 150 0 0 0 134 /MSTT31c1c9 font
+-2 1 SJ
+256 305 1031 (Quota operations) 1031 SB
+32 0 0 75 75 0 0 0 60 /ZapfDingbats font
+473 644 59 (u) 59 SB
+32 0 0 100 100 0 0 0 86 /Courier-Bold /font9 ANSIFont font
+586 618 600 (initialize) 600 SB
+32 0 0 100 100 0 0 1 90 /MSTT31c1f0 font
+2 6 SJ
+1186 614 1681 (: loads quota descriptors associated with a) 1681 SB
+586 734 222 (inode) 222 SB
+32 0 0 75 75 0 0 0 60 /ZapfDingbats font
+473 908 59 (u) 59 SB
+32 0 0 100 100 0 0 0 86 /Courier-Bold /font9 ANSIFont font
+586 882 240 (drop) 240 SB
+32 0 0 100 100 0 0 1 90 /MSTT31c1f0 font
+4 7 SJ
+826 878 1910 (: frees quota descriptors associated with a inode) 1910 SB
+32 0 0 75 75 0 0 0 60 /ZapfDingbats font
+473 1051 59 (u) 59 SB
+32 0 0 100 100 0 0 0 86 /Courier-Bold /font9 ANSIFont font
+586 1025 660 (alloc_block) 660 SB
+32 0 0 100 100 0 0 1 90 /MSTT31c1f0 font
+3 6 SJ
+1246 1021 1630 (: checks for block allocation and updates) 1630 SB
+586 1141 226 (usage) 226 SB
+32 0 0 75 75 0 0 0 60 /ZapfDingbats font
+473 1315 59 (u) 59 SB
+32 0 0 100 100 0 0 0 86 /Courier-Bold /font9 ANSIFont font
+586 1289 660 (alloc_inode) 660 SB
+32 0 0 100 100 0 0 1 90 /MSTT31c1f0 font
+3 6 SJ
+1246 1285 1630 (: checks for inode allocation and updates) 1630 SB
+586 1405 226 (usage) 226 SB
+32 0 0 75 75 0 0 0 60 /ZapfDingbats font
+473 1579 59 (u) 59 SB
+32 0 0 100 100 0 0 0 86 /Courier-Bold /font9 ANSIFont font
+586 1553 600 (free_block) 600 SB
+32 0 0 100 100 0 0 1 90 /MSTT31c1f0 font
+4 7 SJ
+1186 1549 1737 (: updates usage when a block is deallocated) 1737 SB
+32 0 0 75 75 0 0 0 60 /ZapfDingbats font
+473 1722 59 (u) 59 SB
+32 0 0 100 100 0 0 0 86 /Courier-Bold /font9 ANSIFont font
+586 1696 600 (free_inode) 600 SB
+32 0 0 100 100 0 0 1 90 /MSTT31c1f0 font
+3 6 SJ
+1186 1692 1308 (: updates usage when an inode is) 1308 SB
+586 1812 454 (deallocated) 454 SB
+32 0 0 75 75 0 0 0 60 /ZapfDingbats font
+473 1986 59 (u) 59 SB
+32 0 0 100 100 0 0 0 86 /Courier-Bold /font9 ANSIFont font
+586 1960 480 (transfer) 480 SB
+32 0 0 100 100 0 0 1 90 /MSTT31c1f0 font
+6 8 SJ
+1066 1956 1838 (: updates usages when a file owner is changed) 1838 SB
+EJ RS
+%%PageTrailer
+SS
+0 0 18 13 783 1169 300 SM
+255 255 255 fC
+/fm 256 def
+3250 2250 88 49 B
+1 F
+n
+1 lc
+1 lj
+0 0 0 pC
+6 17 SP
+gs 2857 2349 88 0 CB
+-2765 499 M 8559 0 1 PP
+S
+n
+gr
+32 0 0 58 58 0 0 1 53 /MSTT31c1bc font
+0 0 0 fC
+25 8 SJ
+153 2191 1278 (Third International Linux Conference - Berlin - May 96) 1278 SB
+2890 2191 58 (18) 58 SB
+32 0 0 150 150 0 0 0 134 /MSTT31c1c9 font
+-6 3 SJ
+256 305 1727 (Quota support in filesystems) 1727 SB
+32 0 0 75 75 0 0 0 60 /ZapfDingbats font
+473 644 59 (u) 59 SB
+32 0 0 100 100 0 0 1 90 /MSTT31c1f0 font
+
+%%BeginResource: font MSTT31c1f0
+/G4d [89.0 0.0 2.0 0.0 87.0 67.0]
+/G4d {
+    85 67 true [1 0 0 -1 -2.0 67.0] {<ffffc000000000000ffff8ffffe000000000001ffff80fffe000000000001fff0003fff000000000
+003ffc0001fff000000000003ff80000fff000000000007ff80000fff800000000007ff000007ff8
+0000000000fff000007ffc0000000000fff000007ffc0000000001fff000007ffe0000000001fff0
+00007ffe0000000003fff000007bff0000000003dff000007bff0000000007dff0000079ff800000
+00079ff0000079ff800000000f9ff0000078ffc00000000f1ff0000078ffc00000001f1ff0000078
+7fc00000001e1ff00000787fe00000003e1ff00000783fe00000003c1ff00000783ff00000007c1f
+f00000783ff0000000781ff00000781ff8000000781ff00000781ff8000000f01ff00000780ffc00
+0000f01ff00000780ffc000001e01ff000007807fe000001e01ff000007807fe000003c01ff00000
+7803ff000003c01ff000007803ff000007801ff000007801ff000007801ff000007801ff80000f80
+1ff000007800ff80000f001ff000007800ffc0001f001ff000007800ffc0001e001ff0000078007f
+e0003e001ff0000078007fe0003c001ff0000078003ff0007c001ff0000078003ff00078001ff000
+0078001ff800f8001ff0000078001ff800f0001ff0000078000ffc01f0001ff0000078000ffc01e0
+001ff00000780007fc03e0001ff00000780007fe03c0001ff00000780003fe03c0001ff000007800
+03ff0780001ff00000780003ff0780001ff00000780001ff8f00001ff00000780001ff8f00001ff0
+0000780000ffde00001ff00000780000ffde00001ff000007800007ffc00001ff000007800007ffc
+00001ff000007800003ffc00001ff000007800003ff800001ff000007800001ff800001ff0000078
+00001ff000001ff000007800000ff000001ff000007800000fe000001ff00000fc00000fe000003f
+f80000fc000007c000003ff80001fe000007c000007ffc0007ff800003800001ffff00fffffc0003
+80003ffffff8fffffc000100003ffffff8>} imagemask 
+  }
+  77 /G4d MSTT31c1f0 AddChar
+%%EndResource
+
+586 614 2116 (Most of the quota implementation is contained in the) 2116 SB
+
+%%BeginResource: font MSTT31c1f0
+/G56 [72.0 0.0 1.0 -1.0 69.0 67.0]
+/G56 {
+    68 68 true [1 0 0 -1 -1.0 67.0] {<ffffffe00000fffff0ffffffe00000fffff01fffff0000001fffc003fff800000007ff0001fff000
+000003fe0000fff000000001fc00007ff000000001f800007ff000000001f800003ff000000001f0
+00003ff000000001e000001ff800000003e000001ff800000003e000001ff800000003c000000ffc
+00000007c000000ffc0000000780000007fe0000000780000007fe0000000f80000003fe0000000f
+00000003ff0000000f00000003ff0000001f00000001ff8000001e00000001ff8000003e00000000
+ffc000003c00000000ffc000003c000000007fc000007c000000007fe0000078000000007fe00000
+f8000000003ff00000f8000000003ff00000f0000000001ff80001f0000000001ff80001e0000000
+001ff80001e0000000000ffc0003e0000000000ffc0003c00000000007fe0007c00000000007fe00
+07c00000000003ff0007800000000003ff000f800000000003ff000f000000000001ff800f000000
+000001ff801f000000000000ffc01e000000000000ffc03e0000000000007fe03c0000000000007f
+e03c0000000000007fe07c0000000000003ff0780000000000003ff0780000000000001ff8f80000
+000000001ff8f00000000000000ff9f00000000000000ffde00000000000000ffde0000000000000
+07ffe000000000000007ffc000000000000003ffc000000000000003ffc000000000000001ff8000
+000000000001ff8000000000000001ff0000000000000000ff0000000000000000ff000000000000
+00007e00000000000000007e00000000000000003e00000000000000003c00000000000000003c00
+000000000000001800000000>} imagemask 
+  }
+  86 /G56 MSTT31c1f0 AddChar
+/G46 [55.0 0.0 2.0 0.0 51.0 67.0]
+/G46 {
+    49 67 true [1 0 0 -1 -2.0 67.0] {<ffffffffffff00ffffffffffff0007ffffffffff0001ffc00001ff0000ffc000007f0000ffc00000
+1f00007fc000000f00007fc000000f80007fc000000780007fc000000780007fc000000380007fc0
+00000380007fc000000380007fc000000180007fc000000180007fc000000000007fc00000000000
+7fc000000000007fc000000000007fc000000000007fc000000000007fc000000000007fc0000300
+00007fc000030000007fc000030000007fc000070000007fc000070000007fc000070000007fc000
+0f0000007fc0001f0000007fc0007f0000007fffffff0000007fffffff0000007fffffff0000007f
+c0003f0000007fc0001f0000007fc0000f0000007fc000070000007fc000070000007fc000030000
+007fc000030000007fc000030000007fc000030000007fc000000000007fc000000000007fc00000
+0000007fc000000000007fc000000000007fc000000000007fc000000000007fc000000000007fc0
+00000000007fc000000000007fc000000000007fc000000000007fc000000000007fc00000000000
+7fc000000000007fc000000000007fc000000000007fc00000000000ffe00000000000ffe0000000
+0001fff00000000007fffc00000000ffffffe0000000ffffffe0000000>} imagemask 
+  }
+  70 /G46 MSTT31c1f0 AddChar
+%%EndResource
+
+4 3 SJ
+586 734 1082 (Virtual File System \(VFS\):) 1082 SB
+32 0 0 75 75 0 0 1 67 /MSTT31c1fd font
+623 873 38 (\226) 38 SB
+717 873 997 (management of quota descriptors) 997 SB
+623 981 38 (\226) 38 SB
+-3 1 SJ
+717 981 501 (quota operations) 501 SB
+32 0 0 75 75 0 0 0 60 /ZapfDingbats font
+473 1124 59 (u) 59 SB
+32 0 0 100 100 0 0 1 90 /MSTT31c1f0 font
+8 7 SJ
+586 1094 1845 (The file systems need a very minimal support:) 1845 SB
+32 0 0 75 75 0 0 1 67 /MSTT31c1fd font
+623 1233 38 (\226) 38 SB
+717 1233 1193 (when a block or inode is allocated, call ) 1193 SB
+32 0 0 75 75 0 0 0 64 /Courier-Bold /font9 ANSIFont font
+1910 1236 540 (alloc_block ) 540 SB
+32 0 0 75 75 0 0 1 67 /MSTT31c1fd font
+2450 1233 63 (or) 63 SB
+32 0 0 75 75 0 0 0 64 /Courier-Bold /font9 ANSIFont font
+717 1326 495 (alloc_inode) 495 SB
+32 0 0 75 75 0 0 1 67 /MSTT31c1fd font
+623 1431 38 (\226) 38 SB
+717 1431 1264 (when a block or inode is deallocated, call ) 1264 SB
+32 0 0 75 75 0 0 0 64 /Courier-Bold /font9 ANSIFont font
+1981 1434 495 (free_block ) 495 SB
+32 0 0 75 75 0 0 1 67 /MSTT31c1fd font
+2476 1431 63 (or) 63 SB
+32 0 0 75 75 0 0 0 64 /Courier-Bold /font9 ANSIFont font
+717 1525 450 (free_inode) 450 SB
+32 0 0 75 75 0 0 0 60 /ZapfDingbats font
+473 1665 59 (u) 59 SB
+32 0 0 100 100 0 0 1 90 /MSTT31c1f0 font
+6 7 SJ
+586 1635 2005 (Currently, this support is integrated in Ext2fs only) 2005 SB
+32 0 0 75 75 0 0 0 60 /ZapfDingbats font
+473 1809 59 (u) 59 SB
+32 0 0 100 100 0 0 1 90 /MSTT31c1f0 font
+6 9 SJ
+586 1779 1913 (But it would be easy to integrate quotas in other) 1913 SB
+586 1899 447 (filesystems) 447 SB
+EJ RS
+%%PageTrailer
+SS
+0 0 18 13 783 1169 300 SM
+255 255 255 fC
+/fm 256 def
+3250 2250 88 49 B
+1 F
+n
+1 lc
+1 lj
+0 0 0 pC
+6 17 SP
+gs 2857 2349 88 0 CB
+-2765 499 M 8559 0 1 PP
+S
+n
+gr
+32 0 0 58 58 0 0 1 53 /MSTT31c1bc font
+0 0 0 fC
+25 8 SJ
+153 2191 1278 (Third International Linux Conference - Berlin - May 96) 1278 SB
+2890 2191 58 (19) 58 SB
+32 0 0 167 167 0 0 0 150 /MSTT31c1c9 font
+256 284 177 (Su) 176 SB
+432 284 129 (m) 130 SB
+562 284 343 (mary) 342 SB
+32 0 0 75 75 0 0 0 60 /ZapfDingbats font
+473 644 59 (u) 59 SB
+32 0 0 100 100 0 0 1 90 /MSTT31c1f0 font
+8 8 SJ
+586 614 2122 (Finally, the quota patches have been integrated in the) 2122 SB
+2 1 SJ
+586 734 645 (standard kernel!) 645 SB
+32 0 0 75 75 0 0 0 60 /ZapfDingbats font
+473 908 59 (u) 59 SB
+32 0 0 100 100 0 0 1 90 /MSTT31c1f0 font
+
+%%BeginResource: font MSTT31c1f0
+/G30 [50.0 0.0 4.0 -1.0 46.0 68.0]
+/G30 {
+    42 69 true [1 0 0 -1 -4.0 68.0] {<00003f8000000001ffe000000007fff80000000fe0fc0000001f803f0000003f001f8000007e000f
+c00000fc000fc00001f80007e00003f80007f00003f00003f00007f00003f80007f00001fc000fe0
+0001fc000fe00001fc001fe00001fe001fe00000fe001fe00000ff003fc00000ff003fc00000ff00
+3fc00000ff007fc00000ff807fc000007f807fc000007f807fc000007f807fc000007f807f800000
+7fc0ff8000007fc0ff8000007fc0ff8000007fc0ff8000007fc0ff8000007fc0ff8000007fc0ff80
+00007fc0ff8000007fc0ff8000007fc0ff8000007fc0ff8000007fc0ff8000007fc0ff8000007fc0
+ff8000007fc0ff8000007fc0ff8000007f807f8000007f807f8000007f807f800000ff807fc00000
+ff807fc00000ff803fc00000ff003fc00000ff003fc00000ff003fc00000ff001fe00001fe001fe0
+0001fe000fe00001fc000fe00001fc0007f00003f80007f00003f80003f00003f00003f80007f000
+01f80007e00000fc000fc00000fc001fc000007e003f8000003f007e0000001fc1fc00000007fff8
+00000003ffe0000000007f000000>} imagemask 
+  }
+  48 /G30 MSTT31c1f0 AddChar
+%%EndResource
+
+5 9 SJ
+586 878 1928 (They will be part of the next stable version \(2.0\)) 1928 SB
+32 0 0 75 75 0 0 0 60 /ZapfDingbats font
+473 1051 59 (u) 59 SB
+32 0 0 100 100 0 0 1 90 /MSTT31c1f0 font
+
+%%BeginResource: font MSTT31c1f0
+/G50 [56.0 0.0 2.0 0.0 52.0 67.0]
+/G50 {
+    50 67 true [1 0 0 -1 -2.0 67.0] {<ffffffff000000fffffffff8000007fffffffe000001fff007ff800000ffc001ffe00000ffc0007f
+f000007fc0003ff800007fc0001ffc00007fc0000ffe00007fc00007ff00007fc00007ff00007fc0
+0003ff80007fc00003ff80007fc00003ff80007fc00003ffc0007fc00001ffc0007fc00001ffc000
+7fc00001ffc0007fc00001ffc0007fc00001ffc0007fc00001ffc0007fc00001ffc0007fc00001ff
+c0007fc00001ff80007fc00003ff80007fc00003ff80007fc00007ff00007fc00007ff00007fc000
+0ffe00007fc0000ffe00007fc0001ffc00007fc0007ff800007fc000fff000007ff803ffe000007f
+ffffff8000007ffffffe0000007fc1ffe00000007fc000000000007fc000000000007fc000000000
+007fc000000000007fc000000000007fc000000000007fc000000000007fc000000000007fc00000
+0000007fc000000000007fc000000000007fc000000000007fc000000000007fc000000000007fc0
+00000000007fc000000000007fc000000000007fc000000000007fc000000000007fc00000000000
+7fc000000000007fc000000000007fc000000000007fc00000000000ffe00000000000ffe0000000
+0001fff00000000007fffc00000000ffffffe0000000ffffffe0000000>} imagemask 
+  }
+  80 /G50 MSTT31c1f0 AddChar
+/G2a [50.0 0.0 7.0 29.0 41.0 70.0]
+/G2a {
+    34 41 true [1 0 0 -1 -7.0 70.0] {<0000e000000003f000000003f000000003f800000007f800000007f800000007f800000003f80000
+0003f000003c03f00f007e03f01f80ff81f03fc0ffc1e07fc0ffc1e0ffc07fe1e1ffc07ff0e3ff80
+1ff8c7fe0007fccff800007eff80000007f800000001e00000000ff80000007edf800007fccff800
+1ff8c7ff007ff0c3ff807fe1e1ff80ffc1e0ffc0ff81e07fc0ff03f03fc07e03f01f803c03f00f00
+0003f000000003f800000007f800000007f800000007f800000007f800000003f000000003f00000
+0000e00000>} imagemask 
+  }
+  42 /G2a MSTT31c1f0 AddChar
+%%EndResource
+
+3 9 SJ
+586 1021 2321 (The API and tools are compatible with *BSD \(the utilities) 2321 SB
+2 2 SJ
+586 1141 812 (come from 4.4BSD\)) 812 SB
+32 0 0 75 75 0 0 0 60 /ZapfDingbats font
+473 1315 59 (u) 59 SB
+32 0 0 100 100 0 0 1 90 /MSTT31c1f0 font
+7 10 SJ
+586 1285 2232 (Most of the quota management is done in the VFS layer) 2232 SB
+EJ RS
+%%PageTrailer
+%%Trailer
+SVDoc restore
+end
+% TrueType font name key:
+%    MSTT31c1bc = 0c27DTimes New RomanF0000003a000001900000
+%    MSTT31c1c9 = 0c27DTimes New RomanF00000000000001900000
+%    MSTT31c1d6 = 0c27DTimes New RomanF000000000000019000ff
+%    MSTT31c1e3 = 0c27DMonotype SortsF00000058000001900000
+%    MSTT31c1f0 = 0c27DTimes New RomanF00000064000001900000
+%    MSTT31c1fd = 0c27DTimes New RomanF0000004b000001900000
+%    MSTT31c20a = 0c27DMonotype SortsF0000004b000001900000
+%    MSTT31c217 = 0c27DTimes New RomanF00000043000001900000
+%    MSTT31c22e = 0c27DMonotype SortsF0000003f000001900000
+%%DocumentSuppliedResources: procset Win35Dict 3 1
+%%+ font MSTT31c1bc
+%%+ font MSTT31c1c9
+%%+ font MSTT31c1d6
+%%+ font MSTT31c1f0
+%%+ font MSTT31c1fd
+
+%%DocumentNeededResources: font Courier-Bold
+%%+ font ZapfDingbats
+
+%%EOF
+grestore
diff --git a/doc/quotas.ms b/doc/quotas.ms
new file mode 100644 (file)
index 0000000..10e200c
--- /dev/null
@@ -0,0 +1,318 @@
+.\" Copyright (c) 1983 The Regents of the University of California.
+.\" 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.
+.\" 3. All advertising materials mentioning features or use of this software
+.\"    must display the following acknowledgement:
+.\"    This product includes software developed by the University of
+.\"    California, Berkeley and its contributors.
+.\" 4. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS 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 REGENTS 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.
+.\"
+.\"    @(#)quotas.ms   6.3 (Berkeley) 4/17/91
+.\"
+.EH 'SMM:4-%''Disc Quotas in a \s-2UNIX\s+2 Environment'
+.OH 'Disc Quotas in a \s-2UNIX\s+2 Environment''SMM:4-%'
+.ND 5th July, 1983
+.TL
+Disc Quotas in a \s-2UNIX\s+2\s-3\u*\d\s0 Environment
+.FS
+* UNIX is a trademark of Bell Laboratories.
+.FE
+.AU
+Robert Elz
+.AI
+Department of Computer Science
+University of Melbourne,
+Parkville,
+Victoria,
+Australia.
+.AB
+.PP
+In most computing environments, disc space is not
+infinite.
+The disc quota system provides a mechanism
+to control usage of disc space, on an
+individual basis.
+.PP
+Quotas may be set for each individual user, on any, or
+all filesystems.
+.PP
+The quota system will warn users when they
+exceed their allotted limit, but allow some
+extra space for current work.
+Repeatedly remaining over quota at logout,
+will cause a fatal over quota condition eventually.
+.PP
+The quota system is an optional part of
+\s-2VMUNIX\s0 that may be included when the
+system is configured.
+.AE
+.NH 1
+Users' view of disc quotas
+.PP
+To most users, disc quotas will either be of no concern,
+or a fact of life that cannot be avoided.
+The
+\fIquota\fP\|(1)
+command will provide information on any disc quotas
+that may have been imposed upon a user.
+.PP
+There are two individual possible quotas that may be
+imposed, usually if one is, both will be.
+A limit can be set on the amount of space a user
+can occupy, and there may be a limit on the number
+of files (inodes) he can own.
+.PP
+.I Quota
+provides information on the quotas that have
+been set by the system administrators, in each
+of these areas, and current usage.
+.PP
+There are four numbers for each limit, the current
+usage, soft limit (quota), hard limit, and number
+of remaining login warnings.
+The soft limit is the number of 1K blocks (or files)
+that the user is expected to remain below.
+Each time the user's usage goes past this limit,
+he will be warned.
+The hard limit cannot be exceeded.
+If a user's usage reaches this number, further
+requests for space (or attempts to create a file)
+will fail with an EDQUOT error, and the first time
+this occurs, a message will be written to the user's
+terminal.
+Only one message will be output, until space occupied
+is reduced below the limit, and reaches it again,
+in order to avoid continual noise from those
+programs that ignore write errors.
+.PP
+Whenever a user logs in with a usage greater than
+his soft limit, he will be warned, and his login
+warning count decremented.
+When he logs in under quota, the counter is reset
+to its maximum value (which is a system configuration
+parameter, that is typically 3).
+If the warning count should ever reach zero (caused
+by three successive logins over quota), the
+particular limit that has been exceeded will be treated
+as if the hard limit has been reached, and no
+more resources will be allocated to the user.
+The \fBonly\fP way to reset this condition is
+to reduce usage below quota, then log in again.
+.NH 2 
+Surviving when quota limit is reached
+.PP
+In most cases, the only way to recover from over
+quota conditions, is to abort whatever activity was in progress
+on the filesystem that has reached its limit, remove
+sufficient files to bring the limit back below quota,
+and retry the failed program.
+.PP
+However, if you are in the editor and a write fails
+because of an over quota situation, that is not
+a suitable course of action, as it is most likely
+that initially attempting to write the file
+will have truncated its previous contents, so should
+the editor be aborted without correctly writing the
+file not only will the recent changes be lost, but
+possibly much, or even all, of the data
+that previously existed.
+.PP
+There are several possible safe exits for a user
+caught in this situation.
+He may use the editor \fB!\fP shell escape command to
+examine his file space, and remove surplus files.
+Alternatively, using \fIcsh\fP, he may suspend the
+editor, remove some files, then resume it.
+A third possibility, is to write the file to
+some other filesystem (perhaps to a file on /tmp)
+where the user's quota has not been exceeded.
+Then after rectifying the quota situation,
+the file can be moved back to the filesystem
+it belongs on.
+.NH 1
+Administering the quota system
+.PP
+To set up and establish the disc quota system,
+there are several steps necessary to be performed
+by the system administrator.
+.PP
+First, the system must be configured to include
+the disc quota sub-system.
+This is done by including the line:
+.DS
+options   QUOTA
+.DE
+in the system configuration file, then running
+\fIconfig\fP\|(8)
+followed by a system configuration\s-3\u*\d\s0.
+.FS
+* See also the document ``Building 4.2BSD UNIX Systems with Config''.
+.FE
+.PP
+Second, a decision as to what filesystems need to have
+quotas applied needs to be made.
+Usually, only filesystems that house users' home directories,
+or other user files, will need to be subjected to
+the quota system, though it may also prove useful to
+also include \fB/usr\fR.
+If possible, \fB/tmp\fP should usually be free of quotas.
+.PP
+Having decided on which filesystems quotas need to be
+set upon, the administrator should then allocate the
+available space amongst the competing needs. How this
+should be done is (way) beyond the scope of this document.
+.PP
+Then, the
+\fIedquota\fP\|(8)
+command can be used to actually set the limits desired upon
+each user. Where a number of users are to be given the
+same quotas (a common occurrence) the \fB\-p\fP switch
+to edquota will allow this to be easily accomplished.
+.PP
+Once the quotas are set, ready to operate, the system
+must be informed to enforce quotas on the desired filesystems.
+This is accomplished with the
+\fIquotaon\fP\|(8)
+command.
+.I Quotaon
+will either enable quotas for a particular filesystem, or
+with the \fB\-a\fP switch, will enable quotas for each
+filesystem indicated in \fB/etc/fstab\fP as using quotas.
+See
+\fIfstab\fP\|(5)
+for details.
+Most sites using the quota system, will include the
+line
+.DS C
+/etc/quotaon -a
+.DE
+in \fB/etc/rc.local\fP.
+.PP
+Should quotas need to be disabled, the
+\fIquotaoff\fP(8)
+command will do that, however, should the filesystem be
+about to be dismounted, the
+\fIumount\fP\|(8)
+command will disable quotas immediately before the
+filesystem is unmounted.
+This is actually an effect of the
+\fIumount\fP\|(2)
+system call, and it guarantees that the quota system
+will not be disabled if the umount would fail
+because the filesystem is not idle.
+.PP
+Periodically (certainly after each reboot, and when quotas
+are first enabled for a filesystem), the records retained
+in the quota file should be checked for consistency with
+the actual number of blocks and files allocated to
+the user.
+The
+\fIquotacheck\fP\|(8)
+command can be used to accomplish this.
+It is not necessary to dismount the filesystem, or disable
+the quota system to run this command, though on
+active filesystems inaccurate results may occur.
+This does no real harm in most cases, another run of
+.I quotacheck
+when the filesystem is idle will certainly correct any inaccuracy.
+.PP
+The super-user may use the
+\fIquota\fP\|(1)
+command to examine the usage and quotas of any user, and
+the
+\fIrepquota\fP\|(8)
+command may be used to check the usages and limits for
+all users on a filesystem.
+.NH 1
+Some implementation detail.
+.PP
+Disc quota usage and information is stored in a file on the
+filesystem that the quotas are to be applied to.
+Conventionally, this file is \fBquotas\fR in the root of
+the filesystem.
+While this name is not known to the system in any way,
+several of the user level utilities "know" it, and
+choosing any other name would not be wise.
+.PP
+The data in the file comprises an array of structures, indexed
+by uid, one structure for each user on the system (whether
+the user has a quota on this filesystem or not).
+If the uid space is sparse, then the file may have holes
+in it, which would be lost by copying, so it is best to
+avoid this.
+.PP
+The system is informed of the existence of the quota
+file by the
+\fIsetquota\fP\|(2)
+system call.
+It then reads the quota entries for each user currently
+active, then for any files open owned by users who
+are not currently active.
+Each subsequent open of a file on the filesystem, will
+be accompanied by a pairing with its quota information.
+In most cases this information will be retained in core,
+either because the user who owns the file is running some
+process, because other files are open owned by the same
+user, or because some file (perhaps this one) was recently
+accessed.
+In memory, the quota information is kept hashed by user-id
+and filesystem, and retained in an LRU chain so recently
+released data can be easily reclaimed.
+Information about those users whose last process has
+recently terminated is also retained in this way.
+.PP
+Each time a block is accessed or released, and each time an inode
+is allocated or freed, the quota system gets told
+about it, and in the case of allocations, gets the
+opportunity to object.
+.PP
+Measurements have shown
+that the quota code uses a very small percentage of the system
+cpu time consumed in writing a new block to disc.
+.NH 1
+Acknowledgments
+.PP
+The current disc quota system is loosely based upon a very
+early scheme implemented at the University of New South
+Wales, and Sydney University in the mid 70's. That system
+implemented a single combined limit for both files and blocks
+on all filesystems.
+.PP
+A later system was implemented at the University of Melbourne
+by the author, but was not kept highly accurately, eg:
+chown's (etc) did not affect quotas, nor did i/o to a file
+other than one owned by the instigator.
+.PP
+The current system has been running (with only minor modifications)
+since January 82 at Melbourne.
+It is actually just a small part of a much broader resource
+control scheme, which is capable of controlling almost
+anything that is usually uncontrolled in unix. The rest
+of this is, as yet, still in a state where it is far too
+subject to change to be considered for distribution.
+.PP
+For the 4.2BSD release, much work has been done to clean
+up and sanely incorporate the quota code by Sam Leffler and
+Kirk McKusick at The University of California at Berkeley.
diff --git a/doc/quotas.preformated b/doc/quotas.preformated
new file mode 100644 (file)
index 0000000..e008aeb
--- /dev/null
@@ -0,0 +1,330 @@
+
+
+
+
+
+
+
+
+
+                       D\bDi\bis\bsc\bc Q\bQu\buo\bot\bta\bas\bs i\bin\bn a\ba U\bUN\bNI\bIX\bX*\b* E\bEn\bnv\bvi\bir\bro\bon\bnm\bme\ben\bnt\bt
+
+                                   _\bR_\bo_\bb_\be_\br_\bt _\bE_\bl_\bz
+                         Department of Computer Science
+                            University of Melbourne,
+                                   Parkville,
+                                   Victoria,
+                                   Australia.
+
+
+                                    _\bA_\bB_\bS_\bT_\bR_\bA_\bC_\bT
+
+
+
+                    In most computing environments, disc space is
+               not infinite.  The disc quota  system  provides  a
+               mechanism  to  control  usage of disc space, on an
+               individual basis.
+
+                    Quotas may be set for each  individual  user,
+               on any, or all filesystems.
+
+                    The  quota  system  will warn users when they
+               exceed their allotted limit, but allow some  extra
+               space for current work.  Repeatedly remaining over
+               quota at logout, will cause  a  fatal  over  quota
+               condition eventually.
+
+                    The  quota system is an optional part of VMU-
+               NIX that may be included when the system  is  con-
+               figured.
+
+
+          1\b1.\b.  U\bUs\bse\ber\brs\bs'\b' v\bvi\bie\bew\bw o\bof\bf d\bdi\bis\bsc\bc q\bqu\buo\bot\bta\bas\bs
+
+               To  most  users,  disc quotas will either be of no con-
+          cern, or a  fact  of  life  that  cannot  be  avoided.   The
+          _\bq_\bu_\bo_\bt_\ba(1) command will provide information on any disc quotas
+          that may have been imposed upon a user.
+
+               There are two individual possible quotas  that  may  be
+          imposed,  usually  if  one is, both will be.  A limit can be
+          set on the amount of space a user can occupy, and there  may
+          be a limit on the number of files (inodes) he can own.
+
+               _\bQ_\bu_\bo_\bt_\ba provides information on the quotas that have been
+          set by the system administrators, in each  of  these  areas,
+          and current usage.
+
+          -----------
+          * UNIX is a trademark of Bell Laboratories.
+
+
+
+
+
+
+
+
+
+          SMM:4-2                    Disc Quotas in a UNIX Environment
+
+
+               There  are  four  numbers  for  each limit, the current
+          usage, soft limit (quota), hard limit, and number of remain-
+          ing  login  warnings.   The  soft  limit is the number of 1K
+          blocks (or files) that the user is expected to remain below.
+          Each  time the user's usage goes past this limit, he will be
+          warned.  The hard limit cannot be  exceeded.   If  a  user's
+          usage  reaches  this  number, further requests for space (or
+          attempts to create a file) will fail with an  EDQUOT  error,
+          and the first time this occurs, a message will be written to
+          the user's terminal.  Only one message will be output, until
+          space  occupied  is  reduced below the limit, and reaches it
+          again, in order to avoid continual noise from those programs
+          that ignore write errors.
+
+               Whenever  a  user logs in with a usage greater than his
+          soft limit, he will be warned, and his login  warning  count
+          decremented.   When  he  logs in under quota, the counter is
+          reset to its maximum value (which is a system  configuration
+          parameter,  that  is  typically  3).   If  the warning count
+          should ever reach zero (caused by  three  successive  logins
+          over  quota),  the  particular  limit that has been exceeded
+          will be treated as if the hard limit has been  reached,  and
+          no  more  resources will be allocated to the user.  The o\bon\bnl\bly\by
+          way to reset this condition is to reduce usage below  quota,
+          then log in again.
+
+          1\b1.\b.1\b1.\b.  S\bSu\bur\brv\bvi\biv\bvi\bin\bng\bg w\bwh\bhe\ben\bn q\bqu\buo\bot\bta\ba l\bli\bim\bmi\bit\bt i\bis\bs r\bre\bea\bac\bch\bhe\bed\bd
+
+               In  most cases, the only way to recover from over quota
+          conditions, is to abort whatever activity was in progress on
+          the filesystem that has reached its limit, remove sufficient
+          files to bring the limit back below  quota,  and  retry  the
+          failed program.
+
+               However,  if  you  are  in the editor and a write fails
+          because of an over quota situation, that is not  a  suitable
+          course  of  action,  as  it  is  most  likely that initially
+          attempting to write the file will have truncated its  previ-
+          ous  contents,  so should the editor be aborted without cor-
+          rectly writing the file not only will the recent changes  be
+          lost,  but possibly much, or even all, of the data that pre-
+          viously existed.
+
+               There are several possible safe exits for a user caught
+          in  this  situation.   He  may use the editor !\b! shell escape
+          command to examine his file space, and remove surplus files.
+          Alternatively,  using _\bc_\bs_\bh, he may suspend the editor, remove
+          some files, then resume it.   A  third  possibility,  is  to
+          write  the  file to some other filesystem (perhaps to a file
+          on /tmp) where the user's quota has not been exceeded.  Then
+          after  rectifying the quota situation, the file can be moved
+          back to the filesystem it belongs on.
+
+
+
+
+
+
+
+
+
+
+
+          Disc Quotas in a UNIX Environment                    SMM:4-3
+
+
+          2\b2.\b.  A\bAd\bdm\bmi\bin\bni\bis\bst\bte\ber\bri\bin\bng\bg t\bth\bhe\be q\bqu\buo\bot\bta\ba s\bsy\bys\bst\bte\bem\bm
+
+               To set up and establish the disc  quota  system,  there
+          are  several  steps  necessary to be performed by the system
+          administrator.
+
+               First, the system must be  configured  to  include  the
+          disc quota sub-system.  This is done by including the line:
+
+               options   QUOTA
+
+          in  the  system  configuration  file, then running _\bc_\bo_\bn_\bf_\bi_\bg(8)
+          followed by a system configuration*.
+
+               Second,  a decision as to what filesystems need to have
+          quotas applied needs to be made.  Usually, only  filesystems
+          that  house  users'  home  directories, or other user files,
+          will need to be subjected to the quota system, though it may
+          also  prove  useful to also include /\b/u\bus\bsr\br.  If possible, /\b/t\btm\bmp\bp
+          should usually be free of quotas.
+
+               Having decided on which filesystems quotas need  to  be
+          set  upon, the administrator should then allocate the avail-
+          able space amongst the competing needs. How this  should  be
+          done is (way) beyond the scope of this document.
+
+               Then,  the  _\be_\bd_\bq_\bu_\bo_\bt_\ba(8)  command can be used to actually
+          set the limits desired upon each user.  Where  a  number  of
+          users  are to be given the same quotas (a common occurrence)
+          the -\b-p\bp switch to edquota will allow this to be easily accom-
+          plished.
+
+               Once  the  quotas are set, ready to operate, the system
+          must be informed to enforce quotas on the  desired  filesys-
+          tems.   This  is  accomplished  with the _\bq_\bu_\bo_\bt_\ba_\bo_\bn(8) command.
+          _\bQ_\bu_\bo_\bt_\ba_\bo_\bn will either enable quotas for a particular  filesys-
+          tem,  or  with  the  -\b-a\ba  switch, will enable quotas for each
+          filesystem indicated in /\b/e\bet\btc\bc/\b/f\bfs\bst\bta\bab\bb  as  using  quotas.   See
+          _\bf_\bs_\bt_\ba_\bb(5)  for  details.   Most sites using the quota system,
+          will include the line
+
+                                /etc/quotaon -a
+
+          in /\b/e\bet\btc\bc/\b/r\brc\bc.\b.l\blo\boc\bca\bal\bl.
+
+               Should quotas need to be disabled, the _\bq_\bu_\bo_\bt_\ba_\bo_\bf_\bf(8) com-
+          mand  will  do that, however, should the filesystem be about
+          to be dismounted, the _\bu_\bm_\bo_\bu_\bn_\bt(8) command will disable  quotas
+          immediately  before  the  filesystem  is unmounted.  This is
+          actually an effect of the  _\bu_\bm_\bo_\bu_\bn_\bt(2)  system  call,  and  it
+          guarantees that the quota system will not be disabled if the
+          -----------
+          * See also the  document  ``Building  4.2BSD  UNIX
+          Systems with Config''.
+
+
+
+
+
+
+
+
+
+          SMM:4-4                    Disc Quotas in a UNIX Environment
+
+
+          umount would fail because the filesystem is not idle.
+
+               Periodically (certainly after  each  reboot,  and  when
+          quotas  are  first  enabled  for  a filesystem), the records
+          retained in the quota file should be checked for consistency
+          with  the actual number of blocks and files allocated to the
+          user.  The _\bq_\bu_\bo_\bt_\ba_\bc_\bh_\be_\bc_\bk(8) command can be used  to  accomplish
+          this.   It  is  not necessary to dismount the filesystem, or
+          disable the quota system to  run  this  command,  though  on
+          active  filesystems inaccurate results may occur.  This does
+          no real harm in most cases, another run of  _\bq_\bu_\bo_\bt_\ba_\bc_\bh_\be_\bc_\bk  when
+          the  filesystem  is  idle will certainly correct any inaccu-
+          racy.
+
+               The super-user may use the _\bq_\bu_\bo_\bt_\ba(1) command to  examine
+          the  usage  and quotas of any user, and the _\br_\be_\bp_\bq_\bu_\bo_\bt_\ba(8) com-
+          mand may be used to check the  usages  and  limits  for  all
+          users on a filesystem.
+
+          3\b3.\b.  S\bSo\bom\bme\be i\bim\bmp\bpl\ble\bem\bme\ben\bnt\bta\bat\bti\bio\bon\bn d\bde\bet\bta\bai\bil\bl.\b.
+
+               Disc quota usage and information is stored in a file on
+          the filesystem that the quotas are to be applied  to.   Con-
+          ventionally, this file is q\bqu\buo\bot\bta\bas\bs in the root of the filesys-
+          tem.  While this name is not known to the system in any way,
+          several  of the user level utilities "know" it, and choosing
+          any other name would not be wise.
+
+               The data in the file comprises an array of  structures,
+          indexed  by  uid,  one structure for each user on the system
+          (whether the user has a quota on this  filesystem  or  not).
+          If  the uid space is sparse, then the file may have holes in
+          it, which would be lost by copying, so it is best  to  avoid
+          this.
+
+               The  system  is  informed of the existence of the quota
+          file by the _\bs_\be_\bt_\bq_\bu_\bo_\bt_\ba(2) system  call.   It  then  reads  the
+          quota  entries  for each user currently active, then for any
+          files open owned by users  who  are  not  currently  active.
+          Each  subsequent  open  of a file on the filesystem, will be
+          accompanied by a pairing with  its  quota  information.   In
+          most cases this information will be retained in core, either
+          because the user who owns the file is running some  process,
+          because  other  files  are  open  owned by the same user, or
+          because some file (perhaps this one) was recently  accessed.
+          In  memory,  the quota information is kept hashed by user-id
+          and filesystem, and retained in an  LRU  chain  so  recently
+          released  data  can  be easily reclaimed.  Information about
+          those users whose last process has  recently  terminated  is
+          also retained in this way.
+
+               Each  time  a  block  is accessed or released, and each
+          time an inode is allocated or freed, the quota  system  gets
+          told  about  it,  and  in  the case of allocations, gets the
+
+
+
+
+
+
+
+
+
+          Disc Quotas in a UNIX Environment                    SMM:4-5
+
+
+          opportunity to object.
+
+               Measurements have shown that the quota code uses a very
+          small  percentage of the system cpu time consumed in writing
+          a new block to disc.
+
+          4\b4.\b.  A\bAc\bck\bkn\bno\bow\bwl\ble\bed\bdg\bgm\bme\ben\bnt\bts\bs
+
+               The current disc quota system is loosely based  upon  a
+          very early scheme implemented at the University of New South
+          Wales, and Sydney University in the mid  70's.  That  system
+          implemented  a  single  combined  limit  for  both files and
+          blocks on all filesystems.
+
+               A later system was implemented  at  the  University  of
+          Melbourne by the author, but was not kept highly accurately,
+          eg: chown's (etc) did not affect quotas, nor did  i/o  to  a
+          file other than one owned by the instigator.
+
+               The  current  system  has been running (with only minor
+          modifications) since January 82 at Melbourne.  It  is  actu-
+          ally  just  a  small part of a much broader resource control
+          scheme, which is capable of controlling almost anything that
+          is  usually  uncontrolled  in  unix. The rest of this is, as
+          yet, still in a state where it is far too subject to  change
+          to be considered for distribution.
+
+               For  the  4.2BSD  release,  much  work has been done to
+          clean up and sanely incorporate the quota code by  Sam  Lef-
+          fler  and  Kirk  McKusick at The University of California at
+          Berkeley.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dqblk_rpc.h b/dqblk_rpc.h
new file mode 100644 (file)
index 0000000..55d7d65
--- /dev/null
@@ -0,0 +1,20 @@
+/*
+ *     Headerfile for rpc quotafile format
+ */
+
+#ifndef GUARD_DQBLK_RPC_H
+#define GUARD_DQBLK_RPC_H
+
+/* Values used for communication through network */
+#define Q_RPC_GETQUOTA 0x0300  /* get limits and usage */
+#define Q_RPC_SETQUOTA 0x0400  /* set limits and usage */
+#define Q_RPC_SETUSE   0x0500  /* set usage */
+#define Q_RPC_SETQLIM  0x0700  /* set limits */
+
+#define RPC_DQBLK_SIZE_BITS 10
+#define RPC_DQBLK_SIZE (1 << RPC_DQBLK_SIZE_BITS)
+
+/* Operations above this format */
+extern struct quotafile_ops quotafile_ops_rpc;
+
+#endif
diff --git a/dqblk_v1.h b/dqblk_v1.h
new file mode 100644 (file)
index 0000000..7113261
--- /dev/null
@@ -0,0 +1,21 @@
+/*
+ *     Headerfile for old quotafile format
+ */
+
+#ifndef GUARD_DQBLK_V1_H
+#define GUARD_DQBLK_V1_H
+
+/* Values of quota calls */
+#define Q_V1_RSQUASH   0x1000
+#define Q_V1_GETQUOTA  0x300
+#define Q_V1_SETQUOTA  0x400
+#define Q_V1_SETUSE    0x500
+#define Q_V1_SETQLIM   0x700
+#define Q_V1_GETSTATS  0x800
+
+struct quotafile_ops;          /* Will be defined later in quotaio.h */
+
+/* Operations above this format */
+extern struct quotafile_ops quotafile_ops_1;
+
+#endif
diff --git a/dqblk_v2.h b/dqblk_v2.h
new file mode 100644 (file)
index 0000000..c06168d
--- /dev/null
@@ -0,0 +1,40 @@
+/*
+ *
+ *     Header file for disk format of new quotafile format
+ *
+ */
+
+#ifndef GUARD_DQBLK_V2_H
+#define GUARD_DQBLK_V2_H
+
+#include <sys/types.h>
+#include "quota_tree.h"
+
+#define Q_V2_GETQUOTA  0x0D00  /* Get limits and usage */
+#define Q_V2_SETQUOTA  0x0E00  /* Set limits and usage */
+#define Q_V2_SETUSE    0x0F00  /* Set only usage */
+#define Q_V2_SETQLIM   0x0700  /* Set only limits */
+#define Q_V2_GETINFO   0x0900  /* Get information about quota */
+#define Q_V2_SETINFO   0x0A00  /* Set information about quota */
+#define Q_V2_SETGRACE  0x0B00  /* Set just grace times in quotafile information */
+#define Q_V2_SETFLAGS  0x0C00  /* Set just flags in quotafile information */
+#define Q_V2_GETSTATS  0x1100  /* get collected stats (before proc was used) */
+
+/* Structure for format specific information */
+struct v2_mem_dqinfo {
+       struct qtree_mem_dqinfo dqi_qtree;
+       uint dqi_flags;         /* Flags set in quotafile */
+       uint dqi_used_entries;  /* Number of entries in file - updated by scan_dquots */
+       uint dqi_data_blocks;   /* Number of data blocks in file - updated by scan_dquots */
+};
+
+struct v2_mem_dqblk {
+       loff_t dqb_off;         /* Offset of dquot in file */
+};
+
+struct quotafile_ops;          /* Will be defined later in quotaio.h */
+
+/* Operations above this format */
+extern struct quotafile_ops quotafile_ops_2;
+
+#endif
diff --git a/dqblk_xfs.h b/dqblk_xfs.h
new file mode 100644 (file)
index 0000000..415e646
--- /dev/null
@@ -0,0 +1,25 @@
+/*
+ *     Headerfile for XFS quota format
+ */
+
+#ifndef GUARD_DQBLK_XFS_H
+#define GUARD_DQBLK_XFS_H
+
+#include "quotaio_xfs.h"
+
+#define Q_XFS_QUOTAON  Q_XQUOTAON
+#define Q_XFS_QUOTAOFF Q_XQUOTAOFF
+#define Q_XFS_GETQUOTA Q_XGETQUOTA
+#define Q_XFS_SETQLIM  Q_XSETQLIM
+#define Q_XFS_GETQSTAT Q_XGETQSTAT
+#define Q_XFS_QUOTARM  Q_XQUOTARM
+
+#define xfs_mem_dqinfo fs_quota_stat
+#define xfs_kern_dqblk fs_disk_quota
+
+struct quotafile_ops;          /* Will be defined later in quotaio.h */
+
+/* Operations above this format */
+extern struct quotafile_ops quotafile_ops_xfs;
+
+#endif
diff --git a/edquota.8 b/edquota.8
new file mode 100644 (file)
index 0000000..7ade64a
--- /dev/null
+++ b/edquota.8
@@ -0,0 +1,170 @@
+.TH EDQUOTA 8
+.SH NAME
+edquota \- edit user quotas
+.SH SYNOPSIS
+.B edquota
+[
+.B \-p
+.I protoname
+] [
+.BR \-u \ |
+.B \-g
+] [
+.B \-rm
+] [
+.B \-F
+.I format-name
+] [
+.B \-f
+.I filesystem
+]
+.IR username .\|.\|.
+.LP
+.B edquota
+[
+.BR \-u \ |
+.B \-g
+] [
+.B \-F
+.I format-name
+] [
+.B \-f
+.I filesystem
+]
+.B \-t
+.LP
+.B edquota
+[
+.BR \-u \ |
+.B \-g
+] [
+.B \-F
+.I format-name
+] [
+.B \-f
+.I filesystem
+]
+.B \-T
+.IR username \ |
+.IR groupname .\|.\|.
+.SH DESCRIPTION
+.IX  "edquota command"  ""  "\fLedquota\fP \(em edit user quotas"
+.IX  edit "user quotas \(em \fLedquota\fP"
+.IX  "user quotas"  "edquota command"  ""  "\fLedquota\fP \(em edit user quotas"
+.IX  "disk quotas"  "edquota command"  ""  "\fLedquota\fP \(em edit user quotas"
+.IX  "quotas"  "edquota command"  ""  "\fLedquota\fP \(em edit user quotas"
+.IX  "filesystem"  "edquota command"  ""  "\fLedquota\fP \(em edit user quotas"
+.B edquota
+is a quota editor.  One or more users or groups may be specified on the command
+line. If a number is given in the place of user/group name it is treated as
+an UID/GID. For each user or group a temporary file is created with an
+.SM ASCII
+representation of the current disk quotas for that user or group and an editor
+is then invoked on the file.  The quotas may then be modified, new
+quotas added, etc.
+Setting a quota to zero indicates that no quota should be imposed.
+.PP
+Users are permitted to exceed their soft limits for a grace period that
+may be specified per filesystem.  Once the grace period has expired, the
+soft limit is enforced as a hard limit.
+.PP
+The current usage information in the file is for informational purposes;
+only the hard and soft limits can be changed.
+.PP
+Upon leaving the editor,
+.B edquota
+reads the temporary file and modifies the binary quota files to reflect
+the changes made.
+.LP
+The editor invoked is
+.BR vi (1)
+unless either the
+.SB EDITOR
+or the
+.SB VISUAL
+environment variable specifies otherwise.
+.LP
+Only the super-user may edit quotas.
+.SH OPTIONS
+.TP
+.B -r, --remote
+Edit also non-local quota use rpc.rquotad on remote server to set quota.
+This option is available only if quota tools were compiled with enabled
+support for setting quotas over RPC.
+The
+.B -n
+option is equivalent, and is maintained for backward compatibility.
+.TP
+.B -m, --no-mixed-pathnames
+Currently, pathnames of NFSv4 mountpoints are sent without leading slash in the path.
+.BR rpc.rquotad
+uses this to recognize NFSv4 mounts and properly prepend pseudoroot of NFS filesystem
+to the path. If you specify this option, 
+.BR setquota 
+will always send paths with a trailing slash. This can be useful for legacy reasons but
+be aware that quota over RPC will stop working if you are using new
+.BR rpc.rquotad .
+.TP
+.B -u, --user
+Edit the user quota. This is the default.
+.TP
+.B -g, --group
+Edit the group quota.
+.TP
+.B -p, --prototype=\f2protoname\f1
+Duplicate the quotas of the prototypical user
+specified for each user specified.  This is the normal
+mechanism used to initialize quotas for groups of users.
+.TP
+.B -F, --format=\f2format-name\f1
+Edit quota for specified format (ie. don't perform format autodetection).
+Possible format names are:
+.B vfsold
+Original quota format with 16-bit UIDs / GIDs,
+.B vfsv0
+Quota format with 32-bit UIDs / GIDs, 64-bit space usage, 32-bit inode usage and limits,
+.B vfsv1
+Quota format with 64-bit quota limits and usage,
+.B rpc
+(quota over NFS),
+.B xfs
+(quota on XFS filesystem)
+.TP
+.B \-f, --filesystem \f2filesystem\f1
+Perform specified operations only for given filesystem (default is to perform
+operations for all filesystems with quota).
+.TP
+.B \-t, --edit-period
+Edit the soft time limits for each filesystem.
+In old quota format if the time limits are zero, the default time limits in
+.B <linux/quota.h>
+are used. In new quota format time limits must be specified (there is no default
+value set in kernel). Time units of 'seconds', 'minutes', 'hours', and 'days'
+are understood. Time limits are printed in the greatest possible time unit such that
+the value is greater than or equal to one.
+.TP
+.B \-T, --edit-times
+Edit time for the user/group when softlimit is enforced. Possible values
+are 'unset' or number and unit. Units are the same as in
+.B \-t
+option.
+.SH FILES
+.PD 0
+.TP 20
+.BR aquota.user " or " aquota.group
+quota file at the filesystem root (version 2 quota, non-XFS filesystems)
+.TP
+.BR quota.user " or " quota.group
+quota file at the filesystem root (version 1 quota, non-XFS filesystems)
+.TP
+.B /etc/mtab
+mounted filesystems table
+.PD
+.SH SEE ALSO
+.BR quota (1),
+.BR vi (1),
+.BR quotactl (2),
+.BR quotacheck (8),
+.BR quotaon (8),
+.BR repquota (8),
+.BR setquota (8)
diff --git a/edquota.c b/edquota.c
new file mode 100644 (file)
index 0000000..b340d13
--- /dev/null
+++ b/edquota.c
@@ -0,0 +1,351 @@
+/*
+ * Copyright (c) 1980, 1990 Regents of the University of California. All
+ * rights reserved.
+ * 
+ * This code is derived from software contributed to Berkeley by Robert Elz at
+ * The University of Melbourne.
+ * 
+ * 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. 3. All advertising
+ * materials mentioning features or use of this software must display the
+ * following acknowledgement: This product includes software developed by the
+ * University of California, Berkeley and its contributors. 4. Neither the
+ * name of the University nor the names of its contributors may be used to
+ * endorse or promote products derived from this software without specific
+ * prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS 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 REGENTS 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 "config.h"
+
+/*
+ * Disk quota editor.
+ */
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <errno.h>
+#include <pwd.h>
+#include <grp.h>
+#include <ctype.h>
+#include <stdio.h>
+#include <string.h>
+#include <signal.h>
+#include <unistd.h>
+#include <paths.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <getopt.h>
+
+#include "pot.h"
+#include "quotaops.h"
+#include "quotasys.h"
+#include "quotaio.h"
+#include "common.h"
+
+#define FL_EDIT_PERIOD 1
+#define FL_EDIT_TIMES 2
+#define FL_REMOTE 4
+#define FL_NUMNAMES 8
+#define FL_NO_MIXED_PATHS 16
+
+char *progname;
+
+int flags, quotatype;
+int fmt = -1;
+char *protoname;
+char *dirname;
+
+void usage(void)
+{
+#if defined(RPC_SETQUOTA)
+       char *rpcflag = "[-rm] ";
+#else
+       char *rpcflag = "";
+#endif
+       errstr(_("Usage:\n\tedquota %1$s[-u] [-F formatname] [-p username] [-f filesystem] username ...\n\
+\tedquota %1$s-g [-F formatname] [-p groupname] [-f filesystem] groupname ...\n\
+\tedquota %1$s[-u|g] [-F formatname] [-f filesystem] -t\n\
+\tedquota %1$s[-u|g] [-F formatname] [-f filesystem] -T username|groupname ...\n"), rpcflag);
+       fputs(_("\n\
+-u, --user                    edit user data\n\
+-g, --group                   edit group data\n"), stderr);
+#if defined(RPC_SETQUOTA)
+       fputs(_("-r, --remote                  edit remote quota (via RPC)\n\
+-m, --no-mixed-pathnames      trim leading slashes from NFSv4 mountpoints\n"), stderr);
+#endif
+       fputs(_("-F, --format=formatname       edit quotas of a specific format\n\
+-p, --prototype=name          copy data from a prototype user/group\n\
+    --always-resolve          always try to resolve name, even if it is\n\
+                              composed only of digits\n\
+-f, --filesystem=filesystem   edit data only on a specific filesystem\n\
+-t, --edit-period             edit grace period\n\
+-T, --edit-times              edit grace time of a user/group\n\
+-h, --help                    display this help text and exit\n\
+-V, --version                 display version information and exit\n\n"), stderr);
+       fprintf(stderr, _("Bugs to: %s\n"), MY_EMAIL);
+       exit(1);
+}
+
+int parse_options(int argc, char **argv)
+{
+       int ret;
+       struct option long_opts[] = {
+               { "help", 0, NULL, 'h' },
+               { "version", 0, NULL, 'V' },
+               { "prototype", 1, NULL, 'p' },
+               { "user", 0, NULL, 'u' },
+               { "group", 0, NULL, 'g' },
+               { "format", 1, NULL, 'F' },
+               { "filesystem", 1, NULL, 'f' },
+#if defined(RPC_SETQUOTA)
+               { "remote", 0, NULL, 'r' },
+               { "no-mixed-pathnames", 0, NULL, 'm' },
+#endif
+               { "always-resolve", 0, NULL, 256 },
+               { "edit-period", 0, NULL, 't' },
+               { "edit-times", 0, NULL, 'T' },
+               { NULL, 0, NULL, 0 }
+       };
+
+       if (argc < 2)
+               usage();
+
+       quotatype = USRQUOTA;
+#if defined(RPC_SETQUOTA)
+       while ((ret = getopt_long(argc, argv, "ugrmntTVp:F:f:", long_opts, NULL)) != -1) {
+#else
+       while ((ret = getopt_long(argc, argv, "ugtTVp:F:f:", long_opts, NULL)) != -1) {
+#endif
+               switch (ret) {
+                 case 'p':
+                         protoname = optarg;
+                         break;
+                 case 'g':
+                         quotatype = GRPQUOTA;
+                         break;
+#if defined(RPC_SETQUOTA)
+                 case 'n':
+                 case 'r':
+                         flags |= FL_REMOTE;
+                         break;
+                 case 'm':
+                         flags |= FL_NO_MIXED_PATHS;
+                         break;
+#endif
+                 case 'u':
+                         quotatype = USRQUOTA;
+                         break;
+                 case 't':
+                         flags |= FL_EDIT_PERIOD;
+                         break;
+                 case 'T':
+                         flags |= FL_EDIT_TIMES;
+                         break;
+                 case 'F':
+                         if ((fmt = name2fmt(optarg)) == QF_ERROR)     /* Error? */
+                                 exit(1);
+                         break;
+                 case 'f':
+                         dirname = optarg;
+                         break;
+                 case 256:
+                         flags |= FL_NUMNAMES;
+                         break;
+                 case 'V':
+                         version();
+                         exit(0);
+                 default:
+                         usage();
+               }
+       }
+       argc -= optind;
+
+       if (((flags & FL_EDIT_PERIOD) && argc != 0) || ((flags & FL_EDIT_TIMES) && argc < 1))
+               usage();
+       if ((flags & (FL_EDIT_PERIOD | FL_EDIT_TIMES)) && protoname) {
+               errstr(_("Prototype name does not make sense when editing grace period or times.\n"));
+               usage();
+       }
+       return optind;
+}
+
+void copy_prototype(int argc, char **argv, struct quota_handle **handles)
+{
+       int ret, protoid, id;
+       struct dquot *protoprivs, *curprivs, *pprivs, *cprivs;
+       
+       ret = 0;
+       protoid = name2id(protoname, quotatype, !!(flags & FL_NUMNAMES), NULL);
+       protoprivs = getprivs(protoid, handles, 0);
+       while (argc-- > 0) {
+               id = name2id(*argv, quotatype, !!(flags & FL_NUMNAMES), NULL);
+               curprivs = getprivs(id, handles, 0);
+               if (!curprivs)
+                       die(1, _("Cannot get quota information for user %s\n"), *argv);
+               argv++;
+
+               for (pprivs = protoprivs, cprivs = curprivs; pprivs && cprivs;
+                    pprivs = pprivs->dq_next, cprivs = cprivs->dq_next) {
+                       if (!devcmp_handles(pprivs->dq_h, cprivs->dq_h)) {
+                               errstr(_("fsname mismatch\n"));
+                               continue;
+                       }
+                       cprivs->dq_dqb.dqb_bsoftlimit =
+                               pprivs->dq_dqb.dqb_bsoftlimit;
+                       cprivs->dq_dqb.dqb_bhardlimit =
+                               pprivs->dq_dqb.dqb_bhardlimit;
+                       cprivs->dq_dqb.dqb_isoftlimit =
+                               pprivs->dq_dqb.dqb_isoftlimit;
+                       cprivs->dq_dqb.dqb_ihardlimit =
+                               pprivs->dq_dqb.dqb_ihardlimit;
+                       update_grace_times(cprivs);
+               }
+               if (putprivs(curprivs, COMMIT_LIMITS) == -1)
+                       ret = -1;
+               freeprivs(curprivs);
+       }
+       if (dispose_handle_list(handles) == -1)
+               ret = -1;
+       freeprivs(protoprivs);
+       exit(ret ? 1 : 0);
+}
+
+int main(int argc, char **argv)
+{
+       struct dquot *curprivs;
+       int tmpfd, ret, id;
+       struct quota_handle **handles;
+       char *tmpfil, *tmpdir = NULL;
+
+       gettexton();
+       progname = basename(argv[0]);
+       ret = parse_options(argc, argv);
+       argc -= ret;
+       argv += ret;
+
+       init_kernel_interface();
+       handles = create_handle_list(dirname ? 1 : 0, dirname ? &dirname : NULL, quotatype, fmt,
+                       (flags & FL_NO_MIXED_PATHS) ? 0 : IOI_NFS_MIXED_PATHS,
+                       (flags & FL_REMOTE) ? 0 : MS_LOCALONLY);
+       if (!handles[0]) {
+               dispose_handle_list(handles);
+               fputs(_("No filesystems with quota detected.\n"), stderr);
+               return 0;
+       }
+       if (protoname)
+               copy_prototype(argc, argv, handles);
+
+       umask(077);
+       if (getuid() == geteuid() && getgid() == getegid())
+               tmpdir = getenv("TMPDIR");
+       if (!tmpdir)
+               tmpdir = _PATH_TMP;
+       tmpfil = smalloc(strlen(tmpdir) + strlen("/EdP.aXXXXXX") + 1);
+       strcpy(tmpfil, tmpdir);
+       strcat(tmpfil, "/EdP.aXXXXXX");
+       tmpfd = mkstemp(tmpfil);
+       if (tmpfd < 0) {
+               errstr(_("Cannot create temporary file: %s\n"), strerror(errno));
+               ret = -1;
+               goto out;
+       }
+       if (fchown(tmpfd, getuid(), getgid()) < 0) {
+               errstr(_("Cannot change owner of temporary file: %s\n"), strerror(errno));
+               ret = -1;
+               goto out;
+       }
+       ret = 0;
+       if (flags & FL_EDIT_PERIOD) {
+               if (writetimes(handles, tmpfd) < 0) {
+                       errstr(_("Cannot write grace times to file.\n"));
+                       ret = -1;
+               }
+               if (editprivs(tmpfil) < 0) {
+                       errstr(_("Error while editing grace times.\n"));
+                       ret = -1;
+               }
+               if (readtimes(handles, tmpfd) < 0) {
+                       errstr(_("Failed to parse grace times file.\n"));
+                       ret = -1;
+               }
+       }
+       else if (flags & FL_EDIT_TIMES) {
+               for (; argc > 0; argc--, argv++) {
+                       id = name2id(*argv, quotatype, !!(flags & FL_NUMNAMES), NULL);
+                       curprivs = getprivs(id, handles, 0);
+                       if (!curprivs)
+                               die(1, _("Cannot get quota information for user %s.\n"), *argv);
+                       if (writeindividualtimes(curprivs, tmpfd, *argv, quotatype) < 0) {
+                               errstr(_("Cannot write individual grace times to file.\n"));
+                               ret = -1;
+                               continue;
+                       }
+                       if (editprivs(tmpfil) < 0) {
+                               errstr(_("Error while editing individual grace times.\n"));
+                               ret = -1;
+                               continue;
+                       }
+                       if (readindividualtimes(curprivs, tmpfd) < 0) {
+                               errstr(_("Cannot read individual grace times from file.\n"));
+                               ret = -1;
+                               continue;
+                       }
+                       if (putprivs(curprivs, COMMIT_TIMES) == -1)
+                               ret = -1;
+                       freeprivs(curprivs);
+               }
+       }
+       else {
+               for (; argc > 0; argc--, argv++) {
+                       id = name2id(*argv, quotatype, !!(flags & FL_NUMNAMES), NULL);
+                       curprivs = getprivs(id, handles, 0);
+                       if (!curprivs)
+                               die(1, _("Cannot get quota information for user %s.\n"), *argv);
+                       if (writeprivs(curprivs, tmpfd, *argv, quotatype) < 0) {
+                               errstr(_("Cannot write quotas to file.\n"));
+                               ret = -1;
+                               continue;
+                       }
+                       if (editprivs(tmpfil) < 0) {
+                               errstr(_("Error while editing quotas.\n"));
+                               ret = -1;
+                               continue;
+                       }
+                       close(tmpfd);
+                       if ((tmpfd = open(tmpfil, O_RDONLY)) < 0)
+                               die(1, _("Cannot reopen!"));
+                       if (readprivs(curprivs, tmpfd) < 0) {
+                               errstr(_("Cannot read quotas from file.\n"));
+                               ret = -1;
+                               continue;
+                       }
+                       if (putprivs(curprivs, COMMIT_LIMITS) == -1)
+                               ret = -1;
+                       freeprivs(curprivs);
+               }
+       }
+out:
+       if (dispose_handle_list(handles) == -1)
+               ret = -1;
+
+       close(tmpfd);
+       unlink(tmpfil);
+       free(tmpfil);
+       return ret ? 1 : 0;
+}
diff --git a/install-sh b/install-sh
new file mode 100755 (executable)
index 0000000..e9de238
--- /dev/null
@@ -0,0 +1,251 @@
+#!/bin/sh
+#
+# install - install a program, script, or datafile
+# This comes from X11R5 (mit/util/scripts/install.sh).
+#
+# Copyright 1991 by the Massachusetts Institute of Technology
+#
+# Permission to use, copy, modify, distribute, and sell this software and its
+# documentation for any purpose is hereby granted without fee, provided that
+# the above copyright notice appear in all copies and that both that
+# copyright notice and this permission notice appear in supporting
+# documentation, and that the name of M.I.T. not be used in advertising or
+# publicity pertaining to distribution of the software without specific,
+# written prior permission.  M.I.T. makes no representations about the
+# suitability of this software for any purpose.  It is provided "as is"
+# without express or implied warranty.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# `make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch.  It can only install one file at a time, a restriction
+# shared with many OS's install programs.
+
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit="${DOITPROG-}"
+
+
+# put in absolute paths if you don't have them in your path; or use env. vars.
+
+mvprog="${MVPROG-mv}"
+cpprog="${CPPROG-cp}"
+chmodprog="${CHMODPROG-chmod}"
+chownprog="${CHOWNPROG-chown}"
+chgrpprog="${CHGRPPROG-chgrp}"
+stripprog="${STRIPPROG-strip}"
+rmprog="${RMPROG-rm}"
+mkdirprog="${MKDIRPROG-mkdir}"
+
+transformbasename=""
+transform_arg=""
+instcmd="$mvprog"
+chmodcmd="$chmodprog 0755"
+chowncmd=""
+chgrpcmd=""
+stripcmd=""
+rmcmd="$rmprog -f"
+mvcmd="$mvprog"
+src=""
+dst=""
+dir_arg=""
+
+while [ x"$1" != x ]; do
+    case $1 in
+       -c) instcmd="$cpprog"
+           shift
+           continue;;
+
+       -d) dir_arg=true
+           shift
+           continue;;
+
+       -m) chmodcmd="$chmodprog $2"
+           shift
+           shift
+           continue;;
+
+       -o) chowncmd="$chownprog $2"
+           shift
+           shift
+           continue;;
+
+       -g) chgrpcmd="$chgrpprog $2"
+           shift
+           shift
+           continue;;
+
+       -s) stripcmd="$stripprog"
+           shift
+           continue;;
+
+       -t=*) transformarg=`echo $1 | sed 's/-t=//'`
+           shift
+           continue;;
+
+       -b=*) transformbasename=`echo $1 | sed 's/-b=//'`
+           shift
+           continue;;
+
+       *)  if [ x"$src" = x ]
+           then
+               src=$1
+           else
+               # this colon is to work around a 386BSD /bin/sh bug
+               :
+               dst=$1
+           fi
+           shift
+           continue;;
+    esac
+done
+
+if [ x"$src" = x ]
+then
+       echo "install:  no input file specified"
+       exit 1
+else
+       true
+fi
+
+if [ x"$dir_arg" != x ]; then
+       dst=$src
+       src=""
+       
+       if [ -d $dst ]; then
+               instcmd=:
+               chmodcmd=""
+       else
+               instcmd=mkdir
+       fi
+else
+
+# Waiting for this to be detected by the "$instcmd $src $dsttmp" command
+# might cause directories to be created, which would be especially bad 
+# if $src (and thus $dsttmp) contains '*'.
+
+       if [ -f $src -o -d $src ]
+       then
+               true
+       else
+               echo "install:  $src does not exist"
+               exit 1
+       fi
+       
+       if [ x"$dst" = x ]
+       then
+               echo "install:  no destination specified"
+               exit 1
+       else
+               true
+       fi
+
+# If destination is a directory, append the input filename; if your system
+# does not like double slashes in filenames, you may need to add some logic
+
+       if [ -d $dst ]
+       then
+               dst="$dst"/`basename $src`
+       else
+               true
+       fi
+fi
+
+## this sed command emulates the dirname command
+dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
+
+# Make sure that the destination directory exists.
+#  this part is taken from Noah Friedman's mkinstalldirs script
+
+# Skip lots of stat calls in the usual case.
+if [ ! -d "$dstdir" ]; then
+defaultIFS='   
+'
+IFS="${IFS-${defaultIFS}}"
+
+oIFS="${IFS}"
+# Some sh's can't handle IFS=/ for some reason.
+IFS='%'
+set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'`
+IFS="${oIFS}"
+
+pathcomp=''
+
+while [ $# -ne 0 ] ; do
+       pathcomp="${pathcomp}${1}"
+       shift
+
+       if [ ! -d "${pathcomp}" ] ;
+        then
+               $mkdirprog "${pathcomp}"
+       else
+               true
+       fi
+
+       pathcomp="${pathcomp}/"
+done
+fi
+
+if [ x"$dir_arg" != x ]
+then
+       $doit $instcmd $dst &&
+
+       if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi &&
+       if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi &&
+       if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi &&
+       if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi
+else
+
+# If we're going to rename the final executable, determine the name now.
+
+       if [ x"$transformarg" = x ] 
+       then
+               dstfile=`basename $dst`
+       else
+               dstfile=`basename $dst $transformbasename | 
+                       sed $transformarg`$transformbasename
+       fi
+
+# don't allow the sed command to completely eliminate the filename
+
+       if [ x"$dstfile" = x ] 
+       then
+               dstfile=`basename $dst`
+       else
+               true
+       fi
+
+# Make a temp file name in the proper directory.
+
+       dsttmp=$dstdir/#inst.$$#
+
+# Move or copy the file name to the temp name
+
+       $doit $instcmd $src $dsttmp &&
+
+       trap "rm -f ${dsttmp}" 0 &&
+
+# and set any options; do chmod last to preserve setuid bits
+
+# If any of these fail, we abort the whole thing.  If we want to
+# ignore errors from any of these, just make sure not to ignore
+# errors from the above "$doit $instcmd $src $dsttmp" command.
+
+       if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi &&
+       if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi &&
+       if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi &&
+       if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi &&
+
+# Now rename the file to the real destination.
+
+       $doit $rmcmd -f $dstdir/$dstfile &&
+       $doit $mvcmd $dsttmp $dstdir/$dstfile 
+
+fi &&
+
+
+exit 0
diff --git a/ldap-scripts/CVS/Entries b/ldap-scripts/CVS/Entries
new file mode 100644 (file)
index 0000000..5c538db
--- /dev/null
@@ -0,0 +1,6 @@
+/applySystemQuotas.pl/1.2/Mon Oct 13 17:29:18 2008//
+/edquota_editor/1.2/Mon Oct 13 17:29:18 2008//
+/quota.schema/1.1/Mon Oct 13 17:29:18 2008//
+/setSystemQuotas.pl/1.1/Mon Oct 13 17:29:18 2008//
+/setquota-ldap.pl/1.1/Mon Oct 13 17:29:18 2008//
+D
diff --git a/ldap-scripts/CVS/Repository b/ldap-scripts/CVS/Repository
new file mode 100644 (file)
index 0000000..1141060
--- /dev/null
@@ -0,0 +1 @@
+quota-tools/ldap-scripts
diff --git a/ldap-scripts/CVS/Root b/ldap-scripts/CVS/Root
new file mode 100644 (file)
index 0000000..3d66810
--- /dev/null
@@ -0,0 +1 @@
+jkar8572@linuxquota.cvs.sf.net:/cvsroot/linuxquota/
diff --git a/ldap-scripts/applySystemQuotas.pl b/ldap-scripts/applySystemQuotas.pl
new file mode 100755 (executable)
index 0000000..41c74d9
--- /dev/null
@@ -0,0 +1,104 @@
+#!/usr/bin/perl -w
+
+# $0 -b "ou=People,dc=borgia,dc=com" -F '(attr=value)'
+
+# Synopsis
+# applyQuotas.pl is a script solely for making the quota set within LDAP take
+# affect by running the linuxquota tool edquota with the figures set in LDAP.
+# This tool is capable of applying standard LDAP filters to the user-supplied
+# base DN for applying multiple users' quotas at once. 
+
+# Examples:
+# Apply the quotas using the linuxquota tool edquota for user stefan
+# ./applySystemQuotas.pl -b "uid=stefan,ou=People,dc=borgia,dc=com"
+#
+# Apply the quotas using the linuxquota tool edquota for all People with description of Student
+# ./applySystemQuotas.pl -b "ou=People,dc=borgia,dc=com" -F "(description=Student)"
+
+use strict;
+use Net::LDAP;
+use Getopt::Long;
+
+chomp(my $Password = `cat /etc/ldap.secret`);
+my $Host = 'localhost';
+my $Port = '389';
+my $BindDN = 'cn=Manager,dc=borgia,dc=com';
+my $SSL = 0;
+my $edquota_editor = '/usr/sbin/edquota_editor';
+my $edquota = '/usr/sbin/edquota';
+
+my $b = '';
+my $F = '';
+GetOptions(
+        'b=s' => \$b,
+       'F=s' => \$F,
+);
+
+die "Usage: $0 -b basedn [-F '(extrafilter)']\n" unless $b;
+
+my $ldap = connectLDAP();
+
+my $search;
+$search = $ldap->search(
+       base => $b,
+       filter => "(&(objectClass=systemQuotas)$F)",
+       attrs => ['uid', 'quota'],
+);
+$search->code && die $search->error;
+my $i = 0;
+my $max = $search->count;
+for ( $i=0; $i<$max; $i++ ) {
+       my $entry = $search->entry($i);
+       my $editor = $ENV{'VISUAL'} if $ENV{'VISUAL'};
+       $ENV{'VISUAL'} = $edquota_editor;
+       $ENV{'QUOTA_USER'} = $entry->get_value('uid');
+       # Delete all existing quotas for QUOTA_USER
+       $ENV{'QUOTA_FILESYS'} = '*';
+       $ENV{'QUOTA_SBLOCKS'} = 0;
+       $ENV{'QUOTA_HBLOCKS'} = 0;
+       $ENV{'QUOTA_SFILES'} = 0;
+       $ENV{'QUOTA_HFILES'} = 0;
+       print "$ENV{'QUOTA_USER'}: $ENV{'QUOTA_FILESYS'}:$ENV{'QUOTA_SBLOCKS'},$ENV{'QUOTA_HBLOCKS'},$ENV{'QUOTA_SFILES'},$ENV{'QUOTA_HFILES'}\n";
+       qx(/usr/sbin/edquota -u $ENV{'QUOTA_USER'});
+       my @quotas = $entry->get_value('quota');
+       if ( $#quotas >= 0 ) {
+               foreach ( @quotas ) {
+                       my @quota = split /:/;
+                       $ENV{'QUOTA_FILESYS'} = $quota[0];
+                       $ENV{'QUOTA_SBLOCKS'} = $quota[1];
+                       $ENV{'QUOTA_HBLOCKS'} = $quota[2];
+                       $ENV{'QUOTA_SFILES'} = $quota[3];
+                       $ENV{'QUOTA_HFILES'} = $quota[4];
+                       print "$ENV{'QUOTA_USER'}: $ENV{'QUOTA_FILESYS'}:$ENV{'QUOTA_SBLOCKS'},$ENV{'QUOTA_HBLOCKS'},$ENV{'QUOTA_SFILES'},$ENV{'QUOTA_HFILES'}\n";
+                       qx($edquota -u $ENV{'QUOTA_USER'});
+               }
+       }
+       if ($editor) {
+               $ENV{'VISUAL'} = $editor;
+       }
+       else {
+               delete $ENV{'VISUAL'};
+       }
+}
+$search = $ldap->unbind;
+
+sub connectLDAP {
+        # bind to a directory with dn and password
+        my $ldap = Net::LDAP->new(
+                $Host,
+                port => $Port,
+                version => 3,
+#                debug => 0xffff,
+        ) or die "Can't contact LDAP server ($@)\n";
+        if ( $SSL ) {
+                $ldap->start_tls(
+                        # verify => 'require',
+                        # clientcert => 'mycert.pem',
+                        # clientkey => 'mykey.pem',
+                        # decryptkey => sub { 'secret'; },
+                        # capath => '/usr/local/cacerts/'
+                ); 
+        }
+        $ldap->bind($BindDN, password=>$Password);
+        return $ldap;
+}   
diff --git a/ldap-scripts/edquota_editor b/ldap-scripts/edquota_editor
new file mode 100755 (executable)
index 0000000..fdebd09
--- /dev/null
@@ -0,0 +1,32 @@
+#!/usr/bin/perl -w
+
+use strict;
+
+die "QUOTA_USER environment variable not set\n" unless defined $ENV{'QUOTA_USER'};
+die "QUOTA_FILESYS environment variable not set\n" unless defined $ENV{'QUOTA_FILESYS'};
+die "QUOTA_SBLOCKS environment variable not set\n" unless defined $ENV{'QUOTA_SBLOCKS'};
+die "QUOTA_HBLOCKS environment variable not set\n" unless defined $ENV{'QUOTA_HBLOCKS'};
+die "QUOTA_SFILES environment variable not set\n" unless defined $ENV{'QUOTA_SFILES'};
+die "QUOTA_HFILES environment variable not set\n" unless defined $ENV{'QUOTA_HFILES'};
+
+open FILE, $ARGV[0];
+my $qdata = join '', (@_=<FILE>);
+close FILE;
+open FILE, ">$ARGV[0]";
+print FILE &edit_quota_file($qdata, $ENV{'QUOTA_FILESYS'}, $ENV{'QUOTA_SBLOCKS'}, $ENV{'QUOTA_HBLOCKS'}, $ENV{'QUOTA_SFILES'}, $ENV{'QUOTA_HFILES'});
+close FILE;
+
+# edit_quota_file(data, filesys, sblocks, hblocks, sfiles, hfiles)
+sub edit_quota_file {
+       my($rv, $line, @line, $i);
+       @line = split /\n/, $_[0];
+       for ( $i=0; $i<@line; $i++ ) {
+               if ($line[$i] =~ /^\s+(\S+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)$/ && ($1 eq $_[1] || $_[1] eq '*')) {
+                       # new-style line to change
+                       $rv .= "  $1 $2 $_[2] $_[3] $5 $_[4] $_[5]\n";
+               } else {
+                       $rv .= "$line[$i]\n";
+               }
+       }
+       return $rv;
+}
diff --git a/ldap-scripts/quota.schema b/ldap-scripts/quota.schema
new file mode 100644 (file)
index 0000000..b5e216f
--- /dev/null
@@ -0,0 +1,18 @@
+##
+## schema file for Unix Quotas
+## Schema for storing Unix Quotas in LDAP
+## OIDs are owned by Cogent Innovators, LLC
+##
+## 1.3.6.1.4.1.19937.1.1.x - attributetypes
+## 1.3.6.1.4.1.19937.1.2.x - objectclasses
+##
+
+attributetype ( 1.3.6.1.4.1.19937.1.1.1 NAME 'quota'
+       DESC 'Quotas (FileSystem:BlocksSoft,BlocksHard,InodesSoft,InodesHard)'
+       EQUALITY caseIgnoreIA5Match
+       SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{255} )
+
+objectclass ( 1.3.6.1.4.1.19937.1.2.1 NAME 'systemQuotas' SUP posixAccount AUXILIARY
+       DESC 'System Quotas'
+       MUST ( uid )
+       MAY  ( quota ))
diff --git a/ldap-scripts/setSystemQuotas.pl b/ldap-scripts/setSystemQuotas.pl
new file mode 100755 (executable)
index 0000000..90ab1e8
--- /dev/null
@@ -0,0 +1,140 @@
+#!/usr/bin/perl -w
+
+# $0 -b "ou=People,dc=borgia,dc=com" -Q /dev/with/quota=0:0:0:0 -F '(attr=value)'
+
+# Synopsis
+# setSystemQuotas.pl is a script solely for modifying the quota attribute in
+# LDAP.  It expects that the users you intend to have quotas already have the
+# systemQuotas objectClass set.
+# This tool is capable of applying standard LDAP filters to the user-supplied
+# base DN for modifying multiple users' quotas at once.
+
+# Examples:
+# Set quota on /dev/sda7 and /dev/sda8 for user stefan
+# ./setSystemQuotas.pl -b "uid=stefan,ou=People,dc=borgia,dc=com" -Q /dev/sda7=4000000:4400000:10000:11000 -Q /dev/sda8=4000000:4400000:10000:11000
+#
+# Set quota on /dev/sda8 for user all People with description of Student
+# ./setSystemQuotas.pl -b "ou=People,dc=borgia,dc=com" -Q /dev/sda8=40000:44000:1000:1100 -F "(description=Student)"
+#
+# Delete quotas for user stefan
+# ./setSystemQuotas.pl -b "uid=stefan,ou=People,dc=borgia,dc=com"
+
+use strict;
+use Net::LDAP;
+use Getopt::Long;
+
+chomp(my $Password = `cat /etc/ldap.secret`);
+my $Host = 'localhost';
+my $Port = '389';
+my $BindDN = 'cn=Manager,dc=borgia,dc=com';
+my $SSL = 0;
+
+my $b = '';
+my %Q = ();
+my $F = '';
+GetOptions(
+       'b=s' => \$b,
+       'Q=s' => \%Q,
+       'F=s' => \$F,
+);
+die "Usage: $0 -b userdn [-F '(extrafilter)'] [-Q /fs=sb:hb:sf:hf ...]\n" unless $b;
+foreach ( keys %Q ) {
+       local @_ = split /:/, $Q{$_};
+       unless ( $#_ == 3 ) {
+               print "Ignoring $_: invalid format\n";
+               delete $Q{$_};
+       }
+}
+
+my $ldap = connectLDAP();
+
+my $quota = {};
+my $search;
+$search = $ldap->search(
+        base => $b,
+        filter => "(&(objectClass=systemQuotas)$F)",
+        attrs => ['*', 'quota'],
+);
+$search->code && die $search->error;
+my $i = 0;
+my $max = $search->count;
+for ( $i=0; $i<$max; $i++ ) {
+        my $entry = $search->entry($i);
+       my $dn = $entry->dn;
+       if ( keys %Q ) {
+               $quota->{$dn} = 1;
+               foreach ( $entry->get_value('quota') ) {
+                       my @quota = split /:/;
+                       my $fs = shift @quota;
+                       delete $quota->{$dn} if $quota->{$dn} == 1;
+                       $quota->{$dn}->{$fs} = join ':', @quota;
+               }
+       } else {
+               $quota->{$dn} = 0;
+               delete $quota->{$dn} unless $entry->get_value('quota');
+       }
+}
+       
+foreach my $dn ( keys %{$quota} ) {
+       if ( ref $quota->{$dn} eq 'HASH' ) {
+print STDERR "Modify $dn:\n";
+               foreach ( keys %Q ) {
+print STDERR "\t$_:$Q{$_}\n";
+                       $quota->{$dn}->{$_} = $Q{$_};
+               }
+               my @quota = map { "$_:$quota->{$dn}->{$_}" } keys %{$quota->{$dn}};
+               my $modify = $ldap->modify(
+                       $dn,
+                       replace => {
+                               quota => [@quota],
+                       },
+               );
+               $modify->code && warn "Failed to modify quota: ", $modify->error, "\n";
+       } else {
+               if ( $quota->{$dn} == 1 ) {
+                       delete $quota->{$dn};
+print STDERR "Add $dn:\n";
+                       foreach ( keys %Q ) {
+print STDERR "\t$_:$Q{$_}\n";
+                               $quota->{$dn}->{$_} = $Q{$_}
+                       }
+                       my @quota = map { "$_:$quota->{$dn}->{$_}" } keys %{$quota->{$dn}};
+                       my $modify = $ldap->modify(
+                               $dn,
+                               add => {
+                                       quota => [@quota],
+                               },
+                       );
+                       $modify->code && warn "Failed to modify quota: ", $modify->error, "\n";
+               } elsif ( $quota->{$dn} == 0 ) {
+print STDERR "Delete $dn:\n";
+                       my $modify = $ldap->modify(
+                               $dn,
+                               delete => ['quota'],
+                       );
+                       $modify->code && warn "Failed to modify quota: ", $modify->error, "\n";
+               }
+       }
+}
+$ldap->unbind;
+
+sub connectLDAP {
+        # bind to a directory with dn and password
+        my $ldap = Net::LDAP->new(
+                $Host,
+                port => $Port,
+                version => 3,
+#                debug => 0xffff,
+        ) or die "Can't contact LDAP server ($@)\n";
+        if ( $SSL ) {
+                $ldap->start_tls(
+                        # verify => 'require',
+                        # clientcert => 'mycert.pem',
+                        # clientkey => 'mykey.pem',
+                        # decryptkey => sub { 'secret'; },
+                        # capath => '/usr/local/cacerts/'
+                ); 
+        }
+        $ldap->bind($BindDN, password=>$Password);
+        return $ldap;
+}   
diff --git a/ldap-scripts/setquota-ldap.pl b/ldap-scripts/setquota-ldap.pl
new file mode 100644 (file)
index 0000000..7cafc44
--- /dev/null
@@ -0,0 +1,148 @@
+#!/usr/bin/perl
+
+# A Perl wrapper for setquota utility which updates LDAP accordingly.
+
+# /etc/fstab: usrquota,grpquota
+# mount -o remount /f/s
+# touch /f/s/aquota.{user,group}
+# chmod 600 /f/s/aquota.{user,group}
+# quotacheck -cguvamf
+
+use strict;
+use warnings;
+use Net::LDAP;
+use Net::LDAP::Entry;
+use Getopt::Long;
+Getopt::Long::Configure ("bundling");
+
+my $help = $#ARGV >= 0 ? 0 : 1;
+my $ldaphost = 'localhost';
+my $passwordfile = '';
+my $password = '';
+my $binddn = $ENV{BINDDN};
+my $basedn = $ENV{BASEDN};
+my $oc = 'systemQuotas';
+my $attr = 'quota';
+my %Q = ();
+my $F = 'cn=*';
+GetOptions(
+        'help|?' => \$help,
+        'oc|o=s' => \$oc,
+        'attr|a=s' => \$attr,
+        'quota|Q=s' => \%Q,
+        'filter|F=s' => \$F,
+        'ldaphost|h=s' => \$ldaphost,
+        'basedn|b=s' => \$basedn,
+        'binddn|D=s' => \$binddn,
+        'password|w=s' => \$password,
+        'passwordfile|W=s' => \$passwordfile,
+);
+die "Usage: $0 -b basedn [-o objectClass] [-a attr] [-F '(extrafilter)'] [-Q
+/f/s=sb:hb:gb:sf:hf:gf ...]\n" if $help;
+%Q = checkQ(%Q);
+
+my ($ldap, $bind);
+if ( $ldap = Net::LDAP->new($ldaphost, version => 3, timeout => 3) ) {
+        if ( $binddn && $password ) {
+                $bind = $ldap->bind($binddn, password=>$password);
+        } elsif ( $binddn && $passwordfile ){
+                $bind = $ldap->bind($binddn, password=>bindpw($passwordfile));
+        } else {
+                $bind = $ldap->bind();
+        }
+        die "Unable to connect to LDAP\n" if $bind->code;
+        undef $passwordfile;
+} else {
+        die "Unable to connect to LDAP\n";
+}
+
+my $search = $ARGV[0] ? $ldap->search(base=>$basedn, filter=>"uid=$ARGV[0]") : $ldap->search(base=>$basedn, filter=>$F);
+if ( $search->code ) {
+        die "LDAP Error: ", error($search), "\n";
+} elsif ( $search->count <= 0 ) {
+        die "0 results found in LDAP\n";
+} else {
+        my $i = 0;
+        for ( $i=0; $i<$search->count; $i++ ) {
+                my $entry = $search->entry($i);
+                my @oc = $entry->get_value('objectClass');
+                # objectClass: $oc
+                unless ( grep { /^$oc$/ } @oc ) {
+                        my $modify = $ldap->modify($entry->dn, add => {objectClass => $oc});
+                        if ( $modify->code ) {
+                                print STDERR "Failed to add objectClass $oc:", error($modify), "\n";
+                        }
+                }
+                # $attr: /f/s=sb:hb:sf:hf
+                if ( $entry->exists($attr) ) {
+                        my @attr = $entry->get_value($attr);
+                        if ( keys %Q ) {
+                                foreach my $fs ( keys %Q ) {
+                                        foreach ( @attr ) {
+                                                next unless /^$fs=/;
+                                                my $modify = $ldap->modify($entry->dn, delete => {$attr => "$_"});
+                                                if ( $modify->code ) {
+                                                        print STDERR "Failed to delete $attr: $_: ", error($modify), "\n";
+                                                }
+                                        }
+                                        my $modify = $ldap->modify($entry->dn, add => {$attr => "$fs=$Q{$fs}"});
+                                        if ( $modify->code ) {
+                                                print STDERR "Failed to add $attr: $fs=$Q{$fs}: ", error($modify), "\n";
+                                        } else {
+                                                print STDERR "Failed to setquota: $fs=$Q{$fs}\n" if setquota($entry->get_value('uid'), $fs, $Q{$fs});
+                                        }
+                                }
+                        } else {
+                                my $modify = $ldap->modify($entry->dn, delete => [($attr)]);
+                                if ( $modify->code ) {
+                                        print STDERR "Failed to delete $attr: ", error($modify), "\n";
+                                } else {
+                                        foreach ( @attr ) {
+                                                my ($fs) = m!^(/[^=]*)!;
+                                                $Q{$fs} = '0:0:0:0:0:0';
+                                                print STDERR "Failed to setquota: $fs=$Q{$fs}\n" if setquota($entry->get_value('uid'), $fs, $Q{$fs});
+                                        }
+                                }
+                        }
+                } else {
+                        if ( keys %Q ) {
+                                foreach my $fs ( keys %Q ) {
+                                        my $modify = $ldap->modify($entry->dn, add => {$attr => "$fs=$Q{$fs}"});
+                                        if ( $modify->code ) {
+                                                print STDERR "Failed to add $attr: $fs=$Q{$fs}: ", error($modify), "\n";
+                                        } else {
+                                                print STDERR "Failed to setquota: $fs=$Q{$fs}\n" if setquota($entry->get_value('uid'), $fs, $Q{$fs});
+                                        }
+                                }
+                        }
+                }
+        }
+}
+
+sub setquota {
+        $_[2] = '0:0:0:0:0:0' unless $_[2];
+        $_[2] =~ /^(\d+):(\d+):(\d+):(\d+):(\d+):(\d+)$/;
+        qx{/usr/sbin/setquota -u $_[0] $1 $2 $4 $5 $_[1]};
+        qx{/usr/sbin/setquota -T -u $_[0] $3 $6 $_[1]};
+        return 0;
+}
+
+sub checkQ {
+        my (%Q) = @_;
+        foreach ( keys %Q ) {
+                die "$_: invalid format\n" unless m!^(/[^=]*)! && $Q{$_} =~ /^(\d+):(\d+):(\d+):(\d+):(\d+):(\d+)$/;
+        }
+        return %Q;
+}
+
+sub bindpw {
+        my ($passwordfile) = @_;
+        open P, $passwordfile or die "Can't open passwordfile: $!";
+        chomp(my $password = <P>);
+        close P;
+        return $password;
+}
+
+sub error {
+        return $_[0]->error, "(", $_[0]->code, ")";
+}
diff --git a/mntopt.h b/mntopt.h
new file mode 100644 (file)
index 0000000..90673fc
--- /dev/null
+++ b/mntopt.h
@@ -0,0 +1,34 @@
+#ifndef GUARD_MNTOPT_H
+#define GUARD_MNTOPT_H
+
+#include <mntent.h>
+
+/* filesystem type */
+#define MNTTYPE_EXT2           "ext2"  /* 2nd Extended file system */
+#define MNTTYPE_EXT3           "ext3"  /* ext2 + journaling */
+#define MNTTYPE_EXT4           "ext4"  /* ext4 filesystem */
+#define MNTTYPE_EXT4DEV                "ext4dev"/* ext4dev filesystem */
+#define MNTTYPE_MINIX          "minix" /* MINIX file system */
+#define MNTTYPE_UFS            "ufs"   /* UNIX file system */
+#define MNTTYPE_UDF            "udf"   /* OSTA UDF file system */
+#define MNTTYPE_REISER         "reiserfs"      /* Reiser file system */
+#define MNTTYPE_XFS            "xfs"   /* SGI XFS file system */
+#define MNTTYPE_AUTOFS         "autofs"        /* Automount mountpoint */
+#define MNTTYPE_JFS            "jfs"   /* JFS file system */
+#define MNTTYPE_NFS4           "nfs4"  /* NFSv4 filesystem */
+#define MNTTYPE_MPFS           "mpfs"  /* EMC Celerra MPFS filesystem */
+#define MNTTYPE_OCFS2          "ocfs2" /* Oracle Cluster filesystem */
+
+/* mount options */
+#define MNTOPT_NOQUOTA         "noquota"       /* don't enforce quota */
+#define MNTOPT_QUOTA           "quota" /* enforce user quota */
+#define MNTOPT_USRQUOTA                "usrquota"      /* enforce user quota */
+#define MNTOPT_USRJQUOTA       "usrjquota"     /* enforce user quota */
+#define MNTOPT_GRPQUOTA                "grpquota"      /* enforce group quota */
+#define MNTOPT_GRPJQUOTA       "grpjquota"     /* enforce group quota */
+#define MNTOPT_RSQUASH         "rsquash"       /* root as ordinary user */
+#define MNTOPT_BIND            "bind"          /* binded mount */
+#define MNTOPT_LOOP            "loop"          /* loopback mount */
+#define MNTOPT_JQFMT           "jqfmt"         /* journaled quota format */
+
+#endif
diff --git a/packaging/quota-4.0.pre1.tar b/packaging/quota-4.0.pre1.tar
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/packaging/quota-4.0.pre1.tar.bz2 b/packaging/quota-4.0.pre1.tar.bz2
new file mode 100644 (file)
index 0000000..da0ae84
Binary files /dev/null and b/packaging/quota-4.0.pre1.tar.bz2 differ
diff --git a/packaging/quota.changes b/packaging/quota.changes
new file mode 100644 (file)
index 0000000..324df17
--- /dev/null
@@ -0,0 +1,11 @@
+* Wed May 30 03:17:39 UTC 2012 - Lin Yang <lin.a.yang@intel.con> - 4.0.pre1
+- Initial commit to Gerrit
+
+* Tue Apr 10 23:14:30 UTC 2012 - tracy.graydon@intel.com
+- Directly apply the stripping fix patch changes and ditch the patch. 
+
+* Tue Apr 10 00:54:53 UTC 2012 - tracy.graydon@intel.com
+- Stole Auke's initial packaging and added the quota-3.06-no-stripping.patch
+
+* Thu Jul 28 2011 Auke Kok <auke-jan.h.kok@intel.com> - 4.0~pre1
+- Initial packaging, mostly from Bernd Wachter.
diff --git a/packaging/quota.spec b/packaging/quota.spec
new file mode 100644 (file)
index 0000000..47aad39
--- /dev/null
@@ -0,0 +1,62 @@
+Name: quota
+Version: 4.0.pre1
+%define _version 4.00-pre1
+Release: 1
+Summary: Userland for disk quota
+Group: System/Base
+License: BSD, GPLv2, LGPLv2.1
+URL: http://sourceforge.net/projects/linuxquota/
+Source0: %{name}-%{version}.tar.bz2
+BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}
+BuildRequires: pkgconfig(openssl)
+BuildRequires: pkgconfig(ext2fs)
+BuildRequires: pkgconfig(dbus-1)
+BuildRequires: gettext
+
+%description
+%{summary}.
+
+%package devel
+Summary: Development files for %{name}
+Group: Development/Libraries
+
+%description devel
+%{summary}.
+
+%prep
+%setup -q -n %{name}-%{version}
+
+%build
+%configure \
+    --enable-netlink=no \
+    --with-ext2direct=yes \
+    --enable-rpcsetquota=yes
+make %{?_smp_mflags}
+
+%install
+mkdir -p %{buildroot}/sbin
+mkdir -p %{buildroot}%{_sysconfdir}
+mkdir -p %{buildroot}%{_sbindir}
+mkdir -p %{buildroot}%{_bindir}
+mkdir -p %{buildroot}%{_mandir}/{man1,man3,man8}
+make install INSTALL='install -p' ROOTDIR=%{buildroot}
+
+
+%find_lang %{name}
+
+%files -f %{name}.lang
+%defattr(-,root,root,-)
+%config %{_sysconfdir}/quota*
+%config %{_sysconfdir}/*.conf
+%attr(0755,root,root) %{_bindir}/*
+%attr(0755,root,root) %{_sbindir}/*
+%attr(0644,root,root) %{_mandir}/man1/*.gz
+%attr(0644,root,root) %{_mandir}/man2/*.gz
+%attr(0644,root,root) %{_mandir}/man3/*.gz
+%attr(0644,root,root) %{_mandir}/man8/*.gz
+
+%files devel
+%dir %{_includedir}/rpcsvc
+%{_includedir}/rpcsvc/*
+%attr(0644,root,root) %{_mandir}/man3/*
+
diff --git a/po/CVS/Entries b/po/CVS/Entries
new file mode 100644 (file)
index 0000000..7be7731
--- /dev/null
@@ -0,0 +1,3 @@
+/fr.po/1.2/Mon Oct 13 17:29:17 2008//
+/pl.po/1.11/Mon Oct 13 17:29:17 2008//
+D
diff --git a/po/CVS/Repository b/po/CVS/Repository
new file mode 100644 (file)
index 0000000..49f91b6
--- /dev/null
@@ -0,0 +1 @@
+quota-tools/po
diff --git a/po/CVS/Root b/po/CVS/Root
new file mode 100644 (file)
index 0000000..3d66810
--- /dev/null
@@ -0,0 +1 @@
+jkar8572@linuxquota.cvs.sf.net:/cvsroot/linuxquota/
diff --git a/po/fr.po b/po/fr.po
new file mode 100644 (file)
index 0000000..51f49f3
--- /dev/null
+++ b/po/fr.po
@@ -0,0 +1,2146 @@
+# French translation of quota-tools.
+# Copyright (C) 2003 Free Software Foundation, Inc.
+# Jérôme Schell <jerome@myreseau.org>, 2003.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: 1\n"
+"POT-Creation-Date: 2003-01-31 23:05+0100\n"
+"PO-Revision-Date: 2003-02-21 22:43+0100\n"
+"Last-Translator: Jérôme Schell <jerome@myreseau.org>\n"
+"Language-Team: fr <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: bylabel.c:234
+#, c-format
+msgid "Found an invalid UUID: %s\n"
+msgstr "UUID invalide trouvé : %s\n"
+
+#: bylabel.c:254
+#, c-format
+msgid "Error checking device name: %s\n"
+msgstr "Erreur vérification nom de périphérique : %s\n"
+
+#: common.c:122
+#, c-format
+msgid "Quota utilities version %s.\n"
+msgstr "Utilitaires quotas version %s.\n"
+
+#: common.c:124
+msgid "Compiled with "
+msgstr "Compilé avec "
+
+#: common.c:126
+msgid "RPC and EXT2_DIRECT"
+msgstr "RPC et EXT2_DIRECT"
+
+#: common.c:128
+msgid "RPC"
+msgstr "RPC"
+
+#: common.c:130
+msgid "EXT2_DIRECT"
+msgstr "EXT2_DIRECT"
+
+#: common.c:133 convertquota.c:38 quotacheck.c:285 repquota.c:46
+#, c-format
+msgid "Bugs to %s\n"
+msgstr "Rapports de bugs Ã  %s\n"
+
+#: convertquota.c:37
+#, c-format
+msgid ""
+"Utility for converting quota files.\n"
+"Usage:\n"
+"\t%s [-u] [-g] [-e|-f] mountpoint\n"
+msgstr ""
+"Utilitaire pour convertir les fichiers de quotas.\n"
+"Utilisation :\n"
+"\t%s [-u] [-g] [-e|-f] point_montage\n"
+
+#: convertquota.c:71
+msgid "Bad number of arguments."
+msgstr "Mauvais nombre d'arguments."
+
+#: convertquota.c:121 quotacheck_v2.c:214 quotaio_v2.c:276
+#, c-format
+msgid "Can't read block %u: %s\n"
+msgstr "Impossible de lire le bloc %u : %s\n"
+
+#: convertquota.c:145 convertquota.c:237
+#, c-format
+msgid "Can't commit dquot for id %u: %s\n"
+msgstr "Impossible de mettre Ã  jour dquot pour l'id %u : %s\n"
+
+#: convertquota.c:193
+msgid "Can't read header of old quotafile.\n"
+msgstr "Impossible de lire l'en-tête de l'ancien fichier de quotas.\n"
+
+#: convertquota.c:197
+msgid ""
+"Bad file magic or version (probably not quotafile with bad endianity).\n"
+msgstr "Mauvais type ou version de fichier (probablement pas un fichier de quotas avec endianess incorrect).\n"
+
+#: convertquota.c:208
+msgid "Can't read information about old quotafile.\n"
+msgstr "Impossible de lire l'information de l'ancien fichier de quotas.\n"
+
+#: convertquota.c:250
+msgid "Can't get name of new quotafile.\n"
+msgstr "Impossible d'obtenir le nom du nouveau fichier de quotas.\n"
+
+#: convertquota.c:256
+#, c-format
+msgid "Can't rename new quotafile %s to name %s: %s\n"
+msgstr "Impossible de renommer le nouveau fichier de quotas %s vers %s : %s\n"
+
+#: convertquota.c:270
+#, c-format
+msgid "Can't open old format file for %ss on %s\n"
+msgstr "Impossible d'ouvrir l'ancien fichier de format pour %ss sur %s\n"
+
+#: convertquota.c:275 convertquota.c:308
+#, c-format
+msgid "Can't create file for %ss for new format on %s: %s\n"
+msgstr "Impossible de créer le fichier pour %ss pour le nouveau format sur %s : %s\n"
+
+#: convertquota.c:298
+#, c-format
+msgid "Can't open old quota file on %s: %s\n"
+msgstr "Impossible d'ouvrir l'ancien fichier de quotas sur %s : %s\n"
+
+#: convertquota.c:334
+msgid "Unknown action should be performed.\n"
+msgstr "Une action inconnue doit Ãªtre exécutée.\n"
+
+#: edquota.c:68
+msgid ""
+"Usage:\tedquota [-r] [-u] [-F formatname] [-p username] [-f filesystem] "
+"username ...\n"
+msgstr "Utilisation : \tedquota [-r] [-u] [-F nom_format] [-p utilisateur] [-f système_fichier] utilisateur ...\n"
+
+#: edquota.c:69
+msgid ""
+"\tedquota [-r] -g [-F formatname] [-p groupname] [-f filesystem] "
+"groupname ...\n"
+msgstr "\tedquota [-r] -g [-F nom_format] [-p nom_groupe] [-f système_fichier] groupe ...\n"
+
+#: edquota.c:70
+msgid "\tedquota [-r] [-u|g] [-F formatname] [-f filesystem] -t\n"
+msgstr "\tedquota [-r] [-u|g] [-F nom_format] [-f système_fichier] -t\n"
+
+#: edquota.c:71
+msgid ""
+"\tedquota [-r] [-u|g] [-F formatname] [-f filesystem] -T username|"
+"groupname ...\n"
+msgstr "\tedquota [-r] [-u|g] [-F nom_format] [-f système_fichier] -T utilisateur|groupe ...\n"
+
+#: edquota.c:74
+msgid ""
+"Usage:\tedquota [-u] [-F formatname] [-p username] [-f filesystem] "
+"username ...\n"
+msgstr "Utilisation :\tedquota [-u] [-F nom_format] [-p utilisateur] [-f système_fichier] utilisateur ...\n"
+
+#: edquota.c:75
+msgid ""
+"\tedquota -g [-F formatname] [-p groupname] [-f filesystem] groupname ...\n"
+msgstr "\tedquota -g [-F nom_format] [-p groupe] [-f système_fichier] groupe ...\n"
+
+#: edquota.c:76
+msgid "\tedquota [-u|g] [-F formatname] [-f filesystem] -t\n"
+msgstr "\tedquota [-u|g] [-F nom_format] [-f système_fichier] -t\n"
+
+#: edquota.c:77
+msgid ""
+"\tedquota [-u|g] [-F formatname] [-f filesystem] -T username|groupname ...\n"
+msgstr "\tedquota [-u|g] [-F nom_format] [-f système_fichier] -T utilisateur|groupe ...\n"
+
+#: edquota.c:79 quota.c:160 setquota.c:57
+#, c-format
+msgid "Bugs to: %s\n"
+msgstr "Rapports de bugs Ã  : %s\n"
+
+#: edquota.c:153
+msgid "No filesystems with quota detected.\n"
+msgstr "Aucun système de fichier avec quotas détecté.\n"
+
+#: edquota.c:166
+msgid "fsname mismatch\n"
+msgstr "Incohérence de fsname\n"
+
+#: edquota.c:200
+msgid "Can't write grace times to file.\n"
+msgstr "Impossible d'écrire les temps de sursis dans le fichier.\n"
+
+#: edquota.c:204
+msgid "Error while editing grace times.\n"
+msgstr "Erreur lors de la modification des temps de sursis.\n"
+
+#: edquota.c:208
+msgid "Failed to parse grace times file.\n"
+msgstr "Échec lors de l'analyse du fichier des temps de sursis.\n"
+
+#: edquota.c:216
+msgid "Can't write individual grace times to file.\n"
+msgstr "Impossible d'écrire les temps de sursis individuels dans le fichier.\n"
+
+#: edquota.c:220
+msgid "Error while editing individual grace times.\n"
+msgstr "Erreur lors de la modification des temps de sursis individuels.\n"
+
+#: edquota.c:224
+msgid "Can't read individual grace times from file.\n"
+msgstr "Impossible de lire les temps de sursis individuels depuis le fichier.\n"
+
+#: edquota.c:236
+msgid "Can't write quotas to file.\n"
+msgstr "Impossible d'écrire les quotas dans le fichier.\n"
+
+#: edquota.c:240
+msgid "Error while editing quotas.\n"
+msgstr "Erreur lors de la modification des quotas.\n"
+
+#: edquota.c:244
+msgid "Can't read quotas from file.\n"
+msgstr "Impossible de lire les quotas depuis le fichier.\n"
+
+#: quota.c:135
+#, c-format
+msgid "quota: getgroups(): %s\n"
+msgstr "quota : getgroups() : %s\n"
+
+#: quota.c:157
+msgid "Usage: quota [-guqvs] [-l | -Q] [-F quotaformat]\n"
+msgstr "Utilisation : quota [-guqvs] [-l | -Q] [-F format_quota]\n"
+
+#: quota.c:158
+msgid "\tquota [-qvs] [-l | -Q] [-F quotaformat] -u username ...\n"
+msgstr "\tquota [-qvs] [-l | -Q] [-F format_quota] -u utilisateur ...\n"
+
+#: quota.c:159
+msgid "\tquota [-qvs] [-l | -Q] [-F quotaformat] -g groupname ...\n"
+msgstr "\tquota [-qvs] [-l | -Q] [-F format_quota] -g groupe ...\n"
+
+#: quota.c:186
+msgid "File limit reached on"
+msgstr "Limite de fichiers atteinte"
+
+#: quota.c:192
+msgid "In file grace period on"
+msgstr "Période de sursis fichiers activée"
+
+#: quota.c:196
+msgid "Over file quota on"
+msgstr "Quota dépassement fichiers activé"
+
+#: quota.c:202
+msgid "Block limit reached on"
+msgstr "Limite de blocs atteinte"
+
+#: quota.c:208
+msgid "In block grace period on"
+msgstr "Période de sursis blocs activée"
+
+#: quota.c:212
+msgid "Over block quota on"
+msgstr "Quota dépassement blocs activé"
+
+#: quota.c:253 quotasys.c:245
+msgid "none"
+msgstr "aucun"
+
+#: quota.c:261
+#, c-format
+msgid "Disk quotas for %s %s (%cid %d): %s\n"
+msgstr "Quotas disque pour %s %s (%cid %d) : %s\n"
+
+#: quota.c:264
+msgid "Filesystem"
+msgstr "Système fichiers"
+
+#: quota.c:265
+msgid "blocks"
+msgstr "blocs"
+
+#: quota.c:265 quota.c:266
+msgid "quota"
+msgstr "quota"
+
+#: quota.c:265 quota.c:266
+msgid "limit"
+msgstr "limite"
+
+#: quota.c:265 quota.c:266
+msgid "grace"
+msgstr "sursis"
+
+#: quota.c:266
+msgid "files"
+msgstr "fichiers"
+
+#: quotacheck.c:94
+msgid "Not enough memory.\n"
+msgstr "Pas assez de mémoire.\n"
+
+#: quotacheck.c:126
+#, c-format
+msgid "Adding hardlink for ino %d\n"
+msgstr "Ajout d'un lien dur pour ino %d\n"
+
+#: quotacheck.c:169
+#, c-format
+msgid "Adding dquot structure type %s for %d\n"
+msgstr "Ajout d'une structure dquot type %s pour %d\n"
+
+#: quotacheck.c:255
+#, c-format
+msgid "Cannot open file %s: %s\n"
+msgstr "Impossible d'ouvrir le fichier %s : %s\n"
+
+#: quotacheck.c:260
+msgid "Cannot get exact used space... Results might be inaccurate.\n"
+msgstr "Impossible d'obtenir l'espace exact utilisé... Les résultats risque d'être imprécis.\n"
+
+#: quotacheck.c:284
+#, c-format
+msgid ""
+"Utility for checking and repairing quota files.\n"
+"%s [-gucfinvdmMR] [-F <quota-format>] filesystem|-a\n"
+msgstr ""
+"Utilitaire pour vérifier et réparer les fichiers de quotas.\n"
+"%s [-gucfinvdmMR] [-F <format_quotas>] système_fichier|-a\n"
+
+#: quotacheck.c:349 quotaon.c:110 repquota.c:100 setquota.c:150
+msgid "Bad number of arguments.\n"
+msgstr "Mauvais nombre d'arguments.\n"
+
+#: quotacheck.c:353
+msgid "XFS quota format needs no checking.\n"
+msgstr "Le format de quotas XFS n'a pas besoin de vérification.\n"
+
+#: quotacheck.c:379
+#, c-format
+msgid "error (%d) while opening %s\n"
+msgstr "erreur (%d) lors de l'ouverture de %s\n"
+
+#: quotacheck.c:384
+#, c-format
+msgid "error (%d) while allocating inode file bitmap\n"
+msgstr "erreur (%d) lors de l'allocation de la bitmap des inodes fichier\n"
+
+#: quotacheck.c:389
+#, c-format
+msgid "errstr (%d) while allocating inode directory bitmap\n"
+msgstr "errstr (%d) lors de l'allocation de la bitmap des inodes répertoire\n"
+
+#: quotacheck.c:394
+#, c-format
+msgid "error (%d) while opening inode scan\n"
+msgstr "erreur (%d) lors de l'ouverture de l'analyse d'inode\n"
+
+#: quotacheck.c:399
+#, c-format
+msgid "error (%d) while starting inode scan\n"
+msgstr "erreur (%d) lors du démarrage de l'analyse d'inode\n"
+
+#: quotacheck.c:405
+#, c-format
+msgid "Found i_num %ld\n"
+msgstr "Trouvé i_num %ld\n"
+
+#: quotacheck.c:425
+#, c-format
+msgid "Something weird happened while scanning. Error %d\n"
+msgstr "Événement inattendu lors de l'analyse. Erreur %d\n"
+
+#: quotacheck.c:449
+#, c-format
+msgid ""
+"\n"
+"Can open directory %s: %s\n"
+msgstr "\nPossibilité ouverture répertoire %s : %s\n"
+
+#: quotacheck.c:459
+#, c-format
+msgid ""
+"lstat Cannot stat `%s/%s': %s\n"
+"Guess you'd better run fsck first !\n"
+"exiting...\n"
+msgstr ""
+"Impossible pour lstat d'exécuter stat() sur Â« %s/%s Â» : %s\n"
+"Il vaudrait mieux lancer fsck d'abord !\n"
+"Abandon...\n"
+
+#: quotacheck.c:478
+#, c-format
+msgid "pushd %s/%s\n"
+msgstr "pushd %s/%s\n"
+
+#: quotacheck.c:487
+#, c-format
+msgid "\tAdding %s size %d ino %d links %d\n"
+msgstr "\tAjout %s taille %s ino %s liens %d\n"
+
+#: quotacheck.c:497
+msgid "Scanning stored directories from directory stack\n"
+msgstr "Parcours des répertoires stockés depuis la pile des répertoires\n"
+
+#: quotacheck.c:501
+#, c-format
+msgid ""
+"popd %s\n"
+"Entering directory %s\n"
+msgstr ""
+"popd %s\n"
+"Entrée dans le répertoire %s\n"
+
+#: quotacheck.c:513
+#, c-format
+msgid "Leaving %s\n"
+msgstr "Quitte %s\n"
+
+#: quotacheck.c:553
+#, c-format
+msgid "Going to check %s quota file of %s\n"
+msgstr "Sur le point de vérifier %s fichier de quotas de %s\n"
+
+#: quotacheck.c:559
+#, c-format
+msgid ""
+"Quota for %ss is enabled on mountpoint %s so quotacheck might damage the "
+"file.\n"
+msgstr "Les quotas pour %ss sont actif sur le point de montage %s si bien que quotacheck risque d'endommager le fichier.\n"
+
+#: quotacheck.c:560 quotacheck.c:772
+msgid "Should I continue"
+msgstr "Dois-je continuer"
+
+#: quotacheck.c:561 quotacheck.c:773
+msgid "As you wish... Canceling check of this file.\n"
+msgstr "Suivant vos désirs... Abandon de la vérification de ce fichier.\n"
+
+#: quotacheck.c:566
+#, c-format
+msgid ""
+"Quota for %ss is enabled on mountpoint %s so quotacheck might damage the "
+"file.\n"
+"Please turn quotas off or use -f to force checking.\n"
+msgstr ""
+"Les quotas pour %ss sont actif sur le point de montage %s si bien que quotacheck risque d'endommager le fichier.\n"
+"Veuillez désactiver les quotas ou utiliser -f pour forcer la vérification.\n"
+
+#: quotacheck.c:573
+#, c-format
+msgid "Error while syncing quotas on %s: %s\n"
+msgstr "Erreur lors de la synchronisation des quotas sur %s\n"
+
+#: quotacheck.c:578
+#, c-format
+msgid "Cannot get quotafile name for %s\n"
+msgstr "Impossible d'obtenir le nom du fichier de quotas pour %s\n"
+
+#: quotacheck.c:583
+#, c-format
+msgid "Cannot open quotafile %s: %s\n"
+msgstr "Impossible d'ouvrir le fichier de quotas %s : %s\n"
+
+#: quotacheck.c:599
+#, c-format
+msgid "Too new quotafile format on %s\n"
+msgstr "Format de fichier de quotas trop récent sur %s\n"
+
+#: quotacheck.c:623
+msgid "Data dumped.\n"
+msgstr "Données déchargées.\n"
+
+#: quotacheck.c:625
+#, c-format
+msgid "Cannot get name of old quotafile on %s.\n"
+msgstr "Impossible d'obtenir le nom de l'ancien fichier de quotas sur %s.\n"
+
+#: quotacheck.c:628
+msgid "Old file not found.\n"
+msgstr "Ancien fichier non trouvé.\n"
+
+#: quotacheck.c:631
+#, c-format
+msgid "Error while searching for old quota file %s: %s\n"
+msgstr "Erreur lors de la recherche de l'ancien fichier de quotas %s : %s\n"
+
+#: quotacheck.c:638
+#, c-format
+msgid "Renaming old quotafile to %s~\n"
+msgstr "Renomme l'ancien fichier de quotas en %s~\n"
+
+#: quotacheck.c:644
+#, c-format
+msgid "Name of quota file too long. Contact %s.\n"
+msgstr "Nom du fichier de quotas trop long. Contactez %s.\n"
+
+#: quotacheck.c:646
+#, c-format
+msgid "Cannot rename old quotafile %s to %s: %s\n"
+msgstr "Impossible de renommer l'ancien fichier de quotas %s en %s : %s\n"
+
+#: quotacheck.c:652
+msgid "Renaming new quotafile\n"
+msgstr "Renommage du nouveau fichier de quotas\n"
+
+#: quotacheck.c:658
+#, c-format
+msgid "Cannot rename new quotafile %s to name %s: %s\n"
+msgstr "Impossible de renommer le nouveau fichier de quotas %s en %s : %s\n"
+
+#: quotacheck.c:664
+#, c-format
+msgid "Cannot change permission of %s: %s\n"
+msgstr "Impossible de changer les permissions de %s : %s\n"
+
+#: quotacheck.c:683
+#, c-format
+msgid "Dumping gathered data for %ss.\n"
+msgstr "Déchargement des données récupérées pour %ss.\n"
+
+#: quotacheck.c:685
+#, c-format
+msgid "Cannot initialize IO on new quotafile: %s\n"
+msgstr "Initialisation ES impossible sur le nouveau fichier de quotas : %s\n"
+
+#: quotacheck.c:703
+#, c-format
+msgid "Cannot finish IO on new quotafile: %s\n"
+msgstr "Impossible de terminer ES sur le nouveau fichier de quotas : %s\n"
+
+#: quotacheck.c:712
+#, c-format
+msgid "Cannot find checked quota file for %ss on %s!\n"
+msgstr "Impossible de trouver le fichier de quotas vérifié pour %ss sur %s !\n"
+
+#: quotacheck.c:716
+#, c-format
+msgid ""
+"Cannot turn %s quotas off on %s: %s\n"
+"Kernel won't know about changes quotacheck did.\n"
+msgstr ""
+"Impossible de désactiver les quotas %s sur %s : %s\n"
+"Le noyau ne sera pas informé des modifications que quotacheck a effectué.\n"
+
+#: quotacheck.c:726
+#, c-format
+msgid ""
+"Cannot turn %s quotas on on %s: %s\n"
+"Kernel won't know about changes quotacheck did.\n"
+msgstr ""
+"Impossible d'activer les quotas %s sur %s : %s\n"
+"Le noyau ne sera pas informé des modifications que quotacheck a effectué.\n"
+
+#: quotacheck.c:743
+#, c-format
+msgid "Cannot stat mountpoint %s: %s\n"
+msgstr "Impossible d'exécuter stat() sur le point de montage %s : %s\n"
+
+#: quotacheck.c:745
+#, c-format
+msgid "Mountpoint %s isn't directory?!\n"
+msgstr "Le point de montage %s n'est pas un répertoire ?!\n"
+
+#: quotacheck.c:771
+#, c-format
+msgid ""
+"Cannot remount filesystem mounted on %s read-only. Counted values might not "
+"be right.\n"
+msgstr "Impossible de remonter le système de fichier monté sur %s en lecture seule. Les valeurs comptabilisées riquent d'être fausses.\n"
+
+#: quotacheck.c:778
+#, c-format
+msgid ""
+"Cannot remount filesystem mounted on %s read-only so counted values might "
+"not be right.\n"
+"Please stop all programs writing to filesystem or use -m flag to force "
+"checking.\n"
+msgstr ""
+"Impossible de remonter le système de fichier monté sur %s en lecture seule, les valeurs comptabilisées riquent d'être fausses.\n"
+"Veuillez interrompre tous les programmes qui Ã©crivent sur ce système de fichiers ou utilisez l'option -m pour forcer la vérification.\n"
+
+#: quotacheck.c:785
+msgid "Filesystem remounted read-only\n"
+msgstr "Système de fichiers remonté en lecture seule\n"
+
+#: quotacheck.c:787
+#, c-format
+msgid "Scanning %s [%s] "
+msgstr "Parcours de %s [%s] "
+
+#: quotacheck.c:802
+msgid "done\n"
+msgstr "terminé\n"
+
+#: quotacheck.c:803
+#, c-format
+msgid "Checked %d directories and %d files\n"
+msgstr "Vérifié %d répertoires et %d fichiers\n"
+
+#: quotacheck.c:807
+#, c-format
+msgid ""
+"Cannot remount filesystem %s read-write. cannot write new quota files.\n"
+msgstr "Impossible de remonter le système de fichiers en lecture-écriture. Impossible d'écrire les nouveaux fichiers de quotas.\n"
+
+#: quotacheck.c:808
+msgid "Filesystem remounted RW.\n"
+msgstr "Système de fichiers remonté en lecture-écriture.\n"
+
+#: quotacheck.c:836
+#, c-format
+msgid "Can't find quota option on filesystem %s with quotas!\n"
+msgstr "Impossible de trouver le type de quota sur le système de fichiers %s !\n"
+
+#: quotacheck.c:861 quotasys.c:493
+msgid "Can't initialize mountpoint scan.\n"
+msgstr "Impossible d'initialiser l'analyse du point de montage.\n"
+
+#: quotacheck.c:866
+#, c-format
+msgid "Skipping %s [%s]\n"
+msgstr "Non traitement de %s [%s]\n"
+
+#: quotacheck.c:882
+#, c-format
+msgid ""
+"Cannot guess format from filename on %s. Please specify format on "
+"commandline.\n"
+msgstr "Impossible de deviner le format d'après le nom de fichier sur %s. Veuillez préciser le format sur la ligne de commande.\n"
+
+#: quotacheck.c:886
+#, c-format
+msgid "Detected quota format %s\n"
+msgstr "Format de quotas détecté %s\n"
+
+#: quotacheck.c:893
+msgid ""
+"Can't find filesystem to check or filesystem not mounted with quota option.\n"
+msgstr "Impossible de trouver un système de fichiers Ã  vérifier ou système de fichiers monté sans l'option de quotas.\n"
+
+#: quotacheck.c:906
+#, c-format
+msgid ""
+"Allocated %d bytes memory\n"
+"Free'd %d bytes\n"
+"Lost %d bytes\n"
+msgstr ""
+"%d octets de mémoire alloués\n"
+"%d octets libérés\n"
+"%d octets perdus\n"
+
+#: quotacheck_v1.c:30
+#, c-format
+msgid "Can't read entry for id %u from quotafile %s: %s\n"
+msgstr "Impossible de lire l'entrée pour l'id %u du fichier de quotas %s : %s\n"
+
+#: quotacheck_v1.c:33
+#, c-format
+msgid "Entry for id %u is truncated.\n"
+msgstr "L'entrée pour l'id %u est tronquée.\n"
+
+#: quotacheck_v1.c:55
+msgid "Loading first quota entry with grace times.\n"
+msgstr "Chargement de la première entrée de quota avec temps de sursis.\n"
+
+#: quotacheck_v1.c:59
+#, c-format
+msgid "Can't read first entry from quotafile %s: %s\n"
+msgstr "Impossible de lire la première entrée du fichier de quotas %s : %s\n"
+
+#: quotacheck_v1.c:63
+#, c-format
+msgid ""
+"WARNING - Quotafile %s was probably truncated. Can't save quota settings...\n"
+msgstr "ATTENTION - Le fichier de quotas %s a probablement Ã©té tronqué. Impossible d'enregistrer les réglages des quotas...\n"
+
+#: quotacheck_v1.c:69
+msgid "First entry loaded.\n"
+msgstr "Première entrée chargée.\n"
+
+#: quotacheck_v2.c:51
+msgid "Checking quotafile info...\n"
+msgstr "Vérification des informations du fichier de quotas...\n"
+
+#: quotacheck_v2.c:56
+#, c-format
+msgid "Can't read info from quota file %s: %s\n"
+msgstr "Impossible de lire les informations du fichier de quotas %s : %s\n"
+
+#: quotacheck_v2.c:61
+#, c-format
+msgid ""
+"WARNING - Quota file %s was probably truncated. Can't save quota "
+"settings...\n"
+msgstr "ATTENTION - Le fichier de quotas %s a probablement Ã©té tronqué. Impossible d'enregistrer les réglages des quotas...\n"
+
+#: quotacheck_v2.c:73
+msgid "WARNING - Quota file info was corrupted.\n"
+msgstr "ATTENTION - Les informations du fichier de quotas ont Ã©té corrompues.\n"
+
+#: quotacheck_v2.c:74
+#, c-format
+msgid ""
+"Size of file: %lu\n"
+"Blocks: %u Free block: %u Block with free entry: %u Flags: %x\n"
+msgstr ""
+"Taille du fichier : %lu\n"
+"Blocs : %u Blocs libres : %u Blocs avec entrées libres : %u Drapeaux : %x\n"
+
+#: quotacheck_v2.c:81
+#, c-format
+msgid ""
+"Setting grace times and other flags to default values.\n"
+"Assuming number of blocks is %u.\n"
+msgstr ""
+"Réglage des temps de sursis et autres drapeaux aux valeurs par défaut.\n"
+"Considère le nombre de blocs comme Ã©tant %u.\n"
+
+#: quotacheck_v2.c:91
+msgid "File info done.\n"
+msgstr "Informations fichier terminées.\n"
+
+#: quotacheck_v2.c:102
+msgid "Corrupted blocks: "
+msgstr "Blocs corrompus : "
+
+#: quotacheck_v2.c:106
+#, c-format
+msgid "Block %u: "
+msgstr "Bloc %u : "
+
+#: quotacheck_v2.c:157
+msgid "Duplicated entries."
+msgstr "Entrées redondantes."
+
+#: quotacheck_v2.c:161
+#, c-format
+msgid ""
+"Found more structures for ID %u. Using values: BHARD: %Ld BSOFT: %Ld IHARD: %"
+"Ld ISOFT: %Ld\n"
+msgstr "Trouvé plus de structures pour l'ID %u. Valeurs utilisées : BSTRICT : %Ld BSOUPLE : %Ld ISTRICT : %Ld ISOUPLE : %Ld\n"
+
+#: quotacheck_v2.c:167
+#, c-format
+msgid ""
+"\n"
+"Found more structures for ID %u. Values: BHARD: %Ld/%Ld BSOFT: %Ld/%Ld "
+"IHARD: %Ld/%Ld ISOFT: %Ld/%Ld\n"
+msgstr "\nTrouvé plus de structures pour l'ID %u. Valeurs : BSTRICT : %Ld/%Ld BSOUPLE : %Ld/%Ld ISTRICT : %Ld/%Ld ISOUPLE : %Ld/%Ld\n"
+
+#: quotacheck_v2.c:172
+msgid "Should I use new values"
+msgstr "Dois-je utiliser les nouvelles valeurs"
+
+#: quotacheck_v2.c:182
+#, c-format
+msgid ""
+"ID %u has more structures. User intervention needed (use -i for interactive "
+"mode or -n for automatic answer).\n"
+msgstr "L'ID %u possède plus de structures. Intervention de l'utilisateur nécessaire (utilisez -i pour le mode interactif ou -n pour une réponse automatique).\n"
+
+#: quotacheck_v2.c:216
+#, c-format
+msgid "Block %u is truncated.\n"
+msgstr "Le bloc %u est tronqué.\n"
+
+#: quotacheck_v2.c:225
+#, c-format
+msgid "Reference to illegal block %u"
+msgstr "Référence Ã  un bloc illégal %u"
+
+#: quotacheck_v2.c:230
+#, c-format
+msgid "Block %u in tree referenced twice"
+msgstr "Deux références dans l'arbre pour le bloc %u"
+
+#: quotacheck_v2.c:245
+#, c-format
+msgid "Illegal free block reference to block %u"
+msgstr "Référence bloc libre illégale vers le bloc %u"
+
+#: quotacheck_v2.c:248
+#, c-format
+msgid "Corrupted number of used entries (%u)"
+msgstr "Nombre d'entrées utilisées corrompu (%u)"
+
+#: quotacheck_v2.c:294
+msgid "Checking quotafile headers...\n"
+msgstr "Vérification des en-têtes du fichier de quotas...\n"
+
+#: quotacheck_v2.c:298
+#, c-format
+msgid "Can't read header from quotafile %s: %s\n"
+msgstr "Impossible de lire l'en-tête du fichier de quotas %s : %s\n"
+
+#: quotacheck_v2.c:300
+#, c-format
+msgid ""
+"WARNING -  Quotafile %s was probably truncated. Can't save quota "
+"settings...\n"
+msgstr "ATTENTION - Le fichier de quotas %s a probablement Ã©té tronqué. Impossible d'enregistrer les réglages des quotas...\n"
+
+#: quotacheck_v2.c:305
+#, c-format
+msgid "WARNING - Quota file %s has corrupted headers\n"
+msgstr "ATTENTION - Les en-têtes du fichier de quotas %s sont corrompus\n"
+
+#: quotacheck_v2.c:307
+msgid "Headers checked.\n"
+msgstr "En-têtes vérifiés.\n"
+
+#: quotacheck_v2.c:325
+#, c-format
+msgid "Headers of file %s checked. Going to load data...\n"
+msgstr "En-têtes du fichier %s vérifiés. Chargement des données imminent...\n"
+
+#: quotacheck_v2.c:333
+msgid "Can't gather quota data. Tree root node corrupted.\n"
+msgstr "Impossible de récupérer les données des quotas. Noeud racine de l'arbre corrompu.\n"
+
+#: quotacheck_v2.c:341
+msgid "WARNING - Some data might be changed due to corruption.\n"
+msgstr "ATTENTION - Certaines données risquent d'être modifiées suite Ã  la corruption.\n"
+
+#: quotacheck_v2.c:344
+msgid "Not found any corrupted blocks. Congratulations.\n"
+msgstr "Aucun bloc corrompu n'a Ã©té trouvé. Félicitations.\n"
+
+#: quotaio.c:59
+msgid "Only RPC quota format is allowed on NFS filesystem.\n"
+msgstr "Sur un système de fichiers NFS, seul le format de quotas RPC est autorisé.\n"
+
+#: quotaio.c:68
+msgid "RPC quota format not compiled.\n"
+msgstr "Le format de quotas RPC n'a pas Ã©té compilé.\n"
+
+#: quotaio.c:75
+msgid "Only XFS quota format is allowed on XFS filesystem.\n"
+msgstr "Sur un système de fichiers XFS, seul le format de quotas XFS est autorisé.\n"
+
+#: quotaio.c:86
+msgid "XFS quota allowed only on XFS filesystem.\n"
+msgstr "Quotas XFS autorisés uniquement sur un système de fichiers XFS.\n"
+
+#: quotaio.c:99
+msgid "Quota file not found or has wrong format.\n"
+msgstr "Le fichier de quotas est introuvable ou n'a pas le bon format.\n"
+
+#: quotaio.c:105 quotasys.c:427
+#, c-format
+msgid "Can't open quotafile %s: %s\n"
+msgstr "Impossible d'ouvrir le fichier de quotas %s : %s\n"
+
+#: quotaio.c:126
+#, c-format
+msgid "Can't initialize quota on %s: %s\n"
+msgstr "Impossible d'initialiser les quotas sur %s : %s\n"
+
+#: quotaio.c:154
+#, c-format
+msgid "Creation of %s quota format is not supported.\n"
+msgstr "La création de quotas au format %s n'est pas supportée.\n"
+
+#: quotaio.c:164
+#, c-format
+msgid "Can't create new quotafile %s: %s\n"
+msgstr "Impossible de créer le nouveau fichier de quotas %s : %s\n"
+
+#: quotaio_generic.c:49
+#, c-format
+msgid "Cannot get info for %s quota file from kernel on %s: %s\n"
+msgstr "Impossible d'obtenir du noyau les informations pour le fichier de quotas %s sur %s : %s\n"
+
+#: quotaio_generic.c:67
+#, c-format
+msgid "Cannot set info for %s quota file from kernel on %s: %s\n"
+msgstr "Impossible de fixer dans le noyau les informations pour le fichier de quotas %s sur %s : %s\n"
+
+#: quotaio_generic.c:79
+#, c-format
+msgid "Cannot get quota for %s %d from kernel on %s: %s\n"
+msgstr "Impossible d'obtenir du noyau les quotas pour %s %d sur %s : %s\n"
+
+#: quotaio_generic.c:94
+#, c-format
+msgid "Cannot set quota for %s %d from kernel on %s: %s\n"
+msgstr "Impossible de fixer les quotas dans le noyau pour %s %d sur %s : %s\n"
+
+#: quotaio_rpc.c:56 quotaio_v1.c:302 quotaio_v2.c:678
+#, c-format
+msgid "Trying to write quota to readonly quotafile on %s\n"
+msgstr "Tentative d'écriture des quotas dans un fichier en lecture seule sur %s\n"
+
+#: quotaio_v1.c:208
+#, c-format
+msgid "Trying to write info to readonly quotafile on %s.\n"
+msgstr "Tentative d'écriture des informations dans un fichier en lecture seule sur %s.\n"
+
+#: quotaio_v1.c:356 quotaio_v2.c:791
+#, c-format
+msgid "Can't sync quotas on device %s: %s\n"
+msgstr "Impossible de synchroniser les quotas sur le périphérique %s : %s\n"
+
+#: quotaio_v2.c:152
+msgid ""
+"Your quota file is stored in wrong endianity. Please use convertquota(8) to "
+"convert it.\n"
+msgstr "Votre fichier de quotas est stocké avec un ordre des octets incorrect. Veuillez utiliser convertquota(8) pour le convertir.\n"
+
+#: quotaio_v2.c:234
+#, c-format
+msgid "Trying to write info to readonly quotafile on %s\n"
+msgstr "Tentative d'écriture des informations dans un fichier en lecture seule sur %s\n"
+
+#: quotaio_v2.c:289
+#, c-format
+msgid "Can't write block (%u): %s\n"
+msgstr "Impossible d'écrire le bloc (%u) : %s\n"
+
+#: quotaio_v2.c:312
+msgid "Can't allocate new quota block (out of disk space).\n"
+msgstr "Impossible d'allouer un nouveau bloc de quota (plus d'espace disque disponible).\n"
+
+#: quotaio_v2.c:418
+msgid "find_free_dqentry(): Data block full but it shouldn't.\n"
+msgstr "find_free_dqentry() : bloc de données plein alors qu'il ne devrait pas l'être.\n"
+
+#: quotaio_v2.c:454
+#, c-format
+msgid "Inserting already present quota entry (block %u).\n"
+msgstr "Insertion d'une entrée de quota déjà présente (bloc %u).\n"
+
+#: quotaio_v2.c:477
+#, c-format
+msgid "Can't write quota (id %u): %s\n"
+msgstr "Impossible d'écrire les quotas (id %u) : %s\n"
+
+#: quotaio_v2.c:495
+#, c-format
+msgid "Quota write failed (id %u): %s\n"
+msgstr "Échec de l'écriture des quotas (id %u) : %s\n"
+
+#: quotaio_v2.c:506
+#, c-format
+msgid "Quota structure has offset to other block (%u) than it should (%u).\n"
+msgstr "La structure du quota comporte un décalage vers un autre bloc (%u) que celui qu'elle devrait (%u).\n"
+
+#: quotaio_v2.c:585
+#, c-format
+msgid "Quota for id %u referenced but not present.\n"
+msgstr "Quota pour l'id %u référencé mais absent.\n"
+
+#: quotaio_v2.c:661
+#, c-format
+msgid "Can't read quota structure for id %u: %s\n"
+msgstr "Impossible de lire la structure de quotas pour l'id %u : %s\n"
+
+#: quotaio_v2.c:813
+#, c-format
+msgid ""
+"Statistics:\n"
+"Total blocks: %u\n"
+"Data blocks: %u\n"
+"Entries: %u\n"
+"Used average: %f\n"
+msgstr ""
+"Statistiques :\n"
+"Total des blocs : %u\n"
+"Blocs de données : %u\n"
+"Entrées : %u\n"
+"Moyenne d'utilisation : %f\n"
+
+#: quotaio_xfs.c:242
+#, c-format
+msgid "*** Status for %s quotas on device %s\n"
+msgstr "*** Statut des quotas %s sur le périphérique %s\n"
+
+#: quotaio_xfs.c:244 quotaio_xfs.c:259
+msgid "ON"
+msgstr "ACTIVÉ"
+
+#: quotaio_xfs.c:244 quotaio_xfs.c:259
+msgid "OFF"
+msgstr "DESACTIVÉ"
+
+#: quotaio_xfs.c:246 quotaio_xfs.c:250
+#, c-format
+msgid "Accounting: %s; Enforcement: %s\n"
+msgstr "Compte : %s ; En vigueur : %s\n"
+
+#: quotaio_xfs.c:262 quotaio_xfs.c:266
+#, c-format
+msgid "Accounting [ondisk]: %s; Enforcement [ondisk]: %s\n"
+msgstr "Compte [sur disque] : %s ; En vigueur [sur disque] : %s\n"
+
+#: quotaio_xfs.c:275 quotaio_xfs.c:284
+msgid "Inode: none\n"
+msgstr "Inode : aucun\n"
+
+#: quotaio_xfs.c:277 quotaio_xfs.c:286
+#, c-format
+msgid "Inode: #%Lu (%Lu blocks, %u extents)\n"
+msgstr "Inode : #%Lu (%Lu blocs, %u Ã©tendus)\n"
+
+#: quotaon.c:67
+#, c-format
+msgid ""
+"Usage:\n"
+"\t%s [-guvp] [-F quotaformat] [-x state] -a\n"
+"\t%s [-guvp] [-F quotaformat] [-x state] filesys ...\n"
+msgstr ""
+"Utilisation :\n"
+"\t%s [-guvp] [-F formatquotas] [-x Ã©tat] -a\n"
+"\t%s [-guvp] [-F formatquotas] [-x Ã©tat] systèmefichiers ...\n"
+
+#: quotaon.c:114
+msgid "Can't turn on/off quotas via RPC.\n"
+msgstr "Impossible d'activer/désactiver les quotas via RPC.\n"
+
+#: quotaon.c:142
+msgid "Can't change state of XFS quota. It's not compiled in kernel.\n"
+msgstr "Impossible de changer l'état des quotas XFS. Non compilé dans le noyau.\n"
+
+#: quotaon.c:156
+#, c-format
+msgid "Cannot find quota file on %s [%s] to turn quotas on/off.\n"
+msgstr "Impossible de trouver le fichier de quotas sur %s [%s] pour activer/désactiver les quotas.\n"
+
+#: quotaon.c:199
+#, c-format
+msgid "quotactl on %s [%s]: %s\n"
+msgstr "quotactl sur %s [%s] : %s\n"
+
+#: quotaon.c:203
+#, c-format
+msgid "%s [%s]: %s quotas turned off\n"
+msgstr "%s [%s] : quotas %s désactivés\n"
+
+#: quotaon.c:216
+#, c-format
+msgid "can't find %s on %s [%s]\n"
+msgstr "impossible de trouver %s sur %s [%s]\n"
+
+#: quotaon.c:218
+#, c-format
+msgid "using %s on %s [%s]: %s\n"
+msgstr "utilisation de %s sur %s [%s] : %s\n"
+
+#: quotaon.c:220
+msgid "Maybe create new quota files with quotacheck(8)?\n"
+msgstr "Essayez peut-être de créer un nouveau fichier de quotas avec quotacheck(8) ?\n"
+
+#: quotaon.c:222
+msgid "Quota format not supported in kernel.\n"
+msgstr "Ce format de quotas n'est pas supporté par le noyau.\n"
+
+#: quotaon.c:226
+#, c-format
+msgid "%s [%s]: %s quotas turned on\n"
+msgstr "%s [%s] : quotas %s activés\n"
+
+#: quotaon.c:253
+#, c-format
+msgid "set root_squash on %s: %s\n"
+msgstr "Positionnez Â« root_squash Â» sur %s : %s\n"
+
+#: quotaon.c:257
+#, c-format
+msgid "%s: %s root_squash turned off\n"
+msgstr "%s : %s Â« root_squash Â» désactivé\n"
+
+#: quotaon.c:259
+#, c-format
+msgid "%s: %s root_squash turned on\n"
+msgstr "%s : %s Â« root_squash Â» activé\n"
+
+#: quotaon.c:311
+#, c-format
+msgid "Name must be quotaon or quotaoff not %s\n"
+msgstr "Le nom doit Ãªtre Â« quotaon Â» ou Â« quotaoff Â» et non %s\n"
+
+#: quotaon.c:317
+#, c-format
+msgid "Required format %s not supported by kernel.\n"
+msgstr "Le format requis %s n'est pas supporté par le noyau.\n"
+
+#: quotaon_xfs.c:34
+#, c-format
+msgid "quotactl() on %s: %s\n"
+msgstr "quotactl() sur %s : %s\n"
+
+#: quotaon_xfs.c:62 quotaon_xfs.c:84
+#, c-format
+msgid "Enabling %s quota on root filesystem (reboot to take effect)\n"
+msgstr "Activation des quotas %s sur le système de fichiers racine (redémarrez pour prise en compte)\n"
+
+#: quotaon_xfs.c:66
+#, c-format
+msgid "Enable XFS %s quota during mount\n"
+msgstr "Activer les quotas XFS %s au moment du montage\n"
+
+#: quotaon_xfs.c:76
+#, c-format
+msgid "Cannot delete %s quota on %s - switch quota accounting off first\n"
+msgstr "Impossible d'effacer les quotas %s sur %s - supprimez d'abord la prise en compte des quotas\n"
+
+#: quotaon_xfs.c:88
+#, c-format
+msgid "Enabling %s quota accounting on %s\n"
+msgstr "Activation de la prise en compte des quotas %s sur %s\n"
+
+#: quotaon_xfs.c:92
+#, c-format
+msgid "Disabling %s quota accounting on %s\n"
+msgstr "Suppression de la prise en compte des quotas %s sur %s\n"
+
+#: quotaon_xfs.c:102
+#, c-format
+msgid "Cannot delete %s quota on %s - switch quota enforcement off first\n"
+msgstr "Impossible d'effacer les quotas %s sur %s - supprimez d'abord l'application des quotas\n"
+
+#: quotaon_xfs.c:107
+#, c-format
+msgid "Enforcing %s quota already on %s\n"
+msgstr "Application des quotas %s déjà sur %s\n"
+
+#: quotaon_xfs.c:111
+#, c-format
+msgid "Disabling %s quota enforcement on %s\n"
+msgstr "Suppression de l'application des quotas %s sur %s\n"
+
+#: quotaon_xfs.c:118
+#, c-format
+msgid "Unexpected XFS quota state sought on %s\n"
+msgstr "État des quotas XFS inattendu trouvé sur %s\n"
+
+#: quotaon_xfs.c:133
+#, c-format
+msgid "quotactl on %s: %s\n"
+msgstr "quotactl sur %s : %s\n"
+
+#: quotaon_xfs.c:137
+#, c-format
+msgid "%s: %s quotas turned off\n"
+msgstr "%s : quotas %s désactivés\n"
+
+#: quotaon_xfs.c:139
+#, c-format
+msgid "%s: %s quotas turned on\n"
+msgstr "%s : quotas %s activés\n"
+
+#: quotaon_xfs.c:153
+#, c-format
+msgid "Failed to delete quota: %s\n"
+msgstr "Échec de la suppression des quotas : %s\n"
+
+#: quotaon_xfs.c:159
+#, c-format
+msgid "%s: deleted %s quota blocks\n"
+msgstr "%s : blocs des quotas %s effacés\n"
+
+#: quotaon_xfs.c:220
+#, c-format
+msgid "Invalid argument \"%s\"\n"
+msgstr "Argument incorrect Â« %s Â»\n"
+
+#: quotaops.c:110
+#, c-format
+msgid "%s (uid %d): Permission denied\n"
+msgstr "%s (uid %d) : permission refusée\n"
+
+#: quotaops.c:116
+#, c-format
+msgid "Error while trying getgroups(): %s\n"
+msgstr "Erreur lors de l'exécution de getgroups() : %s\n"
+
+#: quotaops.c:126
+#, c-format
+msgid "%s (gid %d): Permission denied\n"
+msgstr "%s (gid %d) : permission refusée\n"
+
+#: quotaops.c:139
+#, c-format
+msgid "Error while getting quota from %s for %u: %s\n"
+msgstr "Erreur lors de la recherche des quotas de %s pour %u : %s\n"
+
+#: quotaops.c:163
+#, c-format
+msgid "Can't write quota for %u on %s: %s\n"
+msgstr "Impossible d'écrire les quotas pour %u sur %s : %s\n"
+
+#: quotaops.c:200
+#, c-format
+msgid "Can't exec %s\n"
+msgstr "Impossible d'exécuter %s\n"
+
+#: quotaops.c:219 quotaops.c:404
+#, c-format
+msgid "Can't duplicate descriptor of file to write to: %s\n"
+msgstr "Impossible de dupliquer le descripteur du fichier Ã  Ã©crire : %s\n"
+
+#: quotaops.c:222
+#, c-format
+msgid "Disk quotas for %s %s (%cid %d):\n"
+msgstr "Quotas disque pour %s %s (%cid %d) :\n"
+
+#: quotaops.c:226
+msgid ""
+"  Filesystem                   blocks       soft       hard     inodes     "
+"soft     hard\n"
+msgstr " Système de fichiers           blocs       souple     stricte   inodes    souple   stricte\n"
+
+#: quotaops.c:238
+#, c-format
+msgid "Quotas for %s %s:\n"
+msgstr "Quotas pour %s %s :\n"
+
+#: quotaops.c:240 quotaops.c:244
+#, c-format
+msgid "%s %d, limits (soft = %d, hard = %d)\n"
+msgstr "%s %d, limites (souple = %d, stricte = %d)\n"
+
+#: quotaops.c:241
+msgid "blocks in use:"
+msgstr "blocs utilisés :"
+
+#: quotaops.c:245
+msgid "\tinodes in use:"
+msgstr "\tinodes utilisés :"
+
+#: quotaops.c:271
+#, c-format
+msgid "WARNING - %s: cannot change current block allocation\n"
+msgstr "ATTENTION - %s : impossible de modifier l'allocation actuelle des blocs\n"
+
+#: quotaops.c:274
+#, c-format
+msgid "WARNING - %s: cannot change current inode allocation\n"
+msgstr "ATTENTION - %s : impossible de modifier l'allocation actuelle des inodes\n"
+
+#: quotaops.c:297 quotaops.c:446
+#, c-format
+msgid "Can't duplicate descriptor of temp file: %s\n"
+msgstr "Impossible de dupliquer le descripteur du fichier temporaire : %s\n"
+
+#: quotaops.c:311
+#, c-format
+msgid ""
+"Bad format:\n"
+"%s\n"
+msgstr ""
+"Format incorrect :\n"
+"%s\n"
+
+#: quotaops.c:324 quotaops.c:588
+#, c-format
+msgid "%s - bad format\n"
+msgstr "%s - format incorrect\n"
+
+#: quotaops.c:328
+#, c-format
+msgid "%s -  %s -- bad format\n"
+msgstr "%s -  %s -- format incorrect\n"
+
+#: quotaops.c:333
+#, c-format
+msgid " blocks in use: %Lu, limits (soft = %Lu, hard = %Lu)"
+msgstr "blocs utilisés : %Lu, limites (souple = %Lu, stricte = %Lu)"
+
+#: quotaops.c:336 quotaops.c:342 quotaops.c:350 quotaops.c:592 quotaops.c:599
+#, c-format
+msgid "%s - %s -- bad format\n"
+msgstr "%s - %s -- format incorrect\n"
+
+#: quotaops.c:347
+#, c-format
+msgid "\tinodes in use: %Lu, limits (soft = %Lu, hard = %Lu)"
+msgstr "\tinodes utilisés : %Lu, limites (souple = %Lu, stricte = %Lu)"
+
+#: quotaops.c:406
+#, c-format
+msgid "Times to enforce softlimit for %s %s (%cid %d):\n"
+msgstr "Temps avant l'application de la limite souple pour %s %s (%cid %d) :\n"
+
+#: quotaops.c:408 quotaops.c:511 quotaops.c:520
+msgid "Time units may be: days, hours, minutes, or seconds\n"
+msgstr "Unités de temps peuvent Ãªtre : days (jours), hours (heures), minutes, ou seconds\n"
+
+#: quotaops.c:410
+msgid ""
+"  Filesystem                         block grace               inode grace\n"
+msgstr "  Système de fichiers                 sursis bloc               sursis inode\n"
+
+#: quotaops.c:415 quotaops.c:421 quotaops.c:463 quotaops.c:475 setquota.c:174
+#: setquota.c:180
+msgid "unset"
+msgstr "vide"
+
+#: quotaops.c:417 quotaops.c:423
+msgid "0seconds"
+msgstr "0seconds"
+
+#: quotaops.c:425 quotasys.c:277
+#, c-format
+msgid "%useconds"
+msgstr "%useconds"
+
+#: quotaops.c:460 quotaops.c:576
+#, c-format
+msgid ""
+"bad format:\n"
+"%s\n"
+msgstr ""
+"format incorrect :\n"
+"%s\n"
+
+#: quotaops.c:470 quotaops.c:606
+msgid "Bad time units. Units are 'second', 'minute', 'hour' and 'day'.\n"
+msgstr "Mauvaise unité de temps. Les unités sont Â« second Â», Â« minute Â», Â« hour Â» et Â« day Â».\n"
+
+#: quotaops.c:506
+#, c-format
+msgid "Can't duplicate descriptor of file to edit: %s\n"
+msgstr "Impossible de dupliquer le descripteur du fichier Ã  Ã©diter : %s\n"
+
+#: quotaops.c:509 quotaops.c:521
+#, c-format
+msgid "Grace period before enforcing soft limits for %ss:\n"
+msgstr "Sursis avant l'application des limites souples pour %ss :\n"
+
+#: quotaops.c:512
+msgid "  Filesystem             Block grace period     Inode grace period\n"
+msgstr "  Système de fichiers  période de sursis bloc  période de sursis inode\n"
+
+#: quotaops.c:526
+#, c-format
+msgid "block grace period: %s, file grace period: %s\n"
+msgstr "période de sursis bloc : %s, période de sursis fichier : %s\n"
+
+#: quotaops.c:554
+#, c-format
+msgid "Can't reopen temp file: %s\n"
+msgstr "Impossible de ré-ouvrir le fichier temporaire : %s\n"
+
+#: quotaops.c:596
+#, c-format
+msgid " block grace period: %d %s file grace period: %d %s"
+msgstr " période de sursis bloc : %d %s période de sursis fichier : %d %s"
+
+#: quotastats.c:48
+#, c-format
+msgid "Can't read stat file %s: %s\n"
+msgstr "Impossible de lire le fichier de statistiques %s : %s\n"
+
+#: quotastats.c:83
+#, c-format
+msgid "Error while getting quota statistics from kernel: %s\n"
+msgstr "Erreur lors de la récupération des statistiques des quotas du noyau : %s\n"
+
+#: quotastats.c:87
+#, c-format
+msgid "Error while getting old quota statistics from kernel: %s\n"
+msgstr "Erreur lors de la récupération des anciennes statistiques des quotas du noyau : %s\n"
+
+#: quotastats.c:101
+msgid "Kernel quota version: old\n"
+msgstr "Version quotas du noyau : ancienne\n"
+
+#: quotastats.c:103
+#, c-format
+msgid "Kernel quota version: %u.%u.%u\n"
+msgstr "Version quotas du noyau : %u.%u.%u\n"
+
+#: quotastats.c:104
+#, c-format
+msgid "Number of dquot lookups: %ld\n"
+msgstr "Nombre de requêtes dquot : %ld\n"
+
+#: quotastats.c:105
+#, c-format
+msgid "Number of dquot drops: %ld\n"
+msgstr "Nombre de rejets dquot : %ld\n"
+
+#: quotastats.c:106
+#, c-format
+msgid "Number of dquot reads: %ld\n"
+msgstr "Nombre de lectures dquot : %ld\n"
+
+#: quotastats.c:107
+#, c-format
+msgid "Number of dquot writes: %ld\n"
+msgstr "Nombre d'écritures dquot : %ld\n"
+
+#: quotastats.c:108
+#, c-format
+msgid "Number of quotafile syncs: %ld\n"
+msgstr "Nombre de synchro fichier de quotas : %ld\n"
+
+#: quotastats.c:109
+#, c-format
+msgid "Number of dquot cache hits: %ld\n"
+msgstr "Nombre de succès cache dquot : %ld\n"
+
+#: quotastats.c:110
+#, c-format
+msgid "Number of allocated dquots: %ld\n"
+msgstr "Nombre de dquots alloués : %ld\n"
+
+#: quotastats.c:111
+#, c-format
+msgid "Number of free dquots: %ld\n"
+msgstr "Nombre de dquots libre : %ld\n"
+
+#: quotastats.c:112
+#, c-format
+msgid "Number of in use dquot entries (user/group): %ld\n"
+msgstr "Nombre d'entrées dquot utilisées (utilisateur/groupe) : %ld\n"
+
+#: quotasys.c:70
+#, c-format
+msgid "User %s doesn't exist.\n"
+msgstr "L'utilisateur %s n'existe pas.\n"
+
+#: quotasys.c:89
+#, c-format
+msgid "Group %s doesn't exist.\n"
+msgstr "Le groupe %s n'existe pas.\n"
+
+#: quotasys.c:186
+#, c-format
+msgid ""
+"Unknown quota format: %s\n"
+"Supported formats are:\n"
+"  vfsold - original quota format\n"
+"  vfsv0 - new quota format\n"
+"  rpc - use RPC calls\n"
+"  xfs - XFS quota format\n"
+msgstr ""
+"Format de quotas inconnu : %s\n"
+"Les formats supportés sont :\n"
+"  vfsold - format de quotas original\n"
+"  vfsv0 - nouveau format de quotas\n"
+"  rpc - utilise les appels RPC\n"
+"  xfs - format de quotas XFS\n"
+
+#: quotasys.c:201
+msgid "Unknown format"
+msgstr "Format inconnu"
+
+#: quotasys.c:265
+#, c-format
+msgid "%ddays"
+msgstr "%ddays"
+
+#: quotasys.c:267
+#, c-format
+msgid "%02d:%02d"
+msgstr "%02d:%02d"
+
+#: quotasys.c:279
+#, c-format
+msgid "%uminutes"
+msgstr "%uminutes"
+
+#: quotasys.c:281
+#, c-format
+msgid "%uhours"
+msgstr "%uhours"
+
+#: quotasys.c:283
+#, c-format
+msgid "%udays"
+msgstr "%udays"
+
+#: quotasys.c:411
+#, c-format
+msgid "Can't stat quota file %s: %s\n"
+msgstr "Impossible d'exécuter stat() sur le fichier de quotas %s : %s\n"
+
+#: quotasys.c:497 quotasys.c:505
+#, c-format
+msgid "Too many mountpoints with quota. Contact %s\n"
+msgstr "Trop de points de montage avec quotas. Contactez %s\n"
+
+#: quotasys.c:515
+msgid "Not all specified mountpoints are using quota.\n"
+msgstr "Les points de montage spécifiés n'utilisent pas tous les quotas.\n"
+
+#: quotasys.c:528
+#, c-format
+msgid "Error while releasing file on %s\n"
+msgstr "Erreur lors de la libération fichier sur %s\n"
+
+#: quotasys.c:586
+#, c-format
+msgid "Can't create set for sigaction(): %s\n"
+msgstr "Impossible de créer le Â« set Â» pour sigaction() : %s\n"
+
+#: quotasys.c:589
+#, c-format
+msgid "Can't set signal handler: %s\n"
+msgstr "Impossible de mettre en place le gestionnaire de signal : %s\n"
+
+#: quotasys.c:620
+#, c-format
+msgid "Can't reset signal handler: %s\n"
+msgstr "Impossible de réinitialiser le gestionnaire de signal : %s\n"
+
+#: quotasys.c:727 quotasys.c:732 warnquota.c:425
+#, c-format
+msgid "Can't open %s: %s\n"
+msgstr "Impossible d'ouvrir %s : %s\n"
+
+#: quotasys.c:745
+#, c-format
+msgid "Can't get device name for %s\n"
+msgstr "Impossible d'obtenir le nom de périphérique pour %s\n"
+
+#: quotasys.c:749
+#, c-format
+msgid "Can't resolve mountpoint path %s: %s\n"
+msgstr "Impossible de résoudre le chemin du point de montage %s : %s\n"
+
+#: quotasys.c:754
+#, c-format
+msgid "Can't statfs() %s: %s\n"
+msgstr "Impossible d'exécuter statfs() sur %s : %s\n"
+
+#: quotasys.c:766
+#, c-format
+msgid "Can't stat() mounted device %s: %s\n"
+msgstr "Impossible d'exécuter stat() sur le périphérique monté %s : %s\n"
+
+#: quotasys.c:782
+#, c-format
+msgid "Can't find device of loopback mount in options for %s. Skipping.\n"
+msgstr "Impossible de trouver dans les options le périphérique de montage de la loopback pour %s. Rejet.\n"
+
+#: quotasys.c:791
+#, c-format
+msgid "Can't stat() loopback device %s: %s\n"
+msgstr "Impossible d'exécuter stat() sur le périphérique loopback %s : %s\n"
+
+#: quotasys.c:796
+#, c-format
+msgid "Loopback device %s isn't block device!\n"
+msgstr "Le périphérique loopback %s n'est pas un périphérique en mode bloc !\n"
+
+#: quotasys.c:805
+#, c-format
+msgid ""
+"Device (%s) filesystem is mounted on isn't block or character device nor "
+"it's loopback or bind mount. Skipping.\n"
+msgstr "Le périphérique (%s) sur lequel est monté le système de fichiers n'est pas un périphérique bloc ou caractère ni un montage Â« loopback Â» ou nommé. Rejet.\n"
+
+#: quotasys.c:817
+#, c-format
+msgid "Can't stat() mountpoint %s: %s\n"
+msgstr "Impossible d'exécuter stat() sur le point de montage %s : %s\n"
+
+#: quotasys.c:874
+#, c-format
+msgid ""
+"Can't stat() given mountpoint %s: %s\n"
+"Skipping...\n"
+msgstr ""
+"Impossible d'exécuter stat() sur le point de montage donné %s : %s\n"
+"Rejet...\n"
+
+#: quotasys.c:883
+#, c-format
+msgid "Can't find filesystem mountpoint for directory %s\n"
+msgstr "Impossible de trouver le point de montage du système de fichiers pour le répertoire %s\n"
+
+#: quotasys.c:889
+#, c-format
+msgid "Can't resolve path %s: %s\n"
+msgstr "Impossible de résoudre le chemin %s : %s\n"
+
+#: quotasys.c:899
+#, c-format
+msgid "Can't find mountpoint for device %s\n"
+msgstr "Impossible de trouver le point de montage pour le périphérique %s\n"
+
+#: quotasys.c:905
+#, c-format
+msgid "Specified path %s is not directory nor device.\n"
+msgstr "Le chemin spécifié %s n'est ni un répertoire ni un périphérique.\n"
+
+#: quotasys.c:912
+msgid "No correct mountpoint specified.\n"
+msgstr "Aucun point de montage correct spécifié.\n"
+
+#: quotasys.c:973
+#, c-format
+msgid "Mountpoint (or device) %s not found.\n"
+msgstr "Point de montage (ou périphérique) %s introuvable.\n"
+
+#: quot.c:80
+#, c-format
+msgid "Usage: %s [-acfugvV] [filesystem...]\n"
+msgstr "Utilisation : %s [-acfugvV] [systèmefichiers...]\n"
+
+#: quot.c:168
+#, c-format
+msgid "%s (%s):\n"
+msgstr "%s (%s) :\n"
+
+#: quot.c:172 quot.c:176
+#, c-format
+msgid "%d\t%llu\t%llu\n"
+msgstr "%d\t%llu\t%llu\n"
+
+#: quot.c:185
+#, c-format
+msgid "%s (%s) %s:\n"
+msgstr "%s (%s) %s :\n"
+
+#: quot.c:192 quot.c:194
+#, c-format
+msgid "%8llu    "
+msgstr "%8llu    "
+
+#: quot.c:196
+#, c-format
+msgid "%-8.8s"
+msgstr "%-8.8s"
+
+#: quot.c:198
+#, c-format
+msgid "#%-7d"
+msgstr "#%-7d"
+
+#: quot.c:200
+#, c-format
+msgid "    %8llu    %8llu    %8llu"
+msgstr "    %8llu    %8llu    %8llu"
+
+#: quot.c:348
+#, c-format
+msgid "cannot open %s: %s\n"
+msgstr "Impossible d'ouvrir %s : %s\n"
+
+#: quot.c:368
+#, c-format
+msgid "XFS_IOC_FSBULKSTAT ioctl failed: %s\n"
+msgstr "Échec de ioctl XFS_IOC_FSBULKSTAT : %s\n"
+
+#: repquota.c:45
+#, c-format
+msgid ""
+"Utility for reporting quotas.\n"
+"Usage:\n"
+"%s [-vugs] [-c|C] [-t|n] [-F quotaformat] (-a | mntpoint)\n"
+msgstr ""
+"Utilitaire de génération de rapports pour les quotas.\n"
+"Utilisation :\n"
+"%s [-vugs] [-c|C] [-t|n] [-F formatquotas] (-a | pointmontage)\n"
+
+#: repquota.c:104
+msgid "Repquota can't report through RPC calls.\n"
+msgstr "Repquota ne peut pas générer de rapport en utilisant des appels RPC.\n"
+
+#: repquota.c:108
+msgid "Specified both -n and -t but only one of them can be used.\n"
+msgstr "Spécification de -n et -t alors qu'un seul des deux peut Ãªtre utilisé Ã  la fois.\n"
+
+#: repquota.c:237
+#, c-format
+msgid "*** Report for %s quotas on device %s\n"
+msgstr "*** Rapport pour les quotas %s sur le périphérique %s\n"
+
+#: repquota.c:240
+#, c-format
+msgid "Block grace time: %s; Inode grace time: %s\n"
+msgstr "Période de sursis bloc : %s ; période de sursis inode : %s\n"
+
+#: repquota.c:241
+msgid "                        Block limits                File limits\n"
+msgstr "                        Limites bloc               Limites fichier\n"
+
+#: repquota.c:242
+#, c-format
+msgid "%-9s       used    soft    hard  grace    used  soft  hard  grace\n"
+msgstr "%-9s     utilisé souple stricte sursis utilisé souple stricte sursis\n"
+
+#: repquota.c:242
+msgid "User"
+msgstr "Utilisateur"
+
+#: repquota.c:242
+msgid "Group"
+msgstr "Groupe"
+
+#: rquota_svc.c:76
+#, c-format
+msgid ""
+"Usage: %s [options]\n"
+"Options are:\n"
+" -h --help         shows this text\n"
+" -V --version      shows version information\n"
+" -F --foreground   starts the quota service in foreground\n"
+" -s --no-setquota  disables remote calls to setquota (default)\n"
+" -S --setquota     enables remote calls to setquota\n"
+msgstr ""
+"Utilisation : %s [options]\n"
+"Avec pour options :\n"
+" -h --help         affichage de ce texte\n"
+" -V --version      affiche les informations de version\n"
+" -F --foreground   démarre le service quotas en avant-plan\n"
+" -s --no-setquota  désactive l'utilisation d'appels distants Ã  setquota (défaut)\n"
+" -S --setquota     active l'utilisation d'appels distants Ã  setquota\n"
+
+#: rquota_svc.c:83
+#, c-format
+msgid ""
+"Usage: %s [options]\n"
+"Options are:\n"
+" -h --help         shows this text\n"
+" -V --version      shows version information\n"
+" -F --foreground   starts the quota service in foreground\n"
+msgstr ""
+"Utilisation : %s [options]\n"
+"Avec pour options :\n"
+" -h --help         affiche ce texte\n"
+" -V --version      affiche les informations de version\n"
+" -F --foreground   démarre le service quotas en avant-plan\n"
+
+#: rquota_svc.c:110
+#, c-format
+msgid "Unknown option '%c'.\n"
+msgstr "Option non reconnue Â« %c Â».\n"
+
+#: rquota_svc.c:134
+#, c-format
+msgid "host %s attempted to call setquota when disabled\n"
+msgstr "La machine %s a tenté d'appeler setquota alors qu'il est désactivé\n"
+
+#: rquota_svc.c:141
+#, c-format
+msgid "host %s attempted to call setquota from port >= 1024\n"
+msgstr "La machine %s a tenté d'appeler setquota depuis un port >= 1024\n"
+
+#: rquota_svc.c:177
+#, c-format
+msgid "Denied access to host %s\n"
+msgstr "Accès refusé Ã  la machine %s\n"
+
+#: rquota_svc.c:265 rquota_svc.c:351
+msgid "unable to free arguments\n"
+msgstr "Imposible de libérer les arguments\n"
+
+#: rquota_svc.c:391
+msgid "cannot create udp service.\n"
+msgstr "Impossible de créer le service udp.\n"
+
+#: rquota_svc.c:395
+msgid "unable to register (RQUOTAPROG, RQUOTAVERS, udp).\n"
+msgstr "Impossible d'enregistrer (RQUOTAPROG, RQUOTAVERS, udp).\n"
+
+#: rquota_svc.c:399
+msgid "unable to register (RQUOTAPROG, EXT_RQUOTAVERS, udp).\n"
+msgstr "Impossible d'enregistrer (RQUOTAPROG, EXT_RQUOTAVERS, udp).\n"
+
+#: rquota_svc.c:406
+msgid "cannot create tcp service.\n"
+msgstr "impossible de créer le service tcp.\n"
+
+#: rquota_svc.c:410
+msgid "unable to register (RQUOTAPROG, RQUOTAVERS, tcp).\n"
+msgstr "Imposible d'enregistrer (RQUOTAPROG, RQUOTAVERS, tcp).\n"
+
+#: rquota_svc.c:414
+msgid "unable to register (RQUOTAPROG, EXT_RQUOTAVERS, tcp).\n"
+msgstr "Impossible d'enregistrer (RQUOTAPROG, EXT_RQUOTAVERS, tcp).\n"
+
+#: rquota_svc.c:423
+msgid "svc_run returned\n"
+msgstr "Retour de svc_run\n"
+
+#: set_limits_example.c:18
+#, c-format
+msgid "copy_user_quota_limits: Failed to set userquota for uid %ld : %s\n"
+msgstr "copy_user_quota_limits : Ã©chec dans le réglage des quotas utilisateur pour l'uid %ld : %s\n"
+
+#: set_limits_example.c:25
+#, c-format
+msgid "copy_user_quota_limits: Failed to get userquota for uid %ld : %s\n"
+msgstr "copy_user_quota_limits : Ã©chec dans la récupération des quotas utilisateur pour l'uid %ld : %s\n"
+
+#: set_limits_example.c:41
+#, c-format
+msgid "copy_group_quota_limits: Failed to set groupquota for uid %ld : %s\n"
+msgstr "copy_group_quota_limits : Ã©chec dans le réglage des quotas groupe pour l'uid %ld : %s\n"
+
+#: set_limits_example.c:48
+#, c-format
+msgid "copy_group_quota_limits: Failed to get groupquota for uid %ld : %s\n"
+msgstr "copy_group_quota_limits : Ã©chec dans la récupération des quotas groupe pour l'uid %ld : %s\n"
+
+#: setquota.c:43
+msgid ""
+"Usage:\n"
+"  setquota [-u|-g] [-r] [-F quotaformat] <user|group>\n"
+"\t<block-softlimit> <block-hardlimit> <inode-softlimit> <inode-hardlimit> -a|"
+"<filesystem>...\n"
+"  setquota [-u|-g] [-r] [-F quotaformat] <-p protouser|protogroup> <user|"
+"group> -a|<filesystem>...\n"
+"  setquota [-u|-g] [-F quotaformat] -t <blockgrace> <inodegrace> -a|"
+"<filesystem>...\n"
+"  setquota [-u|-g] [-F quotaformat] <user|group> -T <blockgrace> "
+"<inodegrace> -a|<filesystem>...\n"
+msgstr ""
+"Utilisation :\n"
+"  setquota [-u|-g] [-r] [-F formatquotas] <utilisateur|groupe>\n"
+"\t<limite_souple_bloc> <limite_stricte_bloc> <limite_souple_inode> <limite_stricte_inode> -a|<système_fichiers>...\n"
+"  setquota [-u|-g] [-r] [-F formatquotas] <-p utilisateur_prototype|groupe_prototype> <utilisateur|groupe> -a|<système_fichiers>...\n"
+"  setquota [-u|-g] [-F formatquotas] -t <sursis_bloc> <sursis_inode> -a|<systèmes_fichiers>...\n"
+"  setquota [-u|-g] [-F formatquotas] <utilisateur|groupe> -T <sursis_bloc> <sursis_inode> -a|<système_fichiers>...\n"
+
+#: setquota.c:50
+msgid ""
+"Usage:\n"
+"  setquota [-u|-g] [-F quotaformat] <user|group>\n"
+"\t<block-softlimit> <block-hardlimit> <inode-softlimit> <inode-hardlimit> -a|"
+"<filesystem>...\n"
+"  setquota [-u|-g] [-F quotaformat] <-p protouser|protogroup> <user|group> -"
+"a|<filesystem>...\n"
+"  setquota [-u|-g] [-F quotaformat] -t <blockgrace> <inodegrace> -a|"
+"<filesystem>...\n"
+"  setquota [-u|-g] [-F quotaformat] <user|group> -T <blockgrace> "
+"<inodegrace> -a|<filesystem>...\n"
+msgstr ""
+"Utilisation :\n"
+"  setquota [-u|-g] [-F formatquotas] <utilisateur|groupe>\n"
+"\t<limite_souple_bloc> <limite_stricte_bloc> <limite_souple_inode> <limite_stricte_inode> -a|<système_fichiers>...\n"
+"  setquota [-u|-g] [-F formatquotas] <-p utilisateur_prototype|groupe_prototype> <utilisateur|groupe> -a|<système_fichiers>...\n"
+"  setquota [-u|-g] [-F formatquotas] -t <sursis_bloc> <sursis_inode> -a|<système_fichiers>...\n"
+"  setquota [-u|-g] [-F formatquotas] <utilisateur|groupe> -T <sursis_bloc> <sursis_inode> -a|<système_fichiers>...\n"
+
+#: setquota.c:68
+#, c-format
+msgid "Bad %s: %s\n"
+msgstr "Mauvais %s : %s\n"
+
+#: setquota.c:133
+msgid "Group and user quotas can't be used together.\n"
+msgstr "Les quotas groupes et utilisateurs ne peuvent pas Ãªtre utilisés simultanément.\n"
+
+#: setquota.c:137
+msgid "Prototype user has no sense when editing grace times.\n"
+msgstr "Un prototype d'utilisateur n'a pas lieu d'être pour la modification des temps de sursis.\n"
+
+#: setquota.c:158
+msgid "block softlimit"
+msgstr "limite souple bloc"
+
+#: setquota.c:159
+msgid "block hardlimit"
+msgstr "limite stricte bloc"
+
+#: setquota.c:160
+msgid "inode softlimit"
+msgstr "limite souple inode"
+
+#: setquota.c:161
+msgid "inode hardlimit"
+msgstr "limite stricte inode"
+
+#: setquota.c:167 setquota.c:179
+msgid "block grace time"
+msgstr "temps de sursis bloc"
+
+#: setquota.c:168 setquota.c:185
+msgid "inode grace time"
+msgstr "temps de sursis inode"
+
+#: setquota.c:191
+msgid "Mountpoint not specified.\n"
+msgstr "Point de montage non spécifié.\n"
+
+#: setquota.c:250
+#, c-format
+msgid ""
+"Can't write times for %s. Maybe kernel doesn't support such operation?\n"
+msgstr "Impossible d'écrire les temps pour %s. Le noyau supporte-t'il une telle opération ?\n"
+
+#: svc_socket.c:40
+#, c-format
+msgid "Cannot create socket: %s\n"
+msgstr "Impossible de créer la socket : %s\n"
+
+#: svc_socket.c:47
+#, c-format
+msgid "Cannot set socket options: %s\n"
+msgstr "Impossible de fixer les options de la socket : %s\n"
+
+#: svc_socket.c:76
+#, c-format
+msgid "Cannot bind to given address: %s\n"
+msgstr "Impossible d'exécuter bind() avec l'adresse donnée : %s\n"
+
+#: warnquota.c:48
+msgid ""
+"Hi,\n"
+"\n"
+"We noticed that you are in violation with the quotasystem\n"
+"used on this system. We have found the following violations:\n"
+"\n"
+msgstr ""
+"Bonjour,\n"
+"\n"
+"Il semblerait que vous soyez en violation avec le mécanisme de\n"
+"quotas utilisé sur ce système. Voici les dépassements relevés :\n"
+"\n"
+
+#: warnquota.c:50
+#, c-format
+msgid ""
+"\n"
+"We hope that you will cleanup before your grace period expires.\n"
+"\n"
+"Basically, this means that the system thinks you are using more disk space\n"
+"on the above partition(s) than you are allowed.  If you do not delete files\n"
+"and get below your quota before the grace period expires, the system will\n"
+"prevent you from creating new files.\n"
+"\n"
+"For additional assistance, please contact us at %s\n"
+"or via phone at %s.\n"
+msgstr ""
+"\n"
+"Nous espérons que vous ferez de la place avant que votre période de\n"
+"sursis n'expire.\n"
+"\n"
+"En clair, tout cela signifie que le système pense que vous utilisez\n"
+"plus d'espace disque qu'il ne vous est autorisé sur la (les)\n"
+"partition(s) ci-dessus. Si vous n'effacez pas de fichiers pour passer\n"
+"en-dessous de votre quota avant que votre période de sursis\n"
+"expire, le système vous empéchera de créer de nouveaux fichiers.\n"
+"\n"
+"Pour plus de renseignements, veuillez nous contacter au %s\n"
+"ou par téléphone au %s.\n"
+
+#: warnquota.c:57
+#, c-format
+msgid ""
+"Hi,\n"
+"\n"
+"We noticed that the group %s you are member of violates the quotasystem\n"
+"used on this system. We have found the following violations:\n"
+"\n"
+msgstr ""
+"Bonjour,\n"
+"\n"
+"Il semblerait que le groupe %s dont vous Ãªtes membre soit en violation avec\n"
+"le mécanisme de quotas utilisé sur ce système. Voici les dépassements relevés :\n"
+"\n"
+
+#: warnquota.c:59
+#, c-format
+msgid ""
+"\n"
+"Please cleanup the group data before the grace period expires.\n"
+"\n"
+"Basically, this means that the system thinks group is using more disk space\n"
+"on the above partition(s) than it is allowed.  If you do not delete files\n"
+"and get below group quota before the grace period expires, the system will\n"
+"prevent you and other members of the group from creating new files owned by\n"
+"the group.\n"
+"\n"
+"For additional assistance, please contact us at %s\n"
+"or via phone at %s.\n"
+msgstr ""
+"\n"
+"Veuillez faire de la place dans les données du groupe avant que la\n"
+"période de sursis n'expire.\n"
+"\n"
+"En clair, tout cela signifie que le système pense que le groupe utilise\n"
+"plus d'espace disque qu'il n'est autorisé sur la (les)\n"
+"partition(s) ci-dessus. Si vous n'effacez pas de fichiers pour passer\n"
+"en-dessous du quota du groupe avant que la période de sursis\n"
+"expire, le système vous empéchera, Ã  vous ainsi qu'aux autres membres du\n"
+"groupe, de créer de nouveaux fichiers appartenant Ã  ce groupe.\n"
+"\n"
+"Pour plus de renseignements, veuillez nous contacter au %s\n"
+"ou par téléphone au %s.\n"
+
+#: warnquota.c:135
+#, c-format
+msgid "Can't get name for uid/gid %u.\n"
+msgstr "Impossible d'obtenir un nom pour les uid/gid %u.\n"
+
+#: warnquota.c:188
+#, c-format
+msgid "Can't create pipe: %s\n"
+msgstr "Impossible de créer un tube : %s\n"
+
+#: warnquota.c:194
+#, c-format
+msgid "Can't fork: %s\n"
+msgstr "Impossible d'exécuter fork() : %s\n"
+
+#: warnquota.c:199
+#, c-format
+msgid "Can't duplicate descriptor: %s\n"
+msgstr "Impossible de dupliquer le descripteur : %s\n"
+
+#: warnquota.c:203
+#, c-format
+msgid "Can't execute '%s': %s\n"
+msgstr "Impossible d'exécuter Â« %s Â» : %s\n"
+
+#: warnquota.c:208
+#, c-format
+msgid "Can't open pine: %s\n"
+msgstr "Impossible d'ouvrir Â« pine Â» : %s\n"
+
+#: warnquota.c:233
+#, c-format
+msgid "Administrator for a group %s not found. Cancelling mail.\n"
+msgstr "Administrateur pour le groupe %s non trouvé. Abandon de l'envoi du courrier.\n"
+
+#: warnquota.c:266
+msgid ""
+"\n"
+"                        Block limits               File limits\n"
+msgstr "\n                        Limites bloc               Limites fichiers\n"
+
+#: warnquota.c:267
+msgid ""
+"Filesystem           used    soft    hard  grace    used  soft  hard  grace\n"
+msgstr "Système fichiers   utilisé souple stricte sursis utilisé souple stricte sursis\n"
+
+#: warnquota.c:300
+#, c-format
+msgid "Can't wait for mailer: %s\n"
+msgstr "Impossible d'attendre le client de messagerie : %s\n"
+
+#: warnquota.c:302
+msgid "Warning: Mailer exitted abnormally.\n"
+msgstr "Attention : le client de messagerie s'est terminé de manière inattendue.\n"
+
+#: warnquota.c:359
+#, c-format
+msgid ""
+"Can't open %s: %s\n"
+"Will use device names.\n"
+msgstr ""
+"Impossible d'ouvrir %s : %s\n"
+"Utilisation des noms de périphériques.\n"
+
+#: warnquota.c:382
+#, c-format
+msgid "Can't parse line %d in quotatab (missing ':')\n"
+msgstr "Impossible d'analyser la ligne %d dans quotatab (il manque Â« : Â»)\n"
+
+#: warnquota.c:396
+#, c-format
+msgid "Can't stat device %s (maybe typo in quotatab)\n"
+msgstr "Impossible d'exécuter stat() sur le périphérique %s (erreur de syntaxe dans quotatab ?)\n"
+
+#: warnquota.c:445
+#, c-format
+msgid "Line %d too long. Truncating.\n"
+msgstr "Ligne %d trop longue. Tronquée.\n"
+
+#: warnquota.c:495
+#, c-format
+msgid "Error in config file (line %d), ignoring\n"
+msgstr "Erreur dans le fichier de configuration (ligne %d), ignorée\n"
+
+#: warnquota.c:498
+#, c-format
+msgid "Possible error in config file (line %d), ignoring\n"
+msgstr "Erreur probable dans le fichier de configuration (ligne %d), ignorée\n"
+
+#: warnquota.c:501
+msgid "Unterminated last line, ignoring\n"
+msgstr "Dernière ligne non terminée, ignorée\n"
+
+#: warnquota.c:520
+#, c-format
+msgid "Can't open file with group administrators: %s\n"
+msgstr "Impossible d'ouvrir le fichier contenant les administrateurs de groupes : %s\n"
+
+#: warnquota.c:535
+#, c-format
+msgid "Parse error at line %d. Can't find end of group name.\n"
+msgstr "Erreur d'analyse Ã  la ligne %d. Impossible de trouver la fin du nom de groupe.\n"
+
+#: warnquota.c:544
+#, c-format
+msgid "Parse error at line %d. Can't find administrators name.\n"
+msgstr "Erreur d'analyse Ã  la ligne %d. Impossible de trouver le nom des administrateurs.\n"
+
+#: warnquota.c:554
+#, c-format
+msgid ""
+"Parse error at line %d. Trailing characters after administrators name.\n"
+msgstr "Erreur d'analyse Ã  la ligne %d. Caractères parasites après le nom des administrateurs.\n"
+
+#: warnquota.c:601
+msgid ""
+"Usage:\n"
+"  warnquota [-ug] [-F quotaformat] [-c configfile] [-q quotatabfile]\n"
+msgstr ""
+"Utilisation :\n"
+"  warnquota [-ug] [-F formatquotas] [-c fichierconfig] [-q fichierquotatab]\n"
+
+#: xqmstats.c:30
+msgid "The running kernel does not support XFS\n"
+msgstr "Le noyau en cours d'exécution de supporte pas XFS\n"
+
+#: xqmstats.c:41
+msgid "XFS Quota Manager dquot statistics\n"
+msgstr "Statistiques dquot du gestionnaire de quotas XFS\n"
+
+#: xqmstats.c:42
+#, c-format
+msgid "  reclaims:        %u\n"
+msgstr "  demandes :           %u\n"
+
+#: xqmstats.c:43
+#, c-format
+msgid "  missed reclaims: %u\n"
+msgstr "  demandes manquées :  %u\n"
+
+#: xqmstats.c:44
+#, c-format
+msgid "  dquot dups:      %u\n"
+msgstr "  dquot en double :    %u\n"
+
+#: xqmstats.c:45
+#, c-format
+msgid "  cache misses:    %u\n"
+msgstr "  défaut de cache :    %u\n"
+
+#: xqmstats.c:46
+#, c-format
+msgid "  cache hits:      %u\n"
+msgstr "  succès cache :       %u\n"
+
+#: xqmstats.c:47
+#, c-format
+msgid "  dquot wants:     %u\n"
+msgstr "  besoins dquot :      %u\n"
+
+#: xqmstats.c:48
+#, c-format
+msgid "  shake reclaims:  %u\n"
+msgstr "  demandes entamées :  %u\n"
+
+#: xqmstats.c:49
+#, c-format
+msgid "  inact reclaims:  %u\n"
+msgstr "  demandes inactives : %u\n"
+
+#: xqmstats.c:52
+#, c-format
+msgid "Maximum %u dquots (currently %u incore, %u on freelist)\n"
+msgstr "Maximum %u dquots (actuellement %u inclus, %u sur liste libre)\n"
diff --git a/po/pl.po b/po/pl.po
new file mode 100644 (file)
index 0000000..08b0225
--- /dev/null
+++ b/po/pl.po
@@ -0,0 +1,2696 @@
+# Polish translation for quota.
+# Copyright (C) 2000, 2003, 2004, 2005 Free Software Foundation, Inc.
+# PAUL NIEWIADOMSKI <lilo@free.poltronic.net>, 2000.
+# Jakub Bogusz <qboosh@pld-linux.org>, 2003-2007.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: quota 3.15\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-08-05 02:34+0200\n"
+"PO-Revision-Date: 2007-08-05 02:35+0200\n"
+"Last-Translator: Jakub Bogusz <qboosh@pld-linux.org>\n"
+"Language-Team: Polish <translation-team-pl@lists.sourceforge.net>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-2\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: bylabel.c:251
+#, c-format
+msgid "Found an invalid UUID: %s\n"
+msgstr "Znaleziono nieprawid³owy UUID: %s\n"
+
+#: bylabel.c:271
+#, c-format
+msgid "Error checking device name: %s\n"
+msgstr "B³±d podczas sprawdzania nazwy urz±dzenia: %s\n"
+
+#: common.c:122
+#, c-format
+msgid "Quota utilities version %s.\n"
+msgstr "Narzêdzia Quota w wersji %s.\n"
+
+#: common.c:124
+#, c-format
+msgid "Compiled with "
+msgstr "Skompilowano z "
+
+#: common.c:126
+msgid "RPC and EXT2_DIRECT"
+msgstr "RPC i EXT2_DIRECT"
+
+#: common.c:128
+msgid "RPC"
+msgstr "RPC"
+
+#: common.c:130
+msgid "EXT2_DIRECT"
+msgstr "EXT2_DIRECT"
+
+#: common.c:133 convertquota.c:45 quotacheck.c:317 repquota.c:62
+#: warnquota.c:982
+#, c-format
+msgid "Bugs to %s\n"
+msgstr "B³êdy na adres %s\n"
+
+#: convertquota.c:38
+#, c-format
+msgid ""
+"Utility for converting quota files.\n"
+"Usage:\n"
+"\t%s [options] mountpoint\n"
+"\n"
+"-u, --user            convert user quota file\n"
+"-g, --group           convert group quota file\n"
+"-e, --convert-endian  convert quota file to correct endianity\n"
+"-f, --convert-format  convert from old to VFSv0 quota format\n"
+"-h, --help            show this help text and exit\n"
+"-V, --version         output version information and exit\n"
+"\n"
+msgstr ""
+"Narzêdzie do konwersji plików limitów.\n"
+"Sk³adnia:\n"
+"\t%s [opcje] punkt-montowania\n"
+"\n"
+"-u, --user            konwersja pliku limitów u¿ytkowników (user)\n"
+"-g, --group           konwersja pliku limitów grup (group)\n"
+"-e, --convert-endian  konwersja pliku limitów do poprawnej kolejno¶ci bajtów\n"
+"-f, --convert-format  konwersja ze starego formatu limitów na VFSv0\n"
+"-h, --help            wy¶wietlenie tego opisu i zakoñczenie\n"
+"-V, --version         wy¶wietlenie informacji o wersji i zakoñczenie\n"
+
+#: convertquota.c:87
+msgid "Bad number of arguments."
+msgstr "B³êdna liczba argumentów."
+
+#: convertquota.c:137 quotacheck_v2.c:219 quotaio_v2.c:276
+#, c-format
+msgid "Cannot read block %u: %s\n"
+msgstr "Nie mo¿na odczytaæ bloku %u: %s\n"
+
+#: convertquota.c:161 convertquota.c:253
+#, c-format
+msgid "Cannot commit dquot for id %u: %s\n"
+msgstr "Nie mo¿na utrwaliæ dquot dla id %u: %s\n"
+
+#: convertquota.c:209
+msgid "Cannot read header of old quotafile.\n"
+msgstr "Nie mo¿na odczytaæ nag³ówka starego pliku limitów.\n"
+
+#: convertquota.c:213
+msgid "Bad file magic or version (probably not quotafile with bad endianity).\n"
+msgstr "B³êdny magic lub wersja (raczej nie plik limitów dla innego procesora).\n"
+
+#: convertquota.c:224
+msgid "Cannot read information about old quotafile.\n"
+msgstr "Nie mo¿na odczytaæ informacji o starym pliku limitów.\n"
+
+#: convertquota.c:266
+msgid "Cannot get name of new quotafile.\n"
+msgstr "Nie mo¿na uzyskaæ nazwy nowego pliku limitów.\n"
+
+#: convertquota.c:272 quotacheck.c:746
+#, c-format
+msgid "Cannot rename new quotafile %s to name %s: %s\n"
+msgstr "Nie mo¿na zmieniæ nazwy nowego pliku limitów %s na %s: %s\n"
+
+#: convertquota.c:286
+#, c-format
+msgid "Cannot open old format file for %ss on %s\n"
+msgstr "Nie mo¿na otworzyæ pliku limitów %s w starym formacie na %s\n"
+
+#: convertquota.c:291 convertquota.c:324
+#, c-format
+msgid "Cannot create file for %ss for new format on %s: %s\n"
+msgstr "Nie mo¿na utworzyæ pliku limitów %s dla nowego formatu na %s: %s\n"
+
+#: convertquota.c:314
+#, c-format
+msgid "Cannot open old quota file on %s: %s\n"
+msgstr "Nie mo¿na otworzyæ starego pliku limitów na %s: %s\n"
+
+#: convertquota.c:350
+msgid "Unknown action should be performed.\n"
+msgstr "Mia³a byæ wykonana nieznana akcja.\n"
+
+#: edquota.c:82
+#, c-format
+msgid ""
+"Usage:\n"
+"\tedquota %1$s[-u] [-F formatname] [-p username] [-f filesystem] username ...\n"
+"\tedquota %1$s-g [-F formatname] [-p groupname] [-f filesystem] groupname ...\n"
+"\tedquota %1$s[-u|g] [-F formatname] [-f filesystem] -t\n"
+"\tedquota %1$s[-u|g] [-F formatname] [-f filesystem] -T username|groupname ...\n"
+msgstr ""
+"Sk³adnia:\n"
+"\tedquota %1$s[-u] [-F format] [-p u¿ytkownik] [-f system-plików] u¿ytkownik ...\n"
+"\tedquota %1$s-g [-F format] [-p grupa] [-f system-plików] grupa ...\n"
+"\tedquota %1$s[-u|g] [-F format] [-f system-plików] -t\n"
+"\tedquota %1$s[-u|g] [-F format] [-f system-plików] -T u¿ytkownik|grupa ...\n"
+
+#: edquota.c:86
+msgid ""
+"\n"
+"-u, --user                    edit user data\n"
+"-g, --group                   edit group data\n"
+msgstr ""
+"\n"
+"-u, --user                    zmiana danych u¿ytkownika\n"
+"-g, --group                   zmiana danych grupy\n"
+
+#: edquota.c:90
+msgid "-r, --remote                  edit remote quota (via RPC)\n"
+msgstr "-r, --remote                  zmiana zdalnego limitu (poprzez RPC)\n"
+
+#: edquota.c:92
+msgid ""
+"-F, --format=formatname       edit quotas of a specific format\n"
+"-p, --prototype=name          copy data from a prototype user/group\n"
+"    --always-resolve          always try to resolve name, even if it is\n"
+"                              composed only of digits\n"
+"-f, --filesystem=filesystem   edit data only on a specific filesystem\n"
+"-t, --edit-period             edit grace period\n"
+"-T, --edit-times              edit grace time of a user/group\n"
+"-h, --help                    display this help text and exit\n"
+"-V, --version                 display version information and exit\n"
+"\n"
+msgstr ""
+"-F, --format=format           zmiana limitów w podanym formacie\n"
+"-p, --prototype=nazwa         skopiowanie danych od wzorcowego u¿ytkownika/grupy\n"
+"    --always-resolve          próba rozwi±zania nazwy zawsze, nawet je¶li\n"
+"                              sk³ada siê wy³±cznie z cyfr\n"
+"-f, --filesystem=system-plików  zmiana danych tylko na podanym systemie plików\n"
+"-t, --edit-period             zmiana okresu pob³a¿liwo¶ci\n"
+"-T, --edit-times              zmiana czasu pob³a¿liwo¶ci u¿ytkownika/grupy\n"
+"-h, --help                    wy¶wietlenie tego opisu i zakoñczenie\n"
+"-V, --version                 wy¶wietlenie informacji o wersji i zakoñczenie\n"
+"\n"
+
+#: edquota.c:101 quota.c:107 setquota.c:71
+#, c-format
+msgid "Bugs to: %s\n"
+msgstr "B³êdy na adres: %s\n"
+
+#: edquota.c:178
+msgid "Prototype name does not make sense when editing grace period or times.\n"
+msgstr "Wzorcowy u¿ytkownik nie ma sensu przy edycji okresów pob³a¿liwo¶ci.\n"
+
+#: edquota.c:199
+msgid "fsname mismatch\n"
+msgstr "nazwa systemu plików siê nie zgadza\n"
+
+#: edquota.c:239
+msgid "No filesystems with quota detected.\n"
+msgstr "Nie wykryto systemów plików z limitami.\n"
+
+#: edquota.c:255
+#, c-format
+msgid "Cannot create temporary file: %s\n"
+msgstr "Nie mo¿na utworzyæ pliku tymczasowego: %s\n"
+
+#: edquota.c:260
+#, c-format
+msgid "Cannot change owner of temporary file: %s\n"
+msgstr "Nie mo¿na zmieniæ w³a¶ciciela pliku tymczasowego: %s\n"
+
+#: edquota.c:267
+msgid "Cannot write grace times to file.\n"
+msgstr "Nie mo¿na zapisaæ okresów pob³a¿liwo¶ci do pliku.\n"
+
+#: edquota.c:271
+msgid "Error while editting grace times.\n"
+msgstr "B³±d podczas edycji okresów pob³a¿liwo¶ci.\n"
+
+#: edquota.c:275
+msgid "Failed to parse grace times file.\n"
+msgstr "Analiza pliku okresów pob³a¿liwo¶ci nie powiod³a siê.\n"
+
+#: edquota.c:284
+msgid "Cannot write individual grace times to file.\n"
+msgstr "Nie mo¿na zapisaæ do pliku pojedynczych okresów pob³a¿liwo¶ci.\n"
+
+#: edquota.c:289
+msgid "Error while editting individual grace times.\n"
+msgstr "B³±d podczas edycji pojedynczych okresów pob³a¿liwo¶ci.\n"
+
+#: edquota.c:294
+msgid "Cannot read individual grace times from file.\n"
+msgstr "Nie mo¿na odczytaæ z pliku pojedynczych okresów pob³a¿liwo¶ci.\n"
+
+#: edquota.c:308
+msgid "Cannot write quotas to file.\n"
+msgstr "Nie mo¿na zapisaæ limitów do pliku.\n"
+
+#: edquota.c:313
+msgid "Error while editting quotas.\n"
+msgstr "B³±d podczas edycji limitów.\n"
+
+#: edquota.c:319
+msgid "Cannot reopen!"
+msgstr "Nie mo¿na ponownie otworzyæ!"
+
+#: edquota.c:321
+msgid "Cannot read quotas from file.\n"
+msgstr "Nie mo¿na odczytaæ limitów z pliku.\n"
+
+#: quot.c:83
+#, c-format
+msgid "Usage: %s [-acfugvViTq] [filesystem...]\n"
+msgstr "Sk³adnia: %s [-acfugvViTq] [system-plików...]\n"
+
+#: quot.c:180
+#, c-format
+msgid "%s (%s):\n"
+msgstr "%s (%s):\n"
+
+#: quot.c:184 quot.c:188
+#, c-format
+msgid "%d\t%llu\t%llu\n"
+msgstr "%d\t%llu\t%llu\n"
+
+#: quot.c:197
+#, c-format
+msgid "%s (%s) %s:\n"
+msgstr "%s (%s) %s:\n"
+
+#: quot.c:205 quot.c:207
+#, c-format
+msgid "%8llu    "
+msgstr "%8llu    "
+
+#: quot.c:210
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: quot.c:212
+#, c-format
+msgid "%-8.8s"
+msgstr "%-8.8s"
+
+#: quot.c:214
+#, c-format
+msgid "#%-7d"
+msgstr "#%-7d"
+
+#: quot.c:216
+#, c-format
+msgid "    %8llu    %8llu    %8llu"
+msgstr "    %8llu    %8llu    %8llu"
+
+#: quot.c:364
+#, c-format
+msgid "cannot open %s: %s\n"
+msgstr "nie mo¿na otworzyæ %s: %s\n"
+
+#: quot.c:384
+#, c-format
+msgid "XFS_IOC_FSBULKSTAT ioctl failed: %s\n"
+msgstr "ioctl XFS_IOC_FSBULKSTAT nie powiód³ siê: %s\n"
+
+#: quota.c:84
+msgid "Usage: quota [-guqvsw] [-l | [-Q | -A]] [-i] [-F quotaformat]\n"
+msgstr "Sk³adnia: quota [-guqvsw] [-l | [-Q | -A]] [-i] [-F format]\n"
+
+#: quota.c:85
+msgid "\tquota [-qvsw] [-l | [-Q | -A]] [-i] [-F quotaformat] -u username ...\n"
+msgstr "\tquota [-qvsw] [-l | [-Q | -A]] [-i] [-F format] -u u¿ytkownik ...\n"
+
+#: quota.c:86
+msgid "\tquota [-qvsw] [-l | [-Q | -A]] [-i] [-F quotaformat] -g groupname ...\n"
+msgstr "\tquota [-qvsw] [-l | [-Q | -A]] [-i] [-F format] -g grupa ...\n"
+
+#: quota.c:87
+msgid "\tquota [-qvswugQ] [-F quotaformat] -f filesystem ...\n"
+msgstr "\tquota [-qvswugQ] [-F format] -f system-plików ...\n"
+
+#: quota.c:88
+msgid ""
+"\n"
+"-u, --user                display quota for user\n"
+"-g, --group               display quota for group\n"
+"-q, --quiet               print more terse message\n"
+"-v, --verbose             print more verbose message\n"
+"-s, --human-readable      display numbers in human friendly units (MB, GB...)\n"
+"    --always-resolve      always try to translate name to id, even if it is\n"
+"\t\t\t  composed of only digits\n"
+"-w, --no-wrap             do not wrap long lines\n"
+"-p, --raw-grace           print grace time in seconds since epoch\n"
+"-l, --local-only          do not query NFS filesystems\n"
+"-Q, --quiet-refuse        do not print error message when NFS server does\n"
+"                          not respond\n"
+"-i, --no-autofs           do not query autofs mountpoints\n"
+"-F, --format=formatname   display quota of a specific format\n"
+"-f, --filesystem-list     display quota information only for given filesystems\n"
+"-A, --nfs-all             display quota for all NFS mountpoints\n"
+"-h, --help                display this help message and exit\n"
+"-V, --version             display version information and exit\n"
+"\n"
+msgstr ""
+"\n"
+"-u, --user                wy¶wietlenie limitów dla u¿ytkownika\n"
+"-g, --group               wy¶wietlenie limitów dla grupy\n"
+"-q, --quiet               wypisywanie bardziej zwiêz³ych komunikatów\n"
+"-v, --verbose             wypisywanie bardziej wyczerpuj±cych komunikatów\n"
+"-s, --human-readable      wy¶wietlanie liczb w jednostkach przyjaznych dla\n"
+"                          cz³owieka (MB, GB...)\n"
+"    --always-resolve      próba rozwi±zania nazwy zawsze, nawet je¶li sk³ada\n"
+"                          siê wy³±cznie z cyfr\n"
+"-w, --no-wrap             nie zawijanie d³ugich linii\n"
+"-p, --raw-grace           wypisywanie czasu pob³a¿liwo¶ci w sekundach od epoch\n"
+"-l, --local-only          nie odpytywanie serwera NFS\n"
+"-Q, --quiet-refuse        nie wypisywanie komunikatów b³êdów je¶li serwer NFS\n"
+"                          nie odpowiada\n"
+"-i, --no-autofs           nie odpytywanie punktów montowania autofs\n"
+"-F, --format=format       wy¶wietlenie limitów w podanym formacie\n"
+"-f, --filesystem-list     wy¶wietlenie informacji tylko dla podanych systemów\n"
+"                          plików\n"
+"-A, --nfs-all             wy¶wietlenie limitów dla wszystkich NFS-ów\n"
+"-h, --help                wy¶wietlenie tego opisu i zakoñczenie\n"
+"-V, --version             wy¶wietlenie informacji o wersji i zakoñczenie\n"
+"\n"
+
+#: quota.c:113
+#, c-format
+msgid "Disk quotas for %s %s (%cid %u): %s\n"
+msgstr "Ograniczenia dyskowe %s %s (%cid %u): %s\n"
+
+#: quota.c:116
+msgid "Filesystem"
+msgstr "System plików"
+
+#: quota.c:117
+msgid "blocks"
+msgstr "bloki"
+
+#: quota.c:117 quota.c:118
+msgid "quota"
+msgstr "miêkki"
+
+#: quota.c:117 quota.c:118
+msgid "limit"
+msgstr "twardy"
+
+#: quota.c:117 quota.c:118
+msgid "grace"
+msgstr "pob³."
+
+#: quota.c:118
+msgid "files"
+msgstr "pliki"
+
+#: quota.c:144
+msgid "File limit reached on"
+msgstr "Twardy limit plików osi±gniêty na"
+
+#: quota.c:150
+msgid "In file grace period on"
+msgstr "Okres pob³a¿liwo¶ci dla plików na"
+
+#: quota.c:154
+msgid "Over file quota on"
+msgstr "Miêkki limit dla plików przekroczony na"
+
+#: quota.c:160
+msgid "Block limit reached on"
+msgstr "Twardy limit bloków osi±gniêty na"
+
+#: quota.c:166
+msgid "In block grace period on"
+msgstr "Okres pob³a¿liwo¶ci dla bloków na"
+
+#: quota.c:170
+msgid "Over block quota on"
+msgstr "Miêkki limit dla bloków przekroczony na"
+
+#: quota.c:232 quotasys.c:298
+msgid "none"
+msgstr "brak"
+
+#: quota.c:324
+#, c-format
+msgid "Warning: Ignoring -%c when filesystem list specified.\n"
+msgstr "Uwaga: Zignorowano -%c kiedy zosta³a podana lista systemów plików.\n"
+
+#: quota.c:331
+msgid "No filesystem specified.\n"
+msgstr "Nie podano systemu plików.\n"
+
+#: quota.c:339
+#, c-format
+msgid "Gid set allocation (%d): %s\n"
+msgstr "Przydzielenie zbioru gid (%d): %s\n"
+
+#: quota.c:345
+#, c-format
+msgid "getgroups(): %s\n"
+msgstr "getgroups(): %s\n"
+
+#: quota_nld.c:93
+#, c-format
+msgid ""
+"Usage: %s [options]\n"
+"Options are:\n"
+" -h --help         shows this text\n"
+" -V --version      shows version information\n"
+" -C --no-console   do not try to write messages to console\n"
+" -D --no-dbus      do not try to write messages to DBUS\n"
+" -F --foreground   run daemon in foreground\n"
+msgstr ""
+"Sk³adnia: %s [opcje]\n"
+"Opcje to:\n"
+" -h --help         wy¶wietlenie tego opisu\n"
+" -V --version      wy¶wietlenie informacji o wersji\n"
+" -C --no-console   nie wypisywanie komunikatów na konsoli\n"
+" -D --no-dbus      nie wypisywanie komunikatów przez DBUS\n"
+" -F --foreground   uruchomienie demona jako procesu pierwszoplanowego\n"
+
+#: quota_nld.c:123 rquota_svc.c:158
+#, c-format
+msgid "Unknown option '%c'.\n"
+msgstr "Nieznana opcja '%c'.\n"
+
+#: quota_nld.c:129
+msgid "No possible destination for messages. Nothing to do.\n"
+msgstr "Brak celu dla komunikatów. Nie ma nic do roboty.\n"
+
+#: quota_nld.c:157
+msgid "Cannot allocate netlink handle!\n"
+msgstr "Nie mo¿na przydzieliæ uchwytu netlink!\n"
+
+#: quota_nld.c:161
+#, c-format
+msgid "Cannot connect to netlink socket: %s\n"
+msgstr "Nie mo¿na po³±czyæ siê z gniazdem netlink: %s\n"
+
+#: quota_nld.c:164
+#, c-format
+msgid "Cannot resolve quota netlink name: %s\n"
+msgstr "Nie mo¿na rozwi±zaæ nazwy netlink limitów: %s\n"
+
+#: quota_nld.c:168
+#, c-format
+msgid "Cannot join quota multicast group: %s\n"
+msgstr "Nie mo¿na do³±czyæ do grupy multicastowej limitów: %s\n"
+
+#: quota_nld.c:172
+#, c-format
+msgid "Cannot register netlink family: %s\n"
+msgstr "Nie mo¿na zarejestrowaæ rodziny netlink: %s\n"
+
+#: quota_nld.c:185
+#, c-format
+msgid "Cannot connect to system DBUS: %s\n"
+msgstr "Nie mo¿na po³±czyæ siê z systemowym DBUS-em: %s\n"
+
+#: quota_nld.c:240
+#, c-format
+msgid "Failed to find tty of user %Lu to report warning to.\n"
+msgstr "Nie uda³o siê odnale¼æ tty u¿ytkownika %Lu w celu zg³oszenia ostrze¿enia.\n"
+
+#: quota_nld.c:245
+#, c-format
+msgid "Failed to open tty %s of user %Lu to report warning.\n"
+msgstr "Nie uda³o siê otworzyæ tty %s u¿ytkownika %Lu w celu zg³oszenia ostrze¿enia.\n"
+
+#: quota_nld.c:277
+#, c-format
+msgid "Failed to write quota message for user %Lu to %s: %s\n"
+msgstr "Nie uda³o siê wypisaæ komunikatu o limicie dla u¿ytkownika %Lu na %s: %s\n"
+
+#: quota_nld.c:290
+msgid "Cannot create DBUS message: No enough memory.\n"
+msgstr "Nie mo¿na utworzyæ komunikatu DBUS: za ma³o pamiêci.\n"
+
+#: quota_nld.c:308
+msgid "Failed to write message to dbus: No enough memory.\n"
+msgstr "Nie uda³o siê wypisaæ komunikatu przez dbus: za ma³o pamiêci.\n"
+
+#: quota_nld.c:329
+#, c-format
+msgid "Read from netlink socket failed: %s\n"
+msgstr "Odczyt z gniazda netlink nie powiód³ siê: %s\n"
+
+#: quota_nld.c:344
+#, c-format
+msgid "Failed parsing netlink command: %s\n"
+msgstr "Nie uda³o siê przeanalizowaæ polecenia netlink: %s\n"
+
+#: quotacheck.c:95
+msgid "Not enough memory.\n"
+msgstr "Za ma³o pamiêci.\n"
+
+#: quotacheck.c:127
+#, c-format
+msgid "Adding hardlink for ino %llu\n"
+msgstr "Dodawanie dowi±zania dla i-wêz³a %llu\n"
+
+#: quotacheck.c:170
+#, c-format
+msgid "Adding dquot structure type %s for %d\n"
+msgstr "Dodawanie struktury dquot typu %s dla %d\n"
+
+#: quotacheck.c:256
+#, c-format
+msgid "Cannot open file %s: %s\n"
+msgstr "Nie mo¿na otworzyæ pliku %s: %s\n"
+
+#: quotacheck.c:261
+msgid "Cannot get exact used space... Results might be inaccurate.\n"
+msgstr "Nie mo¿na dok³adnie uzyskaæ u¿ytej przestrzeni... wyniki mog± byæ niedok³adne.\n"
+
+#: quotacheck.c:299
+#, c-format
+msgid ""
+"Utility for checking and repairing quota files.\n"
+"%s [-gucbfinvdmMR] [-F <quota-format>] filesystem|-a\n"
+"\n"
+"-u, --user                check user files\n"
+"-g, --group               check group files\n"
+"-c, --create-files        create new quota files\n"
+"-b, --backup              create backups of old quota files\n"
+"-f, --force               force check even if quotas are enabled\n"
+"-i, --interactive         interactive mode\n"
+"-n, --use-first-dquot     use the first copy of duplicated structure\n"
+"-v, --verbose             print more information\n"
+"-d, --debug               print even more messages\n"
+"-m, --no-remount          do not remount filesystem read-only\n"
+"-M, --try-remount         try remounting filesystem read-only,\n"
+"                          continue even if it fails\n"
+"-R, --exclude-root        exclude root when checking all filesystems\n"
+"-F, --format=formatname   check quota files of specific format\n"
+"-a, --all                 check all filesystems\n"
+"-h, --help                display this message and exit\n"
+"-V, --version             display version information and exit\n"
+"\n"
+msgstr ""
+"Narzêdzie do sprawdzania i naprawy plików limitów.\n"
+"%s [-gucbfinvdmMR] [-F <format-limitów>] system-plików|-a\n"
+"\n"
+"-u, --user                sprawdzenie plików u¿ytkowników (user)\n"
+"-g, --group               sprawdzenie plików grup (group)\n"
+"-c, --create-files        utworzenie nowych plików limitów\n"
+"-b, --backup              utworzenie kopii zapasowych starych plików limitów\n"
+"-f, --force               wymuszenie sprawdzenia nawet je¶li limity s± w³±czone\n"
+"-i, --interactive         tryb interaktywny\n"
+"-n, --use-first-dquot     u¿ycie pierwszej kopii powielonej struktury\n"
+"-v, --verbose             wypisywanie wiêkszej ilo¶ci informacji\n"
+"-d, --debug               wypisywanie jeszcze wiêkszej liczby komunikatów\n"
+"-m, --no-remount          nie przemontowywanie systemu plików tylko do odczytu\n"
+"-M, --try-remount         próba przemontowania systemu plików tylko do odczytu,\n"
+"                          kontynuacja nawet je¶li siê to nie powiedzie\n"
+"-R, --exclude-root        wykluczenie g³ównego systemu plików przy sprawdzaniu\n"
+"                          wszystkich systemów plików\n"
+"-F, --format=format       sprawdzenie plików limitów w podanym formacie\n"
+"-a, --all                 sprawdzenie wszystkich systemów plików\n"
+"-h, --help                wy¶wietlenie tego opisu i zakoñczenie\n"
+"-V, --version             wy¶wietlenie informacji o wersji i zakoñczenie\n"
+"\n"
+
+#: quotacheck.c:403 quotaon.c:135 repquota.c:139 setquota.c:201
+msgid "Bad number of arguments.\n"
+msgstr "B³êdna liczba argumentów.\n"
+
+#: quotacheck.c:407
+msgid "XFS quota format needs no checking.\n"
+msgstr "Limity w formacie XFS nie wymagaj± sprawdzania.\n"
+
+#: quotacheck.c:433
+#, c-format
+msgid "error (%d) while opening %s\n"
+msgstr "b³±d (%d) podczas otwierania %s\n"
+
+#: quotacheck.c:438
+#, c-format
+msgid "error (%d) while allocating inode file bitmap\n"
+msgstr "b³±d (%d) podczas przydzielania bitmapy i-wêz³ów plików\n"
+
+#: quotacheck.c:443
+#, c-format
+msgid "errstr (%d) while allocating inode directory bitmap\n"
+msgstr "errstr (%d) podczas przydzielania bitmapy i-wêz³ów katalogów\n"
+
+#: quotacheck.c:448
+#, c-format
+msgid "error (%d) while opening inode scan\n"
+msgstr "b³±d (%d) podczas otwierania skanu i-wêz³ów\n"
+
+#: quotacheck.c:453
+#, c-format
+msgid "error (%d) while starting inode scan\n"
+msgstr "b³±d (%d) podczas uruchamiania skanu i-wêz³ów\n"
+
+#: quotacheck.c:459
+#, c-format
+msgid "Found i_num %ld, blocks %ld\n"
+msgstr "Znaleziono i_num %ld, %ld bloków\n"
+
+#: quotacheck.c:465
+msgid "High uid detected.\n"
+msgstr "Wykryto du¿y uid.\n"
+
+#: quotacheck.c:481
+#, c-format
+msgid "Something weird happened while scanning. Error %d\n"
+msgstr "Podczas skanowania zdarzy³o siê co¶ dziwnego. B³±d %d\n"
+
+#: quotacheck.c:505
+#, c-format
+msgid "Cannot stat directory %s: %s\n"
+msgstr "Nie mo¿na wykonaæ stat na katalogu %s: %s\n"
+
+#: quotacheck.c:517
+#, c-format
+msgid ""
+"\n"
+"Can open directory %s: %s\n"
+msgstr ""
+"\n"
+"Nie mo¿na otworzyæ katalogu %s: %s\n"
+
+#: quotacheck.c:529
+#, c-format
+msgid ""
+"lstat Cannot stat `%s/%s': %s\n"
+"Guess you'd better run fsck first !\n"
+"exiting...\n"
+msgstr ""
+"lstat: Nie mo¿na wykonaæ stat na `%s/%s': %s\n"
+"Lepiej najpierw uruchomiæ fsck!\n"
+"zakoñczenie...\n"
+
+#: quotacheck.c:540
+#, c-format
+msgid "pushd %s/%s\n"
+msgstr "pushd %s/%s\n"
+
+#: quotacheck.c:556
+#, c-format
+msgid "\tAdding %s size %Ld ino %d links %d uid %u gid %u\n"
+msgstr "\tDodawanie %s, o rozmiarze %Ld, i-wêze³ %d, dowi±zañ %d uid %u gid %u\n"
+
+#: quotacheck.c:566
+msgid "Scanning stored directories from directory stack\n"
+msgstr "Skanowanie zapisanych na stosie katalogów\n"
+
+#: quotacheck.c:570
+#, c-format
+msgid ""
+"popd %s\n"
+"Entering directory %s\n"
+msgstr ""
+"popd %s\n"
+"Wej¶cie do katalogu %s\n"
+
+#: quotacheck.c:582
+#, c-format
+msgid "Leaving %s\n"
+msgstr "Opuszczanie %s\n"
+
+#: quotacheck.c:622
+#, c-format
+msgid "Going to check %s quota file of %s\n"
+msgstr "Rozpoczynanie sprawdzania pliku limitów %s na %s\n"
+
+#: quotacheck.c:628
+#, c-format
+msgid "Quota for %ss is enabled on mountpoint %s so quotacheck might damage the file.\n"
+msgstr "Limity %s w³±czone w punkcie montowania %s - quotacheck mo¿e uszkodziæ plik.\n"
+
+#: quotacheck.c:629 quotacheck.c:903
+msgid "Should I continue"
+msgstr "Czy kontynuowaæ"
+
+#: quotacheck.c:630 quotacheck.c:904
+#, c-format
+msgid "As you wish... Canceling check of this file.\n"
+msgstr "Wedle Â¿yczenia... anulowanie sprawdzania tego pliku.\n"
+
+#: quotacheck.c:635
+#, c-format
+msgid ""
+"Quota for %ss is enabled on mountpoint %s so quotacheck might damage the file.\n"
+"Please turn quotas off or use -f to force checking.\n"
+msgstr ""
+"Limity %s w³±czone w punkcie montowania %s - quotacheck mo¿e uszkodziæ plik.\n"
+"Proszê wy³±czyæ limity lub u¿yæ -f, aby wymusiæ sprawdzanie.\n"
+
+#: quotacheck.c:642
+#, c-format
+msgid "Error while syncing quotas on %s: %s\n"
+msgstr "B³±d podczas synchronizacji limitów na %s: %s\n"
+
+#: quotacheck.c:647
+#, c-format
+msgid "Cannot get quotafile name for %s\n"
+msgstr "Nie mo¿na uzyskaæ nazwy pliku limitów dla %s\n"
+
+#: quotacheck.c:652 quotaio.c:105 quotasys.c:509
+#, c-format
+msgid "Cannot open quotafile %s: %s\n"
+msgstr "Nie mo¿na otworzyæ pliku limitów %s: %s\n"
+
+#: quotacheck.c:668
+#, c-format
+msgid "Too new quotafile format on %s\n"
+msgstr "Za nowy format pliku limitów na %s\n"
+
+#: quotacheck.c:696
+msgid "Renaming new files to proper names.\n"
+msgstr "Zmiana nazw nowych plików na w³a¶ciwe.\n"
+
+#: quotacheck.c:698
+#, c-format
+msgid "Cannot get name of old quotafile on %s.\n"
+msgstr "Nie mo¿na uzyskaæ nazwy starego pliku limitów na %s.\n"
+
+#: quotacheck.c:701
+msgid "Old file not found.\n"
+msgstr "Nie znaleziono starego pliku.\n"
+
+#: quotacheck.c:704
+#, c-format
+msgid "Error while searching for old quota file %s: %s\n"
+msgstr "B³±d podczas poszukiwania starego pliku limitów %s: %s\n"
+
+#: quotacheck.c:713
+msgid "Old file found removed during check!\n"
+msgstr "Stary plik zosta³ usuniêty przy sprawdzaniu!\n"
+
+#: quotacheck.c:716
+#, c-format
+msgid "Error while opening old quota file %s: %s\n"
+msgstr "B³±d podczas otwierania starego pliku limitów %s: %s\n"
+
+#: quotacheck.c:722
+#, c-format
+msgid "EXT2_IOC_GETFLAGS failed: %s\n"
+msgstr "ioctl XFS_IOC_GETFLAGS nie powiód³ siê: %s\n"
+
+#: quotacheck.c:726
+#, c-format
+msgid "Renaming old quotafile to %s~\n"
+msgstr "Zmiana nazwy starego pliku limitów na %s~\n"
+
+#: quotacheck.c:732
+#, c-format
+msgid "Name of quota file too long. Contact %s.\n"
+msgstr "Nazwa pliku limitów zbyt d³uga. Proszê o kontakt z %s.\n"
+
+#: quotacheck.c:734
+#, c-format
+msgid "Cannot rename old quotafile %s to %s: %s\n"
+msgstr "Nie mo¿na zmieniæ nazwy starego pliku limitów %s na %s: %s\n"
+
+#: quotacheck.c:740
+msgid "Renaming new quotafile\n"
+msgstr "Zmiana nazwy nowego pliku limitów\n"
+
+#: quotacheck.c:752
+#, c-format
+msgid "Cannot change permission of %s: %s\n"
+msgstr "Nie mo¿na zmieniæ uprawnieñ %s: %s\n"
+
+#: quotacheck.c:759
+#, c-format
+msgid "Cannot open new quota file %s: %s\n"
+msgstr "Nie mo¿na otworzyæ nowego pliku limitów %s: %s\n"
+
+#: quotacheck.c:764
+#, c-format
+msgid "Warning: Cannot set EXT2 flags on %s: %s\n"
+msgstr "Uwaga: Nie mo¿na ustawiæ flag EXT2 na %s: %s\n"
+
+#: quotacheck.c:783
+#, c-format
+msgid "Dumping gathered data for %ss.\n"
+msgstr "Zrzucanie zgromadzonych danych typu %s.\n"
+
+#: quotacheck.c:785
+#, c-format
+msgid "Cannot initialize IO on new quotafile: %s\n"
+msgstr "Nie mo¿na zainicjowaæ we/wy na nowym pliku limitów: %s\n"
+
+#: quotacheck.c:803
+#, c-format
+msgid "Cannot finish IO on new quotafile: %s\n"
+msgstr "Nie mo¿na zakoñczyæ we/wy na nowym pliku limitów: %s\n"
+
+#: quotacheck.c:806
+msgid "Data dumped.\n"
+msgstr "Dane zrzucone.\n"
+
+#: quotacheck.c:811
+#, c-format
+msgid "Cannot find checked quota file for %ss on %s!\n"
+msgstr "Nie mo¿na znale¼æ sprawdzonego pliku limitów %s na %s!\n"
+
+#: quotacheck.c:815
+#, c-format
+msgid ""
+"Cannot turn %s quotas off on %s: %s\n"
+"Kernel won't know about changes quotacheck did.\n"
+msgstr ""
+"Nie mo¿na wy³±czyæ limitów %s na %s: %s\n"
+"J±dro nie zauwa¿y zmian wykonanych przez checkquota.\n"
+
+#: quotacheck.c:828
+#, c-format
+msgid ""
+"Cannot turn %s quotas on on %s: %s\n"
+"Kernel won't know about changes quotacheck did.\n"
+msgstr ""
+"Nie mo¿na w³±czyæ limitów %s na %s: %s\n"
+"J±dro nie zauwa¿y zmian wykonanych przez checkquota.\n"
+
+#: quotacheck.c:849
+#, c-format
+msgid "Substracting space used by old %s quota file.\n"
+msgstr "Odejmowanie miejsca u¿ytego przez stary plik limitów %s.\n"
+
+#: quotacheck.c:851
+#, c-format
+msgid "Old %s file not found. Usage will not be substracted.\n"
+msgstr "Stary plik %s nie znaleziony. Miejsce nie bêdzie odjête.\n"
+
+#: quotacheck.c:856
+#, c-format
+msgid "Cannot stat old %s quota file: %s\n"
+msgstr "Nie mo¿na wykonaæ stat na starym pliku limitów %s: %s\n"
+
+#: quotacheck.c:868
+#, c-format
+msgid "Quota structure for %s owning quota file not present! Something is really wrong...\n"
+msgstr "Brak struktury limitów %s dla w³a¶ciciela pliku limitów! Co¶ jest naprawdê Â¼le...\n"
+
+#: quotacheck.c:873
+#, c-format
+msgid "Substracted %lu bytes.\n"
+msgstr "Odjêto %lu bajtów.\n"
+
+#: quotacheck.c:883
+#, c-format
+msgid "Cannot stat mountpoint %s: %s\n"
+msgstr "Nie mo¿na wykonaæ stat na punkcie montowania %s: %s\n"
+
+#: quotacheck.c:885
+#, c-format
+msgid "Mountpoint %s is not a directory?!\n"
+msgstr "Punkt montowania %s nie jest katalogiem?!\n"
+
+#: quotacheck.c:902
+#, c-format
+msgid "Cannot remount filesystem mounted on %s read-only. Counted values might not be right.\n"
+msgstr "Nie mo¿na przemontowaæ r/o systemu plików zamontowanego pod %s. Policzone warto¶ci mog± byæ b³êdne.\n"
+
+#: quotacheck.c:909
+#, c-format
+msgid ""
+"Cannot remount filesystem mounted on %s read-only so counted values might not be right.\n"
+"Please stop all programs writing to filesystem or use -m flag to force checking.\n"
+msgstr ""
+"Nie mo¿na przemontowaæ r/o systemu plików zamontowanego pod %s, wiêc policzone\n"
+"warto¶ci mog± byæ b³êdne. Proszê zatrzymaæ wszystkie programy pisz±ce na ten\n"
+"system plików lub u¿yæ flagi -m, aby wymusiæ sprawdzanie.\n"
+
+#: quotacheck.c:916
+msgid "Filesystem remounted read-only\n"
+msgstr "System plików przemontowany tylko do odczytu\n"
+
+#: quotacheck.c:918
+#, c-format
+msgid "Scanning %s [%s] "
+msgstr "Skanowanie %s [%s] "
+
+#: quotacheck.c:935
+msgid "done\n"
+msgstr "zrobiono\n"
+
+#: quotacheck.c:944
+#, c-format
+msgid "Checked %d directories and %d files\n"
+msgstr "Sprawdzono %d katalogów i %d plików\n"
+
+#: quotacheck.c:948
+#, c-format
+msgid "Cannot remount filesystem %s read-write. cannot write new quota files.\n"
+msgstr "Nie mo¿na przemontowaæ r/w systemu plików %s. Nie mo¿na zapisaæ nowych plików.\n"
+
+#: quotacheck.c:949
+msgid "Filesystem remounted RW.\n"
+msgstr "Przemontowano system plików do zapisu i odczytu.\n"
+
+#: quotacheck.c:986
+#, c-format
+msgid "Cannot find quota option on filesystem %s with quotas!\n"
+msgstr "Nie mo¿na znale¼æ opcji limitów dla systemu plików %s z limitami!\n"
+
+#: quotacheck.c:993
+#, c-format
+msgid "Cannot detect quota format for journalled quota on %s\n"
+msgstr "Nie mo¿na wykryæ formatu limitów dla limitów z kronik± na %s\n"
+
+#: quotacheck.c:1033 quotasys.c:595
+msgid "Cannot initialize mountpoint scan.\n"
+msgstr "Nie mo¿na zainicjowaæ skanu punktów montowania.\n"
+
+#: quotacheck.c:1038
+#, c-format
+msgid "Skipping %s [%s]\n"
+msgstr "Pomijanie %s [%s]\n"
+
+#: quotacheck.c:1054
+#, c-format
+msgid "Cannot guess format from filename on %s. Please specify format on commandline.\n"
+msgstr "Nie mo¿na odgadn±æ formatu z nazwy pliku na %s. Proszê podaæ format w poleceniu.\n"
+
+#: quotacheck.c:1058
+#, c-format
+msgid "Detected quota format %s\n"
+msgstr "Wykryto format limitów %s\n"
+
+#: quotacheck.c:1065
+msgid "Cannot find filesystem to check or filesystem not mounted with quota option.\n"
+msgstr "Nie znaleziono systemu plików do sprawdzenia lub nie jest zamontowany z obs³ug± limitów.\n"
+
+#: quotacheck.c:1078
+#, c-format
+msgid ""
+"Allocated %d bytes memory\n"
+"Free'd %d bytes\n"
+"Lost %d bytes\n"
+msgstr ""
+"Przydzielono %d bajtów pamiêci\n"
+"Zwolniono %d bajtów\n"
+"Stracono %d bajtów\n"
+
+#: quotacheck_v1.c:30
+#, c-format
+msgid "Cannot read entry for id %u from quotafile %s: %s\n"
+msgstr "Nie mo¿na odczytaæ wpisu dla id %u z pliku limitów %s: %s\n"
+
+#: quotacheck_v1.c:33
+#, c-format
+msgid "Entry for id %u is truncated.\n"
+msgstr "Wpis dla id %u jest uciêty.\n"
+
+#: quotacheck_v1.c:62
+msgid "Loading first quota entry with grace times.\n"
+msgstr "Wczytywanie pierwszego wpisu limitów z okresami pob³a¿liwo¶ci.\n"
+
+#: quotacheck_v1.c:66
+#, c-format
+msgid "Cannot read first entry from quotafile %s: %s\n"
+msgstr "Nie mo¿na odczytaæ pierwszego wpisu z pliku limitów %s: %s\n"
+
+#: quotacheck_v1.c:70
+#, c-format
+msgid "WARNING - Quotafile %s was probably truncated. Cannot save quota settings...\n"
+msgstr "UWAGA - plik limitów %s zapewne by³ uciêty. Nie mo¿na zapisaæ ustawieñ...\n"
+
+#: quotacheck_v1.c:76
+msgid "First entry loaded.\n"
+msgstr "Wczytano pierwszy wpis.\n"
+
+#: quotacheck_v2.c:51
+msgid "Checking quotafile info...\n"
+msgstr "Sprawdzanie informacji w pliku limitów...\n"
+
+#: quotacheck_v2.c:56
+#, c-format
+msgid "Cannot read info from quota file %s: %s\n"
+msgstr "Nie mo¿na odczytaæ informacji z pliku limitów %s: %s\n"
+
+#: quotacheck_v2.c:61
+#, c-format
+msgid "WARNING - Quota file %s was probably truncated. Cannot save quota settings...\n"
+msgstr "UWAGA - plik limitów %s zapewne by³ uciêty. Nie mo¿na zapisaæ ustawieñ...\n"
+
+#: quotacheck_v2.c:73
+msgid "WARNING - Quota file info was corrupted.\n"
+msgstr "UWAGA - informacje w pliku limitów by³y uszkodzone.\n"
+
+#: quotacheck_v2.c:74
+#, c-format
+msgid ""
+"Size of file: %lu\n"
+"Blocks: %u Free block: %u Block with free entry: %u Flags: %x\n"
+msgstr ""
+"Rozmiar pliku: %lu\n"
+"Bloki: %u Wolny blok: %u Blok z wolnym wpisem: %u Flagi: %x\n"
+
+#: quotacheck_v2.c:81
+#, c-format
+msgid ""
+"Setting grace times and other flags to default values.\n"
+"Assuming number of blocks is %u.\n"
+msgstr ""
+"Ustawianie okresów pob³a¿liwo¶ci i innych flag na warto¶ci domy¶lne.\n"
+"Przyjêcie liczby bloków %u.\n"
+
+#: quotacheck_v2.c:91
+msgid "File info done.\n"
+msgstr "Informacje z pliku wczytane.\n"
+
+#: quotacheck_v2.c:102
+msgid "Corrupted blocks: "
+msgstr "Bloki uszkodzone: "
+
+#: quotacheck_v2.c:106
+#, c-format
+msgid "Block %u: "
+msgstr "Blok %u: "
+
+#: quotacheck_v2.c:157
+msgid "Duplicated entries."
+msgstr "Powtórzone wpisy."
+
+#: quotacheck_v2.c:161
+#, c-format
+msgid "Found more structures for ID %u. Using values: BHARD: %Ld BSOFT: %Ld IHARD: %Ld ISOFT: %Ld\n"
+msgstr "Znaleziono wiêcej struktur dla ID %u. U¿ycie warto¶ci: BHARD: %Ld BSOFT %Ld IHARD: %Ld ISOFT: %Ld\n"
+
+#: quotacheck_v2.c:169
+#, c-format
+msgid "Found more structures for ID %u. Values: BHARD: %Ld/%Ld BSOFT: %Ld/%Ld IHARD: %Ld/%Ld ISOFT: %Ld/%Ld\n"
+msgstr "Znaleziono wiêcej struktur dla ID %u. Warto¶ci: BHARD %Ld/%Ld BSOFT: %Ld/%Ld IHARD: %Ld/%Ld ISOFT: %Ld/%Ld\n"
+
+#: quotacheck_v2.c:174
+msgid "Should I use new values"
+msgstr "Czy u¿yæ nowych warto¶ci"
+
+#: quotacheck_v2.c:184
+#, c-format
+msgid "ID %u has more structures. User intervention needed (use -i for interactive mode or -n for automatic answer).\n"
+msgstr "ID %u ma wiêcej struktur. Potrzebna inwencja u¿ytkownika (-i dla trybu interaktywnego lub -n dla automatycznej odpowiedzi).\n"
+
+#: quotacheck_v2.c:221
+#, c-format
+msgid "Block %u is truncated.\n"
+msgstr "Blok %u jest uciêty.\n"
+
+#: quotacheck_v2.c:230
+#, c-format
+msgid "Reference to illegal block %u"
+msgstr "Odniesienie do nieprawid³owego bloku %u"
+
+#: quotacheck_v2.c:237
+#, c-format
+msgid "Block %u in tree referenced twice"
+msgstr "Dwukrotne odniesienie w drzewie do bloku %u"
+
+#: quotacheck_v2.c:252
+#, c-format
+msgid "Illegal free block reference to block %u"
+msgstr "B³êdne odniesienie pustego bloku do bloku %u"
+
+#: quotacheck_v2.c:255
+#, c-format
+msgid "Corrupted number of used entries (%u)"
+msgstr "Uszkodzona liczba u¿ytych wpisów (%u)"
+
+#: quotacheck_v2.c:301
+msgid "Checking quotafile headers...\n"
+msgstr "Sprawdzanie nag³ówków pliku limitów...\n"
+
+#: quotacheck_v2.c:305
+#, c-format
+msgid "Cannot read header from quotafile %s: %s\n"
+msgstr "Nie mo¿na odczytaæ nag³ówka z pliku limitów %s: %s\n"
+
+#: quotacheck_v2.c:307
+#, c-format
+msgid "WARNING -  Quotafile %s was probably truncated. Cannot save quota settings...\n"
+msgstr "UWAGA - plik limitów %s zapewne by³ uciêty. Nie mo¿na zapisaæ ustawieñ...\n"
+
+#: quotacheck_v2.c:312
+#, c-format
+msgid "WARNING - Quota file %s has corrupted headers\n"
+msgstr "UWAGA - plik limitów %s ma uszkodzone nag³ówki\n"
+
+#: quotacheck_v2.c:314
+msgid "Headers checked.\n"
+msgstr "Nag³ówki sprawdzone.\n"
+
+#: quotacheck_v2.c:332
+#, c-format
+msgid "Headers of file %s checked. Going to load data...\n"
+msgstr "Nag³ówki pliku %s sprawdzone. Rozpoczêcie wczytywania danych...\n"
+
+#: quotacheck_v2.c:340
+msgid "Cannot gather quota data. Tree root node corrupted.\n"
+msgstr "Nie mo¿na zgromadziæ danych o limitach. Korzeñ drzewa uszkodzony.\n"
+
+#: quotacheck_v2.c:348
+msgid "WARNING - Some data might be changed due to corruption.\n"
+msgstr "UWAGA - czê¶æ danych mo¿e byæ zmieniona z powodu uszkodzenia.\n"
+
+#: quotacheck_v2.c:351
+msgid "Not found any corrupted blocks. Congratulations.\n"
+msgstr "Nie znaleziono Â¿adnych uszkodzonych bloków. Gratulacje.\n"
+
+#: quotaio.c:59
+msgid "Only RPC quota format is allowed on NFS filesystem.\n"
+msgstr "Na systemie plików NFS dozwolony jest tylko format limitów RPC.\n"
+
+#: quotaio.c:68
+msgid "RPC quota format not compiled.\n"
+msgstr "Format limitów RPC nie wkompilowany.\n"
+
+#: quotaio.c:75
+msgid "Only XFS quota format is allowed on XFS filesystem.\n"
+msgstr "Na systemie plików XFS dozwolony jest tylko format limitów XFS.\n"
+
+#: quotaio.c:86
+msgid "XFS quota allowed only on XFS filesystem.\n"
+msgstr "Format limitów XFS dozwolony tylko na systemie plików XFS.\n"
+
+#: quotaio.c:99
+msgid "Quota file not found or has wrong format.\n"
+msgstr "Pliku limitów nie znaleziono lub ma z³y format.\n"
+
+#: quotaio.c:128
+#, c-format
+msgid "Cannot initialize quota on %s: %s\n"
+msgstr "Nie mo¿na zainicjowaæ limitów na %s: %s\n"
+
+#: quotaio.c:156
+#, c-format
+msgid "Creation of %s quota format is not supported.\n"
+msgstr "Tworzenie limitów w formacie %s nie jest obs³ugiwane.\n"
+
+#: quotaio.c:166
+#, c-format
+msgid "Cannot create new quotafile %s: %s\n"
+msgstr "Nie mo¿na utworzyæ nowego pliku limitów %s: %s\n"
+
+#: quotaio_generic.c:49
+#, c-format
+msgid "Cannot get info for %s quota file from kernel on %s: %s\n"
+msgstr "Nie mo¿na uzyskaæ od j±dra informacji o pliku limitów %s na %s: %s\n"
+
+#: quotaio_generic.c:67
+#, c-format
+msgid "Cannot set info for %s quota file from kernel on %s: %s\n"
+msgstr "Nie mo¿na ustawiæ w j±drze informacji o pliku limitów %s na %s: %s\n"
+
+#: quotaio_generic.c:79
+#, c-format
+msgid "Cannot get quota for %s %d from kernel on %s: %s\n"
+msgstr "Nie mo¿na uzyskaæ od j±dra limitu %s dla id %d na %s: %s\n"
+
+#: quotaio_generic.c:94
+#, c-format
+msgid "Cannot set quota for %s %d from kernel on %s: %s\n"
+msgstr "Nie mo¿na ustawiæ w j±drze limitu %s dla id %d na %s: %s\n"
+
+#: quotaio_rpc.c:56 quotaio_v1.c:302 quotaio_v2.c:684
+#, c-format
+msgid "Trying to write quota to readonly quotafile on %s\n"
+msgstr "Próba zapisu limitów do pliku limitów tylko do odczytu na %s\n"
+
+#: quotaio_v1.c:208
+#, c-format
+msgid "Trying to write info to readonly quotafile on %s.\n"
+msgstr "Próba zapisu informacji do pliku limitów tylko do odczytu na %s.\n"
+
+#: quotaio_v1.c:356 quotaio_v2.c:806
+#, c-format
+msgid "Cannot sync quotas on device %s: %s\n"
+msgstr "Nie mo¿na zsynchronizowaæ limitów na urz±dzeniu %s: %s\n"
+
+#: quotaio_v2.c:152
+msgid "Your quota file is stored in wrong endianity. Please use convertquota(8) to convert it.\n"
+msgstr "Plik limitów jest zapisany dla innego procesora. Do konwersji s³u¿y convertquota(8).\n"
+
+#: quotaio_v2.c:234
+#, c-format
+msgid "Trying to write info to readonly quotafile on %s\n"
+msgstr "Próba zapisu informacji do pliku limitów tylko do odczytu na %s\n"
+
+#: quotaio_v2.c:289
+#, c-format
+msgid "Cannot write block (%u): %s\n"
+msgstr "Nie mo¿na zapisaæ bloku (%u): %s\n"
+
+#: quotaio_v2.c:312
+msgid "Cannot allocate new quota block (out of disk space).\n"
+msgstr "Nie mo¿na przydzieliæ nowego bloku limitów (brak miejsca na dysku).\n"
+
+#: quotaio_v2.c:418
+msgid "find_free_dqentry(): Data block full but it shouldn't.\n"
+msgstr "find_free_dqentry(): Blok danych jest pe³ny, a nie powinien.\n"
+
+#: quotaio_v2.c:454
+#, c-format
+msgid "Inserting already present quota entry (block %u).\n"
+msgstr "Wstawianie ju¿ obecnego wpisu limitów (blok %u).\n"
+
+#: quotaio_v2.c:477
+#, c-format
+msgid "Cannot write quota (id %u): %s\n"
+msgstr "Nie mo¿na zapisaæ limitów (id %u): %s\n"
+
+#: quotaio_v2.c:495
+#, c-format
+msgid "Quota write failed (id %u): %s\n"
+msgstr "Zapis limitów nie powiód³ siê (id %u): %s\n"
+
+#: quotaio_v2.c:506
+#, c-format
+msgid "Quota structure has offset to other block (%u) than it should (%u).\n"
+msgstr "Struktura limitów ma wskazanie na inny blok (%u) ni¿ powinna (%u).\n"
+
+#: quotaio_v2.c:586
+#, c-format
+msgid "Quota for id %u referenced but not present.\n"
+msgstr "Limit dla id %u nie istnieje, ale jest odniesienie do niego.\n"
+
+#: quotaio_v2.c:662
+#, c-format
+msgid "Cannot read quota structure for id %u: %s\n"
+msgstr "Nie mo¿na odczytaæ struktury limitów dla id %u: %s\n"
+
+#: quotaio_v2.c:755
+#, c-format
+msgid ""
+"Illegal reference in %s quota file on %s. Quota file is probably corrupted.\n"
+"Please run quotacheck(8) and try again.\n"
+msgstr ""
+"B³êdne odniesienie w pliku limitów %s na %s. Plik limitów jest prawdopodobnie\n"
+"uszkodzony. Proszê uruchomiæ quotacheck(8) i spróbowaæ ponownie.\n"
+
+#: quotaio_v2.c:830
+#, c-format
+msgid ""
+"Statistics:\n"
+"Total blocks: %u\n"
+"Data blocks: %u\n"
+"Entries: %u\n"
+"Used average: %f\n"
+msgstr ""
+"Statystyki:\n"
+"Bloków w sumie: %u\n"
+"Bloków danych: %u\n"
+"Wpisów: %u\n"
+"U¿yte Â¶rednio: %f\n"
+
+#: quotaio_xfs.c:242
+#, c-format
+msgid "*** Status for %s quotas on device %s\n"
+msgstr "*** Raport dla limitów %s na urz±dzeniu %s\n"
+
+#: quotaio_xfs.c:244 quotaio_xfs.c:259
+msgid "ON"
+msgstr "W£¡CZONE"
+
+#: quotaio_xfs.c:244 quotaio_xfs.c:259
+msgid "OFF"
+msgstr "WY£¡CZONE"
+
+#: quotaio_xfs.c:246 quotaio_xfs.c:250
+#, c-format
+msgid "Accounting: %s; Enforcement: %s\n"
+msgstr "Podliczanie: %s; Wymuszanie: %s\n"
+
+#: quotaio_xfs.c:262 quotaio_xfs.c:266
+#, c-format
+msgid "Accounting [ondisk]: %s; Enforcement [ondisk]: %s\n"
+msgstr "Podliczanie [na dysku]: %s; Wymuszanie [na dysku]: %s\n"
+
+#: quotaio_xfs.c:275 quotaio_xfs.c:284
+#, c-format
+msgid "Inode: none\n"
+msgstr "I-wêze³: Â¿aden\n"
+
+#: quotaio_xfs.c:277 quotaio_xfs.c:286
+#, c-format
+msgid "Inode: #%Lu (%Lu blocks, %u extents)\n"
+msgstr "I-wêze³: #%Lu (%Lu bloków, %u zasiêgów)\n"
+
+#: quotaon.c:67
+#, c-format
+msgid ""
+"Usage:\n"
+"\t%s [-guvp] [-F quotaformat] [-x state] -a\n"
+"\t%s [-guvp] [-F quotaformat] [-x state] filesys ...\n"
+"\n"
+"-a, --all                turn quotas on for all filesystems\n"
+"-f, --off                turn quotas off\n"
+"-u, --user               operate on user quotas\n"
+"-g, --group              operate on group quotas\n"
+"-p, --print-state        print whether quotas are on or off\n"
+"-x, --xfs-command=cmd    perform XFS quota command\n"
+"-F, --format=formatname  operate on specific quota format\n"
+"-v, --verbose            print more messages\n"
+"-h, --help               display this help text and exit\n"
+"-V, --version            display version information and exit\n"
+msgstr ""
+"Skladnia:\n"
+"\t%s [-guvp] [-F format] [-x stan] -a\n"
+"\t%s [-guvp] [-F format] [-x stan] system-plików ...\n"
+"\n"
+"-a, --all                w³±czenie limitów na wszystkich systemach plików\n"
+"-f, --off                wy³±czenie limitów\n"
+"-u, --user               operowanie na limitach u¿ytkowników\n"
+"-g, --group              operowanie na limitach grup\n"
+"-p, --print-state        wypisanie, czy limity s± w³±czone czy wy³±czone\n"
+"-x, --xfs-command=polecenie  wykonanie polecenia dla limitów XFS\n"
+"-F, --format=format      operowanie na podanym formacie limitów\n"
+"-v, --verbose            wypisywanie wiêkszej liczby komunikatów\n"
+"-h, --help               wy¶wietlenie tego opisu i zakoñczenie\n"
+"-V, --verbose            wy¶wietlenie informacji o wersji i zakoñczenie\n"
+
+#: quotaon.c:139
+msgid "Cannot turn on/off quotas via RPC.\n"
+msgstr "Nie mo¿na w³±czyæ/wy³±czyæ limitów przez RPC.\n"
+
+#: quotaon.c:167
+msgid "Cannot change state of XFS quota. It's not compiled in kernel.\n"
+msgstr "Nie mo¿na zmieniæ stanu limitów XFS. Nie s± wkompilowane w j±dro.\n"
+
+#: quotaon.c:181
+#, c-format
+msgid "Cannot find quota file on %s [%s] to turn quotas on/off.\n"
+msgstr "Nie mo¿na znale¼æ pliku limitów na %s [%s], aby w³±czyæ/wy³±czyæ limity.\n"
+
+#: quotaon.c:208
+#, c-format
+msgid "%s quota on %s (%s) is %s\n"
+msgstr "Limity %s na %s (%s) s± %s\n"
+
+#: quotaon.c:209
+msgid "on"
+msgstr "w³±czone"
+
+#: quotaon.c:209
+msgid "off"
+msgstr "wy³±czone"
+
+#: quotaon.c:227
+#, c-format
+msgid "quotactl on %s [%s]: %s\n"
+msgstr "quotactl na %s [%s]: %s\n"
+
+#: quotaon.c:231
+#, c-format
+msgid "%s [%s]: %s quotas turned off\n"
+msgstr "%s [%s]: limity %s wy³±czone\n"
+
+#: quotaon.c:244
+#, c-format
+msgid "cannot find %s on %s [%s]\n"
+msgstr "nie mo¿na znale¼æ %s na %s [%s]\n"
+
+#: quotaon.c:246
+#, c-format
+msgid "using %s on %s [%s]: %s\n"
+msgstr "u¿ycie %s na %s [%s]: %s\n"
+
+#: quotaon.c:248
+msgid "Maybe create new quota files with quotacheck(8)?\n"
+msgstr "Mo¿e utworzyæ nowe pliki limitów przez quotacheck(8)?\n"
+
+#: quotaon.c:250
+msgid "Quota format not supported in kernel.\n"
+msgstr "Format limitów nie obs³ugiwany przez j±dro.\n"
+
+#: quotaon.c:254
+#, c-format
+msgid "%s [%s]: %s quotas turned on\n"
+msgstr "%s [%s]: limity %s w³±czone\n"
+
+#: quotaon.c:281
+#, c-format
+msgid "set root_squash on %s: %s\n"
+msgstr "ustawianie root_squash na %s: %s\n"
+
+#: quotaon.c:285
+#, c-format
+msgid "%s: %s root_squash turned off\n"
+msgstr "%s: wy³±czono %s root_squash\n"
+
+#: quotaon.c:287
+#, c-format
+msgid "%s: %s root_squash turned on\n"
+msgstr "%s: w³±czono %s root_squash\n"
+
+#: quotaon.c:339
+#, c-format
+msgid "Name must be quotaon or quotaoff not %s\n"
+msgstr "Nazw± musi byæ quotaon, lub quotaoff, nie %s\n"
+
+#: quotaon.c:345
+#, c-format
+msgid "Required format %s not supported by kernel.\n"
+msgstr "Wymagany format %s nie obs³ugiwany przez j±dro.\n"
+
+#: quotaon.c:347
+msgid "Warning: No quota format detected in the kernel.\n"
+msgstr "Uwaga: Nie wykryto formatu limitów w j±drze.\n"
+
+#: quotaon_xfs.c:35
+#, c-format
+msgid "quotactl() on %s: %s\n"
+msgstr "quotactl() na %s: %s\n"
+
+#: quotaon_xfs.c:61 quotaon_xfs.c:81
+#, c-format
+msgid "Enabling %s quota on root filesystem (reboot to take effect)\n"
+msgstr "W³±czanie limitów %s na / (zostan± uwzglêdnione po reboocie)\n"
+
+#: quotaon_xfs.c:65
+#, c-format
+msgid "Enable XFS %s quota accounting during mount\n"
+msgstr "Nale¿y w³±czyæ podliczanie limitów %s na XFS podczas montowania\n"
+
+#: quotaon_xfs.c:75
+#, c-format
+msgid "Cannot delete %s quota on %s - switch quota accounting off first\n"
+msgstr "Nie mo¿na usun±æ limitów %s na %s - najpierw trzeba wy³±czyæ podliczanie\n"
+
+#: quotaon_xfs.c:86
+#, c-format
+msgid "Enabling %s quota enforcement on %s\n"
+msgstr "W³±czanie wymuszania limitów %s na %s\n"
+
+#: quotaon_xfs.c:89
+#, c-format
+msgid "Already accounting %s quota on %s\n"
+msgstr "Podliczanie limitów %s by³o ju¿ w³±czone na %s\n"
+
+#: quotaon_xfs.c:94
+#, c-format
+msgid "Disabling %s quota accounting on %s\n"
+msgstr "Wy³±czanie podliczania limitów %s na %s\n"
+
+#: quotaon_xfs.c:98
+#, c-format
+msgid "Quota enforcement already disabled for %s on %s\n"
+msgstr "Wymuszenie limitów %s by³o ju¿ wy³±czone na %s\n"
+
+#: quotaon_xfs.c:107
+#, c-format
+msgid "Cannot delete %s quota on %s - switch quota enforcement and accounting off first\n"
+msgstr "Nie mo¿na usun±æ limitów %s na %s - najpierw nale¿y wy³±czyæ wymuszanie i podliczanie\n"
+
+#: quotaon_xfs.c:112
+#, c-format
+msgid "Enforcing %s quota already on %s\n"
+msgstr "Wymuszanie limitów %s by³o ju¿ w³±czone na %s\n"
+
+#: quotaon_xfs.c:117
+#, c-format
+msgid "Cannot switch off %s quotaaccounting on %s when enforcement is on\n"
+msgstr "Nie mo¿na wy³±czyæ podliczania limitów %s na %s kiedy wymuszanie jest w³±czone\n"
+
+#: quotaon_xfs.c:123
+msgid "and accounting "
+msgstr "i podliczania "
+
+#: quotaon_xfs.c:124
+#, c-format
+msgid "Disabling %s quota enforcement %son %s\n"
+msgstr "Wy³±czanie wymuszania %2$slimitów %1$s na %3$s\n"
+
+#: quotaon_xfs.c:130
+#, c-format
+msgid "Unexpected XFS quota state sought on %s\n"
+msgstr "Zauwa¿ono nieoczekiwany stan limitów XFS na %s\n"
+
+#: quotaon_xfs.c:145
+#, c-format
+msgid "quotactl on %s: %s\n"
+msgstr "quotactl na %s: %s\n"
+
+#: quotaon_xfs.c:149
+#, c-format
+msgid "%s: %s quotas turned off\n"
+msgstr "%s: limity %s wy³±czone\n"
+
+#: quotaon_xfs.c:151
+#, c-format
+msgid "%s: %s quotas turned on\n"
+msgstr "%s: limity %s w³±czone\n"
+
+#: quotaon_xfs.c:165
+#, c-format
+msgid "Failed to delete quota: %s\n"
+msgstr "Nie uda³o siê usun±æ limitów: %s\n"
+
+#: quotaon_xfs.c:171
+#, c-format
+msgid "%s: deleted %s quota blocks\n"
+msgstr "%s: usuniêto bloki limitów %s\n"
+
+#: quotaon_xfs.c:232
+#, c-format
+msgid "Invalid argument \"%s\"\n"
+msgstr "B³êdny argument \"%s\"\n"
+
+#: quotaops.c:110
+#, c-format
+msgid "%s (uid %d): Permission denied\n"
+msgstr "%s (uid %d): Brak uprawnieñ\n"
+
+#: quotaops.c:122
+#, c-format
+msgid "%s (gid %d): gid set allocation (%d): %s\n"
+msgstr "%s (gid %d): przydzielenie zbioru gid (%d): %s\n"
+
+#: quotaops.c:133
+#, c-format
+msgid "%s (gid %d): error while trying getgroups(): %s\n"
+msgstr "%s (gid %d): b³±d podczas próby wykonania getgroups(): %s\n"
+
+#: quotaops.c:144
+#, c-format
+msgid "%s (gid %d): Permission denied\n"
+msgstr "%s (gid %d): Brak uprawnieñ\n"
+
+#: quotaops.c:158
+#, c-format
+msgid "error while getting quota from %s for %s (id %u): %s\n"
+msgstr "b³±d podczas uzyskiwania limitów z %s dla %s (id %u): %s\n"
+
+#: quotaops.c:183
+#, c-format
+msgid "Cannot write quota for %u on %s: %s\n"
+msgstr "Nie mo¿na zapisaæ limitów dla %u na %s: %s\n"
+
+#: quotaops.c:232
+msgid "Too many parameters to editor.\n"
+msgstr "Zbyt du¿o parametrów dla edytora.\n"
+
+#: quotaops.c:240
+#, c-format
+msgid "Cannot exec %s\n"
+msgstr "Nie mo¿na uruchomiæ %s\n"
+
+#: quotaops.c:259 quotaops.c:444
+#, c-format
+msgid "Cannot duplicate descriptor of file to write to: %s\n"
+msgstr "Nie mo¿na powieliæ deskryptora pliku do zapisu: %s\n"
+
+#: quotaops.c:262
+#, c-format
+msgid "Disk quotas for %s %s (%cid %d):\n"
+msgstr "Limity dyskowe %s %s (%cid %d):\n"
+
+#: quotaops.c:266
+#, c-format
+msgid "  Filesystem                   blocks       soft       hard     inodes     soft     hard\n"
+msgstr "  System plików                bloki        miêkki     twardy   i-wêz³y    miêkki   twardy\n"
+
+#: quotaops.c:278
+#, c-format
+msgid "Quotas for %s %s:\n"
+msgstr "Limity %s %s:\n"
+
+#: quotaops.c:280 quotaops.c:284
+#, c-format
+msgid "%s %d, limits (soft = %d, hard = %d)\n"
+msgstr "%s %d, limity (miêkki = %d, twardy = %d)\n"
+
+#: quotaops.c:281
+msgid "blocks in use:"
+msgstr "u¿ywanych bloków:"
+
+#: quotaops.c:285
+msgid "\tinodes in use:"
+msgstr "\tu¿ywanych i-wêz³ów:"
+
+#: quotaops.c:311
+#, c-format
+msgid "WARNING - %s: cannot change current block allocation\n"
+msgstr "UWAGA - %s: nie mo¿na zmieniæ aktualnego przydzia³u bloków\n"
+
+#: quotaops.c:314
+#, c-format
+msgid "WARNING - %s: cannot change current inode allocation\n"
+msgstr "UWAGA - %s: nie mo¿na zmieniæ aktualnego przydzia³u i-wêz³ów\n"
+
+#: quotaops.c:337 quotaops.c:486
+#, c-format
+msgid "Cannot duplicate descriptor of temp file: %s\n"
+msgstr "Nie mo¿na powieliæ deskryptora pliku tymczasowego: %s\n"
+
+#: quotaops.c:351
+#, c-format
+msgid ""
+"Bad format:\n"
+"%s\n"
+msgstr ""
+"Z³y format:\n"
+"%s\n"
+
+#: quotaops.c:364 quotaops.c:628
+#, c-format
+msgid "%s - bad format\n"
+msgstr "%s - z³y format\n"
+
+#: quotaops.c:368
+#, c-format
+msgid "%s -  %s -- bad format\n"
+msgstr "%s -  %s -- z³y format\n"
+
+#: quotaops.c:373
+#, c-format
+msgid " blocks in use: %Lu, limits (soft = %Lu, hard = %Lu)"
+msgstr " u¿ywanych bloków: %Lu, limity (miêkki = %Lu, twardy = %Lu)"
+
+#: quotaops.c:376 quotaops.c:382 quotaops.c:390 quotaops.c:632 quotaops.c:639
+#, c-format
+msgid "%s - %s -- bad format\n"
+msgstr "%s - %s -- z³y format\n"
+
+#: quotaops.c:387
+#, c-format
+msgid "\tinodes in use: %Lu, limits (soft = %Lu, hard = %Lu)"
+msgstr "\tu¿ywanych i-wêz³ów: %Lu, limity (miêkki = %Lu, twardy = %Lu)"
+
+#: quotaops.c:446
+#, c-format
+msgid "Times to enforce softlimit for %s %s (%cid %d):\n"
+msgstr "Okresy wymuszenia miêkkich limitów %s %s (%cid %d):\n"
+
+#: quotaops.c:448 quotaops.c:551 quotaops.c:560
+#, c-format
+msgid "Time units may be: days, hours, minutes, or seconds\n"
+msgstr "Jednostkami czasu mog± byæ: days, hours, minutes, seconds\n"
+
+#: quotaops.c:450
+#, c-format
+msgid "  Filesystem                         block grace               inode grace\n"
+msgstr "  System plików         Pob³a¿liwo¶æ dla bloków Pob³a¿liwo¶æ dla i-wêz³ów\n"
+
+#: quotaops.c:455 quotaops.c:461 quotaops.c:503 quotaops.c:515 setquota.c:225
+#: setquota.c:231
+msgid "unset"
+msgstr "nie ustawiona"
+
+#: quotaops.c:457 quotaops.c:463
+msgid "0seconds"
+msgstr "0 sekund"
+
+#: quotaops.c:465 quotasys.c:330
+#, c-format
+msgid "%useconds"
+msgstr "%u sekund"
+
+#: quotaops.c:500 quotaops.c:616
+#, c-format
+msgid ""
+"bad format:\n"
+"%s\n"
+msgstr ""
+"z³y format:\n"
+"%s\n"
+
+#: quotaops.c:510 quotaops.c:646
+msgid "Bad time units. Units are 'second', 'minute', 'hour', and 'day'.\n"
+msgstr "Z³e jednostki czasu. Jednostkami s± 'second', 'minute', 'hour' i 'day'.\n"
+
+#: quotaops.c:546
+#, c-format
+msgid "Cannot duplicate descriptor of file to edit: %s\n"
+msgstr "Nie mo¿na powieliæ deskryptora pliku do edycji: %s\n"
+
+#: quotaops.c:549 quotaops.c:561
+#, c-format
+msgid "Grace period before enforcing soft limits for %ss:\n"
+msgstr "Okres pob³a¿liwo¶ci przed wymuszeniem miêkkich limitów %s:\n"
+
+#: quotaops.c:552
+#, c-format
+msgid "  Filesystem             Block grace period     Inode grace period\n"
+msgstr "  System plików         Pob³a¿liwo¶æ dla bloków Pob³a¿liwo¶æ dla i-wêz³ów\n"
+
+#: quotaops.c:566
+#, c-format
+msgid "block grace period: %s, file grace period: %s\n"
+msgstr "okres pob³a¿liwo¶ci dla bloków: %s, okres pob³a¿liwo¶ci dla plików: %s\n"
+
+#: quotaops.c:594
+#, c-format
+msgid "Cannot reopen temp file: %s\n"
+msgstr "Nie mo¿na ponownie otworzyæ pliku tymczasowego: %s\n"
+
+#: quotaops.c:636
+#, c-format
+msgid " block grace period: %d %s file grace period: %d %s"
+msgstr " okres pob³a¿liwo¶ci dla bloków: %d %s okres pob³a¿liwo¶ci dla plików: %d %s"
+
+#: quotastats.c:48
+#, c-format
+msgid "Cannot read stat file %s: %s\n"
+msgstr "Nie mo¿na odczytaæ pliku statystyk %s: %s\n"
+
+#: quotastats.c:83
+#, c-format
+msgid "Error while getting quota statistics from kernel: %s\n"
+msgstr "B³±d podczas pobierania od j±dra statystyk limitów: %s\n"
+
+#: quotastats.c:87
+#, c-format
+msgid "Error while getting old quota statistics from kernel: %s\n"
+msgstr "B³±d podczas pobierania od j±dra starych statystyk limitów: %s\n"
+
+#: quotastats.c:101
+#, c-format
+msgid "Kernel quota version: old\n"
+msgstr "Wersja limitów w j±drze: stara\n"
+
+#: quotastats.c:103
+#, c-format
+msgid "Kernel quota version: %u.%u.%u\n"
+msgstr "Wersja limitów w j±drze: %u.%u.%u\n"
+
+#: quotastats.c:104
+#, c-format
+msgid "Number of dquot lookups: %ld\n"
+msgstr "Liczba poszukiwañ dquot: %ld\n"
+
+#: quotastats.c:105
+#, c-format
+msgid "Number of dquot drops: %ld\n"
+msgstr "Liczba zrzutów dquot: %ld\n"
+
+#: quotastats.c:106
+#, c-format
+msgid "Number of dquot reads: %ld\n"
+msgstr "Liczba odczytów dquot: %ld\n"
+
+#: quotastats.c:107
+#, c-format
+msgid "Number of dquot writes: %ld\n"
+msgstr "Liczba zapisów dquot: %ld\n"
+
+#: quotastats.c:108
+#, c-format
+msgid "Number of quotafile syncs: %ld\n"
+msgstr "Liczba synchronizacji pliku limitów: %ld\n"
+
+#: quotastats.c:109
+#, c-format
+msgid "Number of dquot cache hits: %ld\n"
+msgstr "Liczba trafieñ bufora dquot: %ld\n"
+
+#: quotastats.c:110
+#, c-format
+msgid "Number of allocated dquots: %ld\n"
+msgstr "Liczba przydzielonych struktur dquot: %ld\n"
+
+#: quotastats.c:111
+#, c-format
+msgid "Number of free dquots: %ld\n"
+msgstr "Liczba wolnych dquot: %ld\n"
+
+#: quotastats.c:112
+#, c-format
+msgid "Number of in use dquot entries (user/group): %ld\n"
+msgstr "Liczba u¿ywanych wpisów dquot (u¿ytkownik/grupa): %ld\n"
+
+#: quotasys.c:108
+#, c-format
+msgid "user %s does not exist.\n"
+msgstr "u¿ytkownik %s nie istnieje.\n"
+
+#: quotasys.c:137
+#, c-format
+msgid "group %s does not exist.\n"
+msgstr "grupa %s nie istnieje.\n"
+
+#: quotasys.c:239
+#, c-format
+msgid ""
+"Unknown quota format: %s\n"
+"Supported formats are:\n"
+"  vfsold - original quota format\n"
+"  vfsv0 - new quota format\n"
+"  rpc - use RPC calls\n"
+"  xfs - XFS quota format\n"
+msgstr ""
+"Nieznany format limitów: %s\n"
+"Obs³ugiwane formaty to:\n"
+"  vfsold - oryginalny format limitów\n"
+"  vfsv0 - nowy format limitów\n"
+"  rpc - u¿ywanie wywo³añ RPC\n"
+"  xfs - format limitów na XFS\n"
+
+#: quotasys.c:254
+msgid "Unknown format"
+msgstr "Nieznany format"
+
+#: quotasys.c:318
+#, c-format
+msgid "%ddays"
+msgstr "%d dni"
+
+#: quotasys.c:320
+#, c-format
+msgid "%02d:%02d"
+msgstr "%02d:%02d"
+
+#: quotasys.c:332
+#, c-format
+msgid "%uminutes"
+msgstr "%u minut"
+
+#: quotasys.c:334
+#, c-format
+msgid "%uhours"
+msgstr "%u godzin"
+
+#: quotasys.c:336
+#, c-format
+msgid "%udays"
+msgstr "%u dni"
+
+#: quotasys.c:493
+#, c-format
+msgid "Cannot stat quota file %s: %s\n"
+msgstr "Nie mo¿na wykonaæ stat na pliku limitów %s: %s\n"
+
+#: quotasys.c:616
+msgid "Not all specified mountpoints are using quota.\n"
+msgstr "Nie wszystkie podane punkty montowania u¿ywaj± limitów.\n"
+
+#: quotasys.c:630
+#, c-format
+msgid "Error while releasing file on %s\n"
+msgstr "B³±d podczas zwalniania pliku na %s\n"
+
+#: quotasys.c:687
+#, c-format
+msgid "Cannot create set for sigaction(): %s\n"
+msgstr "Nie mo¿na utworzyæ zbioru dla sigaction(): %s\n"
+
+#: quotasys.c:690
+#, c-format
+msgid "Cannot set signal handler: %s\n"
+msgstr "Nie mo¿na ustawiæ obs³ugi sygna³u: %s\n"
+
+#: quotasys.c:737
+#, c-format
+msgid "Cannot reset signal handler: %s\n"
+msgstr "Nie mo¿na przywróciæ obs³ugi sygna³u: %s\n"
+
+#: quotasys.c:846 quotasys.c:851 warnquota.c:723
+#, c-format
+msgid "Cannot open %s: %s\n"
+msgstr "nie mo¿na otworzyæ %s: %s\n"
+
+#: quotasys.c:862
+#, c-format
+msgid "Cannot get device name for %s\n"
+msgstr "Nie mo¿na uzyskaæ nazwy urz±dzenia dla %s\n"
+
+#: quotasys.c:899
+#, c-format
+msgid "Cannot resolve mountpoint path %s: %s\n"
+msgstr "Nie mo¿na rozwi±zaæ Â¶cie¿ki punktu montowania %s: %s\n"
+
+#: quotasys.c:905
+#, c-format
+msgid "Cannot statfs() %s: %s\n"
+msgstr "Nie mo¿na wykonaæ statfs() %s: %s\n"
+
+#: quotasys.c:917
+#, c-format
+msgid "Cannot stat() mounted device %s: %s\n"
+msgstr "Nie mo¿na wykonaæ stat() na podmontowanym urz±dzeniu %s: %s\n"
+
+#: quotasys.c:923
+#, c-format
+msgid "Device (%s) filesystem is mounted on unsupported device type. Skipping.\n"
+msgstr "Urz±dzenie (%s), na którym jest podmontowany system plików, nie jest obs³ugiwanego typu. Pominiêto.\n"
+
+#: quotasys.c:938
+#, c-format
+msgid "Cannot find device of loopback mount in options for %s. Skipping.\n"
+msgstr "Nie znaleziono urz±dzenia montowanego po loopbacku w opcjach dla %s. Pominiêto.\n"
+
+#: quotasys.c:947
+#, c-format
+msgid "Cannot stat() loopback device %s: %s\n"
+msgstr "Nie mo¿na wykonaæ stat() na urz±dzeniu loopback %s: %s\n"
+
+#: quotasys.c:952
+#, c-format
+msgid "Loopback device %s is not block device!\n"
+msgstr "Urz±dzenie loopback %s nie jest urz±dzeniem blokowym!\n"
+
+#: quotasys.c:970
+#, c-format
+msgid "Cannot stat() mountpoint %s: %s\n"
+msgstr "Nie mo¿na wykonaæ stat() na punkcie montowania %s: %s\n"
+
+#: quotasys.c:1034
+#, c-format
+msgid ""
+"Cannot find a device with %s.\n"
+"Skipping...\n"
+msgstr ""
+"Nie mo¿na znale¼æ urz±dzenia z %s.\n"
+"Pomijanie...\n"
+
+#: quotasys.c:1038
+#, c-format
+msgid ""
+"Cannot stat() a mountpoint with %s: %s\n"
+"Skipping...\n"
+msgstr ""
+"Nie mo¿na wykonaæ stat() na punkcie montowania z %s: %s\n"
+"Pomijanie...\n"
+
+#: quotasys.c:1046
+#, c-format
+msgid ""
+"Cannot stat() given mountpoint %s: %s\n"
+"Skipping...\n"
+msgstr ""
+"Nie mo¿na wykonaæ stat() na podanym punkcie montowania %s: %s\n"
+"Pomijanie...\n"
+
+#: quotasys.c:1056
+#, c-format
+msgid "Cannot find a filesystem mountpoint for directory %s\n"
+msgstr "Nie mo¿na znale¼æ punktu montowania systemu plików dla katalogu %s\n"
+
+#: quotasys.c:1062
+#, c-format
+msgid "Cannot resolve path %s: %s\n"
+msgstr "Nie mo¿na rozwi±zaæ Â¶cie¿ki %s: %s\n"
+
+#: quotasys.c:1073
+#, c-format
+msgid "Cannot find mountpoint for device %s\n"
+msgstr "Nie mo¿na znale¼æ punktu montowania dla urz±dzenia %s\n"
+
+#: quotasys.c:1079
+#, c-format
+msgid "Specified path %s is not directory nor device.\n"
+msgstr "Podana Â¶cie¿ka %s nie jest katalogiem ani urz±dzeniem.\n"
+
+#: quotasys.c:1087
+msgid "No correct mountpoint specified.\n"
+msgstr "Nie podano poprawnego punktu montowania.\n"
+
+#: quotasys.c:1148
+#, c-format
+msgid "Mountpoint (or device) %s not found or has no quota enabled.\n"
+msgstr "Nie znaleziono punktu montowania (lub urz±dzenia) %s, albo nie ma on w³±czonych limitów.\n"
+
+#: repquota.c:48
+#, c-format
+msgid ""
+"Utility for reporting quotas.\n"
+"Usage:\n"
+"%s [-vugsi] [-c|C] [-t|n] [-F quotaformat] (-a | mntpoint)\n"
+"\n"
+"-v, --verbose               display also users/groups without any usage\n"
+"-u, --user                  display information about users\n"
+"-g, --group                 display information about groups\n"
+"-s, --human-readable        show numbers in human friendly units (MB, GB, ...)\n"
+"-t, --truncate-names        truncate names to 8 characters\n"
+"-p, --raw-grace             print grace time in seconds since epoch\n"
+"-n, --no-names              do not translate uid/gid to name\n"
+"-i, --no-autofs             avoid autofs mountpoints\n"
+"-c, --batch-translation     translate big number of ids at once\n"
+"-C, --no-batch-translation  translate ids one by one\n"
+"-F, --format=formatname     report information for specific format\n"
+"-h, --help                  display this help message and exit\n"
+"-V, --version               display version information and exit\n"
+"\n"
+msgstr ""
+"Narzêdzie do raportowania o limitach.\n"
+"Sk³adnia:\n"
+"%s [-vugsi] [-c|C] [-t|n] [-F format] (-a | punkt-montowania)\n"
+"\n"
+"-v, --verbose               wy¶wietlanie tak¿e u¿ytkowników/grup nie\n"
+"                            zajmuj±cych miejsca\n"
+"-u, --user                  wy¶wietlanie informacji o u¿ytkownikach\n"
+"-g, --group                 wy¶wietlanie informacji o grupach\n"
+"-s, --human-readable        wy¶wietlanie liczb w jednostkach przyjaznych dla\n"
+"                            cz³owieka (MB, GB...)\n"
+"-t, --truncate-names        obcinanie nazw do 8 znaków\n"
+"-p, --raw-grace             wypisywanie czasu pob³a¿liwo¶ci w sekundach od epoch\n"
+"-n, --no-names              nie t³umaczenie uidów/gidów na nazwy\n"
+"-i, --no-autofs             pomijanie punktów montowania autofs\n"
+"-c, --batch-translation     t³umaczenie du¿ej liczby identyfikatorów naraz\n"
+"-C, --no-batch-translation  t³umaczenie identyfikatorów po jednym\n"
+"-F, --format=format         raportowanie informacji dla podanego formatu\n"
+"-h, --help                  wy¶wietlenie tego opisu i zakoñczenie\n"
+"-V, --version               wy¶wietlenie informacji o wersji i zakoñczenie\n"
+"\n"
+
+#: repquota.c:143
+msgid "Repquota cannot report through RPC calls.\n"
+msgstr "repquota nie mo¿e raportowaæ poprzez wywo³ania RPC.\n"
+
+#: repquota.c:147
+msgid "Specified both -n and -t but only one of them can be used.\n"
+msgstr "Podano jednocze¶nie -n i -t, ale tylko jedna z nich mo¿e byæ u¿yte.\n"
+
+#: repquota.c:288
+#, c-format
+msgid "*** Report for %s quotas on device %s\n"
+msgstr "*** Raport dla limitów %s na urz±dzeniu %s\n"
+
+#: repquota.c:291
+#, c-format
+msgid "Block grace time: %s; Inode grace time: %s\n"
+msgstr "Okres pob³a¿liwo¶ci dla bloków: %s; Okres pob³a¿liwo¶ci dla i-wêz³ów: %s\n"
+
+#: repquota.c:292
+#, c-format
+msgid "                        Block limits                File limits\n"
+msgstr "                        Limity bloków               Limity plików\n"
+
+#: repquota.c:293
+#, c-format
+msgid "%-9s       used    soft    hard  grace    used  soft  hard  grace\n"
+msgstr "%-9s       u¿yw.   miêk.   twar. pob³.    u¿yw. miêk. twar. pob³.\n"
+
+#: repquota.c:293
+msgid "User"
+msgstr "U¿ytkownik"
+
+#: repquota.c:293
+msgid "Group"
+msgstr "Grupa"
+
+#: rquota_svc.c:86
+#, c-format
+msgid ""
+"Usage: %s [options]\n"
+"Options are:\n"
+" -h --help         shows this text\n"
+" -V --version      shows version information\n"
+" -F --foreground   starts the quota service in foreground\n"
+" -I --autofs       do not ignore mountpoints mounted by automounter\n"
+" -p --port <port>  listen on given port\n"
+" -s --no-setquota  disables remote calls to setquota (default)\n"
+" -S --setquota     enables remote calls to setquota\n"
+" -x --xtab <path>  set an alternative file with NFSD export table\n"
+msgstr ""
+"Sk³adnia: %s [opcje]\n"
+"Opcje to:\n"
+" -h --help            wy¶wietlenie tego opisu\n"
+" -V --version         wy¶wietlenie informacji o wersji\n"
+" -F --foreground      uruchomienie us³ugi quota jako procesu pierwszoplanowego\n"
+" -I --autofs          nie ignorowanie punktów obs³ugiwanych przez automounter\n"
+" -p --port <port>     nas³uchiwanie na podanym porcie\n"
+" -s --no-setquota     wy³±czenie zdalnych wywo³añ setquota (domy¶lne)\n"
+" -S --setquota        w³±czenie zdalnych wywo³añ setquota\n"
+" -x --xtab <¶cie¿ka>  ustawienie alternatywnego pliku z tabel± export NFSD\n"
+
+#: rquota_svc.c:97
+#, c-format
+msgid ""
+"Usage: %s [options]\n"
+"Options are:\n"
+" -h --help         shows this text\n"
+" -V --version      shows version information\n"
+" -F --foreground   starts the quota service in foreground\n"
+" -I --autofs       do not ignore mountpoints mounted by automounter\n"
+" -p --port <port>  listen on given port\n"
+" -x --xtab <path>  set an alternative file with NFSD export table\n"
+msgstr ""
+"Sk³adnia: %s [opcje]\n"
+"Opcje to:\n"
+" -h --help            wy¶wietlenie tego opisu\n"
+" -V --version         wy¶wietlenie informacji o wersji\n"
+" -F --foreground      uruchomienie us³ugi quota jako procesu pierwszoplanowego\n"
+" -I --autofs          nie ignorowanie punktów obs³ugiwanych przez automounter\n"
+" -p --port <port>     nas³uchiwanie na podanym porcie\n"
+" -x --xtab <¶cie¿ka>  ustawienie alternatywnego pliku z tabel± export NFSD\n"
+
+#: rquota_svc.c:144
+#, c-format
+msgid "Illegal port number: %s\n"
+msgstr "B³êdny numer portu: %s\n"
+
+#: rquota_svc.c:151
+#, c-format
+msgid "Cannot access the specified xtab file %s: %s\n"
+msgstr "Brak dostêpu do podanego pliku xtab %s: %s\n"
+
+#: rquota_svc.c:182
+#, c-format
+msgid "host %s attempted to call setquota when disabled\n"
+msgstr "host %s próbowa³ wywo³aæ setquota kiedy ta operacja jest wy³±czona\n"
+
+#: rquota_svc.c:189
+#, c-format
+msgid "host %s attempted to call setquota from port >= 1024\n"
+msgstr "host %s próbowa³ wywo³aæ setquota z portu >= 1024\n"
+
+#: rquota_svc.c:225
+#, c-format
+msgid "Denied access to host %s\n"
+msgstr "Odrzucono próbê dostêpu z hosta %s\n"
+
+#: rquota_svc.c:313 rquota_svc.c:399
+msgid "unable to free arguments\n"
+msgstr "nie mo¿na usun±æ argumentów\n"
+
+#: rquota_svc.c:422
+#, c-format
+msgid ""
+"Warning: Cannot open export table %s: %s\n"
+"Using '/' as a pseudofilesystem root.\n"
+msgstr ""
+"Uwaga: Nie mo¿na otworzyæ tabeli export %s: %s\n"
+"U¿ycie '/' jako g³ównego katalogu pseudo systemu plików.\n"
+
+#: rquota_svc.c:474
+msgid "cannot create udp service.\n"
+msgstr "nie mo¿na utworzyæ us³ugi udp.\n"
+
+#: rquota_svc.c:478
+msgid "unable to register (RQUOTAPROG, RQUOTAVERS, udp).\n"
+msgstr "nie mo¿na zarejestrowaæ (RQUOTAPROG, RQUOTAVERS, udp).\n"
+
+#: rquota_svc.c:482
+msgid "unable to register (RQUOTAPROG, EXT_RQUOTAVERS, udp).\n"
+msgstr "nie mo¿na zarejestrowaæ (RQUOTAPROG, EXT_RQUOTAVERS, udp).\n"
+
+#: rquota_svc.c:489
+msgid "cannot create tcp service.\n"
+msgstr "nie mo¿na utworzyæ us³ugi tcp.\n"
+
+#: rquota_svc.c:493
+msgid "unable to register (RQUOTAPROG, RQUOTAVERS, tcp).\n"
+msgstr "nie mo¿na zarejestrowaæ (RQUOTAPROG, RQUOTAVERS, tcp).\n"
+
+#: rquota_svc.c:497
+msgid "unable to register (RQUOTAPROG, EXT_RQUOTAVERS, tcp).\n"
+msgstr "nie mo¿na zarejestrowaæ (RQUOTAPROG, EXT_RQOUTAVERS, tcp).\n"
+
+#: rquota_svc.c:506
+msgid "svc_run returned\n"
+msgstr "svc_run powróci³o\n"
+
+#: set_limits_example.c:18
+#, c-format
+msgid "copy_user_quota_limits: Failed to set userquota for uid %ld : %s\n"
+msgstr "copy_user_quota_limits: nie uda³o siê ustawiæ limitów u¿ytkownika dla uid %ld : %s\n"
+
+#: set_limits_example.c:25
+#, c-format
+msgid "copy_user_quota_limits: Failed to get userquota for uid %ld : %s\n"
+msgstr "copy_user_quota_limits: nie uda³o siê pobraæ limitów u¿ytkownika dla uid %ld : %s\n"
+
+#: set_limits_example.c:41
+#, c-format
+msgid "copy_group_quota_limits: Failed to set groupquota for uid %ld : %s\n"
+msgstr "copy_group_quota_limits: nie uda³o siê ustawiæ limitów grupy dla uid %ld : %s\n"
+
+#: set_limits_example.c:48
+#, c-format
+msgid "copy_group_quota_limits: Failed to get groupquota for uid %ld : %s\n"
+msgstr "copy_group_quota_limits: nie uda³o siê odczytaæ limitów grupy dla uid %ld : %s\n"
+
+#: setquota.c:49
+#, c-format
+msgid ""
+"Usage:\n"
+"  setquota [-u|-g] %1$s[-F quotaformat] <user|group>\n"
+"\t<block-softlimit> <block-hardlimit> <inode-softlimit> <inode-hardlimit> -a|<filesystem>...\n"
+"  setquota [-u|-g] %1$s[-F quotaformat] <-p protouser|protogroup> <user|group> -a|<filesystem>...\n"
+"  setquota [-u|-g] %1$s[-F quotaformat] -b -a|<filesystem>...\n"
+"  setquota [-u|-g] [-F quotaformat] -t <blockgrace> <inodegrace> -a|<filesystem>...\n"
+"  setquota [-u|-g] [-F quotaformat] <user|group> -T <blockgrace> <inodegrace> -a|<filesystem>...\n"
+"\n"
+"-u, --user                 set limits for user\n"
+"-g, --group                set limits for group\n"
+"-a, --all                  set limits for all filesystems\n"
+"    --always-resolve       always try to resolve name, even if is\n"
+"                           composed only of digits\n"
+"-F, --format=formatname    operate on specific quota format\n"
+"-p, --prototype=protoname  copy limits from user/group\n"
+"-b, --batch                read limits from standard input\n"
+msgstr ""
+"Sk³adnia:\n"
+"  setquota [-u|-g] %1$s[-F format] <u¿ytkownik|grupa>\n"
+"\t<miêkki-limit-bloków> <twardy-limit-bloków> <miêkki-limit-iwêz³ów> <twardy-limit-iwêz³ów> -a|<system-plików>...\n"
+"  setquota [-u|-g] %1$s[-F format] <-p wzorcowy-u¿ytkownik|grupa> <u¿ytkownik|grupa> -a|<system-plików>...\n"
+"  setquota [-u|-g] %1$s[-F format] -b -a|<system-plików>...\n"
+"  setquota [-u|-g] [-F format] -t <pob³-bloki> <pob³-iwêz³y> -a|<system-plików>...\n"
+"  setquota [-u|-g] [-F format] <u¿ytkownik|grupa> -T <pob³-bloki> <pob³-iwêz³y> -a|<system-plików>...\n"
+"\n"
+"-u, --user                 ustawienie limitów dla u¿ytkownika\n"
+"-g, --group                ustawienie limitów dla grupy\n"
+"-a, --all                  ustawienie limitów dla wszystkich systemów plików\n"
+"    --always-resolve       próba rozwi±zania nazwy zawsze, nawet je¶li sk³ada\n"
+"                           siê wy³±cznie z cyfr\n"
+"-F, --format=nazwa         operowanie na podanym formacie limitów\n"
+"-p, --prototype=nazwa      skopiowanie limitów od podanego u¿ytkownika/grupy\n"
+"-b, --batch                odczyt limitów ze standardowego wej¶cia\n"
+
+#: setquota.c:65
+msgid "-r, --remote               set remote quota (via RPC)\n"
+msgstr "-r, --remote               ustawienie zdalnego limitu (poprzez RPC)\n"
+
+#: setquota.c:67
+msgid ""
+"-t, --edit-period          edit grace period\n"
+"-T, --edit-times           edit grace times for user/group\n"
+"-h, --help                 display this help text and exit\n"
+"-V, --version              display version information and exit\n"
+"\n"
+msgstr ""
+"-t, --edit-period          zmiana okresu pob³a¿liwo¶ci\n"
+"-T, --edit-times           zmiana czasów pob³a¿liwo¶ci dla u¿ytkownika/grupy\n"
+"-h, --help                 wy¶wietlenie tego opisu i zakoñczenie\n"
+"-V, --version              wy¶wietlenie informacji o wersji i zakoñczenie\n"
+
+#: setquota.c:82
+#, c-format
+msgid "Bad %s: %s\n"
+msgstr "B³êdny %s: %s\n"
+
+#: setquota.c:170
+msgid "Group and user quotas cannot be used together.\n"
+msgstr "Limity grupy i u¿ytkownika nie mog± byæ u¿yte razem.\n"
+
+#: setquota.c:174
+msgid "Prototype user has no sense when editing grace times.\n"
+msgstr "Wzorcowy u¿ytkownik nie ma sensu przy edycji okresów pob³a¿liwo¶ci.\n"
+
+#: setquota.c:178
+msgid "Cannot set both individual and global grace time.\n"
+msgstr "Nie mo¿na ustawiæ jednocze¶nie jednostkowych i globalnych okresów pob³a¿liwo¶ci.\n"
+
+#: setquota.c:182
+msgid "Batch mode cannot be used for setting grace times.\n"
+msgstr "Nie mo¿na u¿yæ trybu wsadowego do ustawienia okresów pob³a¿liwo¶ci.\n"
+
+#: setquota.c:186
+msgid "Batch mode and prototype user cannot be used together.\n"
+msgstr "Tryb wsadowy i u¿ytkownik wzorcowy nie mog± byæ u¿yte razem.\n"
+
+#: setquota.c:209
+msgid "block softlimit"
+msgstr "miêkki limit bloków"
+
+#: setquota.c:210
+msgid "block hardlimit"
+msgstr "twardy limit bloków"
+
+#: setquota.c:211
+msgid "inode softlimit"
+msgstr "miêkki limit i-wêz³ów"
+
+#: setquota.c:212
+msgid "inode hardlimit"
+msgstr "twardy limit i-wêz³ów"
+
+#: setquota.c:218 setquota.c:230
+msgid "block grace time"
+msgstr "okres pob³a¿liwo¶ci dla bloków"
+
+#: setquota.c:219 setquota.c:236
+msgid "inode grace time"
+msgstr "okres pob³a¿liwo¶ci dla i-wêz³ów"
+
+#: setquota.c:242
+msgid "Mountpoint not specified.\n"
+msgstr "Nie podano punktu montowania.\n"
+
+#: setquota.c:297
+#, c-format
+msgid "Cannot parse input line %d.\n"
+msgstr "Nie mo¿na przetworzyæ linii wej¶cia %d.\n"
+
+#: setquota.c:301
+#, c-format
+msgid "Unable to get name '%s'.\n"
+msgstr "Nie mo¿na uzyskaæ nazwy '%s'.\n"
+
+#: setquota.c:359
+#, c-format
+msgid "cannot write times for %s. Maybe kernel does not support such operation?\n"
+msgstr "nie mo¿na zapisaæ czasów %s. Mo¿e j±dro nie obs³uguje takiej operacji?\n"
+
+#: svc_socket.c:40
+#, c-format
+msgid "Cannot create socket: %s\n"
+msgstr "Nie mo¿na utworzyæ gniazda: %s\n"
+
+#: svc_socket.c:47
+#, c-format
+msgid "Cannot set socket options: %s\n"
+msgstr "Nie mo¿na ustawiæ opcji gniazda: %s\n"
+
+#: svc_socket.c:82
+#, c-format
+msgid "Cannot bind to given address: %s\n"
+msgstr "Nie mo¿na przypisaæ do podanego adresu: %s\n"
+
+#: warnquota.c:54
+msgid ""
+"Hi,\n"
+"\n"
+"We noticed that you are in violation with the quotasystem\n"
+"used on this system. We have found the following violations:\n"
+"\n"
+msgstr ""
+"Cze¶æ!\n"
+"\n"
+"Zauwa¿yli¶my naruszenie zasad systemu limitowania przestrzeni dyskowej,\n"
+"u¿ywanego na tym systemie. Znale¼li¶my nastêpuj±ce naruszenia:\n"
+
+#: warnquota.c:56
+#, c-format
+msgid ""
+"\n"
+"We hope that you will cleanup before your grace period expires.\n"
+"\n"
+"Basically, this means that the system thinks you are using more disk space\n"
+"on the above partition(s) than you are allowed.  If you do not delete files\n"
+"and get below your quota before the grace period expires, the system will\n"
+"prevent you from creating new files.\n"
+"\n"
+"For additional assistance, please contact us at %s\n"
+"or via phone at %s.\n"
+msgstr ""
+"\n"
+"Mamy nadziejê, Â¿e posprz±tasz przed up³yniêciem okresu pob³a¿liwo¶ci.\n"
+"\n"
+"Oznacza to, i¿ system uwa¿a, Â¿e na podanych systemach plików u¿ywasz\n"
+"wiêcej miejsca, ni¿ jeste¶ upowa¿niony. Je¿eli nie posprz±tasz tak, aby\n"
+"znale¼æ siê poni¿ej limitów przed up³yniêciem okresu pob³a¿liwo¶ci, system\n"
+"zabroni Ci tworzyæ nowe pliki.\n"
+"\n"
+"Aby uzyskaæ dodatkowe wyja¶nienia prosimy skontaktowaæ siê z nami pod\n"
+"adresem %s lub telefonicznie pod numerem %s.\n"
+
+#: warnquota.c:63
+#, c-format
+msgid ""
+"Hi,\n"
+"\n"
+"We noticed that the group %s you are member of violates the quotasystem\n"
+"used on this system. We have found the following violations:\n"
+"\n"
+msgstr ""
+"Cze¶æ!\n"
+"\n"
+"Zauwa¿yli¶my, Â¿e grupa %s, której jeste¶ cz³onkiem, narusza zasady\n"
+"systemu limitowania przestrzeni dyskowej, u¿ywanego na tym systemie.\n"
+"Znale¼li¶my nastêpuj±ce naruszenia:\n"
+
+#: warnquota.c:65
+#, c-format
+msgid ""
+"\n"
+"Please cleanup the group data before the grace period expires.\n"
+"\n"
+"Basically, this means that the system thinks group is using more disk space\n"
+"on the above partition(s) than it is allowed.  If you do not delete files\n"
+"and get below group quota before the grace period expires, the system will\n"
+"prevent you and other members of the group from creating new files owned by\n"
+"the group.\n"
+"\n"
+"For additional assistance, please contact us at %s\n"
+"or via phone at %s.\n"
+msgstr ""
+"\n"
+"Prosimy posprz±taæ dane grupy przed up³yniêciem okresu pob³a¿liwo¶ci.\n"
+"\n"
+"Oznacza to, i¿ system uwa¿a, Â¿e na podanych systemach plików grupa u¿ywa\n"
+"wiêcej miejsca, ni¿ jest upowa¿niona. Je¶li nie posprz±tacie tak, aby\n"
+"znale¼æ siê poni¿ej limitów przed up³yniêciem okresu pob³a¿liwo¶ci, system\n"
+"zabroni Ci i innym cz³onkom grupy tworzyæ nowe pliki nale¿±ce do tej grupy.\n"
+"\n"
+"Aby uzyskaæ dodatkowe wyja¶nienia prosimy skontaktowaæ siê z nami pod\n"
+"adresem %s lub telefonicznie pod numerem %s.\n"
+
+#: warnquota.c:181
+#, c-format
+msgid "%s: %s\n"
+msgstr "%s: %s\n"
+
+#: warnquota.c:225
+#, c-format
+msgid "Cannot get name for uid/gid %u.\n"
+msgstr "Nie mo¿na uzyskaæ nazwy dla uid/gid %u.\n"
+
+#: warnquota.c:309
+#, c-format
+msgid "Cannot create pipe: %s\n"
+msgstr "Nie mo¿na utworzyæ potoku: %s\n"
+
+#: warnquota.c:315
+#, c-format
+msgid "Cannot fork: %s\n"
+msgstr "Nie mo¿na wykonaæ fork: %s\n"
+
+#: warnquota.c:320
+#, c-format
+msgid "Cannot duplicate descriptor: %s\n"
+msgstr "Nie mo¿na powieliæ deskryptora: %s\n"
+
+#: warnquota.c:324
+#, c-format
+msgid "Cannot execute '%s': %s\n"
+msgstr "Nie mo¿na uruchomiæ '%s': %s\n"
+
+#: warnquota.c:329
+#, c-format
+msgid "Cannot open pine: %s\n"
+msgstr "Nie mo¿na otworzyæ potoku: %s\n"
+
+#: warnquota.c:410
+msgid "Could not setup ldap connection, returning.\n"
+msgstr "Nie mo¿na nawi±zaæ po³±czenia LDAP, powrót.\n"
+
+#: warnquota.c:433
+#, c-format
+msgid "Error with %s.\n"
+msgstr "B³±d przy %s.\n"
+
+#: warnquota.c:441
+#, c-format
+msgid "Multiple entries found for client %s, %d not sending mail.\n"
+msgstr "Znaleziono wiele wpisów dla klienta %s - %d, nie wys³ano poczty.\n"
+
+#: warnquota.c:445
+#, c-format
+msgid "Entry not found for client %s, %d not sending mail.\n"
+msgstr "Nie znaleziono wpisu dla klienta %s - %d, nie wys³ano poczty.\n"
+
+#: warnquota.c:456
+#, c-format
+msgid "Could not get values for %s.\n"
+msgstr "Nie mo¿na uzyskaæ warto¶ci dla %s.\n"
+
+#: warnquota.c:488
+#, c-format
+msgid "Administrator for a group %s not found. Cancelling mail.\n"
+msgstr "Nie znaleziono administratora dla grupy %s. Anulowanie poczty.\n"
+
+#: warnquota.c:528
+#, c-format
+msgid ""
+"\n"
+"                        Block limits               File limits\n"
+msgstr ""
+"\n"
+"                        Limity bloków              Limity plików\n"
+
+#: warnquota.c:529
+#, c-format
+msgid "Filesystem           used    soft    hard  grace    used  soft  hard  grace\n"
+msgstr "System plików        u¿yw.   miêk.   twar. pob³.    u¿yw. miêk. twar. pob³.\n"
+
+#: warnquota.c:569
+#, c-format
+msgid "Cannot wait for mailer: %s\n"
+msgstr "Nie mo¿na czekaæ na wys³anie poczty: %s\n"
+
+#: warnquota.c:571
+msgid "Warning: Mailer exitted abnormally.\n"
+msgstr "Uwaga: Program wysy³aj±cy pocztê nie zakoñczy³ siê normalnie.\n"
+
+#: warnquota.c:628
+#, c-format
+msgid ""
+"Cannot open %s: %s\n"
+"Will use device names.\n"
+msgstr ""
+"Nie mo¿na otworzyæ %s: %s\n"
+"Bêd± u¿ywane nazwy urz±dzeñ.\n"
+
+#: warnquota.c:651
+#, c-format
+msgid "Cannot parse line %d in quotatab (missing ':')\n"
+msgstr "Nie mo¿na przeanalizowaæ linii %d w pliku quotatab (brakuje ':')\n"
+
+#: warnquota.c:665
+#, c-format
+msgid "Cannot stat device %s (maybe typo in quotatab)\n"
+msgstr "Nie mo¿na wykonaæ stat na urz±dzeniu %s (mo¿e b³±d w quotatab)\n"
+
+#: warnquota.c:685
+#, c-format
+msgid ""
+"Incorrect format string for variable %s.\n"
+"Unrecognized expression %%%c.\n"
+msgstr ""
+"Niepoprawny Â³añcuch formatuj±cy dla zmiennej %s.\n"
+"Nierozpoznane wyra¿enie %%%c.\n"
+
+#: warnquota.c:743
+#, c-format
+msgid "Line %d too long. Truncating.\n"
+msgstr "Linia %d zbyt d³uga. Uciêto.\n"
+
+#: warnquota.c:813
+#, c-format
+msgid "Cannot parse time at CC_BEFORE variable (line %d).\n"
+msgstr "Nie mo¿na przetworzyæ czasu przy zmiennej CC_BEFORE (linia %d).\n"
+
+#: warnquota.c:837
+#, c-format
+msgid "Error in config file (line %d), ignoring\n"
+msgstr "B³±d w pliku konfiguracyjnym (linia %d), zignorowano\n"
+
+#: warnquota.c:840
+#, c-format
+msgid "Possible error in config file (line %d), ignoring\n"
+msgstr "Mo¿liwy b³±d w pliku konfiguracyjnym (linia %d), zignorowano\n"
+
+#: warnquota.c:843
+msgid "Unterminated last line, ignoring\n"
+msgstr "Niezakoñczona ostatnia linia, zignorowano\n"
+
+#: warnquota.c:848
+#, c-format
+msgid ""
+"LDAP library version >= 2.3 detected. Please use LDAP_URI instead of hostname and port.\n"
+"Generated URI %s\n"
+msgstr ""
+"Wykryto bibliotekê LDAP w wersji >= 2.3. Proszê u¿yæ LDAP_URI zamiast nazwy hosta i portu.\n"
+"Wygenerowano URI %s\n"
+
+#: warnquota.c:852
+msgid "LDAP library does not support ldap_initialize() but URI is specified."
+msgstr "Biblioteka LDAP nie obs³uguje ldap_initialize(), ale podano URI."
+
+#: warnquota.c:873
+#, c-format
+msgid "Cannot open file with group administrators: %s\n"
+msgstr "Nie mo¿na otworzyæ pliku z administratorami grup: %s\n"
+
+#: warnquota.c:888
+#, c-format
+msgid "Parse error at line %d. Cannot find end of group name.\n"
+msgstr "B³±d podczas analizy linii %d. Nie mo¿na znale¼æ nazwy grupy.\n"
+
+#: warnquota.c:897
+#, c-format
+msgid "Parse error at line %d. Cannot find administrators name.\n"
+msgstr "B³±d podczas analizy linii %d. Nie mo¿na znale¼æ nazwy administratora.\n"
+
+#: warnquota.c:907
+#, c-format
+msgid "Parse error at line %d. Trailing characters after administrators name.\n"
+msgstr "B³±d podczas analizy linii %d. Nadmiarowe znaki po nazwie administratora.\n"
+
+#: warnquota.c:970
+msgid ""
+"Usage:\n"
+"  warnquota [-ugsid] [-F quotaformat] [-c configfile] [-q quotatabfile] [-a adminsfile]\n"
+"\n"
+"-u, --user                      warn users\n"
+"-g, --group                     warn groups\n"
+"-s, --human-readable            send information in more human friendly units\n"
+"-i, --no-autofs                 avoid autofs mountpoints\n"
+"-d, --no-details                do not send quota information itself\n"
+"-F, --format=formatname         use quotafiles of specific format\n"
+"-c, --config=config-file        non-default config file\n"
+"-q, --quota-tab=quotatab-file   non-default quotatab\n"
+"-a, --admins-file=admins-file   non-default admins file\n"
+"-h, --help                      display this help message and exit\n"
+"-v, --version                   display version information and exit\n"
+"\n"
+msgstr ""
+"Sk³adnia:\n"
+"  warnquota [-ugsid] [-F format] [-c plik-konfiguracyjny] [-q plik-quotatab] [-a plik-admins]\n"
+"\n"
+"-u, --user                      ostrze¿enie u¿ytkowników\n"
+"-g, --group                     ostrze¿enie grup\n"
+"-s, --human-readable            wysy³anie informacji w jednostkach bardziej\n"
+"                                przyjaznych dla cz³owieka\n"
+"-i, --no-autofs                 pomijanie punktów montowania autofs\n"
+"-d, --no-details                nie wysy³anie informacji o samych limitach\n"
+"-F, --format=format             u¿ycie plików limitów o podanym formacie\n"
+"-c, --config=plik               inny ni¿ domy¶lny plik konfiguracyjny\n"
+"-q, --quota-tab=plik            inny ni¿ domy¶lny plik quotatab\n"
+"-a, --admins-file=plik          inny ni¿ domy¶lny plik admins\n"
+"-h, --help                      wy¶wietlenie tego opisu i zakoñczenie\n"
+"-v, --version                   wy¶wietlenie informacji o wersji i zakoñczenie\n"
+"\n"
+
+#: warnquota.c:1051
+#, c-format
+msgid "Cannot get host name: %s\n"
+msgstr "Nie mo¿na uzyskaæ nazwy hosta: %s\n"
+
+#: xqmstats.c:31 xqmstats.c:36
+msgid "The running kernel does not support XFS\n"
+msgstr "Dzia³aj±ce j±dro nie obs³uguje XFS\n"
+
+#: xqmstats.c:48
+#, c-format
+msgid "XFS Quota Manager dquot statistics\n"
+msgstr "Statystyki dquot Zarz±dcy Limitów na XFS\n"
+
+#: xqmstats.c:49
+#, c-format
+msgid "  reclaims:        %u\n"
+msgstr "  poprawki:          %u\n"
+
+#: xqmstats.c:50
+#, c-format
+msgid "  missed reclaims: %u\n"
+msgstr "  chybione poprawki: %u\n"
+
+#: xqmstats.c:51
+#, c-format
+msgid "  dquot dups:      %u\n"
+msgstr "  duplikaty dquot:   %u\n"
+
+#: xqmstats.c:52
+#, c-format
+msgid "  cache misses:    %u\n"
+msgstr "  chybienia bufora:  %u\n"
+
+#: xqmstats.c:53
+#, c-format
+msgid "  cache hits:      %u\n"
+msgstr "  trafienia bufora:  %u\n"
+
+#: xqmstats.c:54
+#, c-format
+msgid "  dquot wants:     %u\n"
+msgstr "  Â¿Â±dania dquot:     %u\n"
+
+#: xqmstats.c:55
+#, c-format
+msgid "  shake reclaims:  %u\n"
+msgstr "  poprawki shake:    %u\n"
+
+#: xqmstats.c:56
+#, c-format
+msgid "  inact reclaims:  %u\n"
+msgstr "  poprawki inact:    %u\n"
+
+#: xqmstats.c:61
+#, c-format
+msgid "Maximum %u dquots (currently %u incore, %u on freelist)\n"
+msgstr "Maksimum %u dquot (aktualnie %u w rdzeniu, %u na li¶cie wolnych)\n"
diff --git a/po/pl.po.orig b/po/pl.po.orig
new file mode 100644 (file)
index 0000000..3ba3756
--- /dev/null
@@ -0,0 +1,2696 @@
+# Polish translation for quota.
+# Copyright (C) 2000, 2003, 2004, 2005 Free Software Foundation, Inc.
+# PAUL NIEWIADOMSKI <lilo@free.poltronic.net>, 2000.
+# Jakub Bogusz <qboosh@pld-linux.org>, 2003-2007.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: quota 3.15\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-08-05 02:34+0200\n"
+"PO-Revision-Date: 2007-08-05 02:35+0200\n"
+"Last-Translator: Jakub Bogusz <qboosh@pld-linux.org>\n"
+"Language-Team: Polish <translation-team-pl@lists.sourceforge.net>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-2\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: bylabel.c:251
+#, c-format
+msgid "Found an invalid UUID: %s\n"
+msgstr "Znaleziono nieprawid³owy UUID: %s\n"
+
+#: bylabel.c:271
+#, c-format
+msgid "Error checking device name: %s\n"
+msgstr "B³±d podczas sprawdzania nazwy urz±dzenia: %s\n"
+
+#: common.c:122
+#, c-format
+msgid "Quota utilities version %s.\n"
+msgstr "Narzêdzia Quota w wersji %s.\n"
+
+#: common.c:124
+#, c-format
+msgid "Compiled with "
+msgstr "Skompilowano z "
+
+#: common.c:126
+msgid "RPC and EXT2_DIRECT"
+msgstr "RPC i EXT2_DIRECT"
+
+#: common.c:128
+msgid "RPC"
+msgstr "RPC"
+
+#: common.c:130
+msgid "EXT2_DIRECT"
+msgstr "EXT2_DIRECT"
+
+#: common.c:133 convertquota.c:45 quotacheck.c:317 repquota.c:62
+#: warnquota.c:982
+#, c-format
+msgid "Bugs to %s\n"
+msgstr "B³êdy na adres %s\n"
+
+#: convertquota.c:38
+#, c-format
+msgid ""
+"Utility for converting quota files.\n"
+"Usage:\n"
+"\t%s [options] mountpoint\n"
+"\n"
+"-u, --user            convert user quota file\n"
+"-g, --group           convert group quota file\n"
+"-e, --convert-endian  convert quota file to correct endianity\n"
+"-f, --convert-format  convert from old to VFSv0 quota format\n"
+"-h, --help            show this help text and exit\n"
+"-V, --version         output version information and exit\n"
+"\n"
+msgstr ""
+"Narzêdzie do konwersji plików limitów.\n"
+"Sk³adnia:\n"
+"\t%s [opcje] punkt-montowania\n"
+"\n"
+"-u, --user            konwersja pliku limitów u¿ytkowników (user)\n"
+"-g, --group           konwersja pliku limitów grup (group)\n"
+"-e, --convert-endian  konwersja pliku limitów do poprawnej kolejno¶ci bajtów\n"
+"-f, --convert-format  konwersja ze starego formatu limitów na VFSv0\n"
+"-h, --help            wy¶wietlenie tego opisu i zakoñczenie\n"
+"-V, --version         wy¶wietlenie informacji o wersji i zakoñczenie\n"
+
+#: convertquota.c:87
+msgid "Bad number of arguments."
+msgstr "B³êdna liczba argumentów."
+
+#: convertquota.c:137 quotacheck_v2.c:219 quotaio_v2.c:276
+#, c-format
+msgid "Cannot read block %u: %s\n"
+msgstr "Nie mo¿na odczytaæ bloku %u: %s\n"
+
+#: convertquota.c:161 convertquota.c:253
+#, c-format
+msgid "Cannot commit dquot for id %u: %s\n"
+msgstr "Nie mo¿na utrwaliæ dquot dla id %u: %s\n"
+
+#: convertquota.c:209
+msgid "Cannot read header of old quotafile.\n"
+msgstr "Nie mo¿na odczytaæ nag³ówka starego pliku limitów.\n"
+
+#: convertquota.c:213
+msgid "Bad file magic or version (probably not quotafile with bad endianity).\n"
+msgstr "B³êdny magic lub wersja (raczej nie plik limitów dla innego procesora).\n"
+
+#: convertquota.c:224
+msgid "Cannot read information about old quotafile.\n"
+msgstr "Nie mo¿na odczytaæ informacji o starym pliku limitów.\n"
+
+#: convertquota.c:266
+msgid "Cannot get name of new quotafile.\n"
+msgstr "Nie mo¿na uzyskaæ nazwy nowego pliku limitów.\n"
+
+#: convertquota.c:272 quotacheck.c:746
+#, c-format
+msgid "Cannot rename new quotafile %s to name %s: %s\n"
+msgstr "Nie mo¿na zmieniæ nazwy nowego pliku limitów %s na %s: %s\n"
+
+#: convertquota.c:286
+#, c-format
+msgid "Cannot open old format file for %ss on %s\n"
+msgstr "Nie mo¿na otworzyæ pliku limitów %s w starym formacie na %s\n"
+
+#: convertquota.c:291 convertquota.c:324
+#, c-format
+msgid "Cannot create file for %ss for new format on %s: %s\n"
+msgstr "Nie mo¿na utworzyæ pliku limitów %s dla nowego formatu na %s: %s\n"
+
+#: convertquota.c:314
+#, c-format
+msgid "Cannot open old quota file on %s: %s\n"
+msgstr "Nie mo¿na otworzyæ starego pliku limitów na %s: %s\n"
+
+#: convertquota.c:350
+msgid "Unknown action should be performed.\n"
+msgstr "Mia³a byæ wykonana nieznana akcja.\n"
+
+#: edquota.c:82
+#, c-format
+msgid ""
+"Usage:\n"
+"\tedquota %1$s[-u] [-F formatname] [-p username] [-f filesystem] username ...\n"
+"\tedquota %1$s-g [-F formatname] [-p groupname] [-f filesystem] groupname ...\n"
+"\tedquota %1$s[-u|g] [-F formatname] [-f filesystem] -t\n"
+"\tedquota %1$s[-u|g] [-F formatname] [-f filesystem] -T username|groupname ...\n"
+msgstr ""
+"Sk³adnia:\n"
+"\tedquota %1$s[-u] [-F format] [-p u¿ytkownik] [-f system-plików] u¿ytkownik ...\n"
+"\tedquota %1$s-g [-F format] [-p grupa] [-f system-plików] grupa ...\n"
+"\tedquota %1$s[-u|g] [-F format] [-f system-plików] -t\n"
+"\tedquota %1$s[-u|g] [-F format] [-f system-plików] -T u¿ytkownik|grupa ...\n"
+
+#: edquota.c:86
+msgid ""
+"\n"
+"-u, --user                    edit user data\n"
+"-g, --group                   edit group data\n"
+msgstr ""
+"\n"
+"-u, --user                    zmiana danych u¿ytkownika\n"
+"-g, --group                   zmiana danych grupy\n"
+
+#: edquota.c:90
+msgid "-r, --remote                  edit remote quota (via RPC)\n"
+msgstr "-r, --remote                  zmiana zdalnego limitu (poprzez RPC)\n"
+
+#: edquota.c:92
+msgid ""
+"-F, --format=formatname       edit quotas of a specific format\n"
+"-p, --prototype=name          copy data from a prototype user/group\n"
+"    --always-resolve          always try to resolve name, even if it is\n"
+"                              composed only of digits\n"
+"-f, --filesystem=filesystem   edit data only on a specific filesystem\n"
+"-t, --edit-period             edit grace period\n"
+"-T, --edit-times              edit grace time of a user/group\n"
+"-h, --help                    display this help text and exit\n"
+"-V, --version                 display version information and exit\n"
+"\n"
+msgstr ""
+"-F, --format=format           zmiana limitów w podanym formacie\n"
+"-p, --prototype=nazwa         skopiowanie danych od wzorcowego u¿ytkownika/grupy\n"
+"    --always-resolve          próba rozwi±zania nazwy zawsze, nawet je¶li\n"
+"                              sk³ada siê wy³±cznie z cyfr\n"
+"-f, --filesystem=system-plików  zmiana danych tylko na podanym systemie plików\n"
+"-t, --edit-period             zmiana okresu pob³a¿liwo¶ci\n"
+"-T, --edit-times              zmiana czasu pob³a¿liwo¶ci u¿ytkownika/grupy\n"
+"-h, --help                    wy¶wietlenie tego opisu i zakoñczenie\n"
+"-V, --version                 wy¶wietlenie informacji o wersji i zakoñczenie\n"
+"\n"
+
+#: edquota.c:101 quota.c:107 setquota.c:71
+#, c-format
+msgid "Bugs to: %s\n"
+msgstr "B³êdy na adres: %s\n"
+
+#: edquota.c:178
+msgid "Prototype name does not make sence when editting grace period or times.\n"
+msgstr "Wzorcowy u¿ytkownik nie ma sensu przy edycji okresów pob³a¿liwo¶ci.\n"
+
+#: edquota.c:199
+msgid "fsname mismatch\n"
+msgstr "nazwa systemu plików siê nie zgadza\n"
+
+#: edquota.c:239
+msgid "No filesystems with quota detected.\n"
+msgstr "Nie wykryto systemów plików z limitami.\n"
+
+#: edquota.c:255
+#, c-format
+msgid "Cannot create temporary file: %s\n"
+msgstr "Nie mo¿na utworzyæ pliku tymczasowego: %s\n"
+
+#: edquota.c:260
+#, c-format
+msgid "Cannot change owner of temporary file: %s\n"
+msgstr "Nie mo¿na zmieniæ w³a¶ciciela pliku tymczasowego: %s\n"
+
+#: edquota.c:267
+msgid "Cannot write grace times to file.\n"
+msgstr "Nie mo¿na zapisaæ okresów pob³a¿liwo¶ci do pliku.\n"
+
+#: edquota.c:271
+msgid "Error while editting grace times.\n"
+msgstr "B³±d podczas edycji okresów pob³a¿liwo¶ci.\n"
+
+#: edquota.c:275
+msgid "Failed to parse grace times file.\n"
+msgstr "Analiza pliku okresów pob³a¿liwo¶ci nie powiod³a siê.\n"
+
+#: edquota.c:284
+msgid "Cannot write individual grace times to file.\n"
+msgstr "Nie mo¿na zapisaæ do pliku pojedynczych okresów pob³a¿liwo¶ci.\n"
+
+#: edquota.c:289
+msgid "Error while editting individual grace times.\n"
+msgstr "B³±d podczas edycji pojedynczych okresów pob³a¿liwo¶ci.\n"
+
+#: edquota.c:294
+msgid "Cannot read individual grace times from file.\n"
+msgstr "Nie mo¿na odczytaæ z pliku pojedynczych okresów pob³a¿liwo¶ci.\n"
+
+#: edquota.c:308
+msgid "Cannot write quotas to file.\n"
+msgstr "Nie mo¿na zapisaæ limitów do pliku.\n"
+
+#: edquota.c:313
+msgid "Error while editting quotas.\n"
+msgstr "B³±d podczas edycji limitów.\n"
+
+#: edquota.c:319
+msgid "Cannot reopen!"
+msgstr "Nie mo¿na ponownie otworzyæ!"
+
+#: edquota.c:321
+msgid "Cannot read quotas from file.\n"
+msgstr "Nie mo¿na odczytaæ limitów z pliku.\n"
+
+#: quot.c:83
+#, c-format
+msgid "Usage: %s [-acfugvViTq] [filesystem...]\n"
+msgstr "Sk³adnia: %s [-acfugvViTq] [system-plików...]\n"
+
+#: quot.c:180
+#, c-format
+msgid "%s (%s):\n"
+msgstr "%s (%s):\n"
+
+#: quot.c:184 quot.c:188
+#, c-format
+msgid "%d\t%llu\t%llu\n"
+msgstr "%d\t%llu\t%llu\n"
+
+#: quot.c:197
+#, c-format
+msgid "%s (%s) %s:\n"
+msgstr "%s (%s) %s:\n"
+
+#: quot.c:205 quot.c:207
+#, c-format
+msgid "%8llu    "
+msgstr "%8llu    "
+
+#: quot.c:210
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: quot.c:212
+#, c-format
+msgid "%-8.8s"
+msgstr "%-8.8s"
+
+#: quot.c:214
+#, c-format
+msgid "#%-7d"
+msgstr "#%-7d"
+
+#: quot.c:216
+#, c-format
+msgid "    %8llu    %8llu    %8llu"
+msgstr "    %8llu    %8llu    %8llu"
+
+#: quot.c:364
+#, c-format
+msgid "cannot open %s: %s\n"
+msgstr "nie mo¿na otworzyæ %s: %s\n"
+
+#: quot.c:384
+#, c-format
+msgid "XFS_IOC_FSBULKSTAT ioctl failed: %s\n"
+msgstr "ioctl XFS_IOC_FSBULKSTAT nie powiód³ siê: %s\n"
+
+#: quota.c:84
+msgid "Usage: quota [-guqvsw] [-l | [-Q | -A]] [-i] [-F quotaformat]\n"
+msgstr "Sk³adnia: quota [-guqvsw] [-l | [-Q | -A]] [-i] [-F format]\n"
+
+#: quota.c:85
+msgid "\tquota [-qvsw] [-l | [-Q | -A]] [-i] [-F quotaformat] -u username ...\n"
+msgstr "\tquota [-qvsw] [-l | [-Q | -A]] [-i] [-F format] -u u¿ytkownik ...\n"
+
+#: quota.c:86
+msgid "\tquota [-qvsw] [-l | [-Q | -A]] [-i] [-F quotaformat] -g groupname ...\n"
+msgstr "\tquota [-qvsw] [-l | [-Q | -A]] [-i] [-F format] -g grupa ...\n"
+
+#: quota.c:87
+msgid "\tquota [-qvswugQ] [-F quotaformat] -f filesystem ...\n"
+msgstr "\tquota [-qvswugQ] [-F format] -f system-plików ...\n"
+
+#: quota.c:88
+msgid ""
+"\n"
+"-u, --user                display quota for user\n"
+"-g, --group               display quota for group\n"
+"-q, --quiet               print more terse message\n"
+"-v, --verbose             print more verbose message\n"
+"-s, --human-readable      display numbers in human friendly units (MB, GB...)\n"
+"    --always-resolve      always try to translate name to id, even if it is\n"
+"\t\t\t  composed of only digits\n"
+"-w, --no-wrap             do not wrap long lines\n"
+"-p, --raw-grace           print grace time in seconds since epoch\n"
+"-l, --local-only          do not query NFS filesystems\n"
+"-Q, --quiet-refuse        do not print error message when NFS server does\n"
+"                          not respond\n"
+"-i, --no-autofs           do not query autofs mountpoints\n"
+"-F, --format=formatname   display quota of a specific format\n"
+"-f, --filesystem-list     display quota information only for given filesystems\n"
+"-A, --nfs-all             display quota for all NFS mountpoints\n"
+"-h, --help                display this help message and exit\n"
+"-V, --version             display version information and exit\n"
+"\n"
+msgstr ""
+"\n"
+"-u, --user                wy¶wietlenie limitów dla u¿ytkownika\n"
+"-g, --group               wy¶wietlenie limitów dla grupy\n"
+"-q, --quiet               wypisywanie bardziej zwiêz³ych komunikatów\n"
+"-v, --verbose             wypisywanie bardziej wyczerpuj±cych komunikatów\n"
+"-s, --human-readable      wy¶wietlanie liczb w jednostkach przyjaznych dla\n"
+"                          cz³owieka (MB, GB...)\n"
+"    --always-resolve      próba rozwi±zania nazwy zawsze, nawet je¶li sk³ada\n"
+"                          siê wy³±cznie z cyfr\n"
+"-w, --no-wrap             nie zawijanie d³ugich linii\n"
+"-p, --raw-grace           wypisywanie czasu pob³a¿liwo¶ci w sekundach od epoch\n"
+"-l, --local-only          nie odpytywanie serwera NFS\n"
+"-Q, --quiet-refuse        nie wypisywanie komunikatów b³êdów je¶li serwer NFS\n"
+"                          nie odpowiada\n"
+"-i, --no-autofs           nie odpytywanie punktów montowania autofs\n"
+"-F, --format=format       wy¶wietlenie limitów w podanym formacie\n"
+"-f, --filesystem-list     wy¶wietlenie informacji tylko dla podanych systemów\n"
+"                          plików\n"
+"-A, --nfs-all             wy¶wietlenie limitów dla wszystkich NFS-ów\n"
+"-h, --help                wy¶wietlenie tego opisu i zakoñczenie\n"
+"-V, --version             wy¶wietlenie informacji o wersji i zakoñczenie\n"
+"\n"
+
+#: quota.c:113
+#, c-format
+msgid "Disk quotas for %s %s (%cid %u): %s\n"
+msgstr "Ograniczenia dyskowe %s %s (%cid %u): %s\n"
+
+#: quota.c:116
+msgid "Filesystem"
+msgstr "System plików"
+
+#: quota.c:117
+msgid "blocks"
+msgstr "bloki"
+
+#: quota.c:117 quota.c:118
+msgid "quota"
+msgstr "miêkki"
+
+#: quota.c:117 quota.c:118
+msgid "limit"
+msgstr "twardy"
+
+#: quota.c:117 quota.c:118
+msgid "grace"
+msgstr "pob³."
+
+#: quota.c:118
+msgid "files"
+msgstr "pliki"
+
+#: quota.c:144
+msgid "File limit reached on"
+msgstr "Twardy limit plików osi±gniêty na"
+
+#: quota.c:150
+msgid "In file grace period on"
+msgstr "Okres pob³a¿liwo¶ci dla plików na"
+
+#: quota.c:154
+msgid "Over file quota on"
+msgstr "Miêkki limit dla plików przekroczony na"
+
+#: quota.c:160
+msgid "Block limit reached on"
+msgstr "Twardy limit bloków osi±gniêty na"
+
+#: quota.c:166
+msgid "In block grace period on"
+msgstr "Okres pob³a¿liwo¶ci dla bloków na"
+
+#: quota.c:170
+msgid "Over block quota on"
+msgstr "Miêkki limit dla bloków przekroczony na"
+
+#: quota.c:232 quotasys.c:298
+msgid "none"
+msgstr "brak"
+
+#: quota.c:324
+#, c-format
+msgid "Warning: Ignoring -%c when filesystem list specified.\n"
+msgstr "Uwaga: Zignorowano -%c kiedy zosta³a podana lista systemów plików.\n"
+
+#: quota.c:331
+msgid "No filesystem specified.\n"
+msgstr "Nie podano systemu plików.\n"
+
+#: quota.c:339
+#, c-format
+msgid "Gid set allocation (%d): %s\n"
+msgstr "Przydzielenie zbioru gid (%d): %s\n"
+
+#: quota.c:345
+#, c-format
+msgid "getgroups(): %s\n"
+msgstr "getgroups(): %s\n"
+
+#: quota_nld.c:93
+#, c-format
+msgid ""
+"Usage: %s [options]\n"
+"Options are:\n"
+" -h --help         shows this text\n"
+" -V --version      shows version information\n"
+" -C --no-console   do not try to write messages to console\n"
+" -D --no-dbus      do not try to write messages to DBUS\n"
+" -F --foreground   run daemon in foreground\n"
+msgstr ""
+"Sk³adnia: %s [opcje]\n"
+"Opcje to:\n"
+" -h --help         wy¶wietlenie tego opisu\n"
+" -V --version      wy¶wietlenie informacji o wersji\n"
+" -C --no-console   nie wypisywanie komunikatów na konsoli\n"
+" -D --no-dbus      nie wypisywanie komunikatów przez DBUS\n"
+" -F --foreground   uruchomienie demona jako procesu pierwszoplanowego\n"
+
+#: quota_nld.c:123 rquota_svc.c:158
+#, c-format
+msgid "Unknown option '%c'.\n"
+msgstr "Nieznana opcja '%c'.\n"
+
+#: quota_nld.c:129
+msgid "No possible destination for messages. Nothing to do.\n"
+msgstr "Brak celu dla komunikatów. Nie ma nic do roboty.\n"
+
+#: quota_nld.c:157
+msgid "Cannot allocate netlink handle!\n"
+msgstr "Nie mo¿na przydzieliæ uchwytu netlink!\n"
+
+#: quota_nld.c:161
+#, c-format
+msgid "Cannot connect to netlink socket: %s\n"
+msgstr "Nie mo¿na po³±czyæ siê z gniazdem netlink: %s\n"
+
+#: quota_nld.c:164
+#, c-format
+msgid "Cannot resolve quota netlink name: %s\n"
+msgstr "Nie mo¿na rozwi±zaæ nazwy netlink limitów: %s\n"
+
+#: quota_nld.c:168
+#, c-format
+msgid "Cannot join quota multicast group: %s\n"
+msgstr "Nie mo¿na do³±czyæ do grupy multicastowej limitów: %s\n"
+
+#: quota_nld.c:172
+#, c-format
+msgid "Cannot register netlink family: %s\n"
+msgstr "Nie mo¿na zarejestrowaæ rodziny netlink: %s\n"
+
+#: quota_nld.c:185
+#, c-format
+msgid "Cannot connect to system DBUS: %s\n"
+msgstr "Nie mo¿na po³±czyæ siê z systemowym DBUS-em: %s\n"
+
+#: quota_nld.c:240
+#, c-format
+msgid "Failed to find tty of user %Lu to report warning to.\n"
+msgstr "Nie uda³o siê odnale¼æ tty u¿ytkownika %Lu w celu zg³oszenia ostrze¿enia.\n"
+
+#: quota_nld.c:245
+#, c-format
+msgid "Failed to open tty %s of user %Lu to report warning.\n"
+msgstr "Nie uda³o siê otworzyæ tty %s u¿ytkownika %Lu w celu zg³oszenia ostrze¿enia.\n"
+
+#: quota_nld.c:277
+#, c-format
+msgid "Failed to write quota message for user %Lu to %s: %s\n"
+msgstr "Nie uda³o siê wypisaæ komunikatu o limicie dla u¿ytkownika %Lu na %s: %s\n"
+
+#: quota_nld.c:290
+msgid "Cannot create DBUS message: No enough memory.\n"
+msgstr "Nie mo¿na utworzyæ komunikatu DBUS: za ma³o pamiêci.\n"
+
+#: quota_nld.c:308
+msgid "Failed to write message to dbus: No enough memory.\n"
+msgstr "Nie uda³o siê wypisaæ komunikatu przez dbus: za ma³o pamiêci.\n"
+
+#: quota_nld.c:329
+#, c-format
+msgid "Read from netlink socket failed: %s\n"
+msgstr "Odczyt z gniazda netlink nie powiód³ siê: %s\n"
+
+#: quota_nld.c:344
+#, c-format
+msgid "Failed parsing netlink command: %s\n"
+msgstr "Nie uda³o siê przeanalizowaæ polecenia netlink: %s\n"
+
+#: quotacheck.c:95
+msgid "Not enough memory.\n"
+msgstr "Za ma³o pamiêci.\n"
+
+#: quotacheck.c:127
+#, c-format
+msgid "Adding hardlink for ino %llu\n"
+msgstr "Dodawanie dowi±zania dla i-wêz³a %llu\n"
+
+#: quotacheck.c:170
+#, c-format
+msgid "Adding dquot structure type %s for %d\n"
+msgstr "Dodawanie struktury dquot typu %s dla %d\n"
+
+#: quotacheck.c:256
+#, c-format
+msgid "Cannot open file %s: %s\n"
+msgstr "Nie mo¿na otworzyæ pliku %s: %s\n"
+
+#: quotacheck.c:261
+msgid "Cannot get exact used space... Results might be inaccurate.\n"
+msgstr "Nie mo¿na dok³adnie uzyskaæ u¿ytej przestrzeni... wyniki mog± byæ niedok³adne.\n"
+
+#: quotacheck.c:299
+#, c-format
+msgid ""
+"Utility for checking and repairing quota files.\n"
+"%s [-gucbfinvdmMR] [-F <quota-format>] filesystem|-a\n"
+"\n"
+"-u, --user                check user files\n"
+"-g, --group               check group files\n"
+"-c, --create-files        create new quota files\n"
+"-b, --backup              create backups of old quota files\n"
+"-f, --force               force check even if quotas are enabled\n"
+"-i, --interactive         interactive mode\n"
+"-n, --use-first-dquot     use the first copy of duplicated structure\n"
+"-v, --verbose             print more information\n"
+"-d, --debug               print even more messages\n"
+"-m, --no-remount          do not remount filesystem read-only\n"
+"-M, --try-remount         try remounting filesystem read-only,\n"
+"                          continue even if it fails\n"
+"-R, --exclude-root        exclude root when checking all filesystems\n"
+"-F, --format=formatname   check quota files of specific format\n"
+"-a, --all                 check all filesystems\n"
+"-h, --help                display this message and exit\n"
+"-V, --version             display version information and exit\n"
+"\n"
+msgstr ""
+"Narzêdzie do sprawdzania i naprawy plików limitów.\n"
+"%s [-gucbfinvdmMR] [-F <format-limitów>] system-plików|-a\n"
+"\n"
+"-u, --user                sprawdzenie plików u¿ytkowników (user)\n"
+"-g, --group               sprawdzenie plików grup (group)\n"
+"-c, --create-files        utworzenie nowych plików limitów\n"
+"-b, --backup              utworzenie kopii zapasowych starych plików limitów\n"
+"-f, --force               wymuszenie sprawdzenia nawet je¶li limity s± w³±czone\n"
+"-i, --interactive         tryb interaktywny\n"
+"-n, --use-first-dquot     u¿ycie pierwszej kopii powielonej struktury\n"
+"-v, --verbose             wypisywanie wiêkszej ilo¶ci informacji\n"
+"-d, --debug               wypisywanie jeszcze wiêkszej liczby komunikatów\n"
+"-m, --no-remount          nie przemontowywanie systemu plików tylko do odczytu\n"
+"-M, --try-remount         próba przemontowania systemu plików tylko do odczytu,\n"
+"                          kontynuacja nawet je¶li siê to nie powiedzie\n"
+"-R, --exclude-root        wykluczenie g³ównego systemu plików przy sprawdzaniu\n"
+"                          wszystkich systemów plików\n"
+"-F, --format=format       sprawdzenie plików limitów w podanym formacie\n"
+"-a, --all                 sprawdzenie wszystkich systemów plików\n"
+"-h, --help                wy¶wietlenie tego opisu i zakoñczenie\n"
+"-V, --version             wy¶wietlenie informacji o wersji i zakoñczenie\n"
+"\n"
+
+#: quotacheck.c:403 quotaon.c:135 repquota.c:139 setquota.c:201
+msgid "Bad number of arguments.\n"
+msgstr "B³êdna liczba argumentów.\n"
+
+#: quotacheck.c:407
+msgid "XFS quota format needs no checking.\n"
+msgstr "Limity w formacie XFS nie wymagaj± sprawdzania.\n"
+
+#: quotacheck.c:433
+#, c-format
+msgid "error (%d) while opening %s\n"
+msgstr "b³±d (%d) podczas otwierania %s\n"
+
+#: quotacheck.c:438
+#, c-format
+msgid "error (%d) while allocating inode file bitmap\n"
+msgstr "b³±d (%d) podczas przydzielania bitmapy i-wêz³ów plików\n"
+
+#: quotacheck.c:443
+#, c-format
+msgid "errstr (%d) while allocating inode directory bitmap\n"
+msgstr "errstr (%d) podczas przydzielania bitmapy i-wêz³ów katalogów\n"
+
+#: quotacheck.c:448
+#, c-format
+msgid "error (%d) while opening inode scan\n"
+msgstr "b³±d (%d) podczas otwierania skanu i-wêz³ów\n"
+
+#: quotacheck.c:453
+#, c-format
+msgid "error (%d) while starting inode scan\n"
+msgstr "b³±d (%d) podczas uruchamiania skanu i-wêz³ów\n"
+
+#: quotacheck.c:459
+#, c-format
+msgid "Found i_num %ld, blocks %ld\n"
+msgstr "Znaleziono i_num %ld, %ld bloków\n"
+
+#: quotacheck.c:465
+msgid "High uid detected.\n"
+msgstr "Wykryto du¿y uid.\n"
+
+#: quotacheck.c:481
+#, c-format
+msgid "Something weird happened while scanning. Error %d\n"
+msgstr "Podczas skanowania zdarzy³o siê co¶ dziwnego. B³±d %d\n"
+
+#: quotacheck.c:505
+#, c-format
+msgid "Cannot stat directory %s: %s\n"
+msgstr "Nie mo¿na wykonaæ stat na katalogu %s: %s\n"
+
+#: quotacheck.c:517
+#, c-format
+msgid ""
+"\n"
+"Can open directory %s: %s\n"
+msgstr ""
+"\n"
+"Nie mo¿na otworzyæ katalogu %s: %s\n"
+
+#: quotacheck.c:529
+#, c-format
+msgid ""
+"lstat Cannot stat `%s/%s': %s\n"
+"Guess you'd better run fsck first !\n"
+"exiting...\n"
+msgstr ""
+"lstat: Nie mo¿na wykonaæ stat na `%s/%s': %s\n"
+"Lepiej najpierw uruchomiæ fsck!\n"
+"zakoñczenie...\n"
+
+#: quotacheck.c:540
+#, c-format
+msgid "pushd %s/%s\n"
+msgstr "pushd %s/%s\n"
+
+#: quotacheck.c:556
+#, c-format
+msgid "\tAdding %s size %Ld ino %d links %d uid %u gid %u\n"
+msgstr "\tDodawanie %s, o rozmiarze %Ld, i-wêze³ %d, dowi±zañ %d uid %u gid %u\n"
+
+#: quotacheck.c:566
+msgid "Scanning stored directories from directory stack\n"
+msgstr "Skanowanie zapisanych na stosie katalogów\n"
+
+#: quotacheck.c:570
+#, c-format
+msgid ""
+"popd %s\n"
+"Entering directory %s\n"
+msgstr ""
+"popd %s\n"
+"Wej¶cie do katalogu %s\n"
+
+#: quotacheck.c:582
+#, c-format
+msgid "Leaving %s\n"
+msgstr "Opuszczanie %s\n"
+
+#: quotacheck.c:622
+#, c-format
+msgid "Going to check %s quota file of %s\n"
+msgstr "Rozpoczynanie sprawdzania pliku limitów %s na %s\n"
+
+#: quotacheck.c:628
+#, c-format
+msgid "Quota for %ss is enabled on mountpoint %s so quotacheck might damage the file.\n"
+msgstr "Limity %s w³±czone w punkcie montowania %s - quotacheck mo¿e uszkodziæ plik.\n"
+
+#: quotacheck.c:629 quotacheck.c:903
+msgid "Should I continue"
+msgstr "Czy kontynuowaæ"
+
+#: quotacheck.c:630 quotacheck.c:904
+#, c-format
+msgid "As you wish... Canceling check of this file.\n"
+msgstr "Wedle Â¿yczenia... anulowanie sprawdzania tego pliku.\n"
+
+#: quotacheck.c:635
+#, c-format
+msgid ""
+"Quota for %ss is enabled on mountpoint %s so quotacheck might damage the file.\n"
+"Please turn quotas off or use -f to force checking.\n"
+msgstr ""
+"Limity %s w³±czone w punkcie montowania %s - quotacheck mo¿e uszkodziæ plik.\n"
+"Proszê wy³±czyæ limity lub u¿yæ -f, aby wymusiæ sprawdzanie.\n"
+
+#: quotacheck.c:642
+#, c-format
+msgid "Error while syncing quotas on %s: %s\n"
+msgstr "B³±d podczas synchronizacji limitów na %s: %s\n"
+
+#: quotacheck.c:647
+#, c-format
+msgid "Cannot get quotafile name for %s\n"
+msgstr "Nie mo¿na uzyskaæ nazwy pliku limitów dla %s\n"
+
+#: quotacheck.c:652 quotaio.c:105 quotasys.c:509
+#, c-format
+msgid "Cannot open quotafile %s: %s\n"
+msgstr "Nie mo¿na otworzyæ pliku limitów %s: %s\n"
+
+#: quotacheck.c:668
+#, c-format
+msgid "Too new quotafile format on %s\n"
+msgstr "Za nowy format pliku limitów na %s\n"
+
+#: quotacheck.c:696
+msgid "Renaming new files to proper names.\n"
+msgstr "Zmiana nazw nowych plików na w³a¶ciwe.\n"
+
+#: quotacheck.c:698
+#, c-format
+msgid "Cannot get name of old quotafile on %s.\n"
+msgstr "Nie mo¿na uzyskaæ nazwy starego pliku limitów na %s.\n"
+
+#: quotacheck.c:701
+msgid "Old file not found.\n"
+msgstr "Nie znaleziono starego pliku.\n"
+
+#: quotacheck.c:704
+#, c-format
+msgid "Error while searching for old quota file %s: %s\n"
+msgstr "B³±d podczas poszukiwania starego pliku limitów %s: %s\n"
+
+#: quotacheck.c:713
+msgid "Old file found removed during check!\n"
+msgstr "Stary plik zosta³ usuniêty przy sprawdzaniu!\n"
+
+#: quotacheck.c:716
+#, c-format
+msgid "Error while opening old quota file %s: %s\n"
+msgstr "B³±d podczas otwierania starego pliku limitów %s: %s\n"
+
+#: quotacheck.c:722
+#, c-format
+msgid "EXT2_IOC_GETFLAGS failed: %s\n"
+msgstr "ioctl XFS_IOC_GETFLAGS nie powiód³ siê: %s\n"
+
+#: quotacheck.c:726
+#, c-format
+msgid "Renaming old quotafile to %s~\n"
+msgstr "Zmiana nazwy starego pliku limitów na %s~\n"
+
+#: quotacheck.c:732
+#, c-format
+msgid "Name of quota file too long. Contact %s.\n"
+msgstr "Nazwa pliku limitów zbyt d³uga. Proszê o kontakt z %s.\n"
+
+#: quotacheck.c:734
+#, c-format
+msgid "Cannot rename old quotafile %s to %s: %s\n"
+msgstr "Nie mo¿na zmieniæ nazwy starego pliku limitów %s na %s: %s\n"
+
+#: quotacheck.c:740
+msgid "Renaming new quotafile\n"
+msgstr "Zmiana nazwy nowego pliku limitów\n"
+
+#: quotacheck.c:752
+#, c-format
+msgid "Cannot change permission of %s: %s\n"
+msgstr "Nie mo¿na zmieniæ uprawnieñ %s: %s\n"
+
+#: quotacheck.c:759
+#, c-format
+msgid "Cannot open new quota file %s: %s\n"
+msgstr "Nie mo¿na otworzyæ nowego pliku limitów %s: %s\n"
+
+#: quotacheck.c:764
+#, c-format
+msgid "Warning: Cannot set EXT2 flags on %s: %s\n"
+msgstr "Uwaga: Nie mo¿na ustawiæ flag EXT2 na %s: %s\n"
+
+#: quotacheck.c:783
+#, c-format
+msgid "Dumping gathered data for %ss.\n"
+msgstr "Zrzucanie zgromadzonych danych typu %s.\n"
+
+#: quotacheck.c:785
+#, c-format
+msgid "Cannot initialize IO on new quotafile: %s\n"
+msgstr "Nie mo¿na zainicjowaæ we/wy na nowym pliku limitów: %s\n"
+
+#: quotacheck.c:803
+#, c-format
+msgid "Cannot finish IO on new quotafile: %s\n"
+msgstr "Nie mo¿na zakoñczyæ we/wy na nowym pliku limitów: %s\n"
+
+#: quotacheck.c:806
+msgid "Data dumped.\n"
+msgstr "Dane zrzucone.\n"
+
+#: quotacheck.c:811
+#, c-format
+msgid "Cannot find checked quota file for %ss on %s!\n"
+msgstr "Nie mo¿na znale¼æ sprawdzonego pliku limitów %s na %s!\n"
+
+#: quotacheck.c:815
+#, c-format
+msgid ""
+"Cannot turn %s quotas off on %s: %s\n"
+"Kernel won't know about changes quotacheck did.\n"
+msgstr ""
+"Nie mo¿na wy³±czyæ limitów %s na %s: %s\n"
+"J±dro nie zauwa¿y zmian wykonanych przez checkquota.\n"
+
+#: quotacheck.c:828
+#, c-format
+msgid ""
+"Cannot turn %s quotas on on %s: %s\n"
+"Kernel won't know about changes quotacheck did.\n"
+msgstr ""
+"Nie mo¿na w³±czyæ limitów %s na %s: %s\n"
+"J±dro nie zauwa¿y zmian wykonanych przez checkquota.\n"
+
+#: quotacheck.c:849
+#, c-format
+msgid "Substracting space used by old %s quota file.\n"
+msgstr "Odejmowanie miejsca u¿ytego przez stary plik limitów %s.\n"
+
+#: quotacheck.c:851
+#, c-format
+msgid "Old %s file not found. Usage will not be substracted.\n"
+msgstr "Stary plik %s nie znaleziony. Miejsce nie bêdzie odjête.\n"
+
+#: quotacheck.c:856
+#, c-format
+msgid "Cannot stat old %s quota file: %s\n"
+msgstr "Nie mo¿na wykonaæ stat na starym pliku limitów %s: %s\n"
+
+#: quotacheck.c:868
+#, c-format
+msgid "Quota structure for %s owning quota file not present! Something is really wrong...\n"
+msgstr "Brak struktury limitów %s dla w³a¶ciciela pliku limitów! Co¶ jest naprawdê Â¼le...\n"
+
+#: quotacheck.c:873
+#, c-format
+msgid "Substracted %lu bytes.\n"
+msgstr "Odjêto %lu bajtów.\n"
+
+#: quotacheck.c:883
+#, c-format
+msgid "Cannot stat mountpoint %s: %s\n"
+msgstr "Nie mo¿na wykonaæ stat na punkcie montowania %s: %s\n"
+
+#: quotacheck.c:885
+#, c-format
+msgid "Mountpoint %s is not a directory?!\n"
+msgstr "Punkt montowania %s nie jest katalogiem?!\n"
+
+#: quotacheck.c:902
+#, c-format
+msgid "Cannot remount filesystem mounted on %s read-only. Counted values might not be right.\n"
+msgstr "Nie mo¿na przemontowaæ r/o systemu plików zamontowanego pod %s. Policzone warto¶ci mog± byæ b³êdne.\n"
+
+#: quotacheck.c:909
+#, c-format
+msgid ""
+"Cannot remount filesystem mounted on %s read-only so counted values might not be right.\n"
+"Please stop all programs writing to filesystem or use -m flag to force checking.\n"
+msgstr ""
+"Nie mo¿na przemontowaæ r/o systemu plików zamontowanego pod %s, wiêc policzone\n"
+"warto¶ci mog± byæ b³êdne. Proszê zatrzymaæ wszystkie programy pisz±ce na ten\n"
+"system plików lub u¿yæ flagi -m, aby wymusiæ sprawdzanie.\n"
+
+#: quotacheck.c:916
+msgid "Filesystem remounted read-only\n"
+msgstr "System plików przemontowany tylko do odczytu\n"
+
+#: quotacheck.c:918
+#, c-format
+msgid "Scanning %s [%s] "
+msgstr "Skanowanie %s [%s] "
+
+#: quotacheck.c:935
+msgid "done\n"
+msgstr "zrobiono\n"
+
+#: quotacheck.c:944
+#, c-format
+msgid "Checked %d directories and %d files\n"
+msgstr "Sprawdzono %d katalogów i %d plików\n"
+
+#: quotacheck.c:948
+#, c-format
+msgid "Cannot remount filesystem %s read-write. cannot write new quota files.\n"
+msgstr "Nie mo¿na przemontowaæ r/w systemu plików %s. Nie mo¿na zapisaæ nowych plików.\n"
+
+#: quotacheck.c:949
+msgid "Filesystem remounted RW.\n"
+msgstr "Przemontowano system plików do zapisu i odczytu.\n"
+
+#: quotacheck.c:986
+#, c-format
+msgid "Cannot find quota option on filesystem %s with quotas!\n"
+msgstr "Nie mo¿na znale¼æ opcji limitów dla systemu plików %s z limitami!\n"
+
+#: quotacheck.c:993
+#, c-format
+msgid "Cannot detect quota format for journalled quota on %s\n"
+msgstr "Nie mo¿na wykryæ formatu limitów dla limitów z kronik± na %s\n"
+
+#: quotacheck.c:1033 quotasys.c:595
+msgid "Cannot initialize mountpoint scan.\n"
+msgstr "Nie mo¿na zainicjowaæ skanu punktów montowania.\n"
+
+#: quotacheck.c:1038
+#, c-format
+msgid "Skipping %s [%s]\n"
+msgstr "Pomijanie %s [%s]\n"
+
+#: quotacheck.c:1054
+#, c-format
+msgid "Cannot guess format from filename on %s. Please specify format on commandline.\n"
+msgstr "Nie mo¿na odgadn±æ formatu z nazwy pliku na %s. Proszê podaæ format w poleceniu.\n"
+
+#: quotacheck.c:1058
+#, c-format
+msgid "Detected quota format %s\n"
+msgstr "Wykryto format limitów %s\n"
+
+#: quotacheck.c:1065
+msgid "Cannot find filesystem to check or filesystem not mounted with quota option.\n"
+msgstr "Nie znaleziono systemu plików do sprawdzenia lub nie jest zamontowany z obs³ug± limitów.\n"
+
+#: quotacheck.c:1078
+#, c-format
+msgid ""
+"Allocated %d bytes memory\n"
+"Free'd %d bytes\n"
+"Lost %d bytes\n"
+msgstr ""
+"Przydzielono %d bajtów pamiêci\n"
+"Zwolniono %d bajtów\n"
+"Stracono %d bajtów\n"
+
+#: quotacheck_v1.c:30
+#, c-format
+msgid "Cannot read entry for id %u from quotafile %s: %s\n"
+msgstr "Nie mo¿na odczytaæ wpisu dla id %u z pliku limitów %s: %s\n"
+
+#: quotacheck_v1.c:33
+#, c-format
+msgid "Entry for id %u is truncated.\n"
+msgstr "Wpis dla id %u jest uciêty.\n"
+
+#: quotacheck_v1.c:62
+msgid "Loading first quota entry with grace times.\n"
+msgstr "Wczytywanie pierwszego wpisu limitów z okresami pob³a¿liwo¶ci.\n"
+
+#: quotacheck_v1.c:66
+#, c-format
+msgid "Cannot read first entry from quotafile %s: %s\n"
+msgstr "Nie mo¿na odczytaæ pierwszego wpisu z pliku limitów %s: %s\n"
+
+#: quotacheck_v1.c:70
+#, c-format
+msgid "WARNING - Quotafile %s was probably truncated. Cannot save quota settings...\n"
+msgstr "UWAGA - plik limitów %s zapewne by³ uciêty. Nie mo¿na zapisaæ ustawieñ...\n"
+
+#: quotacheck_v1.c:76
+msgid "First entry loaded.\n"
+msgstr "Wczytano pierwszy wpis.\n"
+
+#: quotacheck_v2.c:51
+msgid "Checking quotafile info...\n"
+msgstr "Sprawdzanie informacji w pliku limitów...\n"
+
+#: quotacheck_v2.c:56
+#, c-format
+msgid "Cannot read info from quota file %s: %s\n"
+msgstr "Nie mo¿na odczytaæ informacji z pliku limitów %s: %s\n"
+
+#: quotacheck_v2.c:61
+#, c-format
+msgid "WARNING - Quota file %s was probably truncated. Cannot save quota settings...\n"
+msgstr "UWAGA - plik limitów %s zapewne by³ uciêty. Nie mo¿na zapisaæ ustawieñ...\n"
+
+#: quotacheck_v2.c:73
+msgid "WARNING - Quota file info was corrupted.\n"
+msgstr "UWAGA - informacje w pliku limitów by³y uszkodzone.\n"
+
+#: quotacheck_v2.c:74
+#, c-format
+msgid ""
+"Size of file: %lu\n"
+"Blocks: %u Free block: %u Block with free entry: %u Flags: %x\n"
+msgstr ""
+"Rozmiar pliku: %lu\n"
+"Bloki: %u Wolny blok: %u Blok z wolnym wpisem: %u Flagi: %x\n"
+
+#: quotacheck_v2.c:81
+#, c-format
+msgid ""
+"Setting grace times and other flags to default values.\n"
+"Assuming number of blocks is %u.\n"
+msgstr ""
+"Ustawianie okresów pob³a¿liwo¶ci i innych flag na warto¶ci domy¶lne.\n"
+"Przyjêcie liczby bloków %u.\n"
+
+#: quotacheck_v2.c:91
+msgid "File info done.\n"
+msgstr "Informacje z pliku wczytane.\n"
+
+#: quotacheck_v2.c:102
+msgid "Corrupted blocks: "
+msgstr "Bloki uszkodzone: "
+
+#: quotacheck_v2.c:106
+#, c-format
+msgid "Block %u: "
+msgstr "Blok %u: "
+
+#: quotacheck_v2.c:157
+msgid "Duplicated entries."
+msgstr "Powtórzone wpisy."
+
+#: quotacheck_v2.c:161
+#, c-format
+msgid "Found more structures for ID %u. Using values: BHARD: %Ld BSOFT: %Ld IHARD: %Ld ISOFT: %Ld\n"
+msgstr "Znaleziono wiêcej struktur dla ID %u. U¿ycie warto¶ci: BHARD: %Ld BSOFT %Ld IHARD: %Ld ISOFT: %Ld\n"
+
+#: quotacheck_v2.c:169
+#, c-format
+msgid "Found more structures for ID %u. Values: BHARD: %Ld/%Ld BSOFT: %Ld/%Ld IHARD: %Ld/%Ld ISOFT: %Ld/%Ld\n"
+msgstr "Znaleziono wiêcej struktur dla ID %u. Warto¶ci: BHARD %Ld/%Ld BSOFT: %Ld/%Ld IHARD: %Ld/%Ld ISOFT: %Ld/%Ld\n"
+
+#: quotacheck_v2.c:174
+msgid "Should I use new values"
+msgstr "Czy u¿yæ nowych warto¶ci"
+
+#: quotacheck_v2.c:184
+#, c-format
+msgid "ID %u has more structures. User intervention needed (use -i for interactive mode or -n for automatic answer).\n"
+msgstr "ID %u ma wiêcej struktur. Potrzebna inwencja u¿ytkownika (-i dla trybu interaktywnego lub -n dla automatycznej odpowiedzi).\n"
+
+#: quotacheck_v2.c:221
+#, c-format
+msgid "Block %u is truncated.\n"
+msgstr "Blok %u jest uciêty.\n"
+
+#: quotacheck_v2.c:230
+#, c-format
+msgid "Reference to illegal block %u"
+msgstr "Odniesienie do nieprawid³owego bloku %u"
+
+#: quotacheck_v2.c:237
+#, c-format
+msgid "Block %u in tree referenced twice"
+msgstr "Dwukrotne odniesienie w drzewie do bloku %u"
+
+#: quotacheck_v2.c:252
+#, c-format
+msgid "Illegal free block reference to block %u"
+msgstr "B³êdne odniesienie pustego bloku do bloku %u"
+
+#: quotacheck_v2.c:255
+#, c-format
+msgid "Corrupted number of used entries (%u)"
+msgstr "Uszkodzona liczba u¿ytych wpisów (%u)"
+
+#: quotacheck_v2.c:301
+msgid "Checking quotafile headers...\n"
+msgstr "Sprawdzanie nag³ówków pliku limitów...\n"
+
+#: quotacheck_v2.c:305
+#, c-format
+msgid "Cannot read header from quotafile %s: %s\n"
+msgstr "Nie mo¿na odczytaæ nag³ówka z pliku limitów %s: %s\n"
+
+#: quotacheck_v2.c:307
+#, c-format
+msgid "WARNING -  Quotafile %s was probably truncated. Cannot save quota settings...\n"
+msgstr "UWAGA - plik limitów %s zapewne by³ uciêty. Nie mo¿na zapisaæ ustawieñ...\n"
+
+#: quotacheck_v2.c:312
+#, c-format
+msgid "WARNING - Quota file %s has corrupted headers\n"
+msgstr "UWAGA - plik limitów %s ma uszkodzone nag³ówki\n"
+
+#: quotacheck_v2.c:314
+msgid "Headers checked.\n"
+msgstr "Nag³ówki sprawdzone.\n"
+
+#: quotacheck_v2.c:332
+#, c-format
+msgid "Headers of file %s checked. Going to load data...\n"
+msgstr "Nag³ówki pliku %s sprawdzone. Rozpoczêcie wczytywania danych...\n"
+
+#: quotacheck_v2.c:340
+msgid "Cannot gather quota data. Tree root node corrupted.\n"
+msgstr "Nie mo¿na zgromadziæ danych o limitach. Korzeñ drzewa uszkodzony.\n"
+
+#: quotacheck_v2.c:348
+msgid "WARNING - Some data might be changed due to corruption.\n"
+msgstr "UWAGA - czê¶æ danych mo¿e byæ zmieniona z powodu uszkodzenia.\n"
+
+#: quotacheck_v2.c:351
+msgid "Not found any corrupted blocks. Congratulations.\n"
+msgstr "Nie znaleziono Â¿adnych uszkodzonych bloków. Gratulacje.\n"
+
+#: quotaio.c:59
+msgid "Only RPC quota format is allowed on NFS filesystem.\n"
+msgstr "Na systemie plików NFS dozwolony jest tylko format limitów RPC.\n"
+
+#: quotaio.c:68
+msgid "RPC quota format not compiled.\n"
+msgstr "Format limitów RPC nie wkompilowany.\n"
+
+#: quotaio.c:75
+msgid "Only XFS quota format is allowed on XFS filesystem.\n"
+msgstr "Na systemie plików XFS dozwolony jest tylko format limitów XFS.\n"
+
+#: quotaio.c:86
+msgid "XFS quota allowed only on XFS filesystem.\n"
+msgstr "Format limitów XFS dozwolony tylko na systemie plików XFS.\n"
+
+#: quotaio.c:99
+msgid "Quota file not found or has wrong format.\n"
+msgstr "Pliku limitów nie znaleziono lub ma z³y format.\n"
+
+#: quotaio.c:128
+#, c-format
+msgid "Cannot initialize quota on %s: %s\n"
+msgstr "Nie mo¿na zainicjowaæ limitów na %s: %s\n"
+
+#: quotaio.c:156
+#, c-format
+msgid "Creation of %s quota format is not supported.\n"
+msgstr "Tworzenie limitów w formacie %s nie jest obs³ugiwane.\n"
+
+#: quotaio.c:166
+#, c-format
+msgid "Cannot create new quotafile %s: %s\n"
+msgstr "Nie mo¿na utworzyæ nowego pliku limitów %s: %s\n"
+
+#: quotaio_generic.c:49
+#, c-format
+msgid "Cannot get info for %s quota file from kernel on %s: %s\n"
+msgstr "Nie mo¿na uzyskaæ od j±dra informacji o pliku limitów %s na %s: %s\n"
+
+#: quotaio_generic.c:67
+#, c-format
+msgid "Cannot set info for %s quota file from kernel on %s: %s\n"
+msgstr "Nie mo¿na ustawiæ w j±drze informacji o pliku limitów %s na %s: %s\n"
+
+#: quotaio_generic.c:79
+#, c-format
+msgid "Cannot get quota for %s %d from kernel on %s: %s\n"
+msgstr "Nie mo¿na uzyskaæ od j±dra limitu %s dla id %d na %s: %s\n"
+
+#: quotaio_generic.c:94
+#, c-format
+msgid "Cannot set quota for %s %d from kernel on %s: %s\n"
+msgstr "Nie mo¿na ustawiæ w j±drze limitu %s dla id %d na %s: %s\n"
+
+#: quotaio_rpc.c:56 quotaio_v1.c:302 quotaio_v2.c:684
+#, c-format
+msgid "Trying to write quota to readonly quotafile on %s\n"
+msgstr "Próba zapisu limitów do pliku limitów tylko do odczytu na %s\n"
+
+#: quotaio_v1.c:208
+#, c-format
+msgid "Trying to write info to readonly quotafile on %s.\n"
+msgstr "Próba zapisu informacji do pliku limitów tylko do odczytu na %s.\n"
+
+#: quotaio_v1.c:356 quotaio_v2.c:806
+#, c-format
+msgid "Cannot sync quotas on device %s: %s\n"
+msgstr "Nie mo¿na zsynchronizowaæ limitów na urz±dzeniu %s: %s\n"
+
+#: quotaio_v2.c:152
+msgid "Your quota file is stored in wrong endianity. Please use convertquota(8) to convert it.\n"
+msgstr "Plik limitów jest zapisany dla innego procesora. Do konwersji s³u¿y convertquota(8).\n"
+
+#: quotaio_v2.c:234
+#, c-format
+msgid "Trying to write info to readonly quotafile on %s\n"
+msgstr "Próba zapisu informacji do pliku limitów tylko do odczytu na %s\n"
+
+#: quotaio_v2.c:289
+#, c-format
+msgid "Cannot write block (%u): %s\n"
+msgstr "Nie mo¿na zapisaæ bloku (%u): %s\n"
+
+#: quotaio_v2.c:312
+msgid "Cannot allocate new quota block (out of disk space).\n"
+msgstr "Nie mo¿na przydzieliæ nowego bloku limitów (brak miejsca na dysku).\n"
+
+#: quotaio_v2.c:418
+msgid "find_free_dqentry(): Data block full but it shouldn't.\n"
+msgstr "find_free_dqentry(): Blok danych jest pe³ny, a nie powinien.\n"
+
+#: quotaio_v2.c:454
+#, c-format
+msgid "Inserting already present quota entry (block %u).\n"
+msgstr "Wstawianie ju¿ obecnego wpisu limitów (blok %u).\n"
+
+#: quotaio_v2.c:477
+#, c-format
+msgid "Cannot write quota (id %u): %s\n"
+msgstr "Nie mo¿na zapisaæ limitów (id %u): %s\n"
+
+#: quotaio_v2.c:495
+#, c-format
+msgid "Quota write failed (id %u): %s\n"
+msgstr "Zapis limitów nie powiód³ siê (id %u): %s\n"
+
+#: quotaio_v2.c:506
+#, c-format
+msgid "Quota structure has offset to other block (%u) than it should (%u).\n"
+msgstr "Struktura limitów ma wskazanie na inny blok (%u) ni¿ powinna (%u).\n"
+
+#: quotaio_v2.c:586
+#, c-format
+msgid "Quota for id %u referenced but not present.\n"
+msgstr "Limit dla id %u nie istnieje, ale jest odniesienie do niego.\n"
+
+#: quotaio_v2.c:662
+#, c-format
+msgid "Cannot read quota structure for id %u: %s\n"
+msgstr "Nie mo¿na odczytaæ struktury limitów dla id %u: %s\n"
+
+#: quotaio_v2.c:755
+#, c-format
+msgid ""
+"Illegal reference in %s quota file on %s. Quota file is probably corrupted.\n"
+"Please run quotacheck(8) and try again.\n"
+msgstr ""
+"B³êdne odniesienie w pliku limitów %s na %s. Plik limitów jest prawdopodobnie\n"
+"uszkodzony. Proszê uruchomiæ quotacheck(8) i spróbowaæ ponownie.\n"
+
+#: quotaio_v2.c:830
+#, c-format
+msgid ""
+"Statistics:\n"
+"Total blocks: %u\n"
+"Data blocks: %u\n"
+"Entries: %u\n"
+"Used average: %f\n"
+msgstr ""
+"Statystyki:\n"
+"Bloków w sumie: %u\n"
+"Bloków danych: %u\n"
+"Wpisów: %u\n"
+"U¿yte Â¶rednio: %f\n"
+
+#: quotaio_xfs.c:242
+#, c-format
+msgid "*** Status for %s quotas on device %s\n"
+msgstr "*** Raport dla limitów %s na urz±dzeniu %s\n"
+
+#: quotaio_xfs.c:244 quotaio_xfs.c:259
+msgid "ON"
+msgstr "W£¡CZONE"
+
+#: quotaio_xfs.c:244 quotaio_xfs.c:259
+msgid "OFF"
+msgstr "WY£¡CZONE"
+
+#: quotaio_xfs.c:246 quotaio_xfs.c:250
+#, c-format
+msgid "Accounting: %s; Enforcement: %s\n"
+msgstr "Podliczanie: %s; Wymuszanie: %s\n"
+
+#: quotaio_xfs.c:262 quotaio_xfs.c:266
+#, c-format
+msgid "Accounting [ondisk]: %s; Enforcement [ondisk]: %s\n"
+msgstr "Podliczanie [na dysku]: %s; Wymuszanie [na dysku]: %s\n"
+
+#: quotaio_xfs.c:275 quotaio_xfs.c:284
+#, c-format
+msgid "Inode: none\n"
+msgstr "I-wêze³: Â¿aden\n"
+
+#: quotaio_xfs.c:277 quotaio_xfs.c:286
+#, c-format
+msgid "Inode: #%Lu (%Lu blocks, %u extents)\n"
+msgstr "I-wêze³: #%Lu (%Lu bloków, %u zasiêgów)\n"
+
+#: quotaon.c:67
+#, c-format
+msgid ""
+"Usage:\n"
+"\t%s [-guvp] [-F quotaformat] [-x state] -a\n"
+"\t%s [-guvp] [-F quotaformat] [-x state] filesys ...\n"
+"\n"
+"-a, --all                turn quotas on for all filesystems\n"
+"-f, --off                turn quotas off\n"
+"-u, --user               operate on user quotas\n"
+"-g, --group              operate on group quotas\n"
+"-p, --print-state        print whether quotas are on or off\n"
+"-x, --xfs-command=cmd    perform XFS quota command\n"
+"-F, --format=formatname  operate on specific quota format\n"
+"-v, --verbose            print more messages\n"
+"-h, --help               display this help text and exit\n"
+"-V, --version            display version information and exit\n"
+msgstr ""
+"Skladnia:\n"
+"\t%s [-guvp] [-F format] [-x stan] -a\n"
+"\t%s [-guvp] [-F format] [-x stan] system-plików ...\n"
+"\n"
+"-a, --all                w³±czenie limitów na wszystkich systemach plików\n"
+"-f, --off                wy³±czenie limitów\n"
+"-u, --user               operowanie na limitach u¿ytkowników\n"
+"-g, --group              operowanie na limitach grup\n"
+"-p, --print-state        wypisanie, czy limity s± w³±czone czy wy³±czone\n"
+"-x, --xfs-command=polecenie  wykonanie polecenia dla limitów XFS\n"
+"-F, --format=format      operowanie na podanym formacie limitów\n"
+"-v, --verbose            wypisywanie wiêkszej liczby komunikatów\n"
+"-h, --help               wy¶wietlenie tego opisu i zakoñczenie\n"
+"-V, --verbose            wy¶wietlenie informacji o wersji i zakoñczenie\n"
+
+#: quotaon.c:139
+msgid "Cannot turn on/off quotas via RPC.\n"
+msgstr "Nie mo¿na w³±czyæ/wy³±czyæ limitów przez RPC.\n"
+
+#: quotaon.c:167
+msgid "Cannot change state of XFS quota. It's not compiled in kernel.\n"
+msgstr "Nie mo¿na zmieniæ stanu limitów XFS. Nie s± wkompilowane w j±dro.\n"
+
+#: quotaon.c:181
+#, c-format
+msgid "Cannot find quota file on %s [%s] to turn quotas on/off.\n"
+msgstr "Nie mo¿na znale¼æ pliku limitów na %s [%s], aby w³±czyæ/wy³±czyæ limity.\n"
+
+#: quotaon.c:208
+#, c-format
+msgid "%s quota on %s (%s) is %s\n"
+msgstr "Limity %s na %s (%s) s± %s\n"
+
+#: quotaon.c:209
+msgid "on"
+msgstr "w³±czone"
+
+#: quotaon.c:209
+msgid "off"
+msgstr "wy³±czone"
+
+#: quotaon.c:227
+#, c-format
+msgid "quotactl on %s [%s]: %s\n"
+msgstr "quotactl na %s [%s]: %s\n"
+
+#: quotaon.c:231
+#, c-format
+msgid "%s [%s]: %s quotas turned off\n"
+msgstr "%s [%s]: limity %s wy³±czone\n"
+
+#: quotaon.c:244
+#, c-format
+msgid "cannot find %s on %s [%s]\n"
+msgstr "nie mo¿na znale¼æ %s na %s [%s]\n"
+
+#: quotaon.c:246
+#, c-format
+msgid "using %s on %s [%s]: %s\n"
+msgstr "u¿ycie %s na %s [%s]: %s\n"
+
+#: quotaon.c:248
+msgid "Maybe create new quota files with quotacheck(8)?\n"
+msgstr "Mo¿e utworzyæ nowe pliki limitów przez quotacheck(8)?\n"
+
+#: quotaon.c:250
+msgid "Quota format not supported in kernel.\n"
+msgstr "Format limitów nie obs³ugiwany przez j±dro.\n"
+
+#: quotaon.c:254
+#, c-format
+msgid "%s [%s]: %s quotas turned on\n"
+msgstr "%s [%s]: limity %s w³±czone\n"
+
+#: quotaon.c:281
+#, c-format
+msgid "set root_squash on %s: %s\n"
+msgstr "ustawianie root_squash na %s: %s\n"
+
+#: quotaon.c:285
+#, c-format
+msgid "%s: %s root_squash turned off\n"
+msgstr "%s: wy³±czono %s root_squash\n"
+
+#: quotaon.c:287
+#, c-format
+msgid "%s: %s root_squash turned on\n"
+msgstr "%s: w³±czono %s root_squash\n"
+
+#: quotaon.c:339
+#, c-format
+msgid "Name must be quotaon or quotaoff not %s\n"
+msgstr "Nazw± musi byæ quotaon, lub quotaoff, nie %s\n"
+
+#: quotaon.c:345
+#, c-format
+msgid "Required format %s not supported by kernel.\n"
+msgstr "Wymagany format %s nie obs³ugiwany przez j±dro.\n"
+
+#: quotaon.c:347
+msgid "Warning: No quota format detected in the kernel.\n"
+msgstr "Uwaga: Nie wykryto formatu limitów w j±drze.\n"
+
+#: quotaon_xfs.c:35
+#, c-format
+msgid "quotactl() on %s: %s\n"
+msgstr "quotactl() na %s: %s\n"
+
+#: quotaon_xfs.c:61 quotaon_xfs.c:81
+#, c-format
+msgid "Enabling %s quota on root filesystem (reboot to take effect)\n"
+msgstr "W³±czanie limitów %s na / (zostan± uwzglêdnione po reboocie)\n"
+
+#: quotaon_xfs.c:65
+#, c-format
+msgid "Enable XFS %s quota accounting during mount\n"
+msgstr "Nale¿y w³±czyæ podliczanie limitów %s na XFS podczas montowania\n"
+
+#: quotaon_xfs.c:75
+#, c-format
+msgid "Cannot delete %s quota on %s - switch quota accounting off first\n"
+msgstr "Nie mo¿na usun±æ limitów %s na %s - najpierw trzeba wy³±czyæ podliczanie\n"
+
+#: quotaon_xfs.c:86
+#, c-format
+msgid "Enabling %s quota enforcement on %s\n"
+msgstr "W³±czanie wymuszania limitów %s na %s\n"
+
+#: quotaon_xfs.c:89
+#, c-format
+msgid "Already accounting %s quota on %s\n"
+msgstr "Podliczanie limitów %s by³o ju¿ w³±czone na %s\n"
+
+#: quotaon_xfs.c:94
+#, c-format
+msgid "Disabling %s quota accounting on %s\n"
+msgstr "Wy³±czanie podliczania limitów %s na %s\n"
+
+#: quotaon_xfs.c:98
+#, c-format
+msgid "Quota enforcement already disabled for %s on %s\n"
+msgstr "Wymuszenie limitów %s by³o ju¿ wy³±czone na %s\n"
+
+#: quotaon_xfs.c:107
+#, c-format
+msgid "Cannot delete %s quota on %s - switch quota enforcement and accounting off first\n"
+msgstr "Nie mo¿na usun±æ limitów %s na %s - najpierw nale¿y wy³±czyæ wymuszanie i podliczanie\n"
+
+#: quotaon_xfs.c:112
+#, c-format
+msgid "Enforcing %s quota already on %s\n"
+msgstr "Wymuszanie limitów %s by³o ju¿ w³±czone na %s\n"
+
+#: quotaon_xfs.c:117
+#, c-format
+msgid "Cannot switch off %s quotaaccounting on %s when enforcement is on\n"
+msgstr "Nie mo¿na wy³±czyæ podliczania limitów %s na %s kiedy wymuszanie jest w³±czone\n"
+
+#: quotaon_xfs.c:123
+msgid "and accounting "
+msgstr "i podliczania "
+
+#: quotaon_xfs.c:124
+#, c-format
+msgid "Disabling %s quota enforcement %son %s\n"
+msgstr "Wy³±czanie wymuszania %2$slimitów %1$s na %3$s\n"
+
+#: quotaon_xfs.c:130
+#, c-format
+msgid "Unexpected XFS quota state sought on %s\n"
+msgstr "Zauwa¿ono nieoczekiwany stan limitów XFS na %s\n"
+
+#: quotaon_xfs.c:145
+#, c-format
+msgid "quotactl on %s: %s\n"
+msgstr "quotactl na %s: %s\n"
+
+#: quotaon_xfs.c:149
+#, c-format
+msgid "%s: %s quotas turned off\n"
+msgstr "%s: limity %s wy³±czone\n"
+
+#: quotaon_xfs.c:151
+#, c-format
+msgid "%s: %s quotas turned on\n"
+msgstr "%s: limity %s w³±czone\n"
+
+#: quotaon_xfs.c:165
+#, c-format
+msgid "Failed to delete quota: %s\n"
+msgstr "Nie uda³o siê usun±æ limitów: %s\n"
+
+#: quotaon_xfs.c:171
+#, c-format
+msgid "%s: deleted %s quota blocks\n"
+msgstr "%s: usuniêto bloki limitów %s\n"
+
+#: quotaon_xfs.c:232
+#, c-format
+msgid "Invalid argument \"%s\"\n"
+msgstr "B³êdny argument \"%s\"\n"
+
+#: quotaops.c:110
+#, c-format
+msgid "%s (uid %d): Permission denied\n"
+msgstr "%s (uid %d): Brak uprawnieñ\n"
+
+#: quotaops.c:122
+#, c-format
+msgid "%s (gid %d): gid set allocation (%d): %s\n"
+msgstr "%s (gid %d): przydzielenie zbioru gid (%d): %s\n"
+
+#: quotaops.c:133
+#, c-format
+msgid "%s (gid %d): error while trying getgroups(): %s\n"
+msgstr "%s (gid %d): b³±d podczas próby wykonania getgroups(): %s\n"
+
+#: quotaops.c:144
+#, c-format
+msgid "%s (gid %d): Permission denied\n"
+msgstr "%s (gid %d): Brak uprawnieñ\n"
+
+#: quotaops.c:158
+#, c-format
+msgid "error while getting quota from %s for %s (id %u): %s\n"
+msgstr "b³±d podczas uzyskiwania limitów z %s dla %s (id %u): %s\n"
+
+#: quotaops.c:183
+#, c-format
+msgid "Cannot write quota for %u on %s: %s\n"
+msgstr "Nie mo¿na zapisaæ limitów dla %u na %s: %s\n"
+
+#: quotaops.c:232
+msgid "Too many parameters to editor.\n"
+msgstr "Zbyt du¿o parametrów dla edytora.\n"
+
+#: quotaops.c:240
+#, c-format
+msgid "Cannot exec %s\n"
+msgstr "Nie mo¿na uruchomiæ %s\n"
+
+#: quotaops.c:259 quotaops.c:444
+#, c-format
+msgid "Cannot duplicate descriptor of file to write to: %s\n"
+msgstr "Nie mo¿na powieliæ deskryptora pliku do zapisu: %s\n"
+
+#: quotaops.c:262
+#, c-format
+msgid "Disk quotas for %s %s (%cid %d):\n"
+msgstr "Limity dyskowe %s %s (%cid %d):\n"
+
+#: quotaops.c:266
+#, c-format
+msgid "  Filesystem                   blocks       soft       hard     inodes     soft     hard\n"
+msgstr "  System plików                bloki        miêkki     twardy   i-wêz³y    miêkki   twardy\n"
+
+#: quotaops.c:278
+#, c-format
+msgid "Quotas for %s %s:\n"
+msgstr "Limity %s %s:\n"
+
+#: quotaops.c:280 quotaops.c:284
+#, c-format
+msgid "%s %d, limits (soft = %d, hard = %d)\n"
+msgstr "%s %d, limity (miêkki = %d, twardy = %d)\n"
+
+#: quotaops.c:281
+msgid "blocks in use:"
+msgstr "u¿ywanych bloków:"
+
+#: quotaops.c:285
+msgid "\tinodes in use:"
+msgstr "\tu¿ywanych i-wêz³ów:"
+
+#: quotaops.c:311
+#, c-format
+msgid "WARNING - %s: cannot change current block allocation\n"
+msgstr "UWAGA - %s: nie mo¿na zmieniæ aktualnego przydzia³u bloków\n"
+
+#: quotaops.c:314
+#, c-format
+msgid "WARNING - %s: cannot change current inode allocation\n"
+msgstr "UWAGA - %s: nie mo¿na zmieniæ aktualnego przydzia³u i-wêz³ów\n"
+
+#: quotaops.c:337 quotaops.c:486
+#, c-format
+msgid "Cannot duplicate descriptor of temp file: %s\n"
+msgstr "Nie mo¿na powieliæ deskryptora pliku tymczasowego: %s\n"
+
+#: quotaops.c:351
+#, c-format
+msgid ""
+"Bad format:\n"
+"%s\n"
+msgstr ""
+"Z³y format:\n"
+"%s\n"
+
+#: quotaops.c:364 quotaops.c:628
+#, c-format
+msgid "%s - bad format\n"
+msgstr "%s - z³y format\n"
+
+#: quotaops.c:368
+#, c-format
+msgid "%s -  %s -- bad format\n"
+msgstr "%s -  %s -- z³y format\n"
+
+#: quotaops.c:373
+#, c-format
+msgid " blocks in use: %Lu, limits (soft = %Lu, hard = %Lu)"
+msgstr " u¿ywanych bloków: %Lu, limity (miêkki = %Lu, twardy = %Lu)"
+
+#: quotaops.c:376 quotaops.c:382 quotaops.c:390 quotaops.c:632 quotaops.c:639
+#, c-format
+msgid "%s - %s -- bad format\n"
+msgstr "%s - %s -- z³y format\n"
+
+#: quotaops.c:387
+#, c-format
+msgid "\tinodes in use: %Lu, limits (soft = %Lu, hard = %Lu)"
+msgstr "\tu¿ywanych i-wêz³ów: %Lu, limity (miêkki = %Lu, twardy = %Lu)"
+
+#: quotaops.c:446
+#, c-format
+msgid "Times to enforce softlimit for %s %s (%cid %d):\n"
+msgstr "Okresy wymuszenia miêkkich limitów %s %s (%cid %d):\n"
+
+#: quotaops.c:448 quotaops.c:551 quotaops.c:560
+#, c-format
+msgid "Time units may be: days, hours, minutes, or seconds\n"
+msgstr "Jednostkami czasu mog± byæ: days, hours, minutes, seconds\n"
+
+#: quotaops.c:450
+#, c-format
+msgid "  Filesystem                         block grace               inode grace\n"
+msgstr "  System plików         Pob³a¿liwo¶æ dla bloków Pob³a¿liwo¶æ dla i-wêz³ów\n"
+
+#: quotaops.c:455 quotaops.c:461 quotaops.c:503 quotaops.c:515 setquota.c:225
+#: setquota.c:231
+msgid "unset"
+msgstr "nie ustawiona"
+
+#: quotaops.c:457 quotaops.c:463
+msgid "0seconds"
+msgstr "0 sekund"
+
+#: quotaops.c:465 quotasys.c:330
+#, c-format
+msgid "%useconds"
+msgstr "%u sekund"
+
+#: quotaops.c:500 quotaops.c:616
+#, c-format
+msgid ""
+"bad format:\n"
+"%s\n"
+msgstr ""
+"z³y format:\n"
+"%s\n"
+
+#: quotaops.c:510 quotaops.c:646
+msgid "Bad time units. Units are 'second', 'minute', 'hour', and 'day'.\n"
+msgstr "Z³e jednostki czasu. Jednostkami s± 'second', 'minute', 'hour' i 'day'.\n"
+
+#: quotaops.c:546
+#, c-format
+msgid "Cannot duplicate descriptor of file to edit: %s\n"
+msgstr "Nie mo¿na powieliæ deskryptora pliku do edycji: %s\n"
+
+#: quotaops.c:549 quotaops.c:561
+#, c-format
+msgid "Grace period before enforcing soft limits for %ss:\n"
+msgstr "Okres pob³a¿liwo¶ci przed wymuszeniem miêkkich limitów %s:\n"
+
+#: quotaops.c:552
+#, c-format
+msgid "  Filesystem             Block grace period     Inode grace period\n"
+msgstr "  System plików         Pob³a¿liwo¶æ dla bloków Pob³a¿liwo¶æ dla i-wêz³ów\n"
+
+#: quotaops.c:566
+#, c-format
+msgid "block grace period: %s, file grace period: %s\n"
+msgstr "okres pob³a¿liwo¶ci dla bloków: %s, okres pob³a¿liwo¶ci dla plików: %s\n"
+
+#: quotaops.c:594
+#, c-format
+msgid "Cannot reopen temp file: %s\n"
+msgstr "Nie mo¿na ponownie otworzyæ pliku tymczasowego: %s\n"
+
+#: quotaops.c:636
+#, c-format
+msgid " block grace period: %d %s file grace period: %d %s"
+msgstr " okres pob³a¿liwo¶ci dla bloków: %d %s okres pob³a¿liwo¶ci dla plików: %d %s"
+
+#: quotastats.c:48
+#, c-format
+msgid "Cannot read stat file %s: %s\n"
+msgstr "Nie mo¿na odczytaæ pliku statystyk %s: %s\n"
+
+#: quotastats.c:83
+#, c-format
+msgid "Error while getting quota statistics from kernel: %s\n"
+msgstr "B³±d podczas pobierania od j±dra statystyk limitów: %s\n"
+
+#: quotastats.c:87
+#, c-format
+msgid "Error while getting old quota statistics from kernel: %s\n"
+msgstr "B³±d podczas pobierania od j±dra starych statystyk limitów: %s\n"
+
+#: quotastats.c:101
+#, c-format
+msgid "Kernel quota version: old\n"
+msgstr "Wersja limitów w j±drze: stara\n"
+
+#: quotastats.c:103
+#, c-format
+msgid "Kernel quota version: %u.%u.%u\n"
+msgstr "Wersja limitów w j±drze: %u.%u.%u\n"
+
+#: quotastats.c:104
+#, c-format
+msgid "Number of dquot lookups: %ld\n"
+msgstr "Liczba poszukiwañ dquot: %ld\n"
+
+#: quotastats.c:105
+#, c-format
+msgid "Number of dquot drops: %ld\n"
+msgstr "Liczba zrzutów dquot: %ld\n"
+
+#: quotastats.c:106
+#, c-format
+msgid "Number of dquot reads: %ld\n"
+msgstr "Liczba odczytów dquot: %ld\n"
+
+#: quotastats.c:107
+#, c-format
+msgid "Number of dquot writes: %ld\n"
+msgstr "Liczba zapisów dquot: %ld\n"
+
+#: quotastats.c:108
+#, c-format
+msgid "Number of quotafile syncs: %ld\n"
+msgstr "Liczba synchronizacji pliku limitów: %ld\n"
+
+#: quotastats.c:109
+#, c-format
+msgid "Number of dquot cache hits: %ld\n"
+msgstr "Liczba trafieñ bufora dquot: %ld\n"
+
+#: quotastats.c:110
+#, c-format
+msgid "Number of allocated dquots: %ld\n"
+msgstr "Liczba przydzielonych struktur dquot: %ld\n"
+
+#: quotastats.c:111
+#, c-format
+msgid "Number of free dquots: %ld\n"
+msgstr "Liczba wolnych dquot: %ld\n"
+
+#: quotastats.c:112
+#, c-format
+msgid "Number of in use dquot entries (user/group): %ld\n"
+msgstr "Liczba u¿ywanych wpisów dquot (u¿ytkownik/grupa): %ld\n"
+
+#: quotasys.c:108
+#, c-format
+msgid "user %s does not exist.\n"
+msgstr "u¿ytkownik %s nie istnieje.\n"
+
+#: quotasys.c:137
+#, c-format
+msgid "group %s does not exist.\n"
+msgstr "grupa %s nie istnieje.\n"
+
+#: quotasys.c:239
+#, c-format
+msgid ""
+"Unknown quota format: %s\n"
+"Supported formats are:\n"
+"  vfsold - original quota format\n"
+"  vfsv0 - new quota format\n"
+"  rpc - use RPC calls\n"
+"  xfs - XFS quota format\n"
+msgstr ""
+"Nieznany format limitów: %s\n"
+"Obs³ugiwane formaty to:\n"
+"  vfsold - oryginalny format limitów\n"
+"  vfsv0 - nowy format limitów\n"
+"  rpc - u¿ywanie wywo³añ RPC\n"
+"  xfs - format limitów na XFS\n"
+
+#: quotasys.c:254
+msgid "Unknown format"
+msgstr "Nieznany format"
+
+#: quotasys.c:318
+#, c-format
+msgid "%ddays"
+msgstr "%d dni"
+
+#: quotasys.c:320
+#, c-format
+msgid "%02d:%02d"
+msgstr "%02d:%02d"
+
+#: quotasys.c:332
+#, c-format
+msgid "%uminutes"
+msgstr "%u minut"
+
+#: quotasys.c:334
+#, c-format
+msgid "%uhours"
+msgstr "%u godzin"
+
+#: quotasys.c:336
+#, c-format
+msgid "%udays"
+msgstr "%u dni"
+
+#: quotasys.c:493
+#, c-format
+msgid "Cannot stat quota file %s: %s\n"
+msgstr "Nie mo¿na wykonaæ stat na pliku limitów %s: %s\n"
+
+#: quotasys.c:616
+msgid "Not all specified mountpoints are using quota.\n"
+msgstr "Nie wszystkie podane punkty montowania u¿ywaj± limitów.\n"
+
+#: quotasys.c:630
+#, c-format
+msgid "Error while releasing file on %s\n"
+msgstr "B³±d podczas zwalniania pliku na %s\n"
+
+#: quotasys.c:687
+#, c-format
+msgid "Cannot create set for sigaction(): %s\n"
+msgstr "Nie mo¿na utworzyæ zbioru dla sigaction(): %s\n"
+
+#: quotasys.c:690
+#, c-format
+msgid "Cannot set signal handler: %s\n"
+msgstr "Nie mo¿na ustawiæ obs³ugi sygna³u: %s\n"
+
+#: quotasys.c:737
+#, c-format
+msgid "Cannot reset signal handler: %s\n"
+msgstr "Nie mo¿na przywróciæ obs³ugi sygna³u: %s\n"
+
+#: quotasys.c:846 quotasys.c:851 warnquota.c:723
+#, c-format
+msgid "Cannot open %s: %s\n"
+msgstr "nie mo¿na otworzyæ %s: %s\n"
+
+#: quotasys.c:862
+#, c-format
+msgid "Cannot get device name for %s\n"
+msgstr "Nie mo¿na uzyskaæ nazwy urz±dzenia dla %s\n"
+
+#: quotasys.c:899
+#, c-format
+msgid "Cannot resolve mountpoint path %s: %s\n"
+msgstr "Nie mo¿na rozwi±zaæ Â¶cie¿ki punktu montowania %s: %s\n"
+
+#: quotasys.c:905
+#, c-format
+msgid "Cannot statfs() %s: %s\n"
+msgstr "Nie mo¿na wykonaæ statfs() %s: %s\n"
+
+#: quotasys.c:917
+#, c-format
+msgid "Cannot stat() mounted device %s: %s\n"
+msgstr "Nie mo¿na wykonaæ stat() na podmontowanym urz±dzeniu %s: %s\n"
+
+#: quotasys.c:923
+#, c-format
+msgid "Device (%s) filesystem is mounted on unsupported device type. Skipping.\n"
+msgstr "Urz±dzenie (%s), na którym jest podmontowany system plików, nie jest obs³ugiwanego typu. Pominiêto.\n"
+
+#: quotasys.c:938
+#, c-format
+msgid "Cannot find device of loopback mount in options for %s. Skipping.\n"
+msgstr "Nie znaleziono urz±dzenia montowanego po loopbacku w opcjach dla %s. Pominiêto.\n"
+
+#: quotasys.c:947
+#, c-format
+msgid "Cannot stat() loopback device %s: %s\n"
+msgstr "Nie mo¿na wykonaæ stat() na urz±dzeniu loopback %s: %s\n"
+
+#: quotasys.c:952
+#, c-format
+msgid "Loopback device %s is not block device!\n"
+msgstr "Urz±dzenie loopback %s nie jest urz±dzeniem blokowym!\n"
+
+#: quotasys.c:970
+#, c-format
+msgid "Cannot stat() mountpoint %s: %s\n"
+msgstr "Nie mo¿na wykonaæ stat() na punkcie montowania %s: %s\n"
+
+#: quotasys.c:1034
+#, c-format
+msgid ""
+"Cannot find a device with %s.\n"
+"Skipping...\n"
+msgstr ""
+"Nie mo¿na znale¼æ urz±dzenia z %s.\n"
+"Pomijanie...\n"
+
+#: quotasys.c:1038
+#, c-format
+msgid ""
+"Cannot stat() a mountpoint with %s: %s\n"
+"Skipping...\n"
+msgstr ""
+"Nie mo¿na wykonaæ stat() na punkcie montowania z %s: %s\n"
+"Pomijanie...\n"
+
+#: quotasys.c:1046
+#, c-format
+msgid ""
+"Cannot stat() given mountpoint %s: %s\n"
+"Skipping...\n"
+msgstr ""
+"Nie mo¿na wykonaæ stat() na podanym punkcie montowania %s: %s\n"
+"Pomijanie...\n"
+
+#: quotasys.c:1056
+#, c-format
+msgid "Cannot find a filesystem mountpoint for directory %s\n"
+msgstr "Nie mo¿na znale¼æ punktu montowania systemu plików dla katalogu %s\n"
+
+#: quotasys.c:1062
+#, c-format
+msgid "Cannot resolve path %s: %s\n"
+msgstr "Nie mo¿na rozwi±zaæ Â¶cie¿ki %s: %s\n"
+
+#: quotasys.c:1073
+#, c-format
+msgid "Cannot find mountpoint for device %s\n"
+msgstr "Nie mo¿na znale¼æ punktu montowania dla urz±dzenia %s\n"
+
+#: quotasys.c:1079
+#, c-format
+msgid "Specified path %s is not directory nor device.\n"
+msgstr "Podana Â¶cie¿ka %s nie jest katalogiem ani urz±dzeniem.\n"
+
+#: quotasys.c:1087
+msgid "No correct mountpoint specified.\n"
+msgstr "Nie podano poprawnego punktu montowania.\n"
+
+#: quotasys.c:1148
+#, c-format
+msgid "Mountpoint (or device) %s not found or has no quota enabled.\n"
+msgstr "Nie znaleziono punktu montowania (lub urz±dzenia) %s, albo nie ma on w³±czonych limitów.\n"
+
+#: repquota.c:48
+#, c-format
+msgid ""
+"Utility for reporting quotas.\n"
+"Usage:\n"
+"%s [-vugsi] [-c|C] [-t|n] [-F quotaformat] (-a | mntpoint)\n"
+"\n"
+"-v, --verbose               display also users/groups without any usage\n"
+"-u, --user                  display information about users\n"
+"-g, --group                 display information about groups\n"
+"-s, --human-readable        show numbers in human friendly units (MB, GB, ...)\n"
+"-t, --truncate-names        truncate names to 8 characters\n"
+"-p, --raw-grace             print grace time in seconds since epoch\n"
+"-n, --no-names              do not translate uid/gid to name\n"
+"-i, --no-autofs             avoid autofs mountpoints\n"
+"-c, --batch-translation     translate big number of ids at once\n"
+"-C, --no-batch-translation  translate ids one by one\n"
+"-F, --format=formatname     report information for specific format\n"
+"-h, --help                  display this help message and exit\n"
+"-V, --version               display version information and exit\n"
+"\n"
+msgstr ""
+"Narzêdzie do raportowania o limitach.\n"
+"Sk³adnia:\n"
+"%s [-vugsi] [-c|C] [-t|n] [-F format] (-a | punkt-montowania)\n"
+"\n"
+"-v, --verbose               wy¶wietlanie tak¿e u¿ytkowników/grup nie\n"
+"                            zajmuj±cych miejsca\n"
+"-u, --user                  wy¶wietlanie informacji o u¿ytkownikach\n"
+"-g, --group                 wy¶wietlanie informacji o grupach\n"
+"-s, --human-readable        wy¶wietlanie liczb w jednostkach przyjaznych dla\n"
+"                            cz³owieka (MB, GB...)\n"
+"-t, --truncate-names        obcinanie nazw do 8 znaków\n"
+"-p, --raw-grace             wypisywanie czasu pob³a¿liwo¶ci w sekundach od epoch\n"
+"-n, --no-names              nie t³umaczenie uidów/gidów na nazwy\n"
+"-i, --no-autofs             pomijanie punktów montowania autofs\n"
+"-c, --batch-translation     t³umaczenie du¿ej liczby identyfikatorów naraz\n"
+"-C, --no-batch-translation  t³umaczenie identyfikatorów po jednym\n"
+"-F, --format=format         raportowanie informacji dla podanego formatu\n"
+"-h, --help                  wy¶wietlenie tego opisu i zakoñczenie\n"
+"-V, --version               wy¶wietlenie informacji o wersji i zakoñczenie\n"
+"\n"
+
+#: repquota.c:143
+msgid "Repquota cannot report through RPC calls.\n"
+msgstr "repquota nie mo¿e raportowaæ poprzez wywo³ania RPC.\n"
+
+#: repquota.c:147
+msgid "Specified both -n and -t but only one of them can be used.\n"
+msgstr "Podano jednocze¶nie -n i -t, ale tylko jedna z nich mo¿e byæ u¿yte.\n"
+
+#: repquota.c:288
+#, c-format
+msgid "*** Report for %s quotas on device %s\n"
+msgstr "*** Raport dla limitów %s na urz±dzeniu %s\n"
+
+#: repquota.c:291
+#, c-format
+msgid "Block grace time: %s; Inode grace time: %s\n"
+msgstr "Okres pob³a¿liwo¶ci dla bloków: %s; Okres pob³a¿liwo¶ci dla i-wêz³ów: %s\n"
+
+#: repquota.c:292
+#, c-format
+msgid "                        Block limits                File limits\n"
+msgstr "                        Limity bloków               Limity plików\n"
+
+#: repquota.c:293
+#, c-format
+msgid "%-9s       used    soft    hard  grace    used  soft  hard  grace\n"
+msgstr "%-9s       u¿yw.   miêk.   twar. pob³.    u¿yw. miêk. twar. pob³.\n"
+
+#: repquota.c:293
+msgid "User"
+msgstr "U¿ytkownik"
+
+#: repquota.c:293
+msgid "Group"
+msgstr "Grupa"
+
+#: rquota_svc.c:86
+#, c-format
+msgid ""
+"Usage: %s [options]\n"
+"Options are:\n"
+" -h --help         shows this text\n"
+" -V --version      shows version information\n"
+" -F --foreground   starts the quota service in foreground\n"
+" -I --autofs       do not ignore mountpoints mounted by automounter\n"
+" -p --port <port>  listen on given port\n"
+" -s --no-setquota  disables remote calls to setquota (default)\n"
+" -S --setquota     enables remote calls to setquota\n"
+" -x --xtab <path>  set an alternative file with NFSD export table\n"
+msgstr ""
+"Sk³adnia: %s [opcje]\n"
+"Opcje to:\n"
+" -h --help            wy¶wietlenie tego opisu\n"
+" -V --version         wy¶wietlenie informacji o wersji\n"
+" -F --foreground      uruchomienie us³ugi quota jako procesu pierwszoplanowego\n"
+" -I --autofs          nie ignorowanie punktów obs³ugiwanych przez automounter\n"
+" -p --port <port>     nas³uchiwanie na podanym porcie\n"
+" -s --no-setquota     wy³±czenie zdalnych wywo³añ setquota (domy¶lne)\n"
+" -S --setquota        w³±czenie zdalnych wywo³añ setquota\n"
+" -x --xtab <¶cie¿ka>  ustawienie alternatywnego pliku z tabel± export NFSD\n"
+
+#: rquota_svc.c:97
+#, c-format
+msgid ""
+"Usage: %s [options]\n"
+"Options are:\n"
+" -h --help         shows this text\n"
+" -V --version      shows version information\n"
+" -F --foreground   starts the quota service in foreground\n"
+" -I --autofs       do not ignore mountpoints mounted by automounter\n"
+" -p --port <port>  listen on given port\n"
+" -x --xtab <path>  set an alternative file with NFSD export table\n"
+msgstr ""
+"Sk³adnia: %s [opcje]\n"
+"Opcje to:\n"
+" -h --help            wy¶wietlenie tego opisu\n"
+" -V --version         wy¶wietlenie informacji o wersji\n"
+" -F --foreground      uruchomienie us³ugi quota jako procesu pierwszoplanowego\n"
+" -I --autofs          nie ignorowanie punktów obs³ugiwanych przez automounter\n"
+" -p --port <port>     nas³uchiwanie na podanym porcie\n"
+" -x --xtab <¶cie¿ka>  ustawienie alternatywnego pliku z tabel± export NFSD\n"
+
+#: rquota_svc.c:144
+#, c-format
+msgid "Illegal port number: %s\n"
+msgstr "B³êdny numer portu: %s\n"
+
+#: rquota_svc.c:151
+#, c-format
+msgid "Cannot access the specified xtab file %s: %s\n"
+msgstr "Brak dostêpu do podanego pliku xtab %s: %s\n"
+
+#: rquota_svc.c:182
+#, c-format
+msgid "host %s attempted to call setquota when disabled\n"
+msgstr "host %s próbowa³ wywo³aæ setquota kiedy ta operacja jest wy³±czona\n"
+
+#: rquota_svc.c:189
+#, c-format
+msgid "host %s attempted to call setquota from port >= 1024\n"
+msgstr "host %s próbowa³ wywo³aæ setquota z portu >= 1024\n"
+
+#: rquota_svc.c:225
+#, c-format
+msgid "Denied access to host %s\n"
+msgstr "Odrzucono próbê dostêpu z hosta %s\n"
+
+#: rquota_svc.c:313 rquota_svc.c:399
+msgid "unable to free arguments\n"
+msgstr "nie mo¿na usun±æ argumentów\n"
+
+#: rquota_svc.c:422
+#, c-format
+msgid ""
+"Warning: Cannot open export table %s: %s\n"
+"Using '/' as a pseudofilesystem root.\n"
+msgstr ""
+"Uwaga: Nie mo¿na otworzyæ tabeli export %s: %s\n"
+"U¿ycie '/' jako g³ównego katalogu pseudo systemu plików.\n"
+
+#: rquota_svc.c:474
+msgid "cannot create udp service.\n"
+msgstr "nie mo¿na utworzyæ us³ugi udp.\n"
+
+#: rquota_svc.c:478
+msgid "unable to register (RQUOTAPROG, RQUOTAVERS, udp).\n"
+msgstr "nie mo¿na zarejestrowaæ (RQUOTAPROG, RQUOTAVERS, udp).\n"
+
+#: rquota_svc.c:482
+msgid "unable to register (RQUOTAPROG, EXT_RQUOTAVERS, udp).\n"
+msgstr "nie mo¿na zarejestrowaæ (RQUOTAPROG, EXT_RQUOTAVERS, udp).\n"
+
+#: rquota_svc.c:489
+msgid "cannot create tcp service.\n"
+msgstr "nie mo¿na utworzyæ us³ugi tcp.\n"
+
+#: rquota_svc.c:493
+msgid "unable to register (RQUOTAPROG, RQUOTAVERS, tcp).\n"
+msgstr "nie mo¿na zarejestrowaæ (RQUOTAPROG, RQUOTAVERS, tcp).\n"
+
+#: rquota_svc.c:497
+msgid "unable to register (RQUOTAPROG, EXT_RQUOTAVERS, tcp).\n"
+msgstr "nie mo¿na zarejestrowaæ (RQUOTAPROG, EXT_RQOUTAVERS, tcp).\n"
+
+#: rquota_svc.c:506
+msgid "svc_run returned\n"
+msgstr "svc_run powróci³o\n"
+
+#: set_limits_example.c:18
+#, c-format
+msgid "copy_user_quota_limits: Failed to set userquota for uid %ld : %s\n"
+msgstr "copy_user_quota_limits: nie uda³o siê ustawiæ limitów u¿ytkownika dla uid %ld : %s\n"
+
+#: set_limits_example.c:25
+#, c-format
+msgid "copy_user_quota_limits: Failed to get userquota for uid %ld : %s\n"
+msgstr "copy_user_quota_limits: nie uda³o siê pobraæ limitów u¿ytkownika dla uid %ld : %s\n"
+
+#: set_limits_example.c:41
+#, c-format
+msgid "copy_group_quota_limits: Failed to set groupquota for uid %ld : %s\n"
+msgstr "copy_group_quota_limits: nie uda³o siê ustawiæ limitów grupy dla uid %ld : %s\n"
+
+#: set_limits_example.c:48
+#, c-format
+msgid "copy_group_quota_limits: Failed to get groupquota for uid %ld : %s\n"
+msgstr "copy_group_quota_limits: nie uda³o siê odczytaæ limitów grupy dla uid %ld : %s\n"
+
+#: setquota.c:49
+#, c-format
+msgid ""
+"Usage:\n"
+"  setquota [-u|-g] %1$s[-F quotaformat] <user|group>\n"
+"\t<block-softlimit> <block-hardlimit> <inode-softlimit> <inode-hardlimit> -a|<filesystem>...\n"
+"  setquota [-u|-g] %1$s[-F quotaformat] <-p protouser|protogroup> <user|group> -a|<filesystem>...\n"
+"  setquota [-u|-g] %1$s[-F quotaformat] -b -a|<filesystem>...\n"
+"  setquota [-u|-g] [-F quotaformat] -t <blockgrace> <inodegrace> -a|<filesystem>...\n"
+"  setquota [-u|-g] [-F quotaformat] <user|group> -T <blockgrace> <inodegrace> -a|<filesystem>...\n"
+"\n"
+"-u, --user                 set limits for user\n"
+"-g, --group                set limits for group\n"
+"-a, --all                  set limits for all filesystems\n"
+"    --always-resolve       always try to resolve name, even if is\n"
+"                           composed only of digits\n"
+"-F, --format=formatname    operate on specific quota format\n"
+"-p, --prototype=protoname  copy limits from user/group\n"
+"-b, --batch                read limits from standard input\n"
+msgstr ""
+"Sk³adnia:\n"
+"  setquota [-u|-g] %1$s[-F format] <u¿ytkownik|grupa>\n"
+"\t<miêkki-limit-bloków> <twardy-limit-bloków> <miêkki-limit-iwêz³ów> <twardy-limit-iwêz³ów> -a|<system-plików>...\n"
+"  setquota [-u|-g] %1$s[-F format] <-p wzorcowy-u¿ytkownik|grupa> <u¿ytkownik|grupa> -a|<system-plików>...\n"
+"  setquota [-u|-g] %1$s[-F format] -b -a|<system-plików>...\n"
+"  setquota [-u|-g] [-F format] -t <pob³-bloki> <pob³-iwêz³y> -a|<system-plików>...\n"
+"  setquota [-u|-g] [-F format] <u¿ytkownik|grupa> -T <pob³-bloki> <pob³-iwêz³y> -a|<system-plików>...\n"
+"\n"
+"-u, --user                 ustawienie limitów dla u¿ytkownika\n"
+"-g, --group                ustawienie limitów dla grupy\n"
+"-a, --all                  ustawienie limitów dla wszystkich systemów plików\n"
+"    --always-resolve       próba rozwi±zania nazwy zawsze, nawet je¶li sk³ada\n"
+"                           siê wy³±cznie z cyfr\n"
+"-F, --format=nazwa         operowanie na podanym formacie limitów\n"
+"-p, --prototype=nazwa      skopiowanie limitów od podanego u¿ytkownika/grupy\n"
+"-b, --batch                odczyt limitów ze standardowego wej¶cia\n"
+
+#: setquota.c:65
+msgid "-r, --remote               set remote quota (via RPC)\n"
+msgstr "-r, --remote               ustawienie zdalnego limitu (poprzez RPC)\n"
+
+#: setquota.c:67
+msgid ""
+"-t, --edit-period          edit grace period\n"
+"-T, --edit-times           edit grace times for user/group\n"
+"-h, --help                 display this help text and exit\n"
+"-V, --version              display version information and exit\n"
+"\n"
+msgstr ""
+"-t, --edit-period          zmiana okresu pob³a¿liwo¶ci\n"
+"-T, --edit-times           zmiana czasów pob³a¿liwo¶ci dla u¿ytkownika/grupy\n"
+"-h, --help                 wy¶wietlenie tego opisu i zakoñczenie\n"
+"-V, --version              wy¶wietlenie informacji o wersji i zakoñczenie\n"
+
+#: setquota.c:82
+#, c-format
+msgid "Bad %s: %s\n"
+msgstr "B³êdny %s: %s\n"
+
+#: setquota.c:170
+msgid "Group and user quotas cannot be used together.\n"
+msgstr "Limity grupy i u¿ytkownika nie mog± byæ u¿yte razem.\n"
+
+#: setquota.c:174
+msgid "Prototype user has no sense when editting grace times.\n"
+msgstr "Wzorcowy u¿ytkownik nie ma sensu przy edycji okresów pob³a¿liwo¶ci.\n"
+
+#: setquota.c:178
+msgid "Cannot set both individual and global grace time.\n"
+msgstr "Nie mo¿na ustawiæ jednocze¶nie jednostkowych i globalnych okresów pob³a¿liwo¶ci.\n"
+
+#: setquota.c:182
+msgid "Batch mode cannot be used for setting grace times.\n"
+msgstr "Nie mo¿na u¿yæ trybu wsadowego do ustawienia okresów pob³a¿liwo¶ci.\n"
+
+#: setquota.c:186
+msgid "Batch mode and prototype user cannot be used together.\n"
+msgstr "Tryb wsadowy i u¿ytkownik wzorcowy nie mog± byæ u¿yte razem.\n"
+
+#: setquota.c:209
+msgid "block softlimit"
+msgstr "miêkki limit bloków"
+
+#: setquota.c:210
+msgid "block hardlimit"
+msgstr "twardy limit bloków"
+
+#: setquota.c:211
+msgid "inode softlimit"
+msgstr "miêkki limit i-wêz³ów"
+
+#: setquota.c:212
+msgid "inode hardlimit"
+msgstr "twardy limit i-wêz³ów"
+
+#: setquota.c:218 setquota.c:230
+msgid "block grace time"
+msgstr "okres pob³a¿liwo¶ci dla bloków"
+
+#: setquota.c:219 setquota.c:236
+msgid "inode grace time"
+msgstr "okres pob³a¿liwo¶ci dla i-wêz³ów"
+
+#: setquota.c:242
+msgid "Mountpoint not specified.\n"
+msgstr "Nie podano punktu montowania.\n"
+
+#: setquota.c:297
+#, c-format
+msgid "Cannot parse input line %d.\n"
+msgstr "Nie mo¿na przetworzyæ linii wej¶cia %d.\n"
+
+#: setquota.c:301
+#, c-format
+msgid "Unable to get name '%s'.\n"
+msgstr "Nie mo¿na uzyskaæ nazwy '%s'.\n"
+
+#: setquota.c:359
+#, c-format
+msgid "cannot write times for %s. Maybe kernel does not support such operation?\n"
+msgstr "nie mo¿na zapisaæ czasów %s. Mo¿e j±dro nie obs³uguje takiej operacji?\n"
+
+#: svc_socket.c:40
+#, c-format
+msgid "Cannot create socket: %s\n"
+msgstr "Nie mo¿na utworzyæ gniazda: %s\n"
+
+#: svc_socket.c:47
+#, c-format
+msgid "Cannot set socket options: %s\n"
+msgstr "Nie mo¿na ustawiæ opcji gniazda: %s\n"
+
+#: svc_socket.c:82
+#, c-format
+msgid "Cannot bind to given address: %s\n"
+msgstr "Nie mo¿na przypisaæ do podanego adresu: %s\n"
+
+#: warnquota.c:54
+msgid ""
+"Hi,\n"
+"\n"
+"We noticed that you are in violation with the quotasystem\n"
+"used on this system. We have found the following violations:\n"
+"\n"
+msgstr ""
+"Cze¶æ!\n"
+"\n"
+"Zauwa¿yli¶my naruszenie zasad systemu limitowania przestrzeni dyskowej,\n"
+"u¿ywanego na tym systemie. Znale¼li¶my nastêpuj±ce naruszenia:\n"
+
+#: warnquota.c:56
+#, c-format
+msgid ""
+"\n"
+"We hope that you will cleanup before your grace period expires.\n"
+"\n"
+"Basically, this means that the system thinks you are using more disk space\n"
+"on the above partition(s) than you are allowed.  If you do not delete files\n"
+"and get below your quota before the grace period expires, the system will\n"
+"prevent you from creating new files.\n"
+"\n"
+"For additional assistance, please contact us at %s\n"
+"or via phone at %s.\n"
+msgstr ""
+"\n"
+"Mamy nadziejê, Â¿e posprz±tasz przed up³yniêciem okresu pob³a¿liwo¶ci.\n"
+"\n"
+"Oznacza to, i¿ system uwa¿a, Â¿e na podanych systemach plików u¿ywasz\n"
+"wiêcej miejsca, ni¿ jeste¶ upowa¿niony. Je¿eli nie posprz±tasz tak, aby\n"
+"znale¼æ siê poni¿ej limitów przed up³yniêciem okresu pob³a¿liwo¶ci, system\n"
+"zabroni Ci tworzyæ nowe pliki.\n"
+"\n"
+"Aby uzyskaæ dodatkowe wyja¶nienia prosimy skontaktowaæ siê z nami pod\n"
+"adresem %s lub telefonicznie pod numerem %s.\n"
+
+#: warnquota.c:63
+#, c-format
+msgid ""
+"Hi,\n"
+"\n"
+"We noticed that the group %s you are member of violates the quotasystem\n"
+"used on this system. We have found the following violations:\n"
+"\n"
+msgstr ""
+"Cze¶æ!\n"
+"\n"
+"Zauwa¿yli¶my, Â¿e grupa %s, której jeste¶ cz³onkiem, narusza zasady\n"
+"systemu limitowania przestrzeni dyskowej, u¿ywanego na tym systemie.\n"
+"Znale¼li¶my nastêpuj±ce naruszenia:\n"
+
+#: warnquota.c:65
+#, c-format
+msgid ""
+"\n"
+"Please cleanup the group data before the grace period expires.\n"
+"\n"
+"Basically, this means that the system thinks group is using more disk space\n"
+"on the above partition(s) than it is allowed.  If you do not delete files\n"
+"and get below group quota before the grace period expires, the system will\n"
+"prevent you and other members of the group from creating new files owned by\n"
+"the group.\n"
+"\n"
+"For additional assistance, please contact us at %s\n"
+"or via phone at %s.\n"
+msgstr ""
+"\n"
+"Prosimy posprz±taæ dane grupy przed up³yniêciem okresu pob³a¿liwo¶ci.\n"
+"\n"
+"Oznacza to, i¿ system uwa¿a, Â¿e na podanych systemach plików grupa u¿ywa\n"
+"wiêcej miejsca, ni¿ jest upowa¿niona. Je¶li nie posprz±tacie tak, aby\n"
+"znale¼æ siê poni¿ej limitów przed up³yniêciem okresu pob³a¿liwo¶ci, system\n"
+"zabroni Ci i innym cz³onkom grupy tworzyæ nowe pliki nale¿±ce do tej grupy.\n"
+"\n"
+"Aby uzyskaæ dodatkowe wyja¶nienia prosimy skontaktowaæ siê z nami pod\n"
+"adresem %s lub telefonicznie pod numerem %s.\n"
+
+#: warnquota.c:181
+#, c-format
+msgid "%s: %s\n"
+msgstr "%s: %s\n"
+
+#: warnquota.c:225
+#, c-format
+msgid "Cannot get name for uid/gid %u.\n"
+msgstr "Nie mo¿na uzyskaæ nazwy dla uid/gid %u.\n"
+
+#: warnquota.c:309
+#, c-format
+msgid "Cannot create pipe: %s\n"
+msgstr "Nie mo¿na utworzyæ potoku: %s\n"
+
+#: warnquota.c:315
+#, c-format
+msgid "Cannot fork: %s\n"
+msgstr "Nie mo¿na wykonaæ fork: %s\n"
+
+#: warnquota.c:320
+#, c-format
+msgid "Cannot duplicate descriptor: %s\n"
+msgstr "Nie mo¿na powieliæ deskryptora: %s\n"
+
+#: warnquota.c:324
+#, c-format
+msgid "Cannot execute '%s': %s\n"
+msgstr "Nie mo¿na uruchomiæ '%s': %s\n"
+
+#: warnquota.c:329
+#, c-format
+msgid "Cannot open pine: %s\n"
+msgstr "Nie mo¿na otworzyæ potoku: %s\n"
+
+#: warnquota.c:410
+msgid "Could not setup ldap connection, returning.\n"
+msgstr "Nie mo¿na nawi±zaæ po³±czenia LDAP, powrót.\n"
+
+#: warnquota.c:433
+#, c-format
+msgid "Error with %s.\n"
+msgstr "B³±d przy %s.\n"
+
+#: warnquota.c:441
+#, c-format
+msgid "Multiple entries found for client %s, %d not sending mail.\n"
+msgstr "Znaleziono wiele wpisów dla klienta %s - %d, nie wys³ano poczty.\n"
+
+#: warnquota.c:445
+#, c-format
+msgid "Entry not found for client %s, %d not sending mail.\n"
+msgstr "Nie znaleziono wpisu dla klienta %s - %d, nie wys³ano poczty.\n"
+
+#: warnquota.c:456
+#, c-format
+msgid "Could not get values for %s.\n"
+msgstr "Nie mo¿na uzyskaæ warto¶ci dla %s.\n"
+
+#: warnquota.c:488
+#, c-format
+msgid "Administrator for a group %s not found. Cancelling mail.\n"
+msgstr "Nie znaleziono administratora dla grupy %s. Anulowanie poczty.\n"
+
+#: warnquota.c:528
+#, c-format
+msgid ""
+"\n"
+"                        Block limits               File limits\n"
+msgstr ""
+"\n"
+"                        Limity bloków              Limity plików\n"
+
+#: warnquota.c:529
+#, c-format
+msgid "Filesystem           used    soft    hard  grace    used  soft  hard  grace\n"
+msgstr "System plików        u¿yw.   miêk.   twar. pob³.    u¿yw. miêk. twar. pob³.\n"
+
+#: warnquota.c:569
+#, c-format
+msgid "Cannot wait for mailer: %s\n"
+msgstr "Nie mo¿na czekaæ na wys³anie poczty: %s\n"
+
+#: warnquota.c:571
+msgid "Warning: Mailer exitted abnormally.\n"
+msgstr "Uwaga: Program wysy³aj±cy pocztê nie zakoñczy³ siê normalnie.\n"
+
+#: warnquota.c:628
+#, c-format
+msgid ""
+"Cannot open %s: %s\n"
+"Will use device names.\n"
+msgstr ""
+"Nie mo¿na otworzyæ %s: %s\n"
+"Bêd± u¿ywane nazwy urz±dzeñ.\n"
+
+#: warnquota.c:651
+#, c-format
+msgid "Cannot parse line %d in quotatab (missing ':')\n"
+msgstr "Nie mo¿na przeanalizowaæ linii %d w pliku quotatab (brakuje ':')\n"
+
+#: warnquota.c:665
+#, c-format
+msgid "Cannot stat device %s (maybe typo in quotatab)\n"
+msgstr "Nie mo¿na wykonaæ stat na urz±dzeniu %s (mo¿e b³±d w quotatab)\n"
+
+#: warnquota.c:685
+#, c-format
+msgid ""
+"Incorrect format string for variable %s.\n"
+"Unrecognized expression %%%c.\n"
+msgstr ""
+"Niepoprawny Â³añcuch formatuj±cy dla zmiennej %s.\n"
+"Nierozpoznane wyra¿enie %%%c.\n"
+
+#: warnquota.c:743
+#, c-format
+msgid "Line %d too long. Truncating.\n"
+msgstr "Linia %d zbyt d³uga. Uciêto.\n"
+
+#: warnquota.c:813
+#, c-format
+msgid "Cannot parse time at CC_BEFORE variable (line %d).\n"
+msgstr "Nie mo¿na przetworzyæ czasu przy zmiennej CC_BEFORE (linia %d).\n"
+
+#: warnquota.c:837
+#, c-format
+msgid "Error in config file (line %d), ignoring\n"
+msgstr "B³±d w pliku konfiguracyjnym (linia %d), zignorowano\n"
+
+#: warnquota.c:840
+#, c-format
+msgid "Possible error in config file (line %d), ignoring\n"
+msgstr "Mo¿liwy b³±d w pliku konfiguracyjnym (linia %d), zignorowano\n"
+
+#: warnquota.c:843
+msgid "Unterminated last line, ignoring\n"
+msgstr "Niezakoñczona ostatnia linia, zignorowano\n"
+
+#: warnquota.c:848
+#, c-format
+msgid ""
+"LDAP library version >= 2.3 detected. Please use LDAP_URI instead of hostname and port.\n"
+"Generated URI %s\n"
+msgstr ""
+"Wykryto bibliotekê LDAP w wersji >= 2.3. Proszê u¿yæ LDAP_URI zamiast nazwy hosta i portu.\n"
+"Wygenerowano URI %s\n"
+
+#: warnquota.c:852
+msgid "LDAP library does not support ldap_initialize() but URI is specified."
+msgstr "Biblioteka LDAP nie obs³uguje ldap_initialize(), ale podano URI."
+
+#: warnquota.c:873
+#, c-format
+msgid "Cannot open file with group administrators: %s\n"
+msgstr "Nie mo¿na otworzyæ pliku z administratorami grup: %s\n"
+
+#: warnquota.c:888
+#, c-format
+msgid "Parse error at line %d. Cannot find end of group name.\n"
+msgstr "B³±d podczas analizy linii %d. Nie mo¿na znale¼æ nazwy grupy.\n"
+
+#: warnquota.c:897
+#, c-format
+msgid "Parse error at line %d. Cannot find administrators name.\n"
+msgstr "B³±d podczas analizy linii %d. Nie mo¿na znale¼æ nazwy administratora.\n"
+
+#: warnquota.c:907
+#, c-format
+msgid "Parse error at line %d. Trailing characters after administrators name.\n"
+msgstr "B³±d podczas analizy linii %d. Nadmiarowe znaki po nazwie administratora.\n"
+
+#: warnquota.c:970
+msgid ""
+"Usage:\n"
+"  warnquota [-ugsid] [-F quotaformat] [-c configfile] [-q quotatabfile] [-a adminsfile]\n"
+"\n"
+"-u, --user                      warn users\n"
+"-g, --group                     warn groups\n"
+"-s, --human-readable            send information in more human friendly units\n"
+"-i, --no-autofs                 avoid autofs mountpoints\n"
+"-d, --no-details                do not send quota information itself\n"
+"-F, --format=formatname         use quotafiles of specific format\n"
+"-c, --config=config-file        non-default config file\n"
+"-q, --quota-tab=quotatab-file   non-default quotatab\n"
+"-a, --admins-file=admins-file   non-default admins file\n"
+"-h, --help                      display this help message and exit\n"
+"-v, --version                   display version information and exit\n"
+"\n"
+msgstr ""
+"Sk³adnia:\n"
+"  warnquota [-ugsid] [-F format] [-c plik-konfiguracyjny] [-q plik-quotatab] [-a plik-admins]\n"
+"\n"
+"-u, --user                      ostrze¿enie u¿ytkowników\n"
+"-g, --group                     ostrze¿enie grup\n"
+"-s, --human-readable            wysy³anie informacji w jednostkach bardziej\n"
+"                                przyjaznych dla cz³owieka\n"
+"-i, --no-autofs                 pomijanie punktów montowania autofs\n"
+"-d, --no-details                nie wysy³anie informacji o samych limitach\n"
+"-F, --format=format             u¿ycie plików limitów o podanym formacie\n"
+"-c, --config=plik               inny ni¿ domy¶lny plik konfiguracyjny\n"
+"-q, --quota-tab=plik            inny ni¿ domy¶lny plik quotatab\n"
+"-a, --admins-file=plik          inny ni¿ domy¶lny plik admins\n"
+"-h, --help                      wy¶wietlenie tego opisu i zakoñczenie\n"
+"-v, --version                   wy¶wietlenie informacji o wersji i zakoñczenie\n"
+"\n"
+
+#: warnquota.c:1051
+#, c-format
+msgid "Cannot get host name: %s\n"
+msgstr "Nie mo¿na uzyskaæ nazwy hosta: %s\n"
+
+#: xqmstats.c:31 xqmstats.c:36
+msgid "The running kernel does not support XFS\n"
+msgstr "Dzia³aj±ce j±dro nie obs³uguje XFS\n"
+
+#: xqmstats.c:48
+#, c-format
+msgid "XFS Quota Manager dquot statistics\n"
+msgstr "Statystyki dquot Zarz±dcy Limitów na XFS\n"
+
+#: xqmstats.c:49
+#, c-format
+msgid "  reclaims:        %u\n"
+msgstr "  poprawki:          %u\n"
+
+#: xqmstats.c:50
+#, c-format
+msgid "  missed reclaims: %u\n"
+msgstr "  chybione poprawki: %u\n"
+
+#: xqmstats.c:51
+#, c-format
+msgid "  dquot dups:      %u\n"
+msgstr "  duplikaty dquot:   %u\n"
+
+#: xqmstats.c:52
+#, c-format
+msgid "  cache misses:    %u\n"
+msgstr "  chybienia bufora:  %u\n"
+
+#: xqmstats.c:53
+#, c-format
+msgid "  cache hits:      %u\n"
+msgstr "  trafienia bufora:  %u\n"
+
+#: xqmstats.c:54
+#, c-format
+msgid "  dquot wants:     %u\n"
+msgstr "  Â¿Â±dania dquot:     %u\n"
+
+#: xqmstats.c:55
+#, c-format
+msgid "  shake reclaims:  %u\n"
+msgstr "  poprawki shake:    %u\n"
+
+#: xqmstats.c:56
+#, c-format
+msgid "  inact reclaims:  %u\n"
+msgstr "  poprawki inact:    %u\n"
+
+#: xqmstats.c:61
+#, c-format
+msgid "Maximum %u dquots (currently %u incore, %u on freelist)\n"
+msgstr "Maksimum %u dquot (aktualnie %u w rdzeniu, %u na li¶cie wolnych)\n"
diff --git a/po/pl.po.rej b/po/pl.po.rej
new file mode 100644 (file)
index 0000000..a52f6aa
--- /dev/null
@@ -0,0 +1,51 @@
+***************
+*** 208,214 ****
+  msgstr "Nie mo¿na zapisaæ okresów pob³a¿liwo¶ci do pliku.\n"
+  
+  #: edquota.c:262
+- msgid "Error while editting grace times.\n"
+  msgstr "B³±d podczas edycji okresów pob³a¿liwo¶ci.\n"
+  
+  #: edquota.c:266
+--- 208,214 ----
+  msgstr "Nie mo¿na zapisaæ okresów pob³a¿liwo¶ci do pliku.\n"
+  
+  #: edquota.c:262
++ msgid "Error while editing grace times.\n"
+  msgstr "B³±d podczas edycji okresów pob³a¿liwo¶ci.\n"
+  
+  #: edquota.c:266
+***************
+*** 220,226 ****
+  msgstr "Nie mo¿na zapisaæ do pliku pojedynczych okresów pob³a¿liwo¶ci.\n"
+  
+  #: edquota.c:280
+- msgid "Error while editting individual grace times.\n"
+  msgstr "B³±d podczas edycji pojedynczych okresów pob³a¿liwo¶ci.\n"
+  
+  #: edquota.c:285
+--- 220,226 ----
+  msgstr "Nie mo¿na zapisaæ do pliku pojedynczych okresów pob³a¿liwo¶ci.\n"
+  
+  #: edquota.c:280
++ msgid "Error while editing individual grace times.\n"
+  msgstr "B³±d podczas edycji pojedynczych okresów pob³a¿liwo¶ci.\n"
+  
+  #: edquota.c:285
+***************
+*** 232,238 ****
+  msgstr "Nie mo¿na zapisaæ limitów do pliku.\n"
+  
+  #: edquota.c:304
+- msgid "Error while editting quotas.\n"
+  msgstr "B³±d podczas edycji limitów.\n"
+  
+  #: edquota.c:310
+--- 232,238 ----
+  msgstr "Nie mo¿na zapisaæ limitów do pliku.\n"
+  
+  #: edquota.c:304
++ msgid "Error while editing quotas.\n"
+  msgstr "B³±d podczas edycji limitów.\n"
+  
+  #: edquota.c:310
diff --git a/pot.c b/pot.c
new file mode 100644 (file)
index 0000000..e5a1e1d
--- /dev/null
+++ b/pot.c
@@ -0,0 +1,16 @@
+#include "config.h"
+#include "pot.h"
+#include <locale.h>
+
+/*************************************************************************
+ * if you want to turn off gettext without changing sources edit pot.h 
+ *************************************************************************/
+
+void gettexton(void)
+{
+#ifdef USE_GETTEXT
+       setlocale(LC_ALL, "");
+       bindtextdomain("quota", "/usr/share/locale");
+       textdomain("quota");
+#endif
+}
diff --git a/pot.h b/pot.h
new file mode 100644 (file)
index 0000000..a825c03
--- /dev/null
+++ b/pot.h
@@ -0,0 +1,18 @@
+#ifndef GUARD_POT_H
+#define GUARD_POT_H
+
+#ifdef USE_GETTEXT
+
+#include <libintl.h>
+
+#define _(x)   gettext((x))
+
+#else
+
+#define _(x)   (x)
+
+#endif
+
+void gettexton(void);
+
+#endif
diff --git a/quot.8 b/quot.8
new file mode 100644 (file)
index 0000000..25dfcd2
--- /dev/null
+++ b/quot.8
@@ -0,0 +1,64 @@
+.TH QUOT 8
+.SH NAME
+quot \- summarize filesystem ownership
+.SH SYNOPSIS
+.nf
+\f3quot\f1 [ \f3\-acfguvi\f1 ] [ filesystem... ]
+.fi
+.SH DESCRIPTION
+.IR quot
+displays the number of kilobytes in the named
+.I filesystem
+currently owned by each user or group. Note that this utility
+currently works only for XFS.
+.SH OPTIONS
+.TP
+.B \-a
+Generate a report for all mounted filesystems giving the number of
+kilobytes used by each user or group.
+.TP
+.B \-c
+Display three columns giving file size in kilobytes, number of
+files of that size, and cumulative total of kilobytes
+in that size or smaller file.
+The last row is used as an overflow
+bucket and is the total of all files greater than 500 kilobytes.
+.TP
+.B \-f
+Display count of kilobytes and number of files owned by each user or group.
+.TP
+.B \-g
+Report on groups.
+.TP
+.B \-u
+Report on users (the default).
+.TP
+.B \-v
+Display three columns containing the number of kilobytes not accessed in
+the last 30, 60, and 90 days.
+.TP
+.B \-i
+Ignore mountpoints mounted by automounter.
+.TP
+.B \-T
+Avoid truncation of user names longer than 8 characters.
+.TP
+.B \-q
+Do not sort the output.
+.SH FILES
+.PD 0
+.TP 20
+/etc/mtab
+mounted filesystem table
+.TP
+/etc/passwd
+default set of users
+.TP
+/etc/group
+default set of groups
+.PD
+.SH "SEE ALSO"
+du(1),
+ls(1).
+.SH BUGS
+Currently, only the XFS filesystem type is supported.
diff --git a/quot.c b/quot.c
new file mode 100644 (file)
index 0000000..3e1f8d8
--- /dev/null
+++ b/quot.c
@@ -0,0 +1,388 @@
+/*
+ * Copyright (c) 1980, 1990 Regents of the University of California.
+ * Copyright (C) 2000, 2001 Silicon Graphics, Inc. [SGI]
+ * All rights reserved.
+ *
+ * [Extensions to support XFS are copyright SGI]
+ *
+ * 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. 3. All advertising
+ * materials mentioning features or use of this software must display the
+ * following acknowledgement: This product includes software developed by the
+ * University of California, Berkeley and its contributors. 4. Neither the
+ * name of the University nor the names of its contributors may be used to
+ * endorse or promote products derived from this software without specific
+ * prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS 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 REGENTS 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 "config.h"
+
+#include <sys/stat.h>
+#include <sys/param.h>
+#include <sys/ioctl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <time.h>
+#include <utmp.h>
+#include <pwd.h>
+#include <grp.h>
+
+#include "pot.h"
+#include "quot.h"
+#include "common.h"
+#include "mntopt.h"
+#include "bylabel.h"
+#include "quotasys.h"
+
+#define        TSIZE   500
+__uint64_t sizes[TSIZE];
+__uint64_t overflow;
+
+static int aflag;
+static int cflag;
+static int fflag;
+static int gflag;
+static int uflag;
+static int vflag;
+static int iflag;
+static int qflag;
+static int Tflag;
+static time_t now;
+char *progname;
+
+static void mounttable(void);
+static char *idname(__uint32_t, int);
+static void report(const char *, char *, int);
+static void creport(const char *, char *);
+
+static void usage(void)
+{
+       errstr(_("Usage: %s [-acfugvViTq] [filesystem...]\n"), progname);
+       exit(1);
+}
+
+int main(int argc, char **argv)
+{
+       int c;
+
+       now = time(0);
+       progname = basename(argv[0]);
+
+       while ((c = getopt(argc, argv, "acfguvVTq")) != -1) {
+               switch (c) {
+                 case 'a':
+                         aflag++;
+                         break;
+                 case 'c':
+                         cflag++;
+                         break;
+                 case 'f':
+                         fflag++;
+                         break;
+                 case 'g':
+                         gflag++;
+                         break;
+                 case 'u':
+                         uflag++;
+                         break;
+                 case 'v':
+                         vflag++;
+                         break;
+                 case 'i':
+                         iflag++;
+                         break;
+                 case 'q':
+                         qflag++;
+                         break;
+                 case 'T':
+                         Tflag++;
+                         break;
+                 case 'V':
+                         version();
+                         exit(0);
+                 default:
+                         usage();
+               }
+       }
+       if ((aflag && optind != argc) || (!aflag && optind == argc))
+               usage();
+       if (!uflag && !gflag)
+               uflag++;
+       if (init_mounts_scan(aflag ? 0 : argc - optind, argv + optind, (iflag ? MS_NO_AUTOFS : 0)) < 0)
+               return 1;
+       mounttable();
+       end_mounts_scan();
+       return 0;
+}
+
+static void mounttable(void)
+{
+       int doit = 0;
+       struct mntent *mntp;
+
+       while ((mntp = get_next_mount())) {
+               /* Currently, only XFS is implemented... */
+               if (strcmp(mntp->mnt_type, MNTTYPE_XFS) == 0) {
+                       checkXFS(mntp->mnt_fsname, mntp->mnt_dir);
+                       doit = 1;
+               }
+               /* ...additional filesystems types here. */
+
+               if (doit) {
+                       if (cflag) creport(mntp->mnt_fsname, mntp->mnt_dir);
+                       if (!cflag && uflag) report(mntp->mnt_fsname, mntp->mnt_dir, 0);
+                       if (!cflag && gflag) report(mntp->mnt_fsname, mntp->mnt_dir, 1);
+               }
+       }
+}
+
+static int qcmp(du_t * p1, du_t * p2)
+{
+       if (p1->blocks > p2->blocks)
+               return -1;
+       if (p1->blocks < p2->blocks)
+               return 1;
+       if (p1->id > p2->id)
+               return 1;
+       else if (p1->id < p2->id)
+               return -1;
+       return 0;
+}
+
+static void creport(const char *file, char *fsdir)
+{
+       int i;
+       __uint64_t t = 0;
+
+       printf(_("%s (%s):\n"), file, fsdir);
+       for (i = 0; i < TSIZE - 1; i++)
+               if (sizes[i] > 0) {
+                       t += sizes[i] * i;
+                       printf(_("%d\t%llu\t%llu\n"), i,
+                              (unsigned long long) sizes[i],
+                              (unsigned long long) t);
+               }
+       printf(_("%d\t%llu\t%llu\n"), TSIZE - 1,
+              (unsigned long long) sizes[TSIZE - 1],
+               (unsigned long long) (overflow + t));
+}
+
+static void report(const char *file, char *fsdir, int type)
+{
+       du_t *dp;
+
+       printf(_("%s (%s) %s:\n"), file, fsdir, type? "groups" : "users");
+       if (!qflag)
+               qsort(du[type], ndu[type], sizeof(du[type][0]), (int (*)(const void *, const void *))qcmp);
+       for (dp = du[type]; dp < &du[type][ndu[type]]; dp++) {
+               char *cp;
+
+               if (dp->blocks == 0)
+                       return;
+               printf(_("%8llu    "), (unsigned long long) dp->blocks);
+               if (fflag)
+                       printf(_("%8llu    "), (unsigned long long) dp->nfiles);
+               if ((cp = idname(dp->id, type)) != NULL) {
+                       if (Tflag)
+                               printf(_("%s"), cp);
+                       else
+                               printf(_("%-8.8s"), cp);
+               } else
+                       printf(_("#%-7d"), dp->id);
+               if (vflag)
+                       printf(_("    %8llu    %8llu    %8llu"),
+                              (unsigned long long) dp->blocks30,
+                              (unsigned long long) dp->blocks60,
+                              (unsigned long long) dp->blocks90);
+               putchar('\n');
+       }
+}
+
+static idcache_t *getnextent(int type, __uint32_t id, int byid)
+{
+       struct passwd *pw;
+       struct group  *gr;
+       static idcache_t idc;
+
+       if (type) {     /* /etc/group */
+               if ((gr = byid? getgrgid(id) : getgrent()) == NULL)
+                       return NULL;
+               idc.id = gr->gr_gid;
+               strncpy(idc.name, gr->gr_name, UT_NAMESIZE);
+               return &idc;
+       }
+       /* /etc/passwd */
+       if ((pw = byid? getpwuid(id) : getpwent()) == NULL)
+               return NULL;
+       idc.id = pw->pw_uid;
+       strncpy(idc.name, pw->pw_name, UT_NAMESIZE);
+       return &idc;
+}
+
+static char *idname(__uint32_t id, int type)
+{
+       idcache_t *ncp, *idp;
+       static idcache_t nc[2][NID];
+       static int entriesleft[2] = { NID, NID };
+
+       /* check cache for name first */
+       ncp = &nc[type][id & IDMASK];
+       if (ncp->id == id && ncp->name[0])
+               return ncp->name;
+       if (entriesleft[type]) {
+               /*
+                * If we haven't gone through the passwd/group file
+                * then fill the cache while seaching for name.
+                * This lets us run through passwd/group serially.
+                */
+               if (entriesleft[type] == NID)
+                       type? setgrent() : setpwent();
+               while (((idp = getnextent(type, id, 0)) != NULL) && entriesleft[type]) {
+                       entriesleft[type]--;
+                       ncp = &nc[type][idp->id & IDMASK];
+                       if (ncp->name[0] == '\0' || idp->id == id)
+                               memcpy(ncp, idp, sizeof(idcache_t));
+                       if (idp->id == id)
+                               return ncp->name;
+               }
+               type? endgrent() : endpwent();
+               entriesleft[type] = 0;
+               ncp = &nc[type][id & IDMASK];
+       }
+
+       /* Not cached - do it the slow way & insert into cache */
+       if ((idp = getnextent(type, id, 1)) == NULL)
+               return NULL;
+       memcpy(ncp, idp, sizeof(idcache_t));
+       return ncp->name;
+}
+
+/*
+ *     === XFS specific code follows ===
+ */
+
+static void acctXFS(xfs_bstat_t *p)
+{
+       register du_t *dp;
+       du_t **hp;
+       __uint64_t size;
+       __uint32_t i, id;
+
+       if ((p->bs_mode & S_IFMT) == 0)
+               return;
+       size = howmany((p->bs_blocks * p->bs_blksize), 0x400ULL);
+
+       if (cflag) {
+               if (!(S_ISDIR(p->bs_mode) || S_ISREG(p->bs_mode)))
+                       return;
+               if (size >= TSIZE) {
+                       overflow += size;
+                       size = TSIZE - 1;
+               }
+               sizes[(int)size]++;
+               return;
+       }
+       for (i = 0; i < 2; i++) {
+               id = (i == 0)? p->bs_uid : p->bs_gid;
+               hp = &duhash[i][id % DUHASH];
+               for (dp = *hp; dp; dp = dp->next)
+                       if (dp->id == id)
+                               break;
+               if (dp == 0) {
+                       if (ndu[i] >= NDU)
+                               return;
+                       dp = &du[i][(ndu[i]++)];
+                       dp->next = *hp;
+                       *hp = dp;
+                       dp->id = id;
+                       dp->nfiles = 0;
+                       dp->blocks = 0;
+                       dp->blocks30 = 0;
+                       dp->blocks60 = 0;
+                       dp->blocks90 = 0;
+               }
+               dp->blocks += size;
+
+               if (now - p->bs_atime.tv_sec > 30 * SEC24HR)
+                       dp->blocks30 += size;
+               if (now - p->bs_atime.tv_sec > 60 * SEC24HR)
+                       dp->blocks60 += size;
+               if (now - p->bs_atime.tv_sec > 90 * SEC24HR)
+                       dp->blocks90 += size;
+               dp->nfiles++;
+       }
+}
+
+static void checkXFS(const char *file, char *fsdir)
+{
+       xfs_fsop_bulkreq_t bulkreq;
+       __u64 last = 0;
+       __s32 count;
+       int i;
+       int sts;
+       int fsfd;
+       du_t **dp;
+       xfs_bstat_t *buf;
+
+       /*
+        * Initialize tables between checks; because of the qsort
+        * in report() the hash tables must be rebuilt each time.
+        */
+       for (sts = 0; sts < TSIZE; sts++)
+               sizes[sts] = 0;
+       overflow = 0;
+       for (i = 0; i < 2; i++)
+               for (dp = duhash[i]; dp < &duhash[i][DUHASH]; dp++)
+                       *dp = 0;
+       ndu[0] = ndu[1] = 0;
+
+       fsfd = open(fsdir, O_RDONLY);
+       if (fsfd < 0) {
+               errstr(_("cannot open %s: %s\n"), fsdir, strerror(errno));
+               exit(1);
+       }
+       sync();
+
+       buf = (xfs_bstat_t *) smalloc(NBSTAT * sizeof(xfs_bstat_t));
+       memset(buf, 0, NBSTAT * sizeof(xfs_bstat_t));
+
+       bulkreq.lastip = &last;
+       bulkreq.icount = NBSTAT;
+       bulkreq.ubuffer = buf;
+       bulkreq.ocount = &count;
+
+       while ((sts = ioctl(fsfd, XFS_IOC_FSBULKSTAT, &bulkreq)) == 0) {
+               if (count == 0)
+                       break;
+               for (i = 0; i < count; i++)
+                       acctXFS(&buf[i]);
+       }
+       if (sts < 0) {
+               errstr(_("XFS_IOC_FSBULKSTAT ioctl failed: %s\n"),
+                       strerror(errno));
+               exit(1);
+       }
+       free(buf);
+       close(fsfd);
+}
diff --git a/quot.h b/quot.h
new file mode 100644 (file)
index 0000000..4f3de0b
--- /dev/null
+++ b/quot.h
@@ -0,0 +1,113 @@
+/*
+ * Copyright (c) 1980, 1990 Regents of the University of California.
+ * Copyright (C) 2000, 2001 Silicon Graphics, Inc. [SGI]
+ * All rights reserved.
+ *
+ * [Extensions to support XFS are copyright SGI]
+ *
+ * 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. 3. All advertising
+ * materials mentioning features or use of this software must display the
+ * following acknowledgement: This product includes software developed by the
+ * University of California, Berkeley and its contributors. 4. Neither the
+ * name of the University nor the names of its contributors may be used to
+ * endorse or promote products derived from this software without specific
+ * prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS 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 REGENTS 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.
+ */
+
+#define        SEC24HR (60*60*24)      /* seconds per day */
+
+typedef struct {
+       __uint32_t id;
+       char name[UT_NAMESIZE + 1];
+} idcache_t;
+
+typedef struct du {
+       struct du *next;
+       __uint64_t blocks;
+       __uint64_t blocks30;
+       __uint64_t blocks60;
+       __uint64_t blocks90;
+       __uint64_t nfiles;
+       __uint32_t id;
+} du_t;
+
+#define        NDU     60000
+#define        DUHASH  8209
+static du_t du[2][NDU];
+static du_t *duhash[2][DUHASH];
+static int ndu[2];
+
+#define NID    256
+#define IDMASK (NID-1)
+
+/*
+ *     === Start XFS specific types and definitions ===
+ */
+#include <asm/types.h>
+
+/* Structures returned from ioctl XFS_IOC_FSBULKSTAT */
+typedef struct xfs_bstime {
+       time_t tv_sec;          /* seconds                      */
+       __s32 tv_nsec;          /* and nanoseconds              */
+} xfs_bstime_t;
+
+typedef struct xfs_bstat {
+       __u64 bs_ino;           /* inode number                 */
+       __u16 bs_mode;          /* type and mode                */
+       __u16 bs_nlink;         /* number of links              */
+       __u32 bs_uid;           /* user id                      */
+       __u32 bs_gid;           /* group id                     */
+       __u32 bs_rdev;          /* device value                 */
+       __s32 bs_blksize;       /* block size                   */
+       __s64 bs_size;          /* file size                    */
+       xfs_bstime_t bs_atime;  /* access time                  */
+       xfs_bstime_t bs_mtime;  /* modify time                  */
+       xfs_bstime_t bs_ctime;  /* inode change time            */
+       int64_t bs_blocks;      /* number of blocks             */
+       __u32 bs_xflags;        /* extended flags               */
+       __s32 bs_extsize;       /* extent size                  */
+       __s32 bs_extents;       /* number of extents            */
+       __u32 bs_gen;           /* generation count             */
+       __u16 bs_projid;        /* project id                   */
+       unsigned char bs_pad[14];       /* pad space, unused            */
+       __u32 bs_dmevmask;      /* DMIG event mask              */
+       __u16 bs_dmstate;       /* DMIG state info              */
+       __u16 bs_aextents;      /* attribute number of extents  */
+} xfs_bstat_t;
+
+/* The user-level BulkStat Request interface structure. */
+typedef struct xfs_fsop_bulkreq {
+       __u64 *lastip;          /* last inode # pointer         */
+       __s32 icount;           /* count of entries in buffer   */
+       void *ubuffer;          /* user buffer for inode desc.  */
+       __s32 *ocount;          /* output count pointer         */
+} xfs_fsop_bulkreq_t;
+
+#ifndef XFS_IOC_FSBULKSTAT
+#define XFS_IOC_FSBULKSTAT     _IOWR('X', 101, struct xfs_fsop_bulkreq)
+#endif
+
+#define NBSTAT  4069           /* XFS bulkstat inodes */
+static void checkXFS(const char *file, char *fsdir);
+
+/*
+ *     === End of XFS specific types and definitions ===
+ */
diff --git a/quota.1 b/quota.1
new file mode 100644 (file)
index 0000000..705629c
--- /dev/null
+++ b/quota.1
@@ -0,0 +1,190 @@
+.TH QUOTA 1
+.SH NAME
+quota \- display disk usage and limits
+.SH SYNOPSIS
+.B quota
+[
+.B -F
+.I format-name
+] [
+.B -guqvswi
+] [
+.BR -l \ |
+[
+.BR -QAm
+]]
+.br
+.B quota
+[
+.B -F
+.I format-name
+] [
+.B -qvswi
+] [
+.BR -l \ |
+[
+.BR -QAm
+]]
+.B -u
+.IR user ...
+.br
+.B quota
+[
+.B -F
+.I format-name
+] [
+.B -qvswi
+] [
+.BR -l \ |
+[
+.BR -QAm
+]]
+.B -g
+.IR group ...
+.br
+.B quota
+[
+.B -F
+.I format-name
+] [
+.B -qvswugQm
+]
+.B -f
+.IR filesystem ...
+.SH DESCRIPTION
+.B quota
+displays users' disk usage and limits.
+By default only the user quotas are printed.
+.PP
+.B quota
+reports the quotas of all the filesystems listed in
+.BR /etc/mtab .
+For filesystems that are NFS-mounted a call to the rpc.rquotad on
+the server machine is performed to get the information.
+.SH OPTIONS
+.TP
+.B -F, --format=\f2format-name\f1
+Show quota for specified format (ie. don't perform format autodetection).
+Possible format names are:
+.B vfsold
+Original quota format with 16-bit UIDs / GIDs,
+.B vfsv0
+Quota format with 32-bit UIDs / GIDs, 64-bit space usage, 32-bit inode usage and limits,
+.B vfsv1
+Quota format with 64-bit quota limits and usage,
+.B rpc
+(quota over NFS),
+.B xfs
+(quota on XFS filesystem)
+.TP
+.B -g, --group
+Print group quotas for the group 
+of which the user is a member.
+The optional 
+.B group
+argument(s) restricts the display to the specified group(s).
+.TP
+.B -u, --user
+flag is equivalent to the default.
+.TP
+.B -v, --verbose
+will display quotas on filesystems
+where no storage is allocated.
+.TP
+.B -s, --human-readable
+option will make
+.BR quota (1)
+try to choose units for showing limits, used space and used inodes.
+.TP
+.B -p, --raw-grace
+When user is in grace period, report time in seconds since epoch when his grace
+time runs out (or has run out). Field is '0' when no grace time is in effect.
+This is especially useful when parsing output by a script.
+.TP
+.B -i, --no-autofs
+ignore mountpoints mounted by automounter
+.TP
+.B -l, --local-only
+report quotas only on local filesystems (ie. ignore NFS mounted filesystems).
+.TP
+.B -A, --all-nfs
+report quotas for all NFS filesystems even if they report to be on the same
+device.
+.TP
+.B -m, --no-mixed-pathnames
+Currently, pathnames of NFSv4 mountpoints are sent without leading slash in the path.
+.BR rpc.rquotad
+uses this to recognize NFSv4 mounts and properly prepend pseudoroot of NFS filesystem
+to the path. If you specify this option, 
+.BR setquota 
+will always send paths with a trailing slash. This can be useful for legacy reasons but
+be aware that quota over RPC will stop working if you are using new
+.BR rpc.rquotad .
+.TP
+.B -q, --quiet
+Print a more terse message,
+containing only information
+on filesystems where usage is over quota.
+.TP
+.B -Q, --quiet-refuse
+Do not print error message if connection to
+.BR rpc.rquotad
+is refused (usually this happens when
+.BR rpc.rquotad
+is not running on the server).
+.TP
+.B -w, --no-wrap
+Do not wrap the line if the device name is too long. This can be useful when parsing
+the output of
+.BR quota (1)
+by a script.
+.LP
+Specifying both
+.B \-g
+and
+.B \-u
+displays both the user quotas and the group quotas (for
+the user).
+.LP
+Only the super-user may use the
+.B \-u
+flag and the optional
+.B user
+argument to view the limits of other users.
+Non-super-users can use the the
+.B \-g
+flag and optional
+.B group
+argument to view only the limits of groups of which they are members.
+.LP
+The
+.B \-q
+flag takes precedence over the
+.B \-v
+flag.
+.SH DIAGNOSTICS
+If
+.B quota
+exits with a non-zero status, one or more filesystems
+are over quota.
+.SH FILES
+.PD 0
+.TP 20
+.B aquota.user " or " aquota.group
+quota file at the filesystem root (version 2 quota, non-XFS filesystems)
+.TP 20
+.B quota.user " or " quota.group
+quota file at the filesystem root (version 1 quota, non-XFS filesystems)
+.TP
+.B /etc/mtab
+default filesystems
+.PD
+.SH SEE ALSO
+.BR quotactl (2),
+.BR fstab (5),
+.BR edquota (8),
+.BR quotacheck (8),
+.BR quotaon (8),
+.BR quota_nld (8),
+.BR repquota (8),
+.DR warnquota (8)
diff --git a/quota.c b/quota.c
new file mode 100644 (file)
index 0000000..ba44930
--- /dev/null
+++ b/quota.c
@@ -0,0 +1,377 @@
+/*
+ * Copyright (c) 1980, 1990 Regents of the University of California. All
+ * rights reserved.
+ * 
+ * This code is derived from software contributed to Berkeley by Robert Elz at
+ * The University of Melbourne.
+ * 
+ * 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. 3. All advertising
+ * materials mentioning features or use of this software must display the
+ * following acknowledgement: This product includes software developed by the
+ * University of California, Berkeley and its contributors. 4. Neither the
+ * name of the University nor the names of its contributors may be used to
+ * endorse or promote products derived from this software without specific
+ * prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS 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 REGENTS 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 "config.h"
+
+/*
+ * Disk quota reporting program.
+ */
+#include <sys/types.h>
+#include <sys/param.h>
+#include <getopt.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <pwd.h>
+#include <grp.h>
+#include <time.h>
+#include <errno.h>
+#include <string.h>
+#include <unistd.h>
+#ifdef RPC
+#include <rpc/rpc.h>
+#include "rquota.h"
+#endif
+
+#include "quota.h"
+#include "quotaops.h"
+#include "quotasys.h"
+#include "pot.h"
+#include "common.h"
+
+#define FL_QUIET 1
+#define FL_VERBOSE 2
+#define FL_USER 4
+#define FL_GROUP 8
+#define FL_SMARTSIZE 16
+#define FL_LOCALONLY 32
+#define FL_QUIETREFUSE 64
+#define FL_NOAUTOFS 128
+#define FL_NOWRAP 256
+#define FL_FSLIST 512
+#define FL_NUMNAMES 1024
+#define FL_NFSALL 2048
+#define FL_RAWGRACE 4096
+#define FL_NO_MIXED_PATHS 8192
+
+int flags, fmt = -1;
+char *progname;
+
+void usage(void)
+{
+       errstr( "%s%s%s%s%s",
+               _("Usage: quota [-guqvswim] [-l | [-Q | -A]] [-F quotaformat]\n"),
+               _("\tquota [-qvswim] [-l | [-Q | -A]] [-F quotaformat] -u username ...\n"),
+               _("\tquota [-qvswim] [-l | [-Q | -A]] [-F quotaformat] -g groupname ...\n"),
+               _("\tquota [-qvswugQm] [-F quotaformat] -f filesystem ...\n"),
+               _("\n\
+-u, --user                display quota for user\n\
+-g, --group               display quota for group\n\
+-q, --quiet               print more terse message\n\
+-v, --verbose             print more verbose message\n\
+-s, --human-readable      display numbers in human friendly units (MB, GB...)\n\
+    --always-resolve      always try to translate name to id, even if it is\n\
+                         composed of only digits\n\
+-w, --no-wrap             do not wrap long lines\n\
+-p, --raw-grace           print grace time in seconds since epoch\n\
+-l, --local-only          do not query NFS filesystems\n\
+-Q, --quiet-refuse        do not print error message when NFS server does\n\
+                          not respond\n\
+-i, --no-autofs           do not query autofs mountpoints\n\
+-F, --format=formatname   display quota of a specific format\n\
+-f, --filesystem-list     display quota information only for given filesystems\n\
+-A, --nfs-all             display quota for all NFS mountpoints\n\
+-m, --no-mixed-pathnames  trim leading slashes from NFSv4 mountpoints\n\
+-h, --help                display this help message and exit\n\
+-V, --version             display version information and exit\n\n"));
+       fprintf(stderr, _("Bugs to: %s\n"), MY_EMAIL);
+       exit(1);
+}
+
+void heading(int type, qid_t id, char *name, char *tag)
+{
+       char *spacehdr;
+
+       if (flags & FL_SMARTSIZE)
+               spacehdr = _("space");
+       else
+               spacehdr = _("blocks");
+
+       printf(_("Disk quotas for %s %s (%cid %u): %s\n"), type2name(type),
+              name, *type2name(type), (uint) id, tag);
+       if (!(flags & FL_QUIET) && !tag[0]) {
+               printf("%15s%8s %7s%8s%8s%8s %7s%8s%8s\n", _("Filesystem"),
+                      spacehdr,_("quota"), _("limit"), _("grace"),
+                      _("files"), _("quota"), _("limit"), _("grace"));
+       }
+}
+
+int showquotas(int type, qid_t id, int mntcnt, char **mnt)
+{
+       struct dquot *qlist, *q;
+       char *msgi, *msgb;
+       char timebuf[MAXTIMELEN];
+       char name[MAXNAMELEN];
+       struct quota_handle **handles;
+       int lines = 0, bover, iover, over;
+       time_t now;
+
+       time(&now);
+       id2name(id, type, name);
+       handles = create_handle_list(mntcnt, mnt, type, fmt,
+               IOI_READONLY | ((flags & FL_NO_MIXED_PATHS) ? 0 : IOI_NFS_MIXED_PATHS),
+               ((flags & FL_NOAUTOFS) ? MS_NO_AUTOFS : 0)
+               | ((flags & FL_LOCALONLY) ? MS_LOCALONLY : 0)
+               | ((flags & FL_NFSALL) ? MS_NFS_ALL : 0));
+       qlist = getprivs(id, handles, !!(flags & FL_QUIETREFUSE));
+       over = 0;
+       for (q = qlist; q; q = q->dq_next) {
+               bover = iover = 0;
+               if (!(flags & FL_VERBOSE) && !q->dq_dqb.dqb_isoftlimit && !q->dq_dqb.dqb_ihardlimit
+                   && !q->dq_dqb.dqb_bsoftlimit && !q->dq_dqb.dqb_bhardlimit)
+                       continue;
+               msgi = NULL;
+               if (q->dq_dqb.dqb_ihardlimit && q->dq_dqb.dqb_curinodes >= q->dq_dqb.dqb_ihardlimit) {
+                       msgi = _("File limit reached on");
+                       iover = 1;
+               }
+               else if (q->dq_dqb.dqb_isoftlimit
+                        && q->dq_dqb.dqb_curinodes > q->dq_dqb.dqb_isoftlimit) {
+                       if (q->dq_dqb.dqb_itime > now) {
+                               msgi = _("In file grace period on");
+                               iover = 2;
+                       }
+                       else {
+                               msgi = _("Over file quota on");
+                               iover = 3;
+                       }
+               }
+               msgb = NULL;
+               if (q->dq_dqb.dqb_bhardlimit && toqb(q->dq_dqb.dqb_curspace) >= q->dq_dqb.dqb_bhardlimit) {
+                               msgb = _("Block limit reached on");
+                               bover = 1;
+               }
+               else if (q->dq_dqb.dqb_bsoftlimit
+                        && toqb(q->dq_dqb.dqb_curspace) > q->dq_dqb.dqb_bsoftlimit) {
+                       if (q->dq_dqb.dqb_btime > now) {
+                               msgb = _("In block grace period on");
+                               bover = 2;
+                       }
+                       else {
+                               msgb = _("Over block quota on");
+                               bover = 3;
+                       }
+               }
+               over |= bover | iover;
+               if (flags & FL_QUIET) {
+                       if ((msgi || msgb) && !lines++)
+                               heading(type, id, name, "");
+                       if (msgi)
+                               printf("\t%s %s\n", msgi, q->dq_h->qh_quotadev);
+                       if (msgb)
+                               printf("\t%s %s\n", msgb, q->dq_h->qh_quotadev);
+                       continue;
+               }
+               if ((flags & FL_VERBOSE) || q->dq_dqb.dqb_curspace || q->dq_dqb.dqb_curinodes) {
+                       char numbuf[3][MAXNUMLEN];
+
+                       if (!lines++)
+                               heading(type, id, name, "");
+                       if (strlen(q->dq_h->qh_quotadev) > 15 && !(flags & FL_NOWRAP))
+                               printf("%s\n%15s", q->dq_h->qh_quotadev, "");
+                       else
+                               printf("%15s", q->dq_h->qh_quotadev);
+                       if (!(flags & FL_RAWGRACE)) {
+                               if (bover)
+                                       difftime2str(q->dq_dqb.dqb_btime, timebuf);
+                               else
+                                       timebuf[0] = 0;
+                       }
+                       else {
+                               if (bover)
+                                       sprintf(timebuf, "%llu", (long long unsigned int)q->dq_dqb.dqb_btime);
+                               else
+                                       strcpy(timebuf, "0");
+                       }
+                       space2str(toqb(q->dq_dqb.dqb_curspace), numbuf[0], !!(flags & FL_SMARTSIZE));
+                       space2str(q->dq_dqb.dqb_bsoftlimit, numbuf[1], !!(flags & FL_SMARTSIZE));
+                       space2str(q->dq_dqb.dqb_bhardlimit, numbuf[2], !!(flags & FL_SMARTSIZE));
+                       printf(" %7s%c %6s %7s %7s", numbuf[0], bover ? '*' : ' ', numbuf[1],
+                              numbuf[2], timebuf);
+
+                       if (!(flags & FL_RAWGRACE)) {
+                               if (iover)
+                                       difftime2str(q->dq_dqb.dqb_itime, timebuf);
+                               else
+                                       timebuf[0] = 0;
+                       }
+                       else {
+                               if (iover)
+                                       sprintf(timebuf, "%llu", (long long unsigned int)q->dq_dqb.dqb_itime);
+                               else
+                                       strcpy(timebuf, "0");
+                       }
+                       number2str(q->dq_dqb.dqb_curinodes, numbuf[0], !!(flags & FL_SMARTSIZE));
+                       number2str(q->dq_dqb.dqb_isoftlimit, numbuf[1], !!(flags & FL_SMARTSIZE));
+                       number2str(q->dq_dqb.dqb_ihardlimit, numbuf[2], !!(flags & FL_SMARTSIZE));
+                       printf(" %7s%c %6s %7s %7s\n", numbuf[0], iover ? '*' : ' ', numbuf[1],
+                              numbuf[2], timebuf);
+                       continue;
+               }
+       }
+       if (!(flags & FL_QUIET) && !lines && qlist)
+               heading(type, id, name, _("none"));
+       freeprivs(qlist);
+       dispose_handle_list(handles);
+       return over > 0 ? 1 : 0;
+}
+
+int main(int argc, char **argv)
+{
+       int ngroups;
+       gid_t gidset[NGROUPS], *gidsetp;
+       int i, ret;
+       struct option long_opts[] = {
+               { "help", 0, NULL, 'h' },
+               { "version", 0, NULL, 'V' },
+               { "user", 0, NULL, 'u' },
+               { "group", 0, NULL, 'g' },
+               { "quiet", 0, NULL, 'q' },
+               { "verbose", 0, NULL, 'v' },
+               { "human-readable", 0, NULL, 's' },
+               { "always-resolve", 0, NULL, 256 },
+               { "raw-grace", 0, NULL, 'p' },
+               { "local-only", 0, NULL, 'l' },
+               { "no-autofs", 0, NULL, 'i' },
+               { "quiet-refuse", 0, NULL, 'Q' },
+               { "format", 1, NULL, 'F' },
+               { "no-wrap", 0, NULL, 'w' },
+               { "filesystem-list", 0, NULL, 'f' },
+               { "all-nfs", 0, NULL, 'A' },
+               { "no-mixed-pathnames", 0, NULL, 'm' },
+               { NULL, 0, NULL, 0 }
+       };
+
+       gettexton();
+       progname = basename(argv[0]);
+
+       while ((ret = getopt_long(argc, argv, "guqvsVliQF:wfApm", long_opts, NULL)) != -1) {
+               switch (ret) {
+                 case 'g':
+                         flags |= FL_GROUP;
+                         break;
+                 case 'u':
+                         flags |= FL_USER;
+                         break;
+                 case 'q':
+                         flags |= FL_QUIET;
+                         break;
+                 case 'v':
+                         flags |= FL_VERBOSE;
+                         break;
+                 case 'F':
+                         if ((fmt = name2fmt(optarg)) == QF_ERROR)     /* Error? */
+                                 exit(1);
+                         break;
+                 case 's':
+                         flags |= FL_SMARTSIZE;
+                         break;
+                 case 'p':
+                         flags |= FL_RAWGRACE;
+                         break;
+                 case 256:
+                         flags |= FL_NUMNAMES;
+                         break;
+                 case 'l':
+                         flags |= FL_LOCALONLY;
+                         break;
+                 case 'Q':
+                         flags |= FL_QUIETREFUSE;
+                         break;
+                 case 'i':
+                         flags |= FL_NOAUTOFS;
+                         break;
+                 case 'w':
+                         flags |= FL_NOWRAP;
+                         break;
+                 case 'f':
+                         flags |= FL_FSLIST;
+                         break;
+                 case 'A':
+                         flags |= FL_NFSALL;
+                         break;
+                 case 'm':
+                         flags |= FL_NO_MIXED_PATHS;
+                         break;
+                 case 'V':
+                         version();
+                         exit(0);
+                 default:
+                         usage();
+               }
+       }
+       argc -= optind;
+       argv += optind;
+
+       if (!(flags & FL_USER) && !(flags & FL_GROUP))
+               flags |= FL_USER;
+       if (flags & FL_FSLIST && flags & (FL_LOCALONLY | FL_NOAUTOFS))
+               errstr(_("Warning: Ignoring -%c when filesystem list specified.\n"), flags & FL_LOCALONLY ? 'l' : 'i');
+
+       init_kernel_interface();
+
+       ret = 0;
+       if (argc == 0 || flags & FL_FSLIST) {
+               if (flags & FL_FSLIST && argc == 0)
+                       die(1, _("No filesystem specified.\n"));
+               if (flags & FL_USER)
+                       ret |= showquotas(USRQUOTA, getuid(), argc, argv);
+               if (flags & FL_GROUP) {
+                       ngroups = sysconf(_SC_NGROUPS_MAX);
+                       if (ngroups > NGROUPS) {
+                               gidsetp = malloc(ngroups * sizeof(gid_t));
+                               if (!gidsetp)
+                                       die(1, _("Gid set allocation (%d): %s\n"), ngroups, strerror(errno));
+                       } else {
+                               gidsetp = &gidset[0];
+                       }
+                       ngroups = getgroups(ngroups, gidsetp);
+                       if (ngroups < 0)
+                               die(1, _("getgroups(): %s\n"), strerror(errno));
+                       for (i = 0; i < ngroups; i++)
+                               ret |= showquotas(GRPQUOTA, gidsetp[i], argc, argv);
+               }
+               exit(ret);
+       }
+
+       if ((flags & FL_USER) && (flags & FL_GROUP))
+               usage();
+
+       if (flags & FL_USER)
+               for (; argc > 0; argc--, argv++)
+                       ret |= showquotas(USRQUOTA, user2uid(*argv, !!(flags & FL_NUMNAMES), NULL), 0, NULL);
+       else if (flags & FL_GROUP)
+               for (; argc > 0; argc--, argv++)
+                       ret |= showquotas(GRPQUOTA, group2gid(*argv, !!(flags & FL_NUMNAMES), NULL), 0, NULL);
+       return ret;
+}
diff --git a/quota.h b/quota.h
new file mode 100644 (file)
index 0000000..565fc7e
--- /dev/null
+++ b/quota.h
@@ -0,0 +1,164 @@
+#ifndef GUARD_QUOTA_H
+#define GUARD_QUOTA_H
+
+#include <sys/types.h>
+
+typedef u_int32_t qid_t;       /* Type in which we store ids in memory */
+typedef int64_t qsize_t;       /* Type in which we store size limitations */
+
+#define MAXQUOTAS 2
+#define USRQUOTA  0            /* element used for user quotas */
+#define GRPQUOTA  1            /* element used for group quotas */
+
+/*
+ * Definitions for the default names of the quotas files.
+ */
+#define INITQFNAMES { \
+       "user",    /* USRQUOTA */ \
+       "group",   /* GRPQUOTA */ \
+       "undefined", \
+}
+
+/*
+ * Definitions of magics and versions of current quota files
+ */
+#define INITQMAGICS {\
+       0xd9c01f11,     /* USRQUOTA */\
+       0xd9c01927      /* GRPQUOTA */\
+}
+
+/* Size of blocks in which are counted size limits in generic utility parts */
+#define QUOTABLOCK_BITS 10
+#define QUOTABLOCK_SIZE (1 << QUOTABLOCK_BITS)
+
+/* Conversion routines from and to quota blocks */
+#define qb2kb(x) ((x) << (QUOTABLOCK_BITS-10))
+#define kb2qb(x) ((x) >> (QUOTABLOCK_BITS-10))
+#define toqb(x) (((x) + QUOTABLOCK_SIZE - 1) >> QUOTABLOCK_BITS)
+
+/*
+ * Command definitions for the 'quotactl' system call.
+ * The commands are broken into a main command defined below
+ * and a subcommand that is used to convey the type of
+ * quota that is being manipulated (see above).
+ */
+#define SUBCMDMASK  0x00ff
+#define SUBCMDSHIFT 8
+#define QCMD(cmd, type)  (((cmd) << SUBCMDSHIFT) | ((type) & SUBCMDMASK))
+
+#define Q_6_5_QUOTAON  0x0100  /* enable quotas */
+#define Q_6_5_QUOTAOFF 0x0200  /* disable quotas */
+#define Q_6_5_SYNC     0x0600  /* sync disk copy of a filesystems quotas */
+
+#define Q_SYNC     0x800001    /* sync disk copy of a filesystems quotas */
+#define Q_QUOTAON  0x800002    /* turn quotas on */
+#define Q_QUOTAOFF 0x800003    /* turn quotas off */
+#define Q_GETFMT   0x800004    /* get quota format used on given filesystem */
+#define Q_GETINFO  0x800005    /* get information about quota files */
+#define Q_SETINFO  0x800006    /* set information about quota files */
+#define Q_GETQUOTA 0x800007    /* get user quota structure */
+#define Q_SETQUOTA 0x800008    /* set user quota structure */
+
+/*
+ * Quota structure used for communication with userspace via quotactl
+ * Following flags are used to specify which fields are valid
+ */
+#define QIF_BLIMITS    1
+#define QIF_SPACE      2
+#define QIF_ILIMITS    4
+#define QIF_INODES     8
+#define QIF_BTIME      16
+#define QIF_ITIME      32
+#define QIF_LIMITS     (QIF_BLIMITS | QIF_ILIMITS)
+#define QIF_USAGE      (QIF_SPACE | QIF_INODES)
+#define QIF_TIMES      (QIF_BTIME | QIF_ITIME)
+#define QIF_ALL                (QIF_LIMITS | QIF_USAGE | QIF_TIMES)
+
+struct if_dqblk {
+       u_int64_t dqb_bhardlimit;
+       u_int64_t dqb_bsoftlimit;
+       u_int64_t dqb_curspace;
+       u_int64_t dqb_ihardlimit;
+       u_int64_t dqb_isoftlimit;
+       u_int64_t dqb_curinodes;
+       u_int64_t dqb_btime;
+       u_int64_t dqb_itime;
+       u_int32_t dqb_valid;
+};
+
+/*
+ * Structure used for setting quota information about file via quotactl
+ * Following flags are used to specify which fields are valid
+ */
+#define IIF_BGRACE     1
+#define IIF_IGRACE     2
+#define IIF_FLAGS      4
+#define IIF_ALL                (IIF_BGRACE | IIF_IGRACE | IIF_FLAGS)
+
+struct if_dqinfo {
+       u_int64_t dqi_bgrace;
+       u_int64_t dqi_igrace;
+       u_int32_t dqi_flags;
+       u_int32_t dqi_valid;
+};
+
+/*
+ * Definitions for quota netlink interface
+ */
+#define QUOTA_NL_NOWARN 0
+#define QUOTA_NL_IHARDWARN 1            /* Inode hardlimit reached */
+#define QUOTA_NL_ISOFTLONGWARN 2        /* Inode grace time expired */
+#define QUOTA_NL_ISOFTWARN 3            /* Inode softlimit reached */
+#define QUOTA_NL_BHARDWARN 4            /* Block hardlimit reached */
+#define QUOTA_NL_BSOFTLONGWARN 5        /* Block grace time expired */
+#define QUOTA_NL_BSOFTWARN 6            /* Block softlimit reached */
+#define QUOTA_NL_IHARDBELOW 7          /* Usage got below inode hardlimit */
+#define QUOTA_NL_ISOFTBELOW 8          /* Usage got below inode softlimit */
+#define QUOTA_NL_BHARDBELOW 9          /* Usage got below block hardlimit */
+#define QUOTA_NL_BSOFTBELOW 10         /* Usage got below block softlimit */
+
+enum {
+       QUOTA_NL_C_UNSPEC,
+       QUOTA_NL_C_WARNING,
+       ENUM_QUOTA_NL_C_MAX,
+};
+#define QUOTA_NL_C_MAX (ENUM_QUOTA_NL_C_MAX - 1)
+
+enum {
+       QUOTA_NL_A_UNSPEC,
+       QUOTA_NL_A_QTYPE,
+       QUOTA_NL_A_EXCESS_ID,
+       QUOTA_NL_A_WARNING,
+       QUOTA_NL_A_DEV_MAJOR,
+       QUOTA_NL_A_DEV_MINOR,
+       QUOTA_NL_A_CAUSED_ID,
+       ENUM_QUOTA_NL_A_MAX,
+};
+#define QUOTA_NL_A_MAX (ENUM_QUOTA_NL_A_MAX - 1)
+
+/* Quota format identifiers */
+#define QFMT_VFS_OLD 1
+#define QFMT_VFS_V0  2
+#define QFMT_OCFS2   3
+#define QFMT_VFS_V1  4
+
+/* Flags supported by kernel */
+#define V1_DQF_RSQUASH 1
+
+/* Ioctl for getting quota size */
+#include <sys/ioctl.h>
+#ifndef FIOQSIZE
+       #if defined(__alpha__) || defined(__powerpc__) || defined(__sh__) || defined(__sparc__) || defined(__sparc64__)
+               #define FIOQSIZE _IOR('f', 128, loff_t)
+       #elif defined(__arm__) || defined(__mc68000__) || defined(__s390__)
+               #define FIOQSIZE 0x545E
+        #elif defined(__i386__) || defined(__i486__) || defined(__i586__) || defined(__ia64__) || defined(__parisc__) || defined(__cris__) || defined(__hppa__) || defined(__x86_64__)
+               #define FIOQSIZE 0x5460
+       #elif defined(__mips__) || defined(__mips64__)
+               #define FIOQSIZE 0x6667
+       #endif
+#endif
+
+long quotactl __P((int, const char *, qid_t, caddr_t));
+
+#endif /* _QUOTA_ */
diff --git a/quota_nld.8 b/quota_nld.8
new file mode 100644 (file)
index 0000000..9eb7214
--- /dev/null
@@ -0,0 +1,61 @@
+.TH RQUOTAD 8
+.SH NAME
+quota_nld \- quota netlink message daemon
+.SH SYNOPSIS
+.B quota_nld
+[[
+.B \-D
+|
+.B \-C
+][
+.B \-F
+][
+.B \-b
+]]
+.SH DESCRIPTION
+.BR quota_nld
+listens on netlink socket and processes received quota
+warnings. By default
+.BR quota_nld
+forwards warning messages to both the system's DBUS (so that the desktop
+manager can display a dialog) and the last-accessed terminal of the user to
+whom each warning is directed. Either of these destinations can be disabled
+with the
+.B \-D
+and
+.B \-C
+options, respectively.
+
+In the case of the user's terminal, quota messages about falling below
+the hard and soft limits are not sent unless the
+.B \-b
+option is specified. In the case of the DBUS, all quota messages are sent.
+
+Note, that you have to enable the kernel support for sending quota
+messages over netlink (in Filesystems->Quota menu).
+
+.SH OPTIONS
+.TP
+.B \-V, \-\-version
+Show version of quota tools and exit.
+.TP
+.B \-h, \-\-help
+Show a usage message and exit.
+.TP
+.B \-D, \-\-no-dbus
+Do not forward quota warnings to DBUS.
+.TP
+.B \-C, \-\-no-console
+Do not print quota warnings to the user's last-accessed terminal.
+.TP
+.B \-b, \-\-print-below
+If quota warnings are printed to users' terminals, include
+messages about falling below their hard and soft limits.
+.TP
+.B \-F, \-\-foreground
+Run daemon in foreground (may be useful for debugging purposes).
+
+.SH "SEE ALSO"
+.BR quota (1),
+.BR netlink (7),
+.BR dbus.freedesktop.org
diff --git a/quota_nld.c b/quota_nld.c
new file mode 100644 (file)
index 0000000..538702d
--- /dev/null
@@ -0,0 +1,389 @@
+/*
+ *  A deamon to read quota warning messages from the kernel netlink socket
+ *  and either pipe them to the system DBUS or write them to user's console
+ *
+ *  Copyright (c) 2007 SUSE CR, All Rights Reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of version 2 of the GNU General Public License as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it would be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ */
+
+#include "config.h"
+
+#include <stdio.h>
+#include <unistd.h>
+#include <getopt.h>
+#include <utmp.h>
+#include <errno.h>
+#include <string.h>
+#include <fcntl.h>
+#include <limits.h>
+
+#include <netlink/genl/genl.h>
+#include <netlink/genl/ctrl.h>
+
+#include <dbus/dbus.h>
+
+#include "pot.h"
+#include "common.h"
+#include "quotasys.h"
+#include "quota.h"
+
+char *progname;
+
+struct quota_warning {
+       uint32_t qtype;
+       uint64_t excess_id;
+       uint32_t warntype;
+       uint32_t dev_major;
+       uint32_t dev_minor;
+       uint64_t caused_id;
+};
+
+static struct nla_policy quota_nl_warn_cmd_policy[QUOTA_NL_A_MAX+1] = {
+       [QUOTA_NL_A_QTYPE] = { .type = NLA_U32 },
+       [QUOTA_NL_A_EXCESS_ID] = { .type = NLA_U64 },
+       [QUOTA_NL_A_WARNING] = { .type = NLA_U32 },
+       [QUOTA_NL_A_DEV_MAJOR] = { .type = NLA_U32 },
+       [QUOTA_NL_A_DEV_MINOR] = { .type = NLA_U32 },
+       [QUOTA_NL_A_CAUSED_ID] = { .type = NLA_U64 },
+};
+
+/* User options */
+#define FL_NODBUS 1
+#define FL_NOCONSOLE 2
+#define FL_NODAEMON 4
+#define FL_PRINTBELOW 8
+
+int flags;
+DBusConnection *dhandle;
+
+static const struct option options[] = {
+       { "version", 0, NULL, 'V' },
+       { "help", 0, NULL, 'h' },
+       { "no-dbus", 0, NULL, 'D' },
+       { "no-console", 0, NULL, 'C' },
+       { "foreground", 0, NULL, 'F' },
+       { "print-below", 0, NULL, 'b' },
+       { NULL, 0, NULL, 0 }
+};
+
+void show_help(void)
+{
+       errstr(_("Usage: %s [options]\nOptions are:\n\
+ -h --help         shows this text\n\
+ -V --version      shows version information\n\
+ -C --no-console   do not try to write messages to console\n\
+ -b --print-below  write to console also information about getting below hard/soft limits\n\
+ -D --no-dbus      do not try to write messages to DBUS\n\
+ -F --foreground   run daemon in foreground\n"), progname);
+}
+
+static void parse_options(int argc, char **argv)
+{
+       int opt;
+
+       while ((opt = getopt_long(argc, argv, "VhDCFb", options, NULL)) >= 0) {
+               switch (opt) {
+                       case 'V':
+                               version();
+                               exit(0);
+                       case 'h':
+                               show_help();
+                               exit(0);
+                       case 'D':
+                               flags |= FL_NODBUS;
+                               break;
+                       case 'C':
+                               flags |= FL_NOCONSOLE;
+                               break;
+                       case 'F':
+                               flags |= FL_NODAEMON;
+                               break;
+                       case 'b':
+                               flags |= FL_PRINTBELOW;
+                               break;
+                       default:
+                               errstr(_("Unknown option '%c'.\n"), opt);
+                               show_help();
+                               exit(1);
+               }
+       }
+       if (flags & FL_NODBUS && flags & FL_NOCONSOLE) {
+               errstr(_("No possible destination for messages. Nothing to do.\n"));
+               exit(0);
+       }
+}
+
+static void write_console_warning(struct quota_warning *warn);
+static void write_dbus_warning(struct DBusConnection *dhandle, struct quota_warning *warn);
+
+/* Parse netlink message and process it. */
+static int quota_nl_parser(struct nl_msg *msg, void *arg)
+{
+       struct nlmsghdr *nlh = nlmsg_hdr(msg);
+       struct genlmsghdr *ghdr;
+       struct nlattr *attrs[QUOTA_NL_A_MAX+1];
+       struct quota_warning warn;
+       int ret;
+
+       if (!genlmsg_valid_hdr(nlh, 0))
+                return 0;
+        ghdr = nlmsg_data(nlh);
+       /* Unknown message? Ignore... */
+       if (ghdr->cmd != QUOTA_NL_C_WARNING)
+               return 0;
+
+       ret = genlmsg_parse(nlh, 0, attrs, QUOTA_NL_A_MAX, quota_nl_warn_cmd_policy);
+       if (ret < 0) {
+               errstr(_("Error parsing netlink message.\n"));
+               return ret;
+       }
+       if (!attrs[QUOTA_NL_A_QTYPE] || !attrs[QUOTA_NL_A_EXCESS_ID] ||
+           !attrs[QUOTA_NL_A_WARNING] || !attrs[QUOTA_NL_A_DEV_MAJOR] ||
+           !attrs[QUOTA_NL_A_DEV_MAJOR] || !attrs[QUOTA_NL_A_DEV_MINOR] ||
+           !attrs[QUOTA_NL_A_CAUSED_ID]) {
+               errstr(_("Unknown format of kernel netlink message!\nMaybe your quota tools are too old?\n"));
+               return -EINVAL;
+       }
+       warn.qtype = nla_get_u32(attrs[QUOTA_NL_A_QTYPE]);
+       warn.excess_id = nla_get_u64(attrs[QUOTA_NL_A_EXCESS_ID]);
+       warn.warntype = nla_get_u32(attrs[QUOTA_NL_A_WARNING]);
+       warn.dev_major = nla_get_u32(attrs[QUOTA_NL_A_DEV_MAJOR]);
+       warn.dev_minor = nla_get_u32(attrs[QUOTA_NL_A_DEV_MINOR]);
+       warn.caused_id = nla_get_u64(attrs[QUOTA_NL_A_CAUSED_ID]);
+
+       if (!(flags & FL_NOCONSOLE))
+               write_console_warning(&warn);
+       if (!(flags & FL_NODBUS))
+               write_dbus_warning(dhandle, &warn);
+       return 0;
+}
+
+static struct nl_handle *init_netlink(void)
+{
+       struct nl_handle *handle;
+       int ret, family;
+
+       handle = nl_handle_alloc();
+       if (!handle)
+               die(2, _("Cannot allocate netlink handle!\n"));
+       nl_disable_sequence_check(handle);
+       ret = genl_connect(handle);
+       if (ret < 0)
+               die(2, _("Cannot connect to netlink socket: %s\n"), strerror(-ret));
+       family = genl_ctrl_resolve(handle, "VFS_DQUOT");
+       if (ret < 0)
+               die(2, _("Cannot resolve quota netlink name: %s\n"), strerror(-ret));
+
+       ret = nl_socket_add_membership(handle, family);
+       if (ret < 0)
+               die(2, _("Cannot join quota multicast group: %s\n"), strerror(-ret));
+
+       ret = nl_socket_modify_cb(handle, NL_CB_VALID, NL_CB_CUSTOM,
+                       quota_nl_parser, NULL);
+       if (ret < 0)
+               die(2, _("Cannot register callback for"
+                        " netlink messages: %s\n"), strerror(-ret));
+
+       return handle;
+}
+
+static DBusConnection *init_dbus(void)
+{
+       DBusConnection *handle;
+       DBusError err;
+
+       dbus_error_init(&err);
+       handle = dbus_bus_get(DBUS_BUS_SYSTEM, &err);
+       if (dbus_error_is_set(&err))
+               die(2, _("Cannot connect to system DBUS: %s\n"), err.message);
+
+       dbus_connection_set_exit_on_disconnect(handle, FALSE);
+       return handle;
+}
+
+static int write_all(int fd, char *buf, int len)
+{
+       int ret;
+
+       while (len) {
+               ret = write(fd, buf, len);
+               if (ret < 0)
+                       return -1;
+               buf += ret;
+               len -= ret;
+       }
+       return 0;
+}
+
+#define WARN_BUF_SIZE 512
+
+/* Scan through utmp, find latest used controlling tty and write to it */
+static void write_console_warning(struct quota_warning *warn)
+{
+       struct utmp *uent;
+       char user[MAXNAMELEN];
+       struct stat st;
+       char dev[PATH_MAX];
+       time_t max_atime = 0;
+       char max_dev[PATH_MAX];
+       int fd;
+       char warnbuf[WARN_BUF_SIZE];
+       char *level, *msg;
+
+       if ((warn->warntype == QUOTA_NL_IHARDBELOW ||
+           warn->warntype == QUOTA_NL_ISOFTBELOW ||
+           warn->warntype == QUOTA_NL_BHARDBELOW ||
+           warn->warntype == QUOTA_NL_BSOFTBELOW) && !(flags & FL_PRINTBELOW))
+               return;
+       uid2user(warn->caused_id, user);
+       strcpy(dev, "/dev/");
+
+       setutent();
+       endutent();
+       while ((uent = getutent())) {
+               if (uent->ut_type != USER_PROCESS)
+                       continue;
+               /* Entry for a different user? */
+               if (strcmp(user, uent->ut_user))
+                       continue;
+               sstrncpy(dev+5, uent->ut_line, PATH_MAX-5);
+               if (stat(dev, &st) < 0)
+                       continue;       /* Failed to stat - not a good candidate for warning... */
+               if (max_atime < st.st_atime) {
+                       max_atime = st.st_atime;
+                       strcpy(max_dev, dev);
+               }
+       }
+       if (!max_atime) {
+               errstr(_("Failed to find tty of user %llu to report warning to.\n"), (unsigned long long)warn->caused_id);
+               return;
+       }
+       fd = open(max_dev, O_WRONLY);
+       if (fd < 0) {
+               errstr(_("Failed to open tty %s of user %llu to report warning.\n"), dev, (unsigned long long)warn->caused_id);
+               return;
+       }
+       id2name(warn->excess_id, warn->qtype, user);
+       if (warn->warntype == QUOTA_NL_ISOFTWARN ||
+           warn->warntype == QUOTA_NL_BSOFTWARN)
+               level = _("Warning");
+       else if (warn->warntype == QUOTA_NL_IHARDWARN ||
+                warn->warntype == QUOTA_NL_BHARDWARN)
+               level = _("Error");
+       else
+               level = _("Info");
+       switch (warn->warntype) {
+               case QUOTA_NL_IHARDWARN:
+                       msg = _("file limit reached");
+                       break;
+               case QUOTA_NL_ISOFTLONGWARN:
+                       msg = _("file quota exceeded too long");
+                       break;
+               case QUOTA_NL_ISOFTWARN:
+                       msg = _("file quota exceeded");
+                       break;
+               case QUOTA_NL_BHARDWARN:
+                       msg = _("block limit reached");
+                       break;
+               case QUOTA_NL_BSOFTLONGWARN:
+                       msg = _("block quota exceeded too long");
+                       break;
+               case QUOTA_NL_BSOFTWARN:
+                       msg = _("block quota exceeded");
+                       break;
+               case QUOTA_NL_IHARDBELOW:
+                       msg = _("got below file limit");
+                       break;
+               case QUOTA_NL_ISOFTBELOW:
+                       msg = _("got below file quota");
+                       break;
+               case QUOTA_NL_BHARDBELOW:
+                       msg = _("got below block limit");
+                       break;
+               case QUOTA_NL_BSOFTBELOW:
+                       msg = _("got below block quota");
+                       break;
+               default:
+                       msg = _("unknown quota warning");
+       }
+       sprintf(warnbuf, "%s: %s %s %s.\r\n", level, type2name(warn->qtype), user, msg);
+       if (write_all(fd, warnbuf, strlen(warnbuf)) < 0)
+               errstr(_("Failed to write quota message for user %llu to %s: %s\n"), (unsigned long long)warn->caused_id, dev, strerror(errno));
+       close(fd);
+}
+
+/* Send warning through DBUS */
+static void write_dbus_warning(struct DBusConnection *dhandle, struct quota_warning *warn)
+{
+       DBusMessage* msg;
+       DBusMessageIter args;
+
+       msg = dbus_message_new_signal("/", "com.system.quota.warning", "warning");
+       if (!msg) {
+no_mem:
+               errstr(_("Cannot create DBUS message: No enough memory.\n"));
+               goto out;
+       }
+       dbus_message_iter_init_append(msg, &args);
+       if (!dbus_message_iter_append_basic(&args, DBUS_TYPE_UINT32, &warn->qtype))
+               goto no_mem;
+       if (!dbus_message_iter_append_basic(&args, DBUS_TYPE_UINT64, &warn->excess_id))
+               goto no_mem;
+       if (!dbus_message_iter_append_basic(&args, DBUS_TYPE_UINT32, &warn->warntype))
+               goto no_mem;
+       if (!dbus_message_iter_append_basic(&args, DBUS_TYPE_UINT32, &warn->dev_major))
+               goto no_mem;
+       if (!dbus_message_iter_append_basic(&args, DBUS_TYPE_UINT32, &warn->dev_minor))
+               goto no_mem;
+       if (!dbus_message_iter_append_basic(&args, DBUS_TYPE_UINT64, &warn->caused_id))
+               goto no_mem;
+
+       if (!dbus_connection_send(dhandle, msg, NULL)) {
+               errstr(_("Failed to write message to dbus: No enough memory.\n"));
+               goto out;
+       }
+       dbus_connection_flush(dhandle);
+out:
+       if (msg)
+               dbus_message_unref(msg);
+}
+
+static void run(struct nl_handle *nhandle)
+{
+       int ret;
+
+       while (1) {
+               ret = nl_recvmsgs_default(nhandle);
+               if (ret < 0)
+                       errstr(_("Failed to read or parse quota netlink"
+                               " message: %s\n"), strerror(-ret));
+       }
+}
+
+int main(int argc, char **argv)
+{
+       struct nl_handle *nhandle;
+
+       gettexton();
+       progname = basename(argv[0]);
+       parse_options(argc, argv);
+
+       nhandle = init_netlink();
+       if (!(flags & FL_NODBUS))
+               dhandle = init_dbus();
+       if (!(flags & FL_NODAEMON)) {
+               use_syslog();
+               daemon(0, 0);
+       }
+       run(nhandle);
+       return 0;
+}
diff --git a/quota_tree.h b/quota_tree.h
new file mode 100644 (file)
index 0000000..32fce65
--- /dev/null
@@ -0,0 +1,51 @@
+#ifndef GUARD_QUOTA_TREE_H
+#define GUARD_QUOTA_TREE_H
+
+#include <sys/types.h>
+#include "quota.h"
+
+#define QT_TREEOFF     1       /* Offset of tree in file in blocks */
+#define QT_TREEDEPTH   4       /* Depth of quota tree */
+#define QT_BLKSIZE_BITS        10
+#define QT_BLKSIZE (1 << QT_BLKSIZE_BITS)      /* Size of block with quota structures */
+
+/*
+ *  Structure of header of block with quota structures. It is padded to 16 bytes so
+ *  there will be space for exactly 18 quota-entries in a block
+ */
+struct qt_disk_dqdbheader {
+       u_int32_t dqdh_next_free;       /* Number of next block with free entry */
+       u_int32_t dqdh_prev_free;       /* Number of previous block with free entry */
+       u_int16_t dqdh_entries; /* Number of valid entries in block */
+       u_int16_t dqdh_pad1;
+       u_int32_t dqdh_pad2;
+} __attribute__ ((packed));
+
+struct dquot;
+struct quota_handle;
+
+/* Operations */
+struct qtree_fmt_operations {
+       void (*mem2disk_dqblk)(void *disk, struct dquot *dquot);        /* Convert given entry from in memory format to disk one */
+       void (*disk2mem_dqblk)(struct dquot *dquot, void *disk);        /* Convert given entry from disk format to in memory one */
+       int (*is_id)(void *disk, struct dquot *dquot);  /* Is this structure for given id? */
+};
+
+/* Inmemory copy of version specific information */
+struct qtree_mem_dqinfo {
+       unsigned int dqi_blocks;        /* # of blocks in quota file */
+       unsigned int dqi_free_blk;      /* First block in list of free blocks */
+       unsigned int dqi_free_entry;    /* First block with free entry */
+       unsigned int dqi_entry_size;    /* Size of quota entry in quota file */
+       struct qtree_fmt_operations *dqi_ops;   /* Operations for entry manipulation */
+};
+
+void qtree_write_dquot(struct dquot *dquot);
+struct dquot *qtree_read_dquot(struct quota_handle *h, qid_t id);
+void qtree_delete_dquot(struct dquot *dquot);
+int qtree_entry_unused(struct qtree_mem_dqinfo *info, char *disk);
+int qtree_scan_dquots(struct quota_handle *h, int (*process_dquot) (struct dquot *, char *));
+
+int qtree_dqstr_in_blk(struct qtree_mem_dqinfo *info);
+
+#endif
diff --git a/quotacheck.8 b/quotacheck.8
new file mode 100644 (file)
index 0000000..ed23e73
--- /dev/null
@@ -0,0 +1,197 @@
+.TH quotacheck 8 "Fri Jul 20 2001"
+.SH NAME
+quotacheck \- scan a filesystem for disk usage, create, check and repair quota files
+.SH SYNOPSIS
+.B quotacheck
+[
+.B \-gubcfinvdMmR
+] [
+.B \-F
+.I quota-format
+]
+.B \-a
+|
+.I filesystem
+.br
+.SH DESCRIPTION
+.B quotacheck
+examines each filesystem, builds a table of current disk usage, and
+compares this table against that recorded in the disk quota file for the
+filesystem (this step is ommitted if option
+.B -c
+is specified). If any inconsistencies are detected, both the quota file
+and the current system copy of the incorrect quotas are updated (the
+latter only occurs if an active filesystem is checked which is not advised).
+By default, only user quotas are checked.
+.B quotacheck
+expects each filesystem to be checked to have quota files named
+.I [a]quota.user
+and
+.I [a]quota.group
+located at the root of the associated filesystem.  If a file is not
+present, 
+.B quotacheck
+will create it.
+.PP
+If the quota file is corrupted,
+.B quotacheck
+tries to save as much data as possible.  Rescuing data may need user
+intervention. With no additional options
+.B quotacheck
+will simply exit in such a situation. When in interactive mode (option
+.BR -i )
+, the user is asked for advice. Advice can also be provided from command
+line (see option
+.BR -n )
+, which is useful when
+.B quotacheck
+is run automatically (ie. from script) and failure is unacceptable.
+.PP
+.B quotacheck
+should be run each time the system boots and mounts non-valid filesystems.
+This is most likely to happen after a system crash.
+.PP
+It is strongly recommended to run
+.B quotacheck
+with quotas turned off for the filesystem. Otherwise, possible damage
+or loss to data in the quota files can result.  It is also unwise to
+run
+.B quotacheck
+on a live filesystem as actual usage may change during the scan.  To
+prevent this,
+.B quotacheck
+tries to remount the filesystem read-only before starting the scan.  
+After the scan is done it remounts the filesystem read-write. You can
+disable this with option
+.BR \-m .
+You can also make
+.B quotacheck
+ignore the failure to remount the filesystem read-only with option
+.BR \-M .
+.SH OPTIONS
+.TP
+.B -b, --backup
+Forces
+.B quotacheck
+to make backups of the quota file before writing the new data.
+.TP
+.B -v, --verbose
+.B quotacheck
+reports its operation as it progresses.  Normally it operates silently.
+If the option is specified twice, also the current directory is printed (note
+that printing can slow down the scan measurably).
+.TP
+.B -d, --debug
+Enable debugging mode.  It will result in a lot of information which can
+be used in debugging the program. The output is very verbose and the
+scan will be slow.
+.TP
+.B -u, --user
+Only user quotas listed in
+.I /etc/mtab
+or on the filesystems specified are to be checked.  This is the default action.
+.TP
+.B -g, --group
+Only group quotas listed in
+.I /etc/mtab
+or on the filesystems specified are to be checked.
+.TP
+.B -c, --create-files
+Don't read existing quota files. Just perform a new scan and save it to disk.
+.B quotacheck
+also skips scanning of old quota files when they are not found.
+.TP
+.B -f, --force
+Forces checking and writing of new quota files on filesystems with quotas
+enabled. This is not recommended as the created quota files may be out of sync.
+.TP
+.B -M, --try-remount
+This flag forces checking of filesystem in read-write mode if a remount
+fails. Do this only when you are sure no process will write to a
+filesystem while scanning.
+.TP
+.B -m, --no-remount
+Don't try to remount filesystem read-only. See comment with option
+.BR \-M .
+.TP
+.B -i, --interactive
+Interactive mode. By default
+.B quotacheck
+exits when it finds an error. In interactive mode user is asked for
+input instead.  See option
+.BR \-n .
+.TP
+.B -n, --use-first-dquot
+If the quota files become corrupted, it is possible for duplicate
+entries for a single user or group ID to exist.  Normally in this case,
+.B quotacheck
+exits or asks user for input. When this option is set, the first entry found
+is always used (this option works in interactive mode too).
+.TP
+.B -F, --format=\f2format-name\f1
+Check and fix quota files of specified format (ie. don't perform format
+auto-detection). This is recommended as detection might not work well on
+corrupted quota files.  Possible format names are:
+.B vfsold
+Original quota format with 16-bit UIDs / GIDs,
+.B vfsv0
+Quota format with 32-bit UIDs / GIDs, 64-bit space usage, 32-bit inode usage and limits,
+.B vfsv1
+Quota format with 64-bit quota limits and usage,
+.B rpc
+(quota over NFS),
+.B xfs
+(quota on XFS filesystem)
+.TP
+.B -a, --all
+Check all mounted non-NFS filesystems in
+.B /etc/mtab
+.TP
+.B -R, --exclude-root
+When used together with the
+.B \-a
+option, all filesystems except for the root filesystem are checked for
+quotas.
+
+.SH NOTE
+.B quotacheck
+should only be run by super-user. Non-privileged users are presumably
+not allowed to read all the directories on the given filesystem.
+
+.SH "SEE ALSO"
+.BR quota (1),
+.BR quotactl (2),
+.BR fstab (5),
+.BR quotaon (8),
+.BR repquota (8),
+.BR convertquota (8),
+.BR setquota (8),
+.BR edquota (8),
+.BR fsck (8),
+.BR efsck (8),
+.BR e2fsck (8),
+.BR xfsck (8)
+
+.SH FILES
+.PD 0
+.TP 15
+.B aquota.user or aquota.group
+located at filesystem root with quotas (version 2 quota, non-XFS
+filesystems)
+.TP 15
+.B quota.user or quota.group
+located at filesystem root with quotas (version 1 quota, non-XFS
+filesystems)
+.TP
+.B /etc/mtab
+names and locations of mounted filesystems
+.SH AUTHOR
+Jan Kara \<jack@suse.cz\>
+.br
+Based on old
+.B quotacheck
+by:
+.br
+Edvard Tuinder \<ed@elm.net\>
+.br
+Marco van Wieringen \<mvw@planets.elm.net\>
diff --git a/quotacheck.c b/quotacheck.c
new file mode 100644 (file)
index 0000000..41901f1
--- /dev/null
@@ -0,0 +1,1130 @@
+/*
+ *
+ *     Utility to check disk quotas
+ *
+ *     Some parts of this utility are copied from old quotacheck by
+ *     Marco van Wieringen <mvw@planets.elm.net> and Edvard Tuinder <ed@elm.net>
+ * 
+ *     New quota format implementation - Jan Kara <jack@suse.cz> - Sponsored by SuSE CR
+ */
+
+#include "config.h"
+
+#include <dirent.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdarg.h>
+#include <getopt.h>
+#include <limits.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <errno.h>
+
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <sys/file.h>
+#include <sys/statfs.h>
+#include <sys/ioctl.h>
+#include <sys/mount.h>
+#include <sys/utsname.h>
+
+#if defined(HAVE_EXT2_INCLUDE)
+#include <linux/types.h>
+#include <ext2fs/ext2fs.h>
+#endif
+
+#include "pot.h"
+#include "common.h"
+#include "quotaio.h"
+#include "quotasys.h"
+#include "mntopt.h"
+#include "bylabel.h"
+#include "quotacheck.h"
+#include "quotaops.h"
+
+#ifndef HAVE_EXT2_INO_T
+typedef ino_t ext2_ino_t;
+#endif
+
+#define LINKSHASHSIZE 16384    /* Size of hashtable for hardlinked inodes */
+#define DQUOTHASHSIZE 32768    /* Size of hashtable for dquots from file */
+
+struct dlinks {
+       ino_t i_num;
+       struct dlinks *next;
+};
+
+struct dirs {
+       char *dir_name;
+       struct dirs *next;
+};
+
+#define BITS_SIZE 4            /* sizeof(bits) == 5 */
+#define BLIT_RATIO 10          /* Blit in just 1/10 of blit() calls */
+
+dev_t cur_dev;                 /* Device we are working on */
+int files_done, dirs_done;
+int flags, fmt = -1, cfmt;     /* Options from command line; Quota format to use spec. by user; Actual format to check */
+int uwant, gwant, ucheck, gcheck;      /* Does user want to check user/group quota; Do we check user/group quota? */
+char *mntpoint;                        /* Mountpoint to check */
+char *progname;
+struct util_dqinfo old_info[MAXQUOTAS];        /* Loaded infos */
+
+char extensions[MAXQUOTAS + 2][20] = INITQFNAMES;      /* Extensions depending on quota type */
+char *basenames[] = INITQFBASENAMES;   /* Names of quota files */
+
+#ifdef DEBUG_MALLOC
+size_t malloc_mem = 0;
+size_t free_mem = 0;
+#endif
+
+struct dquot *dquot_hash[MAXQUOTAS][DQUOTHASHSIZE];
+struct dlinks *links_hash[MAXQUOTAS][DQUOTHASHSIZE];
+
+/*
+ * Ok check each memory allocation.
+ */
+void *xmalloc(size_t size)
+{
+       void *ptr;
+
+#ifdef DEBUG_MALLOC
+       malloc_mem += size;
+#endif
+       ptr = malloc(size);
+       if (!ptr)
+               die(3, _("Not enough memory.\n"));
+       memset(ptr, 0, size);
+       return (ptr);
+}
+
+void debug(int df, char *fmtstr, ...)
+{
+       va_list args;
+
+       if (!(flags & df))
+               return;
+
+       fprintf(stderr, "%s: ", progname);
+       va_start(args, fmtstr);
+       vfprintf(stderr, fmtstr, args);
+       va_end(args);
+}
+
+/* Compute hashvalue for given inode number */
+static inline uint hash_ino(uint i_num)
+{
+       return ((i_num ^ (i_num << 16)) * 997) & (LINKSHASHSIZE - 1);
+}
+
+/*
+ * Store a hardlinked inode as we don't want to count it more then once.
+ */
+static int store_dlinks(int type, ino_t i_num)
+{
+       struct dlinks *lptr;
+       uint hash = hash_ino(i_num);
+
+       debug(FL_DEBUG, _("Adding hardlink for ino %llu\n"), (unsigned long long)i_num);
+
+       for (lptr = links_hash[type][hash]; lptr; lptr = lptr->next)
+               if (lptr->i_num == i_num)
+                       return 1;
+
+       lptr = (struct dlinks *)xmalloc(sizeof(struct dlinks));
+
+       lptr->i_num = i_num;
+       lptr->next = links_hash[type][hash];
+       links_hash[type][hash] = lptr;
+       return 0;
+}
+
+/* Hash given id */
+static inline uint hash_dquot(uint id)
+{
+       return ((id ^ (id << 16)) * 997) & (DQUOTHASHSIZE - 1);
+}
+
+/*
+ * Do a lookup of a type of quota for a specific id. Use short cut with
+ * most recently used dquot struct pointer.
+ */
+struct dquot *lookup_dquot(qid_t id, int type)
+{
+       struct dquot *lptr;
+       uint hash = hash_dquot(id);
+
+       for (lptr = dquot_hash[type][hash]; lptr != NODQUOT; lptr = lptr->dq_next)
+               if (lptr->dq_id == id)
+                       return lptr;
+       return NODQUOT;
+}
+
+/*
+ * Add a new dquot for a new id to the list.
+ */
+struct dquot *add_dquot(qid_t id, int type)
+{
+       struct dquot *lptr;
+       uint hash = hash_dquot(id);
+
+       debug(FL_DEBUG, _("Adding dquot structure type %s for %d\n"), type2name(type), (int)id);
+
+       lptr = (struct dquot *)xmalloc(sizeof(struct dquot));
+
+       lptr->dq_id = id;
+       lptr->dq_next = dquot_hash[type][hash];
+       dquot_hash[type][hash] = lptr;
+       lptr->dq_dqb.dqb_btime = lptr->dq_dqb.dqb_itime = (time_t) 0;
+
+       return lptr;
+}
+
+/*
+ * Add a number of blocks and inodes to a quota.
+ */
+static void add_to_quota(int type, ino_t i_num, uid_t i_uid, gid_t i_gid, mode_t i_mode,
+                        nlink_t i_nlink, loff_t i_space, int need_remember)
+{
+       qid_t wanted;
+       struct dquot *lptr;
+
+       if (type == USRQUOTA)
+               wanted = i_uid;
+       else
+               wanted = i_gid;
+
+       if ((lptr = lookup_dquot(wanted, type)) == NODQUOT)
+               lptr = add_dquot(wanted, type);
+
+       if (i_nlink != 1 && need_remember)
+               if (store_dlinks(type, i_num))  /* Did we already count this inode? */
+                       return;
+       lptr->dq_dqb.dqb_curinodes++;
+       lptr->dq_dqb.dqb_curspace += i_space;;
+}
+
+/*
+ * Clean up all list from a previous run.
+ */
+static void remove_list(void)
+{
+       int cnt;
+       uint i;
+       struct dquot *dquot, *dquot_free;
+       struct dlinks *dlink, *dlink_free;
+
+       for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
+               for (i = 0; i < DQUOTHASHSIZE; i++) {
+                       dquot = dquot_hash[cnt][i];
+                       while (dquot != NODQUOT) {
+                               dquot_free = dquot;
+                               dquot = dquot->dq_next;
+#ifdef DEBUG_MALLOC
+                               free_mem += sizeof(struct dquot);
+#endif
+                               free(dquot_free);
+                       }
+                       dquot_hash[cnt][i] = NODQUOT;
+               }
+               for (i = 0; i < LINKSHASHSIZE; i++) {
+                       dlink = links_hash[cnt][i];
+                       while (dlink) {
+                               dlink_free = dlink;
+                               dlink = dlink->next;
+#ifdef DEBUG_MALLOC
+                               free_mem += sizeof(struct dlinks);
+#endif
+                               free(dlink_free);
+                       }
+                       links_hash[cnt][i] = NULL;
+               }
+       }
+}
+
+/* Get size used by file */
+static loff_t getqsize(char *fname, struct stat *st)
+{
+       static char ioctl_fail_warn;
+       int fd;
+       loff_t size;
+
+       if (S_ISLNK(st->st_mode))       /* There's no way to do ioctl() on links... */
+               return st->st_blocks << 9;
+       if (!S_ISDIR(st->st_mode) && !S_ISREG(st->st_mode))
+               return st->st_blocks << 9;
+       if ((fd = open(fname, O_RDONLY)) == -1)
+               die(2, _("Cannot open file %s: %s\n"), fname, strerror(errno));
+       if (ioctl(fd, FIOQSIZE, &size) == -1) {
+               size = st->st_blocks << 9;
+               if (!ioctl_fail_warn) {
+                       ioctl_fail_warn = 1;
+                       fputs(_("Cannot get exact used space... Results might be inaccurate.\n"), stderr);
+               }
+       }
+       close(fd);
+       return size;
+}
+
+/*
+ * Show a blitting cursor as means of visual progress indicator.
+ */
+static inline void blit(char *msg)
+{
+       static int bitc = 0;
+       static const char bits[] = "|/-\\";
+       static int slow_down;
+
+       if (flags & FL_VERYVERBOSE && msg) {
+               int len = strlen(msg);
+               
+               putchar('\r');
+               printf("%.70s", msg);
+               if (len > 70)
+                       fputs("...", stdout);
+               else
+                       printf("%*s",73-len, "");
+       }
+       if (flags & FL_VERYVERBOSE || ++slow_down >= BLIT_RATIO) {
+               putchar(bits[bitc]);
+               putchar('\b');
+               fflush(stdout);
+               bitc++;
+               bitc %= BITS_SIZE;
+               slow_down = 0;
+       }
+}
+
+static void usage(void)
+{
+       printf(_("Utility for checking and repairing quota files.\n%s [-gucbfinvdmMR] [-F <quota-format>] filesystem|-a\n\n\
+-u, --user                check user files\n\
+-g, --group               check group files\n\
+-c, --create-files        create new quota files\n\
+-b, --backup              create backups of old quota files\n\
+-f, --force               force check even if quotas are enabled\n\
+-i, --interactive         interactive mode\n\
+-n, --use-first-dquot     use the first copy of duplicated structure\n\
+-v, --verbose             print more information\n\
+-d, --debug               print even more messages\n\
+-m, --no-remount          do not remount filesystem read-only\n\
+-M, --try-remount         try remounting filesystem read-only,\n\
+                          continue even if it fails\n\
+-R, --exclude-root        exclude root when checking all filesystems\n\
+-F, --format=formatname   check quota files of specific format\n\
+-a, --all                 check all filesystems\n\
+-h, --help                display this message and exit\n\
+-V, --version             display version information and exit\n\n"), progname);
+       printf(_("Bugs to %s\n"), MY_EMAIL);
+       exit(1);
+}
+
+static void parse_options(int argcnt, char **argstr)
+{
+       int ret;
+       struct option long_opts[] = {
+               { "version", 0, NULL, 'V' },
+               { "help", 0, NULL, 'h' },
+               { "backup", 0, NULL, 'b' },
+               { "create-files", 0, NULL, 'c' },
+               { "verbose", 0, NULL, 'v' },
+               { "debug", 0, NULL, 'd' },
+               { "user", 0, NULL, 'u' },
+               { "group", 0, NULL, 'g' },
+               { "interactive", 0, NULL, 'i' },
+               { "use-first-dquot", 0, NULL, 'n' },
+               { "force", 0, NULL, 'f' },
+               { "format", 1, NULL, 'F' },
+               { "no-remount", 0, NULL, 'm' },
+               { "try-remount", 0, NULL, 'M' },
+               { "exclude-root", 0, NULL, 'R' },
+               { "all", 0, NULL, 'a' },
+               { NULL, 0, NULL, 0 }
+       };
+
+       while ((ret = getopt_long(argcnt, argstr, "VhbcvugidnfF:mMRa", long_opts, NULL)) != -1) {
+               switch (ret) {
+                 case 'b':
+                         flags |= FL_BACKUPS;
+                         break;
+                 case 'g':
+                         gwant = 1;
+                         break;
+                 case 'u':
+                         uwant = 1;
+                         break;
+                 case 'd':
+                         flags |= FL_DEBUG;
+                         setlinebuf(stderr);
+                         break;
+                 case 'v':
+                         if (flags & FL_VERBOSE)
+                               flags |= FL_VERYVERBOSE;
+                         else
+                               flags |= FL_VERBOSE;
+                         break;
+                 case 'f':
+                         flags |= FL_FORCE;
+                         break;
+                 case 'i':
+                         flags |= FL_INTERACTIVE;
+                         break;
+                 case 'n':
+                         flags |= FL_GUESSDQ;
+                         break;
+                 case 'c':
+                         flags |= FL_NEWFILE;
+                         break;
+                 case 'V':
+                         version();
+                         exit(0);
+                 case 'M':
+                         flags |= FL_FORCEREMOUNT;
+                         break;
+                 case 'm':
+                         flags |= FL_NOREMOUNT;
+                         break;
+                 case 'a':
+                         flags |= FL_ALL;
+                         break;
+                 case 'R':
+                         flags |= FL_NOROOT;
+                         break;
+                 case 'F':
+                         if ((fmt = name2fmt(optarg)) == QF_ERROR)
+                                 exit(1);
+                         break;
+                 default:
+                       usage();
+               }
+       }
+       if (!(uwant | gwant))
+               uwant = 1;
+       if ((argcnt == optind && !(flags & FL_ALL)) || (argcnt > optind && flags & FL_ALL)) {
+               fputs(_("Bad number of arguments.\n"), stderr);
+               usage();
+       }
+       if (fmt == QF_XFS) {
+               fputs(_("XFS quota format needs no checking.\n"), stderr);
+               exit(0);
+       }
+       if (flags & FL_VERBOSE && flags & FL_DEBUG)
+               flags &= ~FL_VERBOSE;
+       if (!(flags & FL_ALL))
+               mntpoint = argstr[optind];
+       else
+               mntpoint = NULL;
+}
+
+#if defined(EXT2_DIRECT)
+static int ext2_direct_scan(char *device)
+{
+       ext2_ino_t i_num;
+       ext2_filsys fs;
+       errcode_t error;
+       ext2_inode_scan scan;
+       struct ext2_inode inode;
+       int inode_buffer_blocks = 0;
+       ext2fs_inode_bitmap inode_used_map;
+       ext2fs_inode_bitmap inode_dir_map;
+       uid_t uid;
+       gid_t gid;
+
+       if ((error = ext2fs_open(device, 0, 0, 0, unix_io_manager, &fs))) {
+               errstr(_("error (%d) while opening %s\n"), (int)error, device);
+               return -1;
+       }
+
+       if ((error = ext2fs_allocate_inode_bitmap(fs, "in-use inode map", &inode_used_map))) {
+               errstr(_("error (%d) while allocating inode file bitmap\n"), (int)error);
+               return -1;
+       }
+
+       if ((error = ext2fs_allocate_inode_bitmap(fs, "directory inode map", &inode_dir_map))) {
+               errstr(_("errstr (%d) while allocating inode directory bitmap\n"), (int)error);
+               return -1;
+       }
+
+       if ((error = ext2fs_open_inode_scan(fs, inode_buffer_blocks, &scan))) {
+               errstr(_("error (%d) while opening inode scan\n"), (int)error);
+               return -1;
+       }
+
+       if ((error = ext2fs_get_next_inode(scan, &i_num, &inode))) {
+               errstr(_("error (%d) while starting inode scan\n"), (int)error);
+               return -1;
+       }
+
+       while ((long)i_num) {
+               if (inode.i_links_count) {
+                       debug(FL_DEBUG, _("Found i_num %ld, blocks %ld\n"), (long)i_num, (long)inode.i_blocks);
+                       if (flags & FL_VERBOSE)
+                               blit(NULL);
+                       uid = inode.i_uid | (inode.i_uid_high << 16);
+                       gid = inode.i_gid | (inode.i_gid_high << 16);
+                       if (inode.i_uid_high | inode.i_gid_high)
+                               debug(FL_DEBUG, _("High uid detected.\n"));
+                       if (ucheck)
+                               add_to_quota(USRQUOTA, i_num, uid, gid,
+                                            inode.i_mode, inode.i_links_count,
+                                            ((loff_t)inode.i_blocks) << 9, 0);
+                       if (gcheck)
+                               add_to_quota(GRPQUOTA, i_num, uid, gid,
+                                            inode.i_mode, inode.i_links_count,
+                                            ((loff_t)inode.i_blocks) << 9, 0);
+                       if (S_ISDIR(inode.i_mode))
+                               dirs_done++;
+                       else
+                               files_done++;
+               }
+
+               if ((error = ext2fs_get_next_inode(scan, &i_num, &inode))) {
+                       errstr(_("Something weird happened while scanning. Error %d\n"), (int)error);
+                       return -1;
+               }
+       }
+       return 0;
+}
+#endif
+
+/*
+ * Scan a directory with the readdir systemcall. Stat the files and add the sizes
+ * of the files to the appropriate quotas. When we find a dir we recursivly call
+ * ourself to scan that dir.
+ */
+static int scan_dir(char *pathname)
+{
+       struct dirs *dir_stack = NULL;
+       struct dirs *new_dir;
+       struct dirent *de;
+       struct stat st;
+       loff_t qspace;
+       DIR *dp;
+       int ret;
+
+       if (lstat(pathname, &st) == -1) {
+               errstr(_("Cannot stat directory %s: %s\n"), pathname, strerror(errno));
+               goto out;
+       }
+       qspace = getqsize(pathname, &st);
+       if (ucheck)
+               add_to_quota(USRQUOTA, st.st_ino, st.st_uid, st.st_gid, st.st_mode,
+                            st.st_nlink, qspace, 0);
+       if (gcheck)
+               add_to_quota(GRPQUOTA, st.st_ino, st.st_uid, st.st_gid, st.st_mode,
+                            st.st_nlink, qspace, 0);
+
+       if ((dp = opendir(pathname)) == (DIR *) NULL)
+               die(2, _("\nCan open directory %s: %s\n"), pathname, strerror(errno));
+
+       chdir(pathname);
+       if (flags & FL_VERYVERBOSE)
+               blit(pathname);
+       while ((de = readdir(dp)) != (struct dirent *)NULL) {
+               if (!strcmp(de->d_name, ".") || !strcmp(de->d_name, ".."))
+                       continue;
+               if (flags & FL_VERBOSE)
+                       blit(NULL);
+
+               if ((lstat(de->d_name, &st)) == -1) {
+                       errstr(_("lstat Cannot stat `%s/%s': %s\nGuess you'd better run fsck first !\nexiting...\n"),
+                               pathname, de->d_name, strerror(errno));
+                       goto out;
+               }
+
+               if (S_ISDIR(st.st_mode)) {
+                       if (st.st_dev != cur_dev)
+                               continue;
+                       /*
+                        * Add this to the directory stack and check this later on.
+                        */
+                       debug(FL_DEBUG, _("pushd %s/%s\n"), pathname, de->d_name);
+                       new_dir = xmalloc(sizeof(struct dirs));
+
+                       new_dir->dir_name = xmalloc(strlen(pathname) + strlen(de->d_name) + 2);
+                       sprintf(new_dir->dir_name, "%s/%s", pathname, de->d_name);
+                       new_dir->next = dir_stack;
+                       dir_stack = new_dir;
+               }
+               else {
+                       qspace = getqsize(de->d_name, &st);
+                       if (ucheck)
+                               add_to_quota(USRQUOTA, st.st_ino, st.st_uid, st.st_gid, st.st_mode,
+                                            st.st_nlink, qspace, 1);
+                       if (gcheck)
+                               add_to_quota(GRPQUOTA, st.st_ino, st.st_uid, st.st_gid, st.st_mode,
+                                            st.st_nlink, qspace, 1);
+                       debug(FL_DEBUG, _("\tAdding %s size %lld ino %d links %d uid %u gid %u\n"), de->d_name,
+                             (long long)st.st_size, (int)st.st_ino, (int)st.st_nlink, (int)st.st_uid, (int)st.st_gid);
+                       files_done++;
+               }
+       }
+       closedir(dp);
+
+       /*
+        * Traverse the directory stack, and check it.
+        */
+       debug(FL_DEBUG, _("Scanning stored directories from directory stack\n"));
+       while (dir_stack != (struct dirs *)NULL) {
+               new_dir = dir_stack;
+               dir_stack = dir_stack->next;
+               debug(FL_DEBUG, _("popd %s\nEntering directory %s\n"), new_dir->dir_name,
+                     new_dir->dir_name);
+               ret = scan_dir(new_dir->dir_name);
+               dirs_done++;
+#ifdef DEBUG_MALLOC
+               free_mem += sizeof(struct dirs) + strlen(new_dir->dir_name) + 1;
+#endif
+               free(new_dir->dir_name);
+               free(new_dir);
+               if (ret < 0)    /* Error while scanning? */
+                       goto out;
+       }
+       debug(FL_DEBUG, _("Leaving %s\n"), pathname);
+       return 0;
+      out:
+       for (new_dir = dir_stack; new_dir; new_dir = dir_stack) {
+               dir_stack = dir_stack->next;
+#ifdef DEBUG_MALLOC
+               free_mem += sizeof(struct dirs) + strlen(new_dir->dir_name) + 1;
+#endif
+               free(new_dir->dir_name);
+               free(new_dir);
+       }
+       return -1;
+}
+
+/* Ask user y/n question */
+int ask_yn(char *q, int def)
+{
+       char a[10];             /* Users answer */
+
+       printf("%s [%c]: ", q, def ? 'y' : 'n');
+       fflush(stdout);
+       while (1) {
+               fgets(a, sizeof(a)-1, stdin);
+               if (a[0] == '\n')
+                       return def;
+               if (!strcasecmp(a, "y\n"))
+                       return 1;
+               if (!strcasecmp(a, "n\n"))
+                       return 0;
+               printf("Illegal answer. Please answer y/n: ");
+               fflush(stdout);
+       }
+}
+
+/* Do checks and buffer quota file into memory */
+static int process_file(struct mntent *mnt, int type)
+{
+       char *qfname = NULL;
+       int fd = -1, ret;
+
+       debug(FL_DEBUG, _("Going to check %s quota file of %s\n"), type2name(type),
+             mnt->mnt_dir);
+
+       if (kern_quota_on(mnt->mnt_fsname, type, cfmt) >= 0) {  /* Is quota enabled? */
+               if (!(flags & FL_FORCE)) {
+                       if (flags & FL_INTERACTIVE) {
+                               printf(_("Quota for %ss is enabled on mountpoint %s so quotacheck might damage the file.\n"), type2name(type), mnt->mnt_dir);
+                               if (!ask_yn(_("Should I continue"), 0)) {
+                                       printf(_("As you wish... Canceling check of this file.\n"));
+                                       return -1;
+                               }
+                       }
+                       else
+                               die(6, _("Quota for %ss is enabled on mountpoint %s so quotacheck might damage the file.\n\
+Please turn quotas off or use -f to force checking.\n"),
+                                   type2name(type), mnt->mnt_dir);
+               }
+               /* At least sync quotas so damage will be smaller */
+               if (quotactl(QCMD((kernel_iface == IFACE_GENERIC)? Q_SYNC : Q_6_5_SYNC, type),
+                            mnt->mnt_fsname, 0, NULL) < 0)
+                       die(4, _("Error while syncing quotas on %s: %s\n"), mnt->mnt_fsname, strerror(errno));
+       }
+
+       if (!(flags & FL_NEWFILE)) {    /* Need to buffer file? */
+               if (get_qf_name(mnt, type, cfmt, 0, &qfname) < 0) {
+                       errstr(_("Cannot get quotafile name for %s\n"), mnt->mnt_fsname);
+                       return -1;
+               }
+               if ((fd = open(qfname, O_RDONLY)) < 0) {
+                       if (errno != ENOENT) {
+                               errstr(_("Cannot open quotafile %s: %s\n"),
+                                       qfname, strerror(errno));
+                               free(qfname);
+                               return -1;
+                       }
+                       /* When file was not found, just skip it */
+                       flags |= FL_NEWFILE;
+                       free(qfname);
+                       qfname = NULL;
+               }
+       }
+
+       ret = 0;
+       memset(old_info + type, 0, sizeof(old_info[type]));
+       if (is_tree_qfmt(cfmt))
+               ret = v2_buffer_file(qfname, fd, type, cfmt);
+       else
+               ret = v1_buffer_file(qfname, fd, type);
+
+       if (!(flags & FL_NEWFILE)) {
+               free(qfname);
+               close(fd);
+       }
+       return ret;
+}
+
+/* Backup old quotafile and rename new one to right name */
+static int rename_files(struct mntent *mnt, int type)
+{
+       char *filename, newfilename[PATH_MAX];
+       struct stat st;
+       mode_t mode = S_IRUSR | S_IWUSR;
+#ifdef HAVE_EXT2_INCLUDE
+       long ext2_flags = -1;
+       int fd;
+#endif
+
+       debug(FL_DEBUG, _("Renaming new files to proper names.\n"));
+       if (get_qf_name(mnt, type, cfmt, 0, &filename) < 0)
+               die(2, _("Cannot get name of old quotafile on %s.\n"), mnt->mnt_dir);
+       if (stat(filename, &st) < 0) {  /* File doesn't exist? */
+               if (errno == ENOENT) {
+                       debug(FL_DEBUG | FL_VERBOSE, _("Old file not found.\n"));
+                       goto rename_new;
+               }
+               errstr(_("Error while searching for old quota file %s: %s\n"),
+                       filename, strerror(errno));
+               free(filename);
+               return -1;
+       }
+       mode = st.st_mode & (S_IRWXU | S_IRWXG | S_IRWXO);
+#ifdef HAVE_EXT2_INCLUDE
+       if ((fd = open(filename, O_RDONLY)) < 0) {
+               if (errno == ENOENT) {
+                       debug(FL_DEBUG | FL_VERBOSE, _("Old file found removed during check!\n"));
+                       goto rename_new;
+               }
+               errstr(_("Error while opening old quota file %s: %s\n"),
+                       filename, strerror(errno));
+               free(filename);
+               return -1;
+       }
+       if (ioctl(fd, EXT2_IOC_GETFLAGS, &ext2_flags) < 0)
+               debug(FL_DEBUG, _("EXT2_IOC_GETFLAGS failed: %s\n"), strerror(errno));
+       else if (ext2_flags & EXT2_IMMUTABLE_FL) {
+               /* IMMUTABLE flag set probably because system crashed and quota
+                * was not properly turned off */
+               debug(FL_DEBUG | FL_VERBOSE, _("Quota file %s has IMMUTABLE flag set. Clearing.\n"), filename);
+               ext2_flags &= ~EXT2_IMMUTABLE_FL;
+               if (ioctl(fd, EXT2_IOC_SETFLAGS, &ext2_flags) < 0) {
+                       errstr(_("Failed to remove IMMUTABLE flag from quota file %s: %s\n"), filename, strerror(errno));
+                       free(filename);
+                       close(fd);
+                       return -1;
+               }
+       }
+       close(fd);
+#endif
+       if (flags & FL_BACKUPS) {
+               debug(FL_DEBUG, _("Renaming old quotafile to %s~\n"), filename);
+               /* Backup old file */
+               strcpy(newfilename, filename);
+               /* Make backingup safe */
+               sstrncat(newfilename, "~", PATH_MAX);
+               if (newfilename[strlen(newfilename) - 1] != '~')
+                       die(8, _("Name of quota file too long. Contact %s.\n"), MY_EMAIL);
+               if (rename(filename, newfilename) < 0) {
+                       errstr(_("Cannot rename old quotafile %s to %s: %s\n"),
+                               filename, newfilename, strerror(errno));
+                       free(filename);
+                       return -1;
+               }
+       }
+       debug(FL_DEBUG, _("Renaming new quotafile\n"));
+rename_new:
+       /* Rename new file to right name */
+       strcpy(newfilename, filename);
+       sstrncat(newfilename, ".new", PATH_MAX);
+       if (rename(newfilename, filename) < 0) {
+               errstr(_("Cannot rename new quotafile %s to name %s: %s\n"),
+                       newfilename, filename, strerror(errno));
+               free(filename);
+               return -1;
+       }
+       if (chmod(filename, mode) < 0) {
+               errstr(_("Cannot change permission of %s: %s\n"), filename, strerror(errno));
+               free(filename);
+               return -1;
+       }
+#ifdef HAVE_EXT2_INCLUDE
+       if (ext2_flags != -1) {
+               if ((fd = open(filename, O_RDONLY)) < 0) {
+                       errstr(_("Cannot open new quota file %s: %s\n"), filename, strerror(errno));
+                       free(filename);
+                       return -1;
+               }
+               if (ioctl(fd, EXT2_IOC_SETFLAGS, &ext2_flags) < 0)
+                       errstr(_("Warning: Cannot set EXT2 flags on %s: %s\n"), filename, strerror(errno));
+               close(fd);
+       }
+#endif
+       free(filename);
+       return 0;
+}
+
+/*
+ * Dump the quota info that we have in memory now to the appropriate
+ * quota file. As quotafiles doesn't account to quotas we don't have to
+ * bother about accounting new blocks for quota file
+ */
+static int dump_to_file(struct mntent *mnt, int type)
+{
+       struct dquot *dquot;
+       uint i;
+       struct quota_handle *h;
+
+       debug(FL_DEBUG, _("Dumping gathered data for %ss.\n"), type2name(type));
+       if (!(h = new_io(mnt, type, cfmt))) {
+               errstr(_("Cannot initialize IO on new quotafile: %s\n"),
+                       strerror(errno));
+               return -1;
+       }
+       if (!(flags & FL_NEWFILE)) {
+               h->qh_info.dqi_bgrace = old_info[type].dqi_bgrace;
+               h->qh_info.dqi_igrace = old_info[type].dqi_igrace;
+               if (is_tree_qfmt(cfmt))
+                       v2_merge_info(&h->qh_info, old_info + type);
+               mark_quotafile_info_dirty(h);
+       }
+       for (i = 0; i < DQUOTHASHSIZE; i++)
+               for (dquot = dquot_hash[type][i]; dquot; dquot = dquot->dq_next) {
+                       dquot->dq_h = h;
+                       update_grace_times(dquot);
+                       h->qh_ops->commit_dquot(dquot, COMMIT_ALL);
+               }
+       if (end_io(h) < 0) {
+               errstr(_("Cannot finish IO on new quotafile: %s\n"), strerror(errno));
+               return -1;
+       }
+       debug(FL_DEBUG, _("Data dumped.\n"));
+       if (kern_quota_on(mnt->mnt_fsname, type, cfmt) >= 0) {  /* Quota turned on? */
+               char *filename;
+
+               if (get_qf_name(mnt, type, cfmt, NF_FORMAT, &filename) < 0)
+                       errstr(_("Cannot find checked quota file for %ss on %s!\n"), type2name(type), mnt->mnt_fsname);
+               else {
+                       if (quotactl(QCMD((kernel_iface == IFACE_GENERIC) ? Q_QUOTAOFF : Q_6_5_QUOTAOFF, type),
+                                    mnt->mnt_fsname, 0, NULL) < 0)
+                               errstr(_("Cannot turn %s quotas off on %s: %s\nKernel won't know about changes quotacheck did.\n"),
+                                       type2name(type), mnt->mnt_fsname, strerror(errno));
+                       else {
+                               int ret;
+
+                               /* Rename files - if it fails we cannot do anything better than just turn on quotas again */
+                               rename_files(mnt, type);
+
+                               if (kernel_iface == IFACE_GENERIC)
+                                       ret = quotactl(QCMD(Q_QUOTAON, type), mnt->mnt_fsname, util2kernfmt(cfmt), filename);
+                               else
+                                       ret = quotactl(QCMD(Q_6_5_QUOTAON, type), mnt->mnt_fsname, 0, filename);
+                               if (ret < 0)
+                                       errstr(_("Cannot turn %s quotas on on %s: %s\nKernel won't know about changes quotacheck did.\n"),
+                                               type2name(type), mnt->mnt_fsname, strerror(errno));
+                       }
+                       free(filename);
+               }
+       }
+       else
+               if (rename_files(mnt, type) < 0)
+                       return -1;
+       return 0;
+}
+
+/* Substract space used by old quota file from usage */
+static void sub_quota_file(struct mntent *mnt, int qtype, int ftype)
+{
+       char *filename;
+       struct stat st;
+       loff_t qspace;
+       struct dquot *d;
+       qid_t id;
+
+       debug(FL_DEBUG, _("Substracting space used by old %s quota file.\n"), type2name(ftype));
+       if (get_qf_name(mnt, ftype, cfmt, 0, &filename) < 0) {
+               debug(FL_VERBOSE, _("Old %s file not found. Usage will not be substracted.\n"), type2name(ftype));
+               return;
+       }
+
+       if (stat(filename, &st) < 0) {
+               debug(FL_VERBOSE, _("Cannot stat old %s quota file: %s\n"), type2name(ftype), strerror(errno));
+               free(filename);
+               return;
+       }
+       qspace = getqsize(filename, &st);
+       free(filename);
+       
+       if (qtype == USRQUOTA)
+               id = st.st_uid;
+       else
+               id = st.st_gid;
+       if ((d = lookup_dquot(id, qtype)) == NODQUOT) {
+               errstr(_("Quota structure for %s owning quota file not present! Something is really wrong...\n"), type2name(qtype));
+               return;
+       }
+       d->dq_dqb.dqb_curinodes--;
+       d->dq_dqb.dqb_curspace -= qspace;
+       debug(FL_DEBUG, _("Substracted %lu bytes.\n"), (unsigned long)qspace);
+}
+
+/* Buffer quotafile, run filesystem scan, dump quotafiles */
+static void check_dir(struct mntent *mnt)
+{
+       struct stat st;
+       int remounted = 0;
+
+       if (lstat(mnt->mnt_dir, &st) < 0)
+               die(2, _("Cannot stat mountpoint %s: %s\n"), mnt->mnt_dir, strerror(errno));
+       if (!S_ISDIR(st.st_mode))
+               die(2, _("Mountpoint %s is not a directory?!\n"), mnt->mnt_dir);
+       cur_dev = st.st_dev;
+       files_done = dirs_done = 0;
+       if (ucheck)
+               if (process_file(mnt, USRQUOTA) < 0)
+                       ucheck = 0;
+       if (gcheck)
+               if (process_file(mnt, GRPQUOTA) < 0)
+                       gcheck = 0;
+       if (!ucheck && !gcheck) /* Nothing to check? */
+               return;
+       if (!(flags & FL_NOREMOUNT)) {
+               /* Now we try to remount fs read-only to prevent races when scanning filesystem */
+               if (mount
+                   (NULL, mnt->mnt_dir, mnt->mnt_type, MS_MGC_VAL | MS_REMOUNT | MS_RDONLY,
+                    NULL) < 0 && !(flags & FL_FORCEREMOUNT)) {
+                       if (flags & FL_INTERACTIVE) {
+                               printf(_("Cannot remount filesystem mounted on %s read-only. Counted values might not be right.\n"), mnt->mnt_dir);
+                               if (!ask_yn(_("Should I continue"), 0)) {
+                                       printf(_("As you wish... Canceling check of this file.\n"));
+                                       goto out;
+                               }
+                       }
+                       else {
+                               errstr(_("Cannot remount filesystem mounted on %s read-only so counted values might not be right.\n\
+Please stop all programs writing to filesystem or use -m flag to force checking.\n"), mnt->mnt_dir);
+                               goto out;
+                       }
+               }
+               else
+                       remounted = 1;
+               debug(FL_DEBUG, _("Filesystem remounted read-only\n"));
+       }
+       debug(FL_VERBOSE, _("Scanning %s [%s] "), mnt->mnt_fsname, mnt->mnt_dir);
+#if defined(EXT2_DIRECT)
+       if (!strcmp(mnt->mnt_type, MNTTYPE_EXT2) || !strcmp(mnt->mnt_type, MNTTYPE_EXT3)) {
+               if (ext2_direct_scan(mnt->mnt_fsname) < 0)
+                       goto out;
+       }
+       else {
+#else
+       if (mnt->mnt_dir) {
+#endif
+               if (flags & FL_VERYVERBOSE)
+                       putchar('\n');
+               if (scan_dir(mnt->mnt_dir) < 0)
+                       goto out;
+       }
+       dirs_done++;
+       if (flags & FL_VERBOSE || flags & FL_VERYVERBOSE)
+               fputs(_("done\n"), stdout);
+       if (ucheck) {
+               sub_quota_file(mnt, USRQUOTA, USRQUOTA);
+               sub_quota_file(mnt, USRQUOTA, GRPQUOTA);
+       }
+       if (gcheck) {
+               sub_quota_file(mnt, GRPQUOTA, USRQUOTA);
+               sub_quota_file(mnt, GRPQUOTA, GRPQUOTA);
+       }
+       debug(FL_DEBUG | FL_VERBOSE, _("Checked %d directories and %d files\n"), dirs_done,
+             files_done);
+       if (remounted) {
+               if (mount(NULL, mnt->mnt_dir, mnt->mnt_type, MS_MGC_VAL | MS_REMOUNT, NULL) < 0)
+                       die(4, _("Cannot remount filesystem %s read-write. cannot write new quota files.\n"), mnt->mnt_dir);
+               debug(FL_DEBUG, _("Filesystem remounted RW.\n"));
+       }
+       if (ucheck)
+               dump_to_file(mnt, USRQUOTA);
+       if (gcheck)
+               dump_to_file(mnt, GRPQUOTA);
+out:
+       remove_list();
+}
+
+/* Detect quota format from filename of present files */
+static int detect_filename_format(struct mntent *mnt, int type)
+{
+       char *option;
+       struct stat statbuf;
+       char namebuf[PATH_MAX];
+       int journal = 0;
+       int fmt;
+
+       if (type == USRQUOTA) {
+               if ((option = hasmntopt(mnt, MNTOPT_USRQUOTA)))
+                       option += strlen(MNTOPT_USRQUOTA);
+               else if (hasmntopt(mnt, MNTOPT_USRJQUOTA)) {
+                       journal = 1;
+                       option += strlen(MNTOPT_USRJQUOTA);
+               }
+               else if ((option = hasmntopt(mnt, MNTOPT_QUOTA)))
+                       option += strlen(MNTOPT_QUOTA);
+       }
+       else {
+               if ((option = hasmntopt(mnt, MNTOPT_GRPQUOTA)))
+                       option += strlen(MNTOPT_GRPQUOTA);
+               else if (hasmntopt(mnt, MNTOPT_GRPJQUOTA)) {
+                       journal = 1;
+                       option += strlen(MNTOPT_GRPJQUOTA);
+               }
+       }
+       if (!option)
+               die(2, _("Cannot find quota option on filesystem %s with quotas!\n"), mnt->mnt_dir);
+       if (journal) {
+               char fmtbuf[64], *space;
+               
+               if (!(option = hasmntopt(mnt, MNTOPT_JQFMT))) {
+jquota_err:
+                       errstr(_("Cannot detect quota format for journalled quota on %s\n"), mnt->mnt_dir);
+                       return -1;
+               }
+               option += strlen(MNTOPT_JQFMT);
+               if (*option != '=')
+                       goto jquota_err;
+               space = strchr(option, ',');
+               if (!space)
+                       space = option + strlen(option);
+               if (space-option > sizeof(fmtbuf))
+                       goto jquota_err;
+               sstrncpy(fmtbuf, option+1, space-option);
+               fmt = name2fmt(fmtbuf);
+               if (fmt == QF_ERROR)
+                       goto jquota_err;
+               return fmt;
+       }
+       else if (*option == '=')        /* If the file name is specified we can't detect quota format from it... */
+               return -1;
+       snprintf(namebuf, PATH_MAX, "%s/%s.%s", mnt->mnt_dir, basenames[QF_VFSV0], extensions[type]);
+       if (!stat(namebuf, &statbuf)) {
+               int fd = open(namebuf, O_RDONLY);
+               if (fd < 0)
+                       return -1;
+               fmt = v2_detect_version(namebuf, fd, type);
+               close(fd);
+               return fmt;
+               
+       }
+       if (errno != ENOENT)
+               return -1;
+       snprintf(namebuf, PATH_MAX, "%s/%s.%s", mnt->mnt_dir, basenames[QF_VFSOLD], extensions[type]);
+       if (!stat(namebuf, &statbuf))
+               return QF_VFSOLD;
+       /* Old quota files don't exist, just create VFSv0 format if available */
+       if (kern_qfmt_supp(QF_VFSV0))
+               return QF_VFSV0;
+       if (kern_qfmt_supp(QF_VFSOLD))
+               return QF_VFSOLD;
+       return -1;
+}
+
+static void check_all(void)
+{
+       struct mntent *mnt;
+       int checked = 0;
+       static int warned;
+
+       if (init_mounts_scan((flags & FL_ALL) ? 0 : 1, &mntpoint, 0) < 0)
+               die(2, _("Cannot initialize mountpoint scan.\n"));
+       while ((mnt = get_next_mount())) {
+               if (flags & FL_ALL && flags & FL_NOROOT && !strcmp(mnt->mnt_dir, "/"))
+                       continue;
+               if (!strcmp(mnt->mnt_type, MNTTYPE_XFS) || nfs_fstype(mnt->mnt_type) ||
+                   meta_qf_fstype(mnt->mnt_type)) {
+                       debug(FL_DEBUG | FL_VERBOSE, _("Skipping %s [%s]\n"), mnt->mnt_fsname, mnt->mnt_dir);
+                       continue;
+               }
+               cfmt = fmt;
+               if (uwant && hasquota(mnt, USRQUOTA, 0))
+                       ucheck = 1;
+               else
+                       ucheck = 0;
+               if (gwant && hasquota(mnt, GRPQUOTA, 0))
+                       gcheck = 1;
+               else
+                       gcheck = 0;
+               if (!ucheck && !gcheck)
+                       continue;
+               if (cfmt == -1) {
+                       cfmt = detect_filename_format(mnt, ucheck ? USRQUOTA : GRPQUOTA);
+                       if (cfmt == -1) {
+                               errstr(_("Cannot guess format from filename on %s. Please specify format on commandline.\n"),
+                                       mnt->mnt_fsname);
+                               continue;
+                       }
+                       debug(FL_DEBUG, _("Detected quota format %s\n"), fmt2name(cfmt));
+               }
+
+               if (flags & FL_VERBOSE && !hasmntopt(mnt, MNTOPT_USRJQUOTA) &&
+                   !hasmntopt(mnt, MNTOPT_GRPJQUOTA) && !warned &&
+                   (!strcmp(mnt->mnt_type, MNTTYPE_EXT3) ||
+                    !strcmp(mnt->mnt_type, MNTTYPE_EXT4) ||
+                    !strcmp(mnt->mnt_type, MNTTYPE_EXT4DEV) ||
+                    !strcmp(mnt->mnt_type, MNTTYPE_REISER))) {
+                       struct utsname stats;
+
+                       /* Parse Linux kernel version and issue warning if not using
+                        * journaled quotas. */
+                       warned = 1;
+                       if (uname(&stats) < 0)
+                               errstr(_("Cannot get system info: %s\n"),
+                                       strerror(errno));
+                       else if (!strcmp(stats.sysname, "Linux")) {
+                               int v;
+                               char *errch;
+
+                               v = strtol(stats.release, &errch, 10);
+                               if (*errch == '.' && v >= 2) {
+                                       v = strtol(errch + 1, &errch, 10);
+                                       if (*errch == '.' && v >= 6) {
+                                               v = strtol(errch + 1, &errch, 10);
+                                               if (v >= 11)
+                                                       errstr(_("Your kernel probably supports journaled quota but you are not using it. Consider switching to journaled quota to avoid running quotacheck after an unclean shutdown.\n"));
+                                       }
+                               }
+                       }
+               }
+
+               checked++;
+               check_dir(mnt);
+       }
+       end_mounts_scan();
+       if (!checked && (!(flags & FL_ALL) || flags & (FL_VERBOSE | FL_DEBUG)))
+               errstr(_("Cannot find filesystem to check or filesystem not mounted with quota option.\n"));
+}
+
+int main(int argc, char **argv)
+{
+       gettexton();
+       progname = basename(argv[0]);
+
+       parse_options(argc, argv);
+       init_kernel_interface();
+
+       check_all();
+#ifdef DEBUG_MALLOC
+       errstr(_("Allocated %d bytes memory\nFree'd %d bytes\nLost %d bytes\n"),
+               malloc_mem, free_mem, malloc_mem - free_mem);
+#endif
+       return 0;
+}
diff --git a/quotacheck.h b/quotacheck.h
new file mode 100644 (file)
index 0000000..0abdaaa
--- /dev/null
@@ -0,0 +1,47 @@
+/*
+ *
+ *     Header file for quota checking utilities
+ *
+ */
+
+#ifndef GUARD_QUOTACHECK_H
+#define GUARD_QUOTACHECK_H
+
+#include <sys/types.h>
+
+#include "quota.h"
+#include "quotaio.h"
+
+#define NODQUOT ((struct dquot *)NULL)
+
+#define FL_FORCE 1             /* Force check even if quota enabled */
+#define FL_VERBOSE 2           /* Have verbose input */
+#define FL_DEBUG 4             /* Have very verbose input */
+#define FL_INTERACTIVE 8       /* Ask questions when needed */
+#define FL_GUESSDQ 16          /* When more structures for same user found, use the first */
+#define FL_NEWFILE 32          /* Don't try to read old file. Just create new one. */
+#define FL_FORCEREMOUNT 64     /* Force check even when remounting RO fails */
+#define FL_NOREMOUNT 128       /* Don't try to remount filesystem RO */
+#define FL_ALL 256             /* Scan all mountpoints with quota? */
+#define FL_NOROOT 512          /* Scan all mountpoints except root */
+#define FL_BACKUPS 1024                /* Create backup of old quota file? */
+#define FL_VERYVERBOSE 2048    /* Print directory names when checking */
+
+extern int flags;              /* Options from command line */
+extern struct util_dqinfo old_info[MAXQUOTAS]; /* Loaded info from file */
+
+#ifdef DEBUG_MALLOC
+extern size_t malloc_mem = 0;
+extern size_t free_mem = 0;
+#endif
+
+void *xmalloc(size_t size);
+void debug(int df, char *fmtstr, ...) __attribute__ ((__format__ (__printf__, 2, 3)));
+int ask_yn(char *q, int def);
+struct dquot *lookup_dquot(qid_t id, int type);
+struct dquot *add_dquot(qid_t id, int type);
+int v2_detect_version(char *filename, int fd, int type);
+int v2_buffer_file(char *filename, int fd, int type, int version);
+int v1_buffer_file(char *filename, int fd, int type);
+void v2_merge_info(struct util_dqinfo *new, struct util_dqinfo *old);
+#endif
diff --git a/quotacheck_v1.c b/quotacheck_v1.c
new file mode 100644 (file)
index 0000000..d0ed3d5
--- /dev/null
@@ -0,0 +1,92 @@
+/*
+ *
+ *     Checking routines for old VFS quota format
+ *
+ */
+
+#include "config.h"
+
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+#include <errno.h>
+
+#include "pot.h"
+#include "common.h"
+#include "quotaio.h"
+#include "quotaio_v1.h"
+#include "quotacheck.h"
+
+/* Load all other dquot structures */
+static void load_dquots(char *filename, int fd, int type)
+{
+       struct v1_disk_dqblk ddqblk;
+       struct util_dqblk *udq;
+       struct dquot *dquot;
+       int err;
+       qid_t id = 0;
+
+       lseek(fd, 0, SEEK_SET);
+       while ((err = read(fd, &ddqblk, sizeof(ddqblk)))) {
+               if (err < 0)
+                       die(1, _("Cannot read entry for id %u from quotafile %s: %s\n"), (uint) id,
+                           filename, strerror(errno));
+               if (err != sizeof(ddqblk)) {
+                       errstr(_("Entry for id %u is truncated.\n"),
+                               (uint) id);
+                       break;
+               }
+               if (ddqblk.dqb_bhardlimit == 0
+                       && ddqblk.dqb_bsoftlimit == 0
+                       && ddqblk.dqb_ihardlimit == 0
+                       && ddqblk.dqb_isoftlimit == 0) {
+                       id++;
+                       continue;
+               }
+               dquot = add_dquot(id, type);
+               udq = &dquot->dq_dqb;
+               udq->dqb_bhardlimit = ddqblk.dqb_bhardlimit;
+               udq->dqb_bsoftlimit = ddqblk.dqb_bsoftlimit;
+               udq->dqb_ihardlimit = ddqblk.dqb_ihardlimit;
+               udq->dqb_isoftlimit = ddqblk.dqb_isoftlimit;
+               udq->dqb_btime = ddqblk.dqb_btime;
+               udq->dqb_itime = ddqblk.dqb_itime;
+               id++;
+       }
+}
+
+/* Load first structure - get grace times */
+static int check_info(char *filename, int fd, int type)
+{
+       struct v1_disk_dqblk ddqblk;
+       int err;
+
+       debug(FL_DEBUG, _("Loading first quota entry with grace times.\n"));
+       lseek(fd, 0, SEEK_SET);
+       err = read(fd, &ddqblk, sizeof(ddqblk));
+       if (err < 0)
+               die(1, _("Cannot read first entry from quotafile %s: %s\n"), filename,
+                   strerror(errno));
+       if (err != sizeof(ddqblk)) {
+               errstr(
+                       _("WARNING - Quotafile %s was probably truncated. Cannot save quota settings...\n"),
+                       filename);
+               return -1;
+       }
+       old_info[type].dqi_bgrace = ddqblk.dqb_btime;
+       old_info[type].dqi_igrace = ddqblk.dqb_itime;
+       debug(FL_DEBUG, _("First entry loaded.\n"));
+       return 0;
+}
+
+int v1_buffer_file(char *filename, int fd, int type)
+{
+       old_info[type].dqi_bgrace = MAX_DQ_TIME;
+       old_info[type].dqi_igrace = MAX_IQ_TIME;
+       if (flags & FL_NEWFILE)
+               return 0;
+       if (check_info(filename, fd, type) < 0)
+               return 0;
+       load_dquots(filename, fd, type);
+       return 0;
+}
diff --git a/quotacheck_v2.c b/quotacheck_v2.c
new file mode 100644 (file)
index 0000000..77afde3
--- /dev/null
@@ -0,0 +1,425 @@
+/*
+ *
+ *     Checking routines for new VFS quota format
+ *
+ */
+
+#include "config.h"
+
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+#include <errno.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <asm/byteorder.h>
+
+#include "pot.h"
+#include "common.h"
+#include "quota.h"
+#include "quotaio.h"
+#include "quotaio_v2.h"
+#include "quotacheck.h"
+#include "quota_tree.h"
+
+#define getdqbuf() smalloc(QT_BLKSIZE)
+#define freedqbuf(buf) free(buf)
+
+#define SET_BLK(blk) (blkbmp[(blk) >> 3] |= 1 << ((blk) & 7))
+#define GET_BLK(blk) (blkbmp[(blk) >> 3] & (1 << ((blk) & 7)))
+
+typedef char *dqbuf_t;
+
+static const int magics[MAXQUOTAS] = INITQMAGICS;      /* Magics we should look for */
+static const int known_versions[MAXQUOTAS] = INIT_V2_VERSIONS; /* Versions we accept */
+static char *blkbmp;           /* Bitmap of checked blocks */
+static int detected_versions[MAXQUOTAS];
+
+static int check_blkref(uint blk, uint blocks)
+{
+       if (blk >= blocks)
+               return -1;
+       if (blk && blk < QT_TREEOFF)
+               return -1;
+       return 0;
+}
+
+/* Load and check basic info about quotas */
+static int check_info(char *filename, int fd, int type)
+{
+       struct v2_disk_dqinfo dinfo;
+       uint blocks, dflags, freeblk, freeent;
+       off_t filesize;
+       int err;
+
+       debug(FL_DEBUG, _("Checking quotafile info...\n"));
+       lseek(fd, V2_DQINFOOFF, SEEK_SET);
+       err = read(fd, &dinfo, sizeof(struct v2_disk_dqinfo));
+
+       if (err < 0) {
+               errstr(_("Cannot read info from quota file %s: %s\n"),
+                       filename, strerror(errno));
+               return -1;
+       }
+       if (err != sizeof(struct v2_disk_dqinfo)) {
+               errstr(_("WARNING - Quota file %s was probably truncated. Cannot save quota settings...\n"),
+                       filename);
+               return -1;
+       }
+
+       blocks = __le32_to_cpu(dinfo.dqi_blocks);
+       freeblk = __le32_to_cpu(dinfo.dqi_free_blk);
+       freeent = __le32_to_cpu(dinfo.dqi_free_entry);
+       dflags = __le32_to_cpu(dinfo.dqi_flags);
+       filesize = lseek(fd, 0, SEEK_END);
+       if (check_blkref(freeblk, blocks) < 0 || dflags & ~V2_DQF_MASK ||
+           check_blkref(freeent, blocks) < 0 || (filesize + QT_BLKSIZE - 1) >> QT_BLKSIZE_BITS != blocks) {
+               errstr(_("WARNING - Quota file info was corrupted.\n"));
+               debug(FL_DEBUG, _("Size of file: %lu\nBlocks: %u Free block: %u Block with free entry: %u Flags: %x\n"),
+                     (unsigned long)filesize, blocks, freeblk, freeent, dflags);
+               old_info[type].dqi_bgrace = MAX_DQ_TIME;
+               old_info[type].dqi_igrace = MAX_IQ_TIME;
+               old_info[type].u.v2_mdqi.dqi_qtree.dqi_blocks =
+                       (filesize + QT_BLKSIZE - 1) >> QT_BLKSIZE_BITS;
+               old_info[type].u.v2_mdqi.dqi_flags = 0;
+               printf(_("Setting grace times and other flags to default values.\nAssuming number of blocks is %u.\n"),
+                      old_info[type].u.v2_mdqi.dqi_qtree.dqi_blocks);
+       }
+       else {
+               old_info[type].dqi_bgrace = __le32_to_cpu(dinfo.dqi_bgrace);
+               old_info[type].dqi_igrace = __le32_to_cpu(dinfo.dqi_igrace);
+               old_info[type].u.v2_mdqi.dqi_qtree.dqi_blocks = blocks;
+               old_info[type].u.v2_mdqi.dqi_flags = dflags;
+       }
+       if (detected_versions[type] == 0)
+               old_info[type].u.v2_mdqi.dqi_qtree.dqi_entry_size = sizeof(struct v2r0_disk_dqblk);
+       else if (detected_versions[type] == 1)
+               old_info[type].u.v2_mdqi.dqi_qtree.dqi_entry_size = sizeof(struct v2r1_disk_dqblk);
+       /* Won't be needed */
+       old_info[type].u.v2_mdqi.dqi_qtree.dqi_free_blk = 0;
+       old_info[type].u.v2_mdqi.dqi_qtree.dqi_free_entry = 0;
+
+       debug(FL_DEBUG, _("File info done.\n"));
+       return 0;
+}
+
+/* Print errstr message */
+static void blk_corrupted(int *corrupted, uint * lblk, uint blk, char *fmtstr, ...)
+{
+       va_list args;
+
+       if (!*corrupted) {
+               if (!(flags & (FL_VERBOSE | FL_DEBUG)))
+                       errstr(_("Corrupted blocks: "));
+       }
+       if (flags & (FL_VERBOSE | FL_DEBUG)) {
+               va_start(args, fmtstr);
+               errstr(_("Block %u: "), blk);
+               vfprintf(stderr, fmtstr, args);
+               fputc('\n', stderr);
+               va_end(args);
+       }
+       else if (*lblk != blk) {
+               if (!*corrupted)
+                       fprintf(stderr, "%u", blk);
+               else
+                       fprintf(stderr, ", %u", blk);
+       }
+       *corrupted = 1;
+       *lblk = blk;
+       fflush(stderr);
+}
+
+/* Convert dist quota format to utility one - copy just needed fields */
+static void v2r0_disk2utildqblk(struct util_dqblk *u, struct v2r0_disk_dqblk *d)
+{
+       u->dqb_ihardlimit = __le32_to_cpu(d->dqb_ihardlimit);
+       u->dqb_isoftlimit = __le32_to_cpu(d->dqb_isoftlimit);
+       u->dqb_bhardlimit = __le32_to_cpu(d->dqb_bhardlimit);
+       u->dqb_bsoftlimit = __le32_to_cpu(d->dqb_bsoftlimit);
+       u->dqb_itime = __le64_to_cpu(d->dqb_itime);
+       u->dqb_btime = __le64_to_cpu(d->dqb_btime);
+}
+
+/* Convert dist quota format to utility one - copy just needed fields */
+static void v2r1_disk2utildqblk(struct util_dqblk *u, struct v2r1_disk_dqblk *d)
+{
+       u->dqb_ihardlimit = __le64_to_cpu(d->dqb_ihardlimit);
+       u->dqb_isoftlimit = __le64_to_cpu(d->dqb_isoftlimit);
+       u->dqb_bhardlimit = __le64_to_cpu(d->dqb_bhardlimit);
+       u->dqb_bsoftlimit = __le64_to_cpu(d->dqb_bsoftlimit);
+       u->dqb_itime = __le64_to_cpu(d->dqb_itime);
+       u->dqb_btime = __le64_to_cpu(d->dqb_btime);
+}
+
+/* Put one entry info memory */
+static int buffer_entry(dqbuf_t buf, uint blk, int *corrupted, uint * lblk, int cnt, int type)
+{
+       struct util_dqblk *fdq, mdq;
+       qid_t id;
+       struct dquot *cd;
+       struct qtree_mem_dqinfo *info = &old_info[type].u.v2_mdqi.dqi_qtree;
+       char *ddq = (char *)buf + sizeof(struct qt_disk_dqdbheader) + cnt * info->dqi_entry_size;
+
+       if (detected_versions[type] == 0) {
+               v2r0_disk2utildqblk(&mdq, (struct v2r0_disk_dqblk *)ddq);
+               id = __le32_to_cpu(((struct v2r0_disk_dqblk *)ddq)->dqb_id);
+       } else {
+               v2r1_disk2utildqblk(&mdq, (struct v2r1_disk_dqblk *)ddq);
+               id = __le32_to_cpu(((struct v2r1_disk_dqblk *)ddq)->dqb_id);
+       }
+
+       cd = lookup_dquot(id, type);
+       if (cd != NODQUOT) {
+               fdq = &cd->dq_dqb;
+               if (mdq.dqb_bhardlimit != fdq->dqb_bhardlimit
+                   || mdq.dqb_bsoftlimit != fdq->dqb_bsoftlimit
+                   || mdq.dqb_ihardlimit != fdq->dqb_ihardlimit
+                   || mdq.dqb_isoftlimit != fdq->dqb_isoftlimit) {
+                       blk_corrupted(corrupted, lblk, blk, _("Duplicated entries."));
+                       if (flags & FL_GUESSDQ) {
+                               if (!(flags & (FL_DEBUG | FL_VERBOSE)))
+                                       fputc('\n', stderr);
+                               errstr(_("Found more structures for ID %u. Using values: BHARD: %lld BSOFT: %lld IHARD: %lld ISOFT: %lld\n"),
+                                       (uint) id, (long long)fdq->dqb_bhardlimit, (long long)fdq->dqb_bsoftlimit,
+                                       (long long)fdq->dqb_ihardlimit, (long long)fdq->dqb_isoftlimit);
+                               return 0;
+                       }
+                       else if (flags & FL_INTERACTIVE) {
+                               if (!(flags & (FL_DEBUG | FL_VERBOSE)))
+                                       fputc('\n', stderr);
+                               errstr(_("Found more structures for ID %u. Values: BHARD: %lld/%lld BSOFT: %lld/%lld IHARD: %lld/%lld ISOFT: %lld/%lld\n"),
+                                       (uint) id, (long long)fdq->dqb_bhardlimit, (long long)mdq.dqb_bhardlimit,
+                                       (long long)fdq->dqb_bsoftlimit, (long long)mdq.dqb_bsoftlimit,
+                                       (long long)fdq->dqb_ihardlimit, (long long)mdq.dqb_ihardlimit,
+                                       (long long)fdq->dqb_isoftlimit, (long long)mdq.dqb_isoftlimit);
+                               if (ask_yn(_("Should I use new values"), 0)) {
+                                       fdq->dqb_bhardlimit = mdq.dqb_bhardlimit;
+                                       fdq->dqb_bsoftlimit = mdq.dqb_bsoftlimit;
+                                       fdq->dqb_ihardlimit = mdq.dqb_ihardlimit;
+                                       fdq->dqb_isoftlimit = mdq.dqb_isoftlimit;
+                                       fdq->dqb_btime = mdq.dqb_btime;
+                                       fdq->dqb_itime = mdq.dqb_itime;
+                               }
+                       }
+                       else {
+                               errstr(_("ID %u has more structures. User intervention needed (use -i for interactive mode or -n for automatic answer).\n"),
+                                       (uint) id);
+                               return -1;
+                       }
+               }
+               else if (mdq.dqb_itime != fdq->dqb_itime || mdq.dqb_btime != fdq->dqb_btime) {
+                       if (fdq->dqb_btime < mdq.dqb_btime)
+                               fdq->dqb_btime = mdq.dqb_btime;
+                       if (fdq->dqb_itime < mdq.dqb_itime)
+                               fdq->dqb_itime = mdq.dqb_itime;
+               }
+       }
+       else {
+               cd = add_dquot(id, type);
+               fdq = &cd->dq_dqb;
+               fdq->dqb_bhardlimit = mdq.dqb_bhardlimit;
+               fdq->dqb_bsoftlimit = mdq.dqb_bsoftlimit;
+               fdq->dqb_ihardlimit = mdq.dqb_ihardlimit;
+               fdq->dqb_isoftlimit = mdq.dqb_isoftlimit;
+               /* Add grace times only if there are limits... */
+               if (mdq.dqb_bsoftlimit)
+                       fdq->dqb_btime = mdq.dqb_btime;
+               if (mdq.dqb_isoftlimit)
+                       fdq->dqb_itime = mdq.dqb_itime;
+       }
+       return 0;
+}
+
+static void check_read_blk(int fd, uint blk, dqbuf_t buf)
+{
+       size_t rd;
+
+       lseek(fd, blk << QT_BLKSIZE_BITS, SEEK_SET);
+       rd = read(fd, buf, QT_BLKSIZE);
+       if (rd < 0)
+               die(2, _("Cannot read block %u: %s\n"), blk, strerror(errno));
+       if (rd != QT_BLKSIZE) {
+               debug(FL_VERBOSE | FL_DEBUG, _("Block %u is truncated.\n"), blk);
+               memset(buf + rd, 0, QT_BLKSIZE - rd);
+       }
+}
+
+static int check_tree_ref(uint blk, uint ref, uint blocks, int check_use, int * corrupted,
+                         uint * lblk)
+{
+       if (check_blkref(ref, blocks) < 0) {
+               blk_corrupted(corrupted, lblk, blk, _("Reference to illegal block %u"), ref);
+               return -1;
+       }
+       if (!ref)
+               return 0;
+       if (!check_use || !GET_BLK(ref))
+               return 0;
+       blk_corrupted(corrupted, lblk, blk, _("Block %u in tree referenced twice"), ref);
+       return -1;
+}
+
+/* Check block with structures */
+static int check_data_blk(int fd, uint blk, int type, uint blocks, int * corrupted, uint * lblk)
+{
+       dqbuf_t buf = getdqbuf();
+       struct qt_disk_dqdbheader *head = (struct qt_disk_dqdbheader *)buf;
+       int i;
+       char *dd = (char *)(head + 1);
+       struct qtree_mem_dqinfo *info = &old_info[type].u.v2_mdqi.dqi_qtree;
+
+       SET_BLK(blk);
+       check_read_blk(fd, blk, buf);
+       if (check_blkref(__le32_to_cpu(head->dqdh_next_free), blocks) < 0)
+               blk_corrupted(corrupted, lblk, blk, _("Illegal free block reference to block %u"),
+                             __le32_to_cpu(head->dqdh_next_free));
+       if (__le16_to_cpu(head->dqdh_entries) > qtree_dqstr_in_blk(info))
+               blk_corrupted(corrupted, lblk, blk, _("Corrupted number of used entries (%u)"),
+                             (uint) __le16_to_cpu(head->dqdh_entries));
+       for (i = 0; i < qtree_dqstr_in_blk(info); i++)
+               if (!qtree_entry_unused(info, dd + i * info->dqi_entry_size))
+                       if (buffer_entry(buf, blk, corrupted, lblk, i, type) < 0) {
+                               freedqbuf(buf);
+                               return -1;
+                       }
+       freedqbuf(buf);
+       return 0;
+}
+
+/* Check one tree block */
+static int check_tree_blk(int fd, uint blk, int depth, int type, uint blocks, int * corrupted,
+                         uint * lblk)
+{
+       dqbuf_t buf = getdqbuf();
+       u_int32_t *r = (u_int32_t *) buf;
+       int i;
+
+       SET_BLK(blk);
+       check_read_blk(fd, blk, buf);
+       for (i = 0; i < QT_BLKSIZE >> 2; i++)
+               if (depth < QT_TREEDEPTH - 1) {
+                       if (check_tree_ref(blk, __le32_to_cpu(r[i]), blocks, 1, corrupted, lblk) >= 0 &&
+                           __le32_to_cpu(r[i]))        /* Isn't block OK? */
+                               if (check_tree_blk(fd, __le32_to_cpu(r[i]), depth + 1, type, blocks, corrupted, lblk) < 0) {
+                                       freedqbuf(buf);
+                                       return -1;
+                               }
+               }
+               else if (check_tree_ref(blk, __le32_to_cpu(r[i]), blocks, 0, corrupted, lblk) >= 0 && __le32_to_cpu(r[i]))
+                       if (!GET_BLK(__le32_to_cpu(r[i])) && check_data_blk(fd, __le32_to_cpu(r[i]), type, blocks, corrupted, lblk) < 0) {
+                               freedqbuf(buf);
+                               return -1;
+                       }
+       freedqbuf(buf);
+       return 0;
+}
+
+int v2_detect_version(char *filename, int fd, int type)
+{
+       struct v2_disk_dqheader head;
+       int err;
+       int ver;
+
+       lseek(fd, 0, SEEK_SET);
+       err = read(fd, &head, sizeof(head));
+       if (err < 0 || err != sizeof(head))
+               return -1;
+       if (__le32_to_cpu(head.dqh_magic) != magics[type] ||
+           __le32_to_cpu(head.dqh_version) > known_versions[type]) {
+               errstr(_("Quota file %s has corrupted headers. You have to specify quota format on command line.\n"),
+                       filename);
+               return -1;
+       }
+       ver = __le32_to_cpu(head.dqh_version);
+       if (ver == 0)
+               return QF_VFSV0;
+       return QF_VFSV1;
+}
+
+/* Check basic header */
+static int check_header(char *filename, int fd, int type, int version)
+{
+       int err;
+       struct v2_disk_dqheader head;
+
+       debug(FL_DEBUG, _("Checking quotafile headers...\n"));
+       lseek(fd, 0, SEEK_SET);
+       err = read(fd, &head, sizeof(head));
+       if (err < 0)
+               die(1, _("Cannot read header from quotafile %s: %s\n"), filename, strerror(errno));
+       if (err != sizeof(head)) {
+               errstr(_("WARNING -  Quotafile %s was probably truncated. Cannot save quota settings...\n"),
+                       filename);
+               return -1;
+       }
+       if (__le32_to_cpu(head.dqh_magic) != magics[type] ||
+           __le32_to_cpu(head.dqh_version) > known_versions[type]) {
+               errstr(_("WARNING - Quota file %s has corrupted headers\n"),
+                       filename);
+       }
+       if (__le32_to_cpu(head.dqh_version) != version) {
+               errstr(_("Quota file format version %d does not match the one "
+                        "specified on command line (%d). Quota file header "
+                        "may be corrupted.\n"),
+                      __le32_to_cpu(head.dqh_version), version);
+               if (!ask_yn(_("Continue checking assuming version from command line?"), 1))
+                       return -1;
+               detected_versions[type] = version;
+       } else
+               detected_versions[type] = __le32_to_cpu(head.dqh_version);
+
+       debug(FL_DEBUG, _("Headers checked.\n"));
+       return 0;
+}
+
+/* Load data from file to memory */
+int v2_buffer_file(char *filename, int fd, int type, int fmt)
+{
+       uint blocks, lastblk = 0;
+       int corrupted = 0, ret = 0;
+       int version;
+
+       if (fmt == QF_VFSV0)
+               version = 0;
+       else if (fmt == QF_VFSV1)
+               version = 1;
+       else
+               die(3, _("Do not know how to buffer format %d\n"), fmt);
+
+       old_info[type].dqi_bgrace = MAX_DQ_TIME;
+       old_info[type].dqi_igrace = MAX_IQ_TIME;
+       if (flags & FL_NEWFILE)
+               return 0;
+       if (check_header(filename, fd, type, version) < 0)
+               return -1;
+       if (check_info(filename, fd, type) < 0)
+               return -1;
+       debug(FL_DEBUG, _("Headers of file %s checked. Going to load data...\n"),
+             filename);
+       blocks = old_info[type].u.v2_mdqi.dqi_qtree.dqi_blocks;
+       blkbmp = xmalloc((blocks + 7) >> 3);
+       memset(blkbmp, 0, (blocks + 7) >> 3);
+       if (check_tree_ref(0, QT_TREEOFF, blocks, 1, &corrupted, &lastblk) >= 0)
+               ret = check_tree_blk(fd, QT_TREEOFF, 0, type, blocks, &corrupted, &lastblk);
+       else
+               errstr(_("Cannot gather quota data. Tree root node corrupted.\n"));
+#ifdef DEBUG_MALLOC
+       free_mem += (blocks + 7) >> 3;
+#endif
+       free(blkbmp);
+       if (corrupted) {
+               if (!(flags & (FL_VERBOSE | FL_DEBUG)))
+                       fputc('\n', stderr);
+               errstr(_("WARNING - Some data might be changed due to corruption.\n"));
+       }
+       else
+               debug(FL_DEBUG, _("Not found any corrupted blocks. Congratulations.\n"));
+       return ret;
+}
+
+/* Merge quotafile info from old and new file */
+void v2_merge_info(struct util_dqinfo *new, struct util_dqinfo *old)
+{
+       new->u.v2_mdqi.dqi_flags = old->u.v2_mdqi.dqi_flags;
+}
diff --git a/quotactl.2 b/quotactl.2
new file mode 100644 (file)
index 0000000..683903d
--- /dev/null
@@ -0,0 +1,317 @@
+.TH QUOTACTL 2
+.SH NAME
+quotactl \- manipulate disk quotas
+.SH SYNOPSIS
+.nf
+.B #include <sys/quota.h>
+.B #include <xfs/xqm.h>
+.LP
+.B long quotactl(int cmd, char \(**special, qid_t id, caddr_t addr)
+.fi
+.SH DESCRIPTION
+.LP
+.IX  "filesystem"  "quotactl() disk quotas"  ""  "\fLquotactl()\fP \(em disk quotas"
+.IX  "quotactl() disk quotas"  ""  "\fLquotactl()\fP \(em disk quotas"
+.IX  "disk quotas quotactl()"  ""  "disk quotas \(em \fLquotactl()\fP"
+.LP
+The
+.B quotactl(\|)
+call manipulates disk quotas.
+.I cmd
+indicates a command to be applied to 
+.SM UID
+.IR id
+or 
+.SM GID
+.IR id .
+To set the type of quota use the
+.IR "QCMD(cmd, type)"
+macro.
+.I special
+is a pointer to a null-terminated string containing the path
+name of the block special device for the filesystem being manipulated.
+.I addr
+is the address of an optional, command specific, data structure
+which is copied in or out of the system.  The interpretation of
+.I addr
+is given with each command below.
+.TP 15
+.SB Q_QUOTAON
+Turn on quotas for a filesystem.
+.I id
+is the identification number of the quota format to be used. Format numbers
+are defined in the header file of appropriate format. Currently there are
+two supported quota formats whose numbers are defined by constants
+.IR QFMT_VFS_OLD
+(original quota format) and
+.IR QFMT_VFS_V0
+(new VFS v0 quota format).
+.IR addr
+points to the path name of file containing the quotas for the filesystem.
+The quota file must exist; it is normally created with the
+.BR quotacheck (8)
+program.  This call is restricted to the super-user.
+.TP
+.SB Q_QUOTAOFF
+Turn off quotas for a filesystem.
+.I addr
+and
+.I id
+are ignored.
+This call is restricted to the super-user.
+.TP
+.SB Q_GETQUOTA
+Get disk quota limits and current usage for user or group
+.IR id .
+.I addr
+is a pointer to an
+.B dqblk
+structure (defined in
+.BR <sys/quota.h> ).
+The field
+.I dqb_valid
+defines the entries in the structure which are set correctly. On
+.B Q_GETQUOTA
+call all entries are valid. Only the super-user may get the quotas
+of a user other than himself.
+.TP
+.SB Q_SETQUOTA
+Set current quota information for user or group
+.IR id .
+.I addr
+is a pointer to an
+.B dqblk
+structure (defined in
+.BR <sys/quota.h> ).
+The field
+.I dqb_valid
+defines which entries in the quota structure are valid and should be set. The constants for
+.I dqb_valid
+field are defined in the
+.B <sys/quota.h>
+header file. This call obsoletes calls
+.B Q_SETQLIM
+and
+.B Q_SETUSE
+in the previous quota interfaces. This call is restricted to the super-user.
+.TP
+.SB Q_GETINFO
+Get information (like grace times) about quotafile.
+.I addr
+should be a pointer to an
+.B dqinfo
+structure (defined in
+.IR <sys/quota.h> ).
+The
+.I dqi_valid
+field in the structure defines entries in it
+which are valid. On
+.B Q_GETINFO
+call all entries are valid.
+Parameter
+.I id
+is ignored. 
+.TP
+.SB Q_SETINFO
+Set information about quotafile.
+.I addr
+should be a pointer to
+.B dqinfo
+structure (defined in
+.IR <sys/quota.h> ).
+The field
+.I dqi_valid
+defines which entries in the quota info structure are valid and should be set. The constants for
+.I dqi_valid
+field are defined in the
+.B <sys/quota.h>
+header file. This call obsoletes calls
+.B Q_SETGRACE
+and
+.B Q_SETFLAGS
+in the previous quota interfaces. Parameter
+.I id
+is ignored. This operation is restricted to super-user.
+.TP
+.SB Q_GETFMT
+Get quota format used on the specified filesystem.
+.I addr
+should be a pointer to a memory (4 bytes) where the format number will be stored.
+.TP
+.SB Q_SYNC
+Update the on-disk copy of quota usages for a filesystem.
+If
+.I special
+is null then all filesystems with active quotas are sync'ed.
+.I addr
+and
+.I id
+are ignored.
+.TP
+.SB Q_GETSTATS
+Get statistics and other generic information about quota subsystem.
+.I addr
+should be a pointer to
+.B dqstats
+structure (defined in
+.BR <sys/quota.h> )
+in which data should be stored.
+.I special
+and
+.I id
+are ignored. This call is obsolete and not supported by recent kernels.
+Files in 
+.B /proc/sys/fs/quota/
+carry the information instead.
+.TP
+For XFS filesystems making use of the XFS Quota Manager (XQM), the above commands are bypassed and the following commands are used:
+.TP 15
+.SB Q_XQUOTAON
+Turn on quotas for an XFS filesystem.
+XFS provides the ability to turn on/off quota limit enforcement
+with quota accounting.
+Therefore, XFS expects the addr to be a pointer to an unsigned int
+that contains either the flags XFS_QUOTA_UDQ_ACCT and/or
+XFS_QUOTA_UDQ_ENFD (for user quota), or XFS_QUOTA_GDQ_ACCT and/or
+XFS_QUOTA_GDQ_ENFD (for group quota), as defined in
+.BR <xfs/xqm.h> .
+This call is restricted to the superuser.
+.TP
+.SB Q_XQUOTAOFF
+Turn off quotas for an XFS filesystem.
+As in Q_QUOTAON, XFS filesystems expect a pointer to an unsigned int
+that specifies whether quota accounting and/or limit enforcement need
+to be turned off.
+This call is restricted to the superuser.
+.TP
+.SB Q_XGETQUOTA
+Get disk quota limits and current usage for user
+.IR id .
+.I addr
+is a pointer to a
+.B fs_disk_quota
+structure (defined in
+.BR <xfs/xqm.h> ).
+Only the superuser may get the quotas of a user other than himself.
+.TP
+.SB Q_XSETQLIM
+Set disk quota limits for user
+.IR id .
+.I addr
+is a pointer to a
+.B fs_disk_quota
+structure (defined in
+.BR <xfs/xqm.h> ).
+This call is restricted to the superuser.
+.TP
+.SB Q_XGETQSTAT
+Returns a
+.B fs_quota_stat
+structure containing XFS filesystem specific quota information.
+This is useful in finding out how much space is spent to store quota
+information, and also to get quotaon/off status of a given local XFS
+filesystem.
+.TP
+.SB Q_XQUOTARM
+Free the disk space taken by disk quotas.
+Quotas must have already been turned off.
+.PP
+There is no command equivalent to
+.B Q_SYNC
+for XFS since
+.IR sync (1)
+writes quota information to disk (in addition to the other filesystem
+metadata it writes out).
+.SH RETURN VALUES
+.LP
+.B quotactl(\|)
+returns:
+.TP
+0
+on success.
+.TP
+\-1
+on failure and sets
+.B errno
+to indicate the error.
+.SH ERRORS
+.TP 15
+.SM EFAULT
+.I addr
+or
+.I special
+are invalid.
+.TP
+.SM ENOSYS
+The kernel has not been compiled with the
+.SB QUOTA
+option.
+.TP
+.SM EINVAL
+.IP
+.I cmd
+or
+.I type
+is invalid.
+.TP
+.SM ENOENT
+The file specified by
+.I special
+or
+.I addr
+does not exist.
+.TP
+.SM ENOTBLK
+.I special
+is not a block device.
+.TP
+.SM EPERM
+The call is privileged and the caller was not the super-user.
+.TP
+.SM ESRCH
+No disc quota is found for the indicated user. Quotas have not been turned on for this filesystem.
+.LP
+If
+.I cmd
+is
+.BR \s-1Q_SETQUOTA\s0 ,
+.B quotactl(\|)
+may also set errno to:
+.TP 15
+.SM ERANGE
+Specified limits are out of range allowed by quota format.
+.LP
+If
+.I cmd
+is
+.BR \s-1Q_QUOTAON\s0 ,
+.B quotactl(\|)
+may also set errno to:
+.TP 15
+.SM EACCES
+The quota file pointed to by
+.I addr
+exists but is not a regular file.
+.IP
+The quota file pointed to by
+.I addr
+exists but is not on the
+filesystem pointed to by
+.IR special .
+.TP
+.SM EINVAL
+The quota file is corrupted.
+.TP
+.SM ESRCH
+Specified quota format was not found.
+.TP
+.SM EBUSY
+.SB Q_QUOTAON
+attempted while another
+.SB Q_QUOTAON
+has already taken place.
+.SH "SEE ALSO"
+.BR quota (1),
+.BR getrlimit (2),
+.BR quotacheck (8),
+.BR quotaon (8)
diff --git a/quotadebug b/quotadebug
new file mode 100755 (executable)
index 0000000..bbb4fe0
Binary files /dev/null and b/quotadebug differ
diff --git a/quotadebug.c b/quotadebug.c
new file mode 100644 (file)
index 0000000..5d31c42
--- /dev/null
@@ -0,0 +1,282 @@
+/*
+ *
+ *     Utility for quota debugging
+ *
+ */
+
+#include "config.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <string.h>
+#include <unistd.h>
+#include <errno.h>
+#include <limits.h>
+#include <stdarg.h>
+#include <getopt.h>
+
+#include <sys/types.h>
+
+#include <asm/byteorder.h>
+
+#include "quotaio_v2.h"
+#include "quota_tree.h"
+
+#define PROMPTSTR "> "
+#define MAXCMDLEN 64
+
+int fd;
+static int mode = O_RDWR;
+
+void die(int ret, char *fmtstr, ...)
+{
+       va_list args;
+
+       va_start(args, fmtstr);
+       fprintf(stderr, "quotadebug: ");
+       vfprintf(stderr, fmtstr, args);
+       va_end(args);
+       exit(ret);
+}
+
+void sstrncpy(char *d, const char *s, size_t len)
+{
+       strncpy(d, s, len);
+       d[len - 1] = 0;
+}
+
+void parse_options(int argcnt, char **argstr)
+{
+       char *slash = strrchr(argstr[0], '/'), cmdname[PATH_MAX];
+       int ret = 0;
+
+       if (!slash)
+               slash = argstr[0];
+       else
+               slash++;
+       sstrncpy(cmdname, slash, PATH_MAX);
+
+       while (ret != -1) {
+               ret = getopt(argcnt, argstr, "hr");
+               switch (ret) {
+                       case '?':
+                       case 'h':
+usage:
+                               fprintf(stderr, "Utility for quota debugging.\nUsage:\n%s [-r] file\nBugs to /dev/null\n", cmdname);
+                               exit(1);
+                       case 'r':
+                               mode = O_RDONLY;
+                               break;
+               }
+       }
+       if (optind != argcnt - 1) {
+               fputs("Bad number of arguments.\n", stderr);
+               goto usage;
+       }
+}
+
+void print_help(void)
+{
+       puts("Simple utility for debugging quota.");
+       puts("Commands:\nh - help\nq - quit\nptb <blk> - print block as tree block\npdq0 <blk> - print block as quota block of version 0 structures");
+       puts("pdq1 <blk> - print block as quota block of version 1 structures\npi - print base info\nww <blk> <off> <val> - write word to given block on given offset\nwl <blk> <off> <val> - write long ...");
+}
+
+
+void print_tb(char *arg)
+{
+       int blk, ret, i;
+       char *errch;
+       __u32 data[QT_BLKSIZE/sizeof(__u32)];
+
+       if (!arg) {
+               puts("Bad number of arguments");
+               return;
+       }
+       blk = strtol(arg, &errch, 0);
+       if (blk < 0 || *errch) {
+               printf("Illegal block number %s\n", arg);
+               return;
+       }
+       lseek(fd, blk * QT_BLKSIZE, SEEK_SET);
+       ret = read(fd, data, QT_BLKSIZE);
+       if (ret != QT_BLKSIZE) {
+               if (ret >= 0)
+                       errno = ENODATA;
+               printf("Error occured while reading block %d: %s\n", blk, strerror(errno));
+               return;
+       }
+       for (i = 0; i < QT_BLKSIZE / sizeof(__u32); i++)
+               printf("%08x ", __le32_to_cpu(data[i]));
+       putchar('\n');
+}
+
+void print_quota_r0(char *arg)
+{
+       int ret, blk, i, entries;
+       char *errch;
+       char buf[QT_BLKSIZE];
+       struct qt_disk_dqdbheader *head;
+       struct v2r0_disk_dqblk *entry;
+
+       if (!arg) {
+               puts("Bad number of arguments.");
+               return;
+       }
+       blk = strtol(arg, &errch, 0);
+       if (blk < 0 || *errch) {
+               printf("Illegal block number: %s\n", arg);
+               return;
+       }
+       lseek(fd, blk * QT_BLKSIZE, SEEK_SET);
+       ret = read(fd, buf, QT_BLKSIZE);
+       if (ret < 0) {
+               printf("Error occured while reading block %d: %s\n", blk, strerror(errno));
+               return;
+       }
+       else if (ret != QT_BLKSIZE)
+               memset(buf + ret, 0, QT_BLKSIZE - ret);
+       head = (struct qt_disk_dqdbheader *)buf;
+       entry = (struct v2r0_disk_dqblk *)(buf + sizeof(struct qt_disk_dqdbheader));
+       printf("HEAD:\nEntries: %d Nextblk: %x Prevblk: %x\n", entries = __le16_to_cpu(head->dqdh_entries),
+         __le32_to_cpu(head->dqdh_next_free), __le32_to_cpu(head->dqdh_prev_free));
+       printf("ENTRIES:\n");
+       for (i = 0; i < (QT_BLKSIZE - sizeof(struct qt_disk_dqdbheader)) / sizeof(struct v2r0_disk_dqblk); i++)
+               printf("ID: %d B: %Lu/%u(%Lu)/%u I: %u/%u(%Lu)/%u\n", __le32_to_cpu(entry[i].dqb_id),
+                 __le64_to_cpu(entry[i].dqb_curspace), __le32_to_cpu(entry[i].dqb_bsoftlimit), __le64_to_cpu(entry[i].dqb_btime), __le32_to_cpu(entry[i].dqb_bhardlimit),
+                 __le32_to_cpu(entry[i].dqb_curinodes), __le32_to_cpu(entry[i].dqb_isoftlimit), __le64_to_cpu(entry[i].dqb_itime), __le32_to_cpu(entry[i].dqb_ihardlimit));
+}
+
+void print_quota_r1(char *arg)
+{
+       int ret, blk, i, entries;
+       char *errch;
+       char buf[QT_BLKSIZE];
+       struct qt_disk_dqdbheader *head;
+       struct v2r1_disk_dqblk *entry;
+
+       if (!arg) {
+               puts("Bad number of arguments.");
+               return;
+       }
+       blk = strtol(arg, &errch, 0);
+       if (blk < 0 || *errch) {
+               printf("Illegal block number: %s\n", arg);
+               return;
+       }
+       lseek(fd, blk * QT_BLKSIZE, SEEK_SET);
+       ret = read(fd, buf, QT_BLKSIZE);
+       if (ret < 0) {
+               printf("Error occured while reading block %d: %s\n", blk, strerror(errno));
+               return;
+       }
+       else if (ret != QT_BLKSIZE)
+               memset(buf + ret, 0, QT_BLKSIZE - ret);
+       head = (struct qt_disk_dqdbheader *)buf;
+       entry = (struct v2r1_disk_dqblk *)(buf + sizeof(struct qt_disk_dqdbheader));
+       printf("HEAD:\nEntries: %d Nextblk: %x Prevblk: %x\n", entries = __le16_to_cpu(head->dqdh_entries),
+         __le32_to_cpu(head->dqdh_next_free), __le32_to_cpu(head->dqdh_prev_free));
+       printf("ENTRIES:\n");
+       for (i = 0; i < (QT_BLKSIZE - sizeof(struct qt_disk_dqdbheader)) / sizeof(struct v2r1_disk_dqblk); i++)
+               printf("ID: %u B: %llu/%llu(%llu)/%llu I: %llu/%llu(%llu)/%llu\n", __le32_to_cpu(entry[i].dqb_id),
+                 __le64_to_cpu(entry[i].dqb_curspace), __le64_to_cpu(entry[i].dqb_bsoftlimit), __le64_to_cpu(entry[i].dqb_btime), __le64_to_cpu(entry[i].dqb_bhardlimit),
+                 __le64_to_cpu(entry[i].dqb_curinodes), __le64_to_cpu(entry[i].dqb_isoftlimit), __le64_to_cpu(entry[i].dqb_itime), __le64_to_cpu(entry[i].dqb_ihardlimit));
+}
+
+void print_info(void)
+{
+       struct v2_disk_dqinfo info;
+       int ret;
+
+       lseek(fd, V2_DQINFOOFF, SEEK_SET);
+       ret = read(fd, &info, sizeof(struct v2_disk_dqinfo));
+       if (ret != sizeof(struct v2_disk_dqinfo)) {
+               if (ret >= 0)
+                       errno = ENODATA;
+               printf("Can't read base info: %s\n", strerror(errno));
+               return;
+       }
+       printf("Flags: %08x\nBlocks: %d = %x\nFree block: %x\nFree entry: %x\nBGrace: %Lu\nIGrace: %Lu\n",
+         __le32_to_cpu(info.dqi_flags), __le32_to_cpu(info.dqi_blocks), __le32_to_cpu(info.dqi_blocks),
+         __le32_to_cpu(info.dqi_free_blk), __le32_to_cpu(info.dqi_free_entry), __le64_to_cpu(info.dqi_bgrace), __le64_to_cpu(info.dqi_igrace));
+}
+
+void write_bytes(int len, char *args)
+{
+       char *blks, *offs, *vals;
+       uint blk, off, val;
+       char *errch;
+       int wrt;
+
+       blks = args;
+       if (!blks || !(offs = strchr(blks, ' ')) || !(vals = strchr(offs+1, ' '))) {
+               puts("Bad number of arguments.");
+               return;
+       }
+       *(offs++) = *(vals++) = 0;
+       blk = strtol(blks, &errch, 0);
+       if (*errch) {
+               printf("Bad block number: %s\n", blks);
+               return;
+       }
+       off = strtol(offs, &errch, 0);
+       if (*errch || off > QT_BLKSIZE) {
+               printf("Bad offset: %s\n", offs);
+               return;
+       }
+       val = __cpu_to_le32(strtol(vals, &errch, 0));
+       if (*errch) {
+               printf("Bad value: %s\n", vals);
+               return;
+       }
+       lseek(fd, (blk << QT_BLKSIZE_BITS) + off, SEEK_SET);
+       if ((wrt = write(fd, &val, len)) < 0)
+               printf("Can't write value: %s\n", strerror(errno));
+       else if (wrt != len)
+               printf("Warning: Written only %d bytes.\n", wrt);
+}
+
+void run(void)
+{
+       char cmd[MAXCMDLEN];
+       char *arg;
+
+       puts("Ready to serve.");
+       while (1) {
+               printf(PROMPTSTR);
+               fgets(cmd, MAXCMDLEN, stdin);
+               cmd[strlen(cmd) - 1] = '\0';    /* Discard '\n' */
+               if ((arg = strchr(cmd, ' ')))
+                       *(arg++) = '\0';
+               if (!strcmp(cmd, "h"))
+                       print_help();
+               else if (!strcmp(cmd, "q"))
+                       break;
+               else if (!strcmp(cmd, "ptb"))
+                       print_tb(arg);
+               else if (!strcmp(cmd, "pdq0"))
+                       print_quota_r0(arg);
+               else if (!strcmp(cmd, "pdq1"))
+                       print_quota_r1(arg);
+               else if (!strcmp(cmd, "pi"))
+                       print_info();
+               else if (!strcmp(cmd, "ww"))
+                       write_bytes(2, arg);
+               else if (!strcmp(cmd, "wl"))
+                       write_bytes(4, arg);
+               else
+                       puts("Unknown command. Type h for help.");
+       }
+}
+
+int main(int argcnt, char **argstr)
+{
+       parse_options(argcnt, argstr);
+       if ((fd = open(argstr[argcnt - 1], mode)) < 0)
+               die(1, "Can't open given file: %s\n", strerror(errno));
+       run();
+       close(fd);
+       return 0;
+}
+
diff --git a/quotagrpadmins b/quotagrpadmins
new file mode 100644 (file)
index 0000000..a1f2f46
--- /dev/null
@@ -0,0 +1,8 @@
+#
+# This is a sample groupadmins file (/etc/quotagrpadmins)
+#
+#  Comments begin with hash in the beginning of the line
+
+# In this file you specify users responsible for space used by the group
+users: root
+mygroup: chief
diff --git a/quotaio.c b/quotaio.c
new file mode 100644 (file)
index 0000000..e857328
--- /dev/null
+++ b/quotaio.c
@@ -0,0 +1,276 @@
+/*
+ *
+ *     Generic IO operations on quotafiles
+ *
+ *     Jan Kara <jack@suse.cz> - sponsored by SuSE CR
+ */
+
+#include "config.h"
+
+#include <stdio.h>
+#include <errno.h>
+#include <string.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/file.h>
+#include <asm/byteorder.h>
+
+#include "pot.h"
+#include "bylabel.h"
+#include "common.h"
+#include "quotasys.h"
+#include "quotaio.h"
+
+#include "dqblk_v1.h"
+#include "dqblk_v2.h"
+#include "dqblk_rpc.h"
+#include "dqblk_xfs.h"
+
+/* Header in all newer quotafiles */
+struct disk_dqheader {
+       u_int32_t dqh_magic;
+       u_int32_t dqh_version;
+} __attribute__ ((packed));
+
+/*
+ *     Detect quota format and initialize quota IO
+ */
+struct quota_handle *init_io(struct mntent *mnt, int type, int fmt, int flags)
+{
+       char *qfname = NULL;
+       int fd = -1, kernfmt;
+       struct quota_handle *h = smalloc(sizeof(struct quota_handle));
+       const char *mnt_fsname = NULL;
+
+       if (!hasquota(mnt, type, 0))
+               goto out_handle;
+       if (!(mnt_fsname = get_device_name(mnt->mnt_fsname)))
+               goto out_handle;
+       if (stat(mnt_fsname, &h->qh_stat) < 0)
+               memset(&h->qh_stat, 0, sizeof(struct stat));
+       h->qh_io_flags = 0;
+       if (flags & IOI_READONLY)
+               h->qh_io_flags |= IOFL_RO;
+       if (flags & IOI_NFS_MIXED_PATHS)
+               h->qh_io_flags |= IOFL_NFS_MIXED_PATHS;
+       h->qh_type = type;
+       sstrncpy(h->qh_quotadev, mnt_fsname, sizeof(h->qh_quotadev));
+       free((char *)mnt_fsname);
+       sstrncpy(h->qh_fstype, mnt->mnt_type, MAX_FSTYPE_LEN);
+       if (nfs_fstype(mnt->mnt_type)) {        /* NFS filesystem? */
+               if (fmt != -1 && fmt != QF_RPC) {       /* User wanted some other format? */
+                       errstr(_("Only RPC quota format is allowed on NFS filesystem.\n"));
+                       goto out_handle;
+               }
+#ifdef RPC
+               h->qh_fd = -1;
+               h->qh_fmt = QF_RPC;
+               h->qh_ops = &quotafile_ops_rpc;
+               return h;
+#else
+               errstr(_("RPC quota format not compiled.\n"));
+               goto out_handle;
+#endif
+       } else if (fmt == QF_RPC) {
+               errstr(_("RPC quota format specified for non-NFS filesystem.\n"));
+               goto out_handle;
+       }
+
+       if (!strcmp(mnt->mnt_type, MNTTYPE_XFS)) {      /* XFS filesystem? */
+               if (fmt != -1 && fmt != QF_XFS) {       /* User wanted some other format? */
+                       errstr(_("Only XFS quota format is allowed on XFS filesystem.\n"));
+                       goto out_handle;
+               }
+               h->qh_fd = -1;
+               h->qh_fmt = QF_XFS;
+               h->qh_ops = &quotafile_ops_xfs;
+               memset(&h->qh_info, 0, sizeof(h->qh_info));
+               h->qh_ops->init_io(h);
+               return h;
+       }
+       else if (fmt == QF_XFS) {
+               errstr(_("XFS quota allowed only on XFS filesystem.\n"));
+               goto out_handle;
+       }
+       if (kern_qfmt_supp(fmt)) {      /* Quota compiled and desired format available? */
+               /* Quota turned on? */
+               kernfmt = kern_quota_on(h->qh_quotadev, type, fmt);
+               if (kernfmt >= 0) {
+                       h->qh_io_flags |= IOFL_QUOTAON;
+                       fmt = kernfmt;  /* Default is kernel used format */
+               }
+       }
+
+       if (meta_qf_fstype(mnt->mnt_type)) {
+               if (!QIO_ENABLED(h)) {
+                       errstr(_("Quota not supported by the filesystem.\n"));
+                       goto out_handle;
+               }
+               if (flags & IOI_OPENFILE) {
+                       errstr(_("Operation not supported for filesystems with hidden quota files!\n"));
+                       goto out_handle;
+               }
+               h->qh_fd = -1;
+               h->qh_fmt = fmt;
+               goto set_ops;
+       }
+
+       if (fmt == -1) {
+               /* Let's try any VFSv0 quota format... */
+               if (get_qf_name(mnt, type, QF_VFSV0,
+                               (!QIO_ENABLED(h) || flags & IOI_OPENFILE) ? NF_FORMAT : 0,
+                               &qfname) >= 0)
+                       fmt = QF_VFSV0;
+               /* And then VFSv1 quota format... */
+               else if (get_qf_name(mnt, type, QF_VFSV1,
+                               (!QIO_ENABLED(h) || flags & IOI_OPENFILE) ? NF_FORMAT : 0,
+                               &qfname) >= 0)
+                       fmt = QF_VFSV1;
+               /* And then old quota format... */
+               else if (get_qf_name(mnt, type, QF_VFSOLD,
+                                (!QIO_ENABLED(h) || flags & IOI_OPENFILE) ? NF_FORMAT : 0,
+                                &qfname) >= 0)
+                       fmt = QF_VFSOLD;
+               else {  /* Don't know... */
+                       errstr(_("Cannot find any quota file to work on.\n"));
+                       goto out_handle;
+               }
+       } else {
+               if (get_qf_name(mnt, type, fmt,
+                               (!QIO_ENABLED(h) || flags & IOI_OPENFILE) ? NF_FORMAT : 0,
+                               &qfname) < 0) {
+                       errstr(_("Quota file not found or has wrong format.\n"));
+                       goto out_handle;
+               }
+       }
+       if (!QIO_ENABLED(h) || flags & IOI_OPENFILE) {  /* Need to open file? */
+               /* We still need to open file for operations like 'repquota' */
+               if ((fd = open(qfname, QIO_RO(h) ? O_RDONLY : O_RDWR)) < 0) {
+                       errstr(_("Cannot open quotafile %s: %s\n"),
+                               qfname, strerror(errno));
+                       goto out_handle;
+               }
+               flock(fd, QIO_RO(h) ? LOCK_SH : LOCK_EX);
+               /* Init handle */
+               h->qh_fd = fd;
+               h->qh_fmt = fmt;
+       } else {
+               h->qh_fd = -1;
+               h->qh_fmt = fmt;
+       }
+       free(qfname);   /* We don't need it anymore */
+       qfname = NULL;
+
+set_ops:
+       if (fmt == QF_VFSOLD)
+               h->qh_ops = &quotafile_ops_1;
+       else if (is_tree_qfmt(fmt))
+               h->qh_ops = &quotafile_ops_2;
+       else if (fmt == QF_META)
+               h->qh_ops = &quotafile_ops_meta;
+       memset(&h->qh_info, 0, sizeof(h->qh_info));
+
+       if (h->qh_ops->init_io && h->qh_ops->init_io(h) < 0) {
+               errstr(_("Cannot initialize quota on %s: %s\n"), h->qh_quotadev, strerror(errno));
+               goto out_lock;
+       }
+       return h;
+out_lock:
+       if (fd != -1)
+               flock(fd, LOCK_UN);
+out_handle:
+       if (qfname)
+               free(qfname);
+       free(h);
+       return NULL;
+}
+
+/*
+ *     Create new quotafile of specified format on given filesystem
+ */
+struct quota_handle *new_io(struct mntent *mnt, int type, int fmt)
+{
+       char *qfname;
+       int fd;
+       struct quota_handle *h;
+       const char *mnt_fsname;
+       char namebuf[PATH_MAX];
+
+       if (fmt == -1)
+               fmt = QF_VFSV0;
+       else if (fmt == QF_RPC || fmt == QF_XFS || meta_qf_fstype(mnt->mnt_type)) {
+               errstr(_("Creation of %s quota format is not supported.\n"),
+                       fmt2name(fmt));
+               return NULL;
+       }
+       if (get_qf_name(mnt, type, fmt, 0, &qfname) < 0)
+               return NULL;
+       sstrncpy(namebuf, qfname, PATH_MAX);
+       sstrncat(namebuf, ".new", PATH_MAX);
+       free(qfname);
+       if ((fd = open(namebuf, O_RDWR | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR)) < 0) {
+               errstr(_("Cannot create new quotafile %s: %s\n"),
+                       namebuf, strerror(errno));
+               return NULL;
+       }
+       if (!(mnt_fsname = get_device_name(mnt->mnt_fsname)))
+               goto out_fd;
+       h = smalloc(sizeof(struct quota_handle));
+
+       h->qh_fd = fd;
+       h->qh_io_flags = 0;
+       sstrncpy(h->qh_quotadev, mnt_fsname, sizeof(h->qh_quotadev));
+       free((char *)mnt_fsname);
+       h->qh_type = type;
+       h->qh_fmt = fmt;
+       memset(&h->qh_info, 0, sizeof(h->qh_info));
+       if (fmt == QF_VFSOLD)
+               h->qh_ops = &quotafile_ops_1;
+       else
+               h->qh_ops = &quotafile_ops_2;
+
+       flock(fd, LOCK_EX);
+       if (h->qh_ops->new_io && h->qh_ops->new_io(h) < 0) {
+               flock(fd, LOCK_UN);
+               free(h);
+               goto out_fd;
+       }
+       return h;
+out_fd:
+       close(fd);
+       return NULL;
+}
+
+/*
+ *     Close quotafile and release handle
+ */
+int end_io(struct quota_handle *h)
+{
+       if (h->qh_io_flags & IOFL_INFODIRTY) {
+               if (h->qh_ops->write_info && h->qh_ops->write_info(h) < 0)
+                       return -1;
+               h->qh_io_flags &= ~IOFL_INFODIRTY;
+       }
+       if (h->qh_ops->end_io && h->qh_ops->end_io(h) < 0)
+               return -1;
+       if (h->qh_fd != -1) {
+               flock(h->qh_fd, LOCK_UN);
+               close(h->qh_fd);
+       }
+       free(h);
+       return 0;
+}
+
+/*
+ *     Create empty quota structure
+ */
+struct dquot *get_empty_dquot(void)
+{
+       struct dquot *dquot = smalloc(sizeof(struct dquot));
+
+       memset(dquot, 0, sizeof(*dquot));
+       dquot->dq_id = -1;
+       return dquot;
+}
diff --git a/quotaio.h b/quotaio.h
new file mode 100644 (file)
index 0000000..2ee734a
--- /dev/null
+++ b/quotaio.h
@@ -0,0 +1,173 @@
+/*
+ *
+ *     Header of IO operations for quota utilities
+ *
+ */
+
+#ifndef GUARD_QUOTAIO_H
+#define GUARD_QUOTAIO_H
+
+#include <limits.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include "quota.h"
+#include "mntopt.h"
+#include "dqblk_v1.h"
+#include "dqblk_v2.h"
+#include "dqblk_rpc.h"
+#include "dqblk_xfs.h"
+
+#define QUOTAFORMATS 6
+
+#define INITQFBASENAMES {\
+       "quota",\
+       "aquota",\
+       "aquota",\
+       "",\
+       "",\
+       "",\
+}
+
+#define MAX_FSTYPE_LEN 16              /* Maximum length of filesystem type name */
+
+/* Values for format handling */
+#define QF_ERROR -1            /* There was error while detecting format (maybe unknown format...) */
+#define QF_VFSOLD 0            /* Old quota format */
+#define QF_VFSV0 1             /* Quota files with tree quota format */
+#define QF_VFSV1 2             /* Quota files with 64-bit tree quota format */
+#define QF_RPC 3               /* RPC should be used on given filesystem */
+#define QF_XFS 4               /* XFS quota format */
+#define QF_META 5              /* Quota files are hidden, we don't care about the format */
+
+static inline int is_tree_qfmt(int fmt)
+{
+       return fmt == QF_VFSV0 || fmt == QF_VFSV1;
+}
+
+/*
+ * Definitions for disk quotas imposed on the average user
+ * (big brother finally hits Linux).
+ *
+ * The following constants define the default amount of time given a user
+ * before the soft limits are treated as hard limits (usually resulting
+ * in an allocation failure). The timer is started when the user crosses
+ * their soft limit, it is reset when they go below their soft limit.
+ */
+#define MAX_IQ_TIME  604800    /* (7*24*60*60) 1 week */
+#define MAX_DQ_TIME  604800    /* (7*24*60*60) 1 week */
+
+#define IOFL_QUOTAON   0x01    /* Is quota enabled in kernel? */
+#define IOFL_INFODIRTY 0x02    /* Did info change? */
+#define IOFL_RO                0x04    /* Just RO access? */
+#define IOFL_NFS_MIXED_PATHS   0x08    /* Should we trim leading slashes
+                                          from NFSv4 mountpoints? */
+
+struct quotafile_ops;
+
+/* Generic information about quotafile */
+struct util_dqinfo {
+       time_t dqi_bgrace;      /* Block grace time for given quotafile */
+       time_t dqi_igrace;      /* Inode grace time for given quotafile */
+       union {
+               struct v2_mem_dqinfo v2_mdqi;
+               struct xfs_mem_dqinfo xfs_mdqi;
+       } u;                    /* Format specific info about quotafile */
+};
+
+/* Structure for one opened quota file */
+struct quota_handle {
+       int qh_fd;              /* Handle of file (-1 when IOFL_QUOTAON) */
+       int qh_io_flags;        /* IO flags for file */
+       char qh_quotadev[PATH_MAX];     /* Device file is for */
+       char qh_fstype[MAX_FSTYPE_LEN]; /* Type of the filesystem on qh_quotadev */
+       int qh_type;            /* Type of quotafile */
+       int qh_fmt;             /* Quotafile format */
+       struct stat qh_stat;    /* stat(2) for qh_quotadev */
+       struct quotafile_ops *qh_ops;   /* Operations on quotafile */
+       struct util_dqinfo qh_info;     /* Generic quotafile info */
+};
+
+/* Statistics gathered from kernel */
+struct util_dqstats {
+       u_int32_t lookups;
+       u_int32_t drops;
+       u_int32_t reads;
+       u_int32_t writes;
+       u_int32_t cache_hits;
+       u_int32_t allocated_dquots;
+       u_int32_t free_dquots;
+       u_int32_t syncs;
+       u_int32_t version;
+};
+
+/* Utility quota block */
+struct util_dqblk {
+       qsize_t dqb_ihardlimit;
+       qsize_t dqb_isoftlimit;
+       qsize_t dqb_curinodes;
+       qsize_t dqb_bhardlimit;
+       qsize_t dqb_bsoftlimit;
+       qsize_t dqb_curspace;
+       time_t dqb_btime;
+       time_t dqb_itime;
+       union {
+               struct v2_mem_dqblk v2_mdqb;
+       } u;                    /* Format specific dquot information */
+};
+
+#define DQ_FOUND 0x01          /* Dquot was found in the edquotas file */
+#define DQ_PRINTED 0x02                /* Dquota has been already printed by repquota */
+
+/* Structure for one loaded quota */
+struct dquot {
+       struct dquot *dq_next;  /* Pointer to next dquot in the list */
+       qid_t dq_id;            /* ID dquot belongs to */
+       int dq_flags;           /* Some flags for utils */
+       struct quota_handle *dq_h;      /* Handle of quotafile dquot belongs to */
+       struct util_dqblk dq_dqb;       /* Parsed data of dquot */
+};
+
+/* Flags for commit function (have effect only when quota in kernel is turned on) */
+#define COMMIT_USAGE QIF_USAGE
+#define COMMIT_LIMITS QIF_LIMITS
+#define COMMIT_TIMES QIF_TIMES
+#define COMMIT_ALL (COMMIT_USAGE | COMMIT_LIMITS | COMMIT_TIMES)
+
+/* Structure of quotafile operations */
+struct quotafile_ops {
+       int (*check_file) (int fd, int type, int fmt);  /* Check whether quotafile is in our format */
+       int (*init_io) (struct quota_handle * h);       /* Open quotafile */
+       int (*new_io) (struct quota_handle * h);        /* Create new quotafile */
+       int (*end_io) (struct quota_handle * h);        /* Write all changes and close quotafile */
+       int (*write_info) (struct quota_handle * h);    /* Write info about quotafile */
+       struct dquot *(*read_dquot) (struct quota_handle * h, qid_t id);        /* Read dquot into memory */
+       int (*commit_dquot) (struct dquot * dquot, int flag);   /* Write given dquot to disk */
+       int (*scan_dquots) (struct quota_handle * h, int (*process_dquot) (struct dquot * dquot, char * dqname));       /* Scan quotafile and call callback on every structure */
+       int (*report) (struct quota_handle * h, int verbose);   /* Function called after 'repquota' to print format specific file information */
+};
+
+/* This might go into a special header file but that sounds a bit silly... */
+extern struct quotafile_ops quotafile_ops_meta;
+
+static inline void mark_quotafile_info_dirty(struct quota_handle *h)
+{
+       h->qh_io_flags |= IOFL_INFODIRTY;
+}
+
+#define QIO_ENABLED(h) ((h)->qh_io_flags & IOFL_QUOTAON)
+#define QIO_RO(h)      ((h)->qh_io_flags & IOFL_RO)
+
+/* Check quota format used on specified medium and initialize it */
+struct quota_handle *init_io(struct mntent *mnt, int type, int fmt, int flags);
+
+/* Create new quotafile of specified format on given filesystem */
+struct quota_handle *new_io(struct mntent *mnt, int type, int fmt);
+
+/* Close quotafile */
+int end_io(struct quota_handle *h);
+
+/* Get empty quota structure */
+struct dquot *get_empty_dquot(void);
+
+#endif /* GUARD_QUOTAIO_H */
diff --git a/quotaio_generic.c b/quotaio_generic.c
new file mode 100644 (file)
index 0000000..e5df683
--- /dev/null
@@ -0,0 +1,100 @@
+/*
+ *     Implementation of communication with kernel generic interface
+ *
+ *     Jan Kara <jack@suse.cz> - sponsored by SuSE CR
+ */
+
+#include "config.h"
+
+#include <errno.h>
+#include <string.h>
+#include <sys/types.h>
+
+#include "pot.h"
+#include "common.h"
+#include "quotaio.h"
+#include "quota.h"
+#include "quotasys.h"
+
+/* Convert kernel quotablock format to utility one */
+static inline void generic_kern2utildqblk(struct util_dqblk *u, struct if_dqblk *k)
+{
+       u->dqb_ihardlimit = k->dqb_ihardlimit;
+       u->dqb_isoftlimit = k->dqb_isoftlimit;
+       u->dqb_bhardlimit = k->dqb_bhardlimit;
+       u->dqb_bsoftlimit = k->dqb_bsoftlimit;
+       u->dqb_curinodes = k->dqb_curinodes;
+       u->dqb_curspace = k->dqb_curspace;
+       u->dqb_itime = k->dqb_itime;
+       u->dqb_btime = k->dqb_btime;
+}
+
+/* Convert utility quotablock format to kernel one */
+static inline void generic_util2kerndqblk(struct if_dqblk *k, struct util_dqblk *u)
+{
+       k->dqb_ihardlimit = u->dqb_ihardlimit;
+       k->dqb_isoftlimit = u->dqb_isoftlimit;
+       k->dqb_bhardlimit = u->dqb_bhardlimit;
+       k->dqb_bsoftlimit = u->dqb_bsoftlimit;
+       k->dqb_curinodes = u->dqb_curinodes;
+       k->dqb_curspace = u->dqb_curspace;
+       k->dqb_itime = u->dqb_itime;
+       k->dqb_btime = u->dqb_btime;
+}
+
+/* Get info from kernel to handle */
+int vfs_get_info(struct quota_handle *h)
+{
+       struct if_dqinfo kinfo;
+
+       if (quotactl(QCMD(Q_GETINFO, h->qh_type), h->qh_quotadev, 0, (void *)&kinfo) < 0) {
+               errstr(_("Cannot get info for %s quota file from kernel on %s: %s\n"), type2name(h->qh_type), h->qh_quotadev, strerror(errno));
+               return -1;
+       }
+       h->qh_info.dqi_bgrace = kinfo.dqi_bgrace;
+       h->qh_info.dqi_igrace = kinfo.dqi_igrace;
+       return 0;
+}
+
+/* Set info in kernel from handle */
+int vfs_set_info(struct quota_handle *h, int flags)
+{
+       struct if_dqinfo kinfo;
+
+       kinfo.dqi_bgrace = h->qh_info.dqi_bgrace;
+       kinfo.dqi_igrace = h->qh_info.dqi_igrace;
+       kinfo.dqi_valid = flags;
+
+       if (quotactl(QCMD(Q_SETINFO, h->qh_type), h->qh_quotadev, 0, (void *)&kinfo) < 0) {
+               errstr(_("Cannot set info for %s quota file from kernel on %s: %s\n"), type2name(h->qh_type), h->qh_quotadev, strerror(errno));
+               return -1;
+       }
+       return 0;
+}
+
+/* Get dquot from kernel */
+int vfs_get_dquot(struct dquot *dquot)
+{
+       struct if_dqblk kdqblk;
+
+       if (quotactl(QCMD(Q_GETQUOTA, dquot->dq_h->qh_type), dquot->dq_h->qh_quotadev, dquot->dq_id, (void *)&kdqblk) < 0) {
+               errstr(_("Cannot get quota for %s %d from kernel on %s: %s\n"), type2name(dquot->dq_h->qh_type), dquot->dq_id, dquot->dq_h->qh_quotadev, strerror(errno));
+               return -1;
+       }
+       generic_kern2utildqblk(&dquot->dq_dqb, &kdqblk);
+       return 0;
+}
+
+/* Set dquot in kernel */
+int vfs_set_dquot(struct dquot *dquot, int flags)
+{
+       struct if_dqblk kdqblk;
+
+       generic_util2kerndqblk(&kdqblk, &dquot->dq_dqb);
+       kdqblk.dqb_valid = flags;
+       if (quotactl(QCMD(Q_SETQUOTA, dquot->dq_h->qh_type), dquot->dq_h->qh_quotadev, dquot->dq_id, (void *)&kdqblk) < 0) {
+               errstr(_("Cannot set quota for %s %d from kernel on %s: %s\n"), type2name(dquot->dq_h->qh_type), dquot->dq_id, dquot->dq_h->qh_quotadev, strerror(errno));
+               return -1;
+       }
+       return 0;
+}
diff --git a/quotaio_generic.h b/quotaio_generic.h
new file mode 100644 (file)
index 0000000..422fb52
--- /dev/null
@@ -0,0 +1,24 @@
+/*
+ *
+ *     Header file for communication with kernel generic interface
+ *
+ */
+
+#ifndef GUARD_QUOTAIO_GENERIC_H
+#define GUARD_QUOTAIO_GENERIC_H
+
+#include "quotaio.h"
+
+/* Get info from kernel to handle */
+int vfs_get_info(struct quota_handle *h);
+
+/* Set info in kernel from handle */
+int vfs_set_info(struct quota_handle *h, int flags);
+
+/* Get dquot from kernel */
+int vfs_get_dquot(struct dquot *dquot);
+
+/* Set dquot in kernel */
+int vfs_set_dquot(struct dquot *dquot, int flags);
+
+#endif
diff --git a/quotaio_meta.c b/quotaio_meta.c
new file mode 100644 (file)
index 0000000..f1f714f
--- /dev/null
@@ -0,0 +1,61 @@
+/*
+ *     Implementation of handling of quotafiles which are hidden
+ *
+ *     Jan Kara <jack@suse.cz>
+ */
+
+#include "config.h"
+
+#include <string.h>
+#include <stdlib.h>
+
+#include <sys/types.h>
+
+#include "pot.h"
+#include "common.h"
+#include "quotasys.h"
+#include "quotaio_generic.h"
+
+static int meta_init_io(struct quota_handle *h)
+{
+       if (!QIO_ENABLED(h)) {
+               errstr(_("Metadata init_io called when kernel support is not enabled.\n"));
+               return -1;
+       }
+       if (kernel_iface != IFACE_GENERIC) {
+               errstr(_("Metadata init_io called when kernel does not support generic quota interface!\n"));
+               return -1;
+       }
+       return vfs_get_info(h);
+}
+
+static int meta_write_info(struct quota_handle *h)
+{
+       return vfs_set_info(h, IIF_BGRACE | IIF_IGRACE);
+}
+
+static struct dquot *meta_read_dquot(struct quota_handle *h, qid_t id)
+{
+       struct dquot *dquot = get_empty_dquot();
+
+       dquot->dq_id = id;
+       dquot->dq_h = h;
+       memset(&dquot->dq_dqb, 0, sizeof(struct util_dqblk));
+       if (vfs_get_dquot(dquot) < 0) {
+               free(dquot);
+               return NULL;
+       }
+       return dquot;
+}
+
+static int meta_commit_dquot(struct dquot *dquot, int flags)
+{
+       return vfs_set_dquot(dquot, flags);
+}
+
+struct quotafile_ops quotafile_ops_meta = {
+init_io:       meta_init_io,
+write_info:    meta_write_info,
+read_dquot:    meta_read_dquot,
+commit_dquot:  meta_commit_dquot,
+};
diff --git a/quotaio_rpc.c b/quotaio_rpc.c
new file mode 100644 (file)
index 0000000..14fe410
--- /dev/null
@@ -0,0 +1,71 @@
+/*
+ *     quotaio_rpc.c - quota IO operations for RPC (just wrappers for RPC calls)
+ */
+
+#include "config.h"
+
+#include <stdio.h>
+#include <errno.h>
+#include <stdlib.h>
+#include <sys/types.h>
+
+#include "common.h"
+#include "quotaio.h"
+#include "dqblk_rpc.h"
+#include "rquota_client.h"
+#include "pot.h"
+
+static struct dquot *rpc_read_dquot(struct quota_handle *h, qid_t id);
+static int rpc_commit_dquot(struct dquot *dquot, int flags);
+
+struct quotafile_ops quotafile_ops_rpc = {
+read_dquot:    rpc_read_dquot,
+commit_dquot:  rpc_commit_dquot
+};
+
+/*
+ *     Read a dqblk struct from RPC server - just wrapper function.
+ */
+static struct dquot *rpc_read_dquot(struct quota_handle *h, qid_t id)
+{
+#ifdef RPC
+       struct dquot *dquot = get_empty_dquot();
+       int ret;
+
+       dquot->dq_id = id;
+       dquot->dq_h = h;
+       if ((ret = rpc_rquota_get(dquot)) < 0) {
+               errno = -ret;
+               free(dquot);
+               return NULL;
+       }
+       return dquot;
+#else
+       errno = ENOTSUP;
+       return NULL;
+#endif
+}
+
+/*
+ *     Write a dqblk struct to RPC server - just wrapper function.
+ */
+static int rpc_commit_dquot(struct dquot *dquot, int flags)
+{
+#ifdef RPC
+       int ret;
+
+       if (QIO_RO(dquot->dq_h)) {
+               errstr(_("Trying to write quota to readonly quotafile on %s\n"), dquot->dq_h->qh_quotadev);
+               errno = EPERM;
+               return -1;
+       }
+       if ((ret = rpc_rquota_set(QCMD(Q_RPC_SETQUOTA, dquot->dq_h->qh_type), dquot)) < 0) {
+               errno = -ret;
+               return -1;
+       }
+       return 0;
+#else
+       errno = ENOTSUP;
+       return -1;
+#endif
+}
diff --git a/quotaio_tree.c b/quotaio_tree.c
new file mode 100644 (file)
index 0000000..cdc0e8f
--- /dev/null
@@ -0,0 +1,521 @@
+/*
+ *     Implementation of new quotafile format
+ *
+ *     Jan Kara <jack@suse.cz> - sponsored by SuSE CR
+ */
+
+#include "config.h"
+
+#include <sys/types.h>
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <asm/byteorder.h>
+
+#include "pot.h"
+#include "common.h"
+#include "quota_tree.h"
+#include "quotaio.h"
+#include "quotasys.h"
+#include "quotaio_generic.h"
+
+typedef char *dqbuf_t;
+
+#define getdqbuf() smalloc(QT_BLKSIZE)
+#define freedqbuf(buf) free(buf)
+
+/* Is given dquot empty? */
+int qtree_entry_unused(struct qtree_mem_dqinfo *info, char *disk)
+{
+       int i;
+
+       for (i = 0; i < info->dqi_entry_size; i++)
+               if (disk[i])
+                       return 0;
+       return 1;
+}
+
+int qtree_dqstr_in_blk(struct qtree_mem_dqinfo *info)
+{
+       return (QT_BLKSIZE - sizeof(struct qt_disk_dqdbheader)) / info->dqi_entry_size;
+}
+
+static int get_index(qid_t id, int depth)
+{
+       return (id >> ((QT_TREEDEPTH - depth - 1) * 8)) & 0xff;
+}
+
+/* Read given block */
+static void read_blk(struct quota_handle *h, uint blk, dqbuf_t buf)
+{
+       int err;
+
+       lseek(h->qh_fd, blk << QT_BLKSIZE_BITS, SEEK_SET);
+       err = read(h->qh_fd, buf, QT_BLKSIZE);
+       if (err < 0)
+               die(2, _("Cannot read block %u: %s\n"), blk, strerror(errno));
+       else if (err != QT_BLKSIZE)
+               memset(buf + err, 0, QT_BLKSIZE - err);
+}
+
+/* Write block */
+static int write_blk(struct quota_handle *h, uint blk, dqbuf_t buf)
+{
+       int err;
+
+       lseek(h->qh_fd, blk << QT_BLKSIZE_BITS, SEEK_SET);
+       err = write(h->qh_fd, buf, QT_BLKSIZE);
+       if (err < 0 && errno != ENOSPC)
+               die(2, _("Cannot write block (%u): %s\n"), blk, strerror(errno));
+       if (err != QT_BLKSIZE)
+               return -ENOSPC;
+       return 0;
+}
+
+/* Get free block in file (either from free list or create new one) */
+static int get_free_dqblk(struct quota_handle *h)
+{
+       dqbuf_t buf = getdqbuf();
+       struct qt_disk_dqdbheader *dh = (struct qt_disk_dqdbheader *)buf;
+       struct qtree_mem_dqinfo *info = &h->qh_info.u.v2_mdqi.dqi_qtree;
+       int blk;
+
+       if (info->dqi_free_blk) {
+               blk = info->dqi_free_blk;
+               read_blk(h, blk, buf);
+               info->dqi_free_blk = __le32_to_cpu(dh->dqdh_next_free);
+       }
+       else {
+               memset(buf, 0, QT_BLKSIZE);
+               if (write_blk(h, info->dqi_blocks, buf) < 0) {  /* Assure block allocation... */
+                       freedqbuf(buf);
+                       errstr(_("Cannot allocate new quota block (out of disk space).\n"));
+                       return -ENOSPC;
+               }
+               blk = info->dqi_blocks++;
+       }
+       mark_quotafile_info_dirty(h);
+       freedqbuf(buf);
+       return blk;
+}
+
+/* Put given block to free list */
+static void put_free_dqblk(struct quota_handle *h, dqbuf_t buf, uint blk)
+{
+       struct qt_disk_dqdbheader *dh = (struct qt_disk_dqdbheader *)buf;
+       struct qtree_mem_dqinfo *info = &h->qh_info.u.v2_mdqi.dqi_qtree;
+
+       dh->dqdh_next_free = __cpu_to_le32(info->dqi_free_blk);
+       dh->dqdh_prev_free = __cpu_to_le32(0);
+       dh->dqdh_entries = __cpu_to_le16(0);
+       info->dqi_free_blk = blk;
+       mark_quotafile_info_dirty(h);
+       write_blk(h, blk, buf);
+}
+
+/* Remove given block from the list of blocks with free entries */
+static void remove_free_dqentry(struct quota_handle *h, dqbuf_t buf, uint blk)
+{
+       dqbuf_t tmpbuf = getdqbuf();
+       struct qt_disk_dqdbheader *dh = (struct qt_disk_dqdbheader *)buf;
+       uint nextblk = __le32_to_cpu(dh->dqdh_next_free), prevblk =
+
+               __le32_to_cpu(dh->dqdh_prev_free);
+
+       if (nextblk) {
+               read_blk(h, nextblk, tmpbuf);
+               ((struct qt_disk_dqdbheader *)tmpbuf)->dqdh_prev_free = dh->dqdh_prev_free;
+               write_blk(h, nextblk, tmpbuf);
+       }
+       if (prevblk) {
+               read_blk(h, prevblk, tmpbuf);
+               ((struct qt_disk_dqdbheader *)tmpbuf)->dqdh_next_free = dh->dqdh_next_free;
+               write_blk(h, prevblk, tmpbuf);
+       }
+       else {
+               h->qh_info.u.v2_mdqi.dqi_qtree.dqi_free_entry = nextblk;
+               mark_quotafile_info_dirty(h);
+       }
+       freedqbuf(tmpbuf);
+       dh->dqdh_next_free = dh->dqdh_prev_free = __cpu_to_le32(0);
+       write_blk(h, blk, buf); /* No matter whether write succeeds block is out of list */
+}
+
+/* Insert given block to the beginning of list with free entries */
+static void insert_free_dqentry(struct quota_handle *h, dqbuf_t buf, uint blk)
+{
+       dqbuf_t tmpbuf = getdqbuf();
+       struct qt_disk_dqdbheader *dh = (struct qt_disk_dqdbheader *)buf;
+       struct qtree_mem_dqinfo *info = &h->qh_info.u.v2_mdqi.dqi_qtree;
+
+       dh->dqdh_next_free = __cpu_to_le32(info->dqi_free_entry);
+       dh->dqdh_prev_free = __cpu_to_le32(0);
+       write_blk(h, blk, buf);
+       if (info->dqi_free_entry) {
+               read_blk(h, info->dqi_free_entry, tmpbuf);
+               ((struct qt_disk_dqdbheader *)tmpbuf)->dqdh_prev_free = __cpu_to_le32(blk);
+               write_blk(h, info->dqi_free_entry, tmpbuf);
+       }
+       freedqbuf(tmpbuf);
+       info->dqi_free_entry = blk;
+       mark_quotafile_info_dirty(h);
+}
+
+/* Find space for dquot */
+static uint find_free_dqentry(struct quota_handle *h, struct dquot *dquot, int *err)
+{
+       int blk, i;
+       struct qt_disk_dqdbheader *dh;
+       struct qtree_mem_dqinfo *info = &h->qh_info.u.v2_mdqi.dqi_qtree;
+       char *ddquot;
+       dqbuf_t buf;
+
+       *err = 0;
+       buf = getdqbuf();
+       dh = (struct qt_disk_dqdbheader *)buf;
+       if (info->dqi_free_entry) {
+               blk = info->dqi_free_entry;
+               read_blk(h, blk, buf);
+       }
+       else {
+               blk = get_free_dqblk(h);
+               if (blk < 0) {
+                       freedqbuf(buf);
+                       *err = blk;
+                       return 0;
+               }
+               memset(buf, 0, QT_BLKSIZE);
+               info->dqi_free_entry = blk;
+               mark_quotafile_info_dirty(h);
+       }
+       if (__le16_to_cpu(dh->dqdh_entries) + 1 >= qtree_dqstr_in_blk(info))    /* Block will be full? */
+               remove_free_dqentry(h, buf, blk);
+       dh->dqdh_entries = __cpu_to_le16(__le16_to_cpu(dh->dqdh_entries) + 1);
+       /* Find free structure in block */
+       ddquot = buf + sizeof(struct qt_disk_dqdbheader);
+       for (i = 0;
+            i < qtree_dqstr_in_blk(info) && !qtree_entry_unused(info, ddquot);
+            i++, ddquot += info->dqi_entry_size);
+       if (i == qtree_dqstr_in_blk(info))
+               die(2, _("find_free_dqentry(): Data block full but it shouldn't.\n"));
+       write_blk(h, blk, buf);
+       dquot->dq_dqb.u.v2_mdqb.dqb_off =
+               (blk << QT_BLKSIZE_BITS) + sizeof(struct qt_disk_dqdbheader) +
+               i * info->dqi_entry_size;
+       freedqbuf(buf);
+       return blk;
+}
+
+/* Insert reference to structure into the trie */
+static int do_insert_tree(struct quota_handle *h, struct dquot *dquot, uint * treeblk, int depth)
+{
+       dqbuf_t buf;
+       int newson = 0, newact = 0;
+       u_int32_t *ref;
+       uint newblk;
+       int ret = 0;
+
+       buf = getdqbuf();
+       if (!*treeblk) {
+               ret = get_free_dqblk(h);
+               if (ret < 0)
+                       goto out_buf;
+               *treeblk = ret;
+               memset(buf, 0, QT_BLKSIZE);
+               newact = 1;
+       }
+       else
+               read_blk(h, *treeblk, buf);
+       ref = (u_int32_t *) buf;
+       newblk = __le32_to_cpu(ref[get_index(dquot->dq_id, depth)]);
+       if (!newblk)
+               newson = 1;
+       if (depth == QT_TREEDEPTH - 1) {
+               if (newblk)
+                       die(2, _("Inserting already present quota entry (block %u).\n"),
+                           ref[get_index(dquot->dq_id, depth)]);
+               newblk = find_free_dqentry(h, dquot, &ret);
+       }
+       else
+               ret = do_insert_tree(h, dquot, &newblk, depth + 1);
+       if (newson && ret >= 0) {
+               ref[get_index(dquot->dq_id, depth)] = __cpu_to_le32(newblk);
+               write_blk(h, *treeblk, buf);
+       }
+       else if (newact && ret < 0)
+               put_free_dqblk(h, buf, *treeblk);
+out_buf:
+       freedqbuf(buf);
+       return ret;
+}
+
+/* Wrapper for inserting quota structure into tree */
+static void dq_insert_tree(struct quota_handle *h, struct dquot *dquot)
+{
+       uint tmp = QT_TREEOFF;
+
+       if (do_insert_tree(h, dquot, &tmp, 0) < 0)
+               die(2, _("Cannot write quota (id %u): %s\n"), (uint) dquot->dq_id, strerror(errno));
+}
+
+/* Write dquot to file */
+void qtree_write_dquot(struct dquot *dquot)
+{
+       ssize_t ret;
+       struct qtree_mem_dqinfo *info = &dquot->dq_h->qh_info.u.v2_mdqi.dqi_qtree;
+       char *ddquot = smalloc(info->dqi_entry_size);
+
+       if (!dquot->dq_dqb.u.v2_mdqb.dqb_off)
+               dq_insert_tree(dquot->dq_h, dquot);
+       lseek(dquot->dq_h->qh_fd, dquot->dq_dqb.u.v2_mdqb.dqb_off, SEEK_SET);
+       info->dqi_ops->mem2disk_dqblk(ddquot, dquot);
+       ret = write(dquot->dq_h->qh_fd, ddquot, info->dqi_entry_size);
+       if (ret != info->dqi_entry_size) {
+               if (ret > 0)
+                       errno = ENOSPC;
+               die(2, _("Quota write failed (id %u): %s\n"), (uint)dquot->dq_id, strerror(errno));
+       }
+}
+
+/* Free dquot entry in data block */
+static void free_dqentry(struct quota_handle *h, struct dquot *dquot, uint blk)
+{
+       struct qt_disk_dqdbheader *dh;
+       struct qtree_mem_dqinfo *info = &h->qh_info.u.v2_mdqi.dqi_qtree;
+       dqbuf_t buf = getdqbuf();
+
+       if (dquot->dq_dqb.u.v2_mdqb.dqb_off >> QT_BLKSIZE_BITS != blk)
+               die(2, _("Quota structure has offset to other block (%u) than it should (%u).\n"), blk,
+                   (uint) (dquot->dq_dqb.u.v2_mdqb.dqb_off >> QT_BLKSIZE_BITS));
+       read_blk(h, blk, buf);
+       dh = (struct qt_disk_dqdbheader *)buf;
+       dh->dqdh_entries = __cpu_to_le16(__le16_to_cpu(dh->dqdh_entries) - 1);
+       if (!__le16_to_cpu(dh->dqdh_entries)) { /* Block got free? */
+               remove_free_dqentry(h, buf, blk);
+               put_free_dqblk(h, buf, blk);
+       }
+       else {
+               memset(buf + (dquot->dq_dqb.u.v2_mdqb.dqb_off & ((1 << QT_BLKSIZE_BITS) - 1)), 0,
+                      info->dqi_entry_size);
+
+               if (__le16_to_cpu(dh->dqdh_entries) == qtree_dqstr_in_blk(info) - 1)    /* First free entry? */
+                       insert_free_dqentry(h, buf, blk);       /* This will also write data block */
+               else
+                       write_blk(h, blk, buf);
+       }
+       dquot->dq_dqb.u.v2_mdqb.dqb_off = 0;
+       freedqbuf(buf);
+}
+
+/* Remove reference to dquot from tree */
+static void remove_tree(struct quota_handle *h, struct dquot *dquot, uint * blk, int depth)
+{
+       dqbuf_t buf = getdqbuf();
+       uint newblk;
+       u_int32_t *ref = (u_int32_t *) buf;
+
+       read_blk(h, *blk, buf);
+       newblk = __le32_to_cpu(ref[get_index(dquot->dq_id, depth)]);
+       if (depth == QT_TREEDEPTH - 1) {
+               free_dqentry(h, dquot, newblk);
+               newblk = 0;
+       }
+       else
+               remove_tree(h, dquot, &newblk, depth + 1);
+       if (!newblk) {
+               int i;
+
+               ref[get_index(dquot->dq_id, depth)] = __cpu_to_le32(0);
+               for (i = 0; i < QT_BLKSIZE && !buf[i]; i++);    /* Block got empty? */
+               /* Don't put the root block into the free block list */
+               if (i == QT_BLKSIZE && *blk != QT_TREEOFF) {
+                       put_free_dqblk(h, buf, *blk);
+                       *blk = 0;
+               }
+               else
+                       write_blk(h, *blk, buf);
+       }
+       freedqbuf(buf);
+}
+
+/* Delete dquot from tree */
+void qtree_delete_dquot(struct dquot *dquot)
+{
+       uint tmp = QT_TREEOFF;
+
+       if (!dquot->dq_dqb.u.v2_mdqb.dqb_off)   /* Even not allocated? */
+               return;
+       remove_tree(dquot->dq_h, dquot, &tmp, 0);
+}
+
+/* Find entry in block */
+static loff_t find_block_dqentry(struct quota_handle *h, struct dquot *dquot, uint blk)
+{
+       struct qtree_mem_dqinfo *info = &h->qh_info.u.v2_mdqi.dqi_qtree;
+       dqbuf_t buf = getdqbuf();
+       int i;
+       char *ddquot = buf + sizeof(struct qt_disk_dqdbheader);
+
+       read_blk(h, blk, buf);
+       for (i = 0;
+            i < qtree_dqstr_in_blk(info) && !info->dqi_ops->is_id(ddquot, dquot);
+            i++, ddquot += info->dqi_entry_size);
+       if (i == qtree_dqstr_in_blk(info))
+               die(2, _("Quota for id %u referenced but not present.\n"), dquot->dq_id);
+       freedqbuf(buf);
+       return (blk << QT_BLKSIZE_BITS) + sizeof(struct qt_disk_dqdbheader) +
+               i * info->dqi_entry_size;
+}
+
+/* Find entry for given id in the tree */
+static loff_t find_tree_dqentry(struct quota_handle *h, struct dquot *dquot, uint blk, int depth)
+{
+       dqbuf_t buf = getdqbuf();
+       loff_t ret = 0;
+       u_int32_t *ref = (u_int32_t *) buf;
+
+       read_blk(h, blk, buf);
+       ret = 0;
+       blk = __le32_to_cpu(ref[get_index(dquot->dq_id, depth)]);
+       if (!blk)               /* No reference? */
+               goto out_buf;
+       if (depth < QT_TREEDEPTH - 1)
+               ret = find_tree_dqentry(h, dquot, blk, depth + 1);
+       else
+               ret = find_block_dqentry(h, dquot, blk);
+      out_buf:
+       freedqbuf(buf);
+       return ret;
+}
+
+/* Find entry for given id in the tree - wrapper function */
+static inline loff_t find_dqentry(struct quota_handle *h, struct dquot *dquot)
+{
+       return find_tree_dqentry(h, dquot, QT_TREEOFF, 0);
+}
+
+/*
+ *  Read dquot (either from disk or from kernel)
+ *  User can use errno to detect errstr when NULL is returned
+ */
+struct dquot *qtree_read_dquot(struct quota_handle *h, qid_t id)
+{
+       struct qtree_mem_dqinfo *info = &h->qh_info.u.v2_mdqi.dqi_qtree;
+       loff_t offset;
+       ssize_t ret;
+       char *ddquot = smalloc(info->dqi_entry_size);
+       struct dquot *dquot = get_empty_dquot();
+
+       dquot->dq_id = id;
+       dquot->dq_h = h;
+       dquot->dq_dqb.u.v2_mdqb.dqb_off = 0;
+       memset(&dquot->dq_dqb, 0, sizeof(struct util_dqblk));
+
+       offset = find_dqentry(h, dquot);
+       if (offset > 0) {
+               dquot->dq_dqb.u.v2_mdqb.dqb_off = offset;
+               lseek(h->qh_fd, offset, SEEK_SET);
+               ret = read(h->qh_fd, ddquot, info->dqi_entry_size);
+               if (ret != info->dqi_entry_size) {
+                       if (ret > 0)
+                               errno = EIO;
+                       die(2, _("Cannot read quota structure for id %u: %s\n"), dquot->dq_id,
+                           strerror(errno));
+               }
+               info->dqi_ops->disk2mem_dqblk(dquot, ddquot);
+       }
+       return dquot;
+}
+
+/*
+ *     Scan all dquots in file and call callback on each
+ */
+#define set_bit(bmp, ind) ((bmp)[(ind) >> 3] |= (1 << ((ind) & 7)))
+#define get_bit(bmp, ind) ((bmp)[(ind) >> 3] & (1 << ((ind) & 7)))
+
+static int report_block(struct dquot *dquot, uint blk, char *bitmap,
+                       int (*process_dquot) (struct dquot *, char *))
+{
+       struct qtree_mem_dqinfo *info = &dquot->dq_h->qh_info.u.v2_mdqi.dqi_qtree;
+       dqbuf_t buf = getdqbuf();
+       struct qt_disk_dqdbheader *dh;
+       char *ddata;
+       int entries, i;
+
+       set_bit(bitmap, blk);
+       read_blk(dquot->dq_h, blk, buf);
+       dh = (struct qt_disk_dqdbheader *)buf;
+       ddata = buf + sizeof(struct qt_disk_dqdbheader);
+       entries = __le16_to_cpu(dh->dqdh_entries);
+       for (i = 0; i < qtree_dqstr_in_blk(info); i++, ddata += info->dqi_entry_size)
+               if (!qtree_entry_unused(info, ddata)) {
+                       info->dqi_ops->disk2mem_dqblk(dquot, ddata);
+                       if (process_dquot(dquot, NULL) < 0)
+                               break;
+               }
+       freedqbuf(buf);
+       return entries;
+}
+
+static void check_reference(struct quota_handle *h, uint blk)
+{
+       if (blk >= h->qh_info.u.v2_mdqi.dqi_qtree.dqi_blocks)
+               die(2, _("Illegal reference (%u >= %u) in %s quota file on %s. Quota file is probably corrupted.\nPlease run quotacheck(8) and try again.\n"), blk, h->qh_info.u.v2_mdqi.dqi_qtree.dqi_blocks, type2name(h->qh_type), h->qh_quotadev);
+}
+
+static int report_tree(struct dquot *dquot, uint blk, int depth, char *bitmap,
+                      int (*process_dquot) (struct dquot *, char *))
+{
+       int entries = 0, i;
+       dqbuf_t buf = getdqbuf();
+       u_int32_t *ref = (u_int32_t *) buf;
+
+       read_blk(dquot->dq_h, blk, buf);
+       if (depth == QT_TREEDEPTH - 1) {
+               for (i = 0; i < QT_BLKSIZE >> 2; i++) {
+                       blk = __le32_to_cpu(ref[i]);
+                       check_reference(dquot->dq_h, blk);
+                       if (blk && !get_bit(bitmap, blk))
+                               entries += report_block(dquot, blk, bitmap, process_dquot);
+               }
+       }
+       else {
+               for (i = 0; i < QT_BLKSIZE >> 2; i++)
+                       if ((blk = __le32_to_cpu(ref[i]))) {
+                               check_reference(dquot->dq_h, blk);
+                               entries +=
+                                       report_tree(dquot, blk, depth + 1, bitmap, process_dquot);
+                       }
+       }
+       freedqbuf(buf);
+       return entries;
+}
+
+static uint find_set_bits(char *bmp, int blocks)
+{
+       uint i, used = 0;
+
+       for (i = 0; i < blocks; i++)
+               if (get_bit(bmp, i))
+                       used++;
+       return used;
+}
+
+int qtree_scan_dquots(struct quota_handle *h, int (*process_dquot) (struct dquot *, char *))
+{
+       char *bitmap;
+       struct v2_mem_dqinfo *v2info = &h->qh_info.u.v2_mdqi;
+       struct qtree_mem_dqinfo *info = &v2info->dqi_qtree;
+       struct dquot *dquot = get_empty_dquot();
+
+       dquot->dq_h = h;
+       bitmap = smalloc((info->dqi_blocks + 7) >> 3);
+       memset(bitmap, 0, (info->dqi_blocks + 7) >> 3);
+       v2info->dqi_used_entries = report_tree(dquot, QT_TREEOFF, 0, bitmap, process_dquot);
+       v2info->dqi_data_blocks = find_set_bits(bitmap, info->dqi_blocks);
+       free(bitmap);
+       free(dquot);
+       return 0;
+}
diff --git a/quotaio_v1.c b/quotaio_v1.c
new file mode 100644 (file)
index 0000000..0edbc16
--- /dev/null
@@ -0,0 +1,389 @@
+/*
+ * Copyright (c) 1980, 1990 Regents of the University of California. All
+ * rights reserved.
+ * 
+ * This code is derived from software contributed to Berkeley by Robert Elz at
+ * The University of Melbourne.
+ * 
+ * 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. 3. All advertising
+ * materials mentioning features or use of this software must display the
+ * following acknowledgement: This product includes software developed by the
+ * University of California, Berkeley and its contributors. 4. Neither the
+ * name of the University nor the names of its contributors may be used to
+ * endorse or promote products derived from this software without specific
+ * prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS 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 REGENTS 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 "config.h"
+
+#include <unistd.h>
+#include <errno.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include "pot.h"
+#include "common.h"
+#include "quotaio_v1.h"
+#include "dqblk_v1.h"
+#include "quotaio.h"
+#include "quotasys.h"
+#include "quotaio_generic.h"
+
+static int v1_check_file(int fd, int type, int fmt);
+static int v1_init_io(struct quota_handle *h);
+static int v1_new_io(struct quota_handle *h);
+static int v1_write_info(struct quota_handle *h);
+static struct dquot *v1_read_dquot(struct quota_handle *h, qid_t id);
+static int v1_commit_dquot(struct dquot *dquot, int flags);
+static int v1_scan_dquots(struct quota_handle *h, int (*process_dquot) (struct dquot *dquot, char *dqname));
+
+struct quotafile_ops quotafile_ops_1 = {
+check_file:    v1_check_file,
+init_io:       v1_init_io,
+new_io:                v1_new_io,
+write_info:    v1_write_info,
+read_dquot:    v1_read_dquot,
+commit_dquot:  v1_commit_dquot,
+scan_dquots:   v1_scan_dquots,
+};
+
+/*
+ *     Copy dquot from disk to memory
+ */
+static inline void v1_disk2memdqblk(struct util_dqblk *m, struct v1_disk_dqblk *d)
+{
+       m->dqb_ihardlimit = d->dqb_ihardlimit;
+       m->dqb_isoftlimit = d->dqb_isoftlimit;
+       m->dqb_bhardlimit = d->dqb_bhardlimit;
+       m->dqb_bsoftlimit = d->dqb_bsoftlimit;
+       m->dqb_curinodes = d->dqb_curinodes;
+       m->dqb_curspace = ((qsize_t)d->dqb_curblocks) * V1_DQBLK_SIZE;
+       m->dqb_itime = d->dqb_itime;
+       m->dqb_btime = d->dqb_btime;
+}
+
+/*
+ *     Copy dquot from memory to disk
+ */
+static inline void v1_mem2diskdqblk(struct v1_disk_dqblk *d, struct util_dqblk *m)
+{
+       d->dqb_ihardlimit = m->dqb_ihardlimit;
+       d->dqb_isoftlimit = m->dqb_isoftlimit;
+       d->dqb_bhardlimit = m->dqb_bhardlimit;
+       d->dqb_bsoftlimit = m->dqb_bsoftlimit;
+       d->dqb_curinodes = m->dqb_curinodes;
+       d->dqb_curblocks = m->dqb_curspace >> V1_DQBLK_SIZE_BITS;
+       d->dqb_itime = m->dqb_itime;
+       d->dqb_btime = m->dqb_btime;
+}
+
+/* Convert kernel quotablock format to utility one */
+static inline void v1_kern2utildqblk(struct util_dqblk *u, struct v1_kern_dqblk *k)
+{
+       u->dqb_ihardlimit = k->dqb_ihardlimit;
+       u->dqb_isoftlimit = k->dqb_isoftlimit;
+       u->dqb_bhardlimit = k->dqb_bhardlimit;
+       u->dqb_bsoftlimit = k->dqb_bsoftlimit;
+       u->dqb_curinodes = k->dqb_curinodes;
+       u->dqb_curspace = ((qsize_t)k->dqb_curblocks) << V1_DQBLK_SIZE_BITS;
+       u->dqb_itime = k->dqb_itime;
+       u->dqb_btime = k->dqb_btime;
+}
+
+/* Convert utility quotablock format to kernel one */
+static inline void v1_util2kerndqblk(struct v1_kern_dqblk *k, struct util_dqblk *u)
+{
+       k->dqb_ihardlimit = u->dqb_ihardlimit;
+       k->dqb_isoftlimit = u->dqb_isoftlimit;
+       k->dqb_bhardlimit = u->dqb_bhardlimit;
+       k->dqb_bsoftlimit = u->dqb_bsoftlimit;
+       k->dqb_curinodes = u->dqb_curinodes;
+       k->dqb_curblocks = (u->dqb_curspace + V1_DQBLK_SIZE - 1) >> V1_DQBLK_SIZE_BITS;
+       k->dqb_itime = u->dqb_itime;
+       k->dqb_btime = u->dqb_btime;
+}
+
+/*
+ *     Check whether quotafile is in our format
+ */
+static int v1_check_file(int fd, int type, int fmt)
+{
+       struct stat st;
+
+       if (fstat(fd, &st) < 0)
+               return 0;
+       if (!st.st_size || st.st_size % sizeof(struct v1_disk_dqblk))
+               return 0;
+       return 1;
+}
+
+/*
+ *     Open quotafile
+ */
+static int v1_init_io(struct quota_handle *h)
+{
+       if (QIO_ENABLED(h)) {
+               if (kernel_iface == IFACE_GENERIC) {
+                       if (vfs_get_info(h) < 0)
+                               return -1;
+               }
+               else {
+                       struct v1_kern_dqblk kdqblk;
+
+                       if (quotactl(QCMD(Q_V1_GETQUOTA, h->qh_type), h->qh_quotadev, 0, (void *)&kdqblk) < 0) {
+                               if (errno == EPERM) {   /* We have no permission to get this information? */
+                                       h->qh_info.dqi_bgrace = h->qh_info.dqi_igrace = 0;      /* It hopefully won't be needed */
+                               }
+                               else
+                                       return -1;
+                       }
+                       else {
+                               h->qh_info.dqi_bgrace = kdqblk.dqb_btime;
+                               h->qh_info.dqi_igrace = kdqblk.dqb_itime;
+                       }
+               }
+       }
+       else {
+               struct v1_disk_dqblk ddqblk;
+
+               lseek(h->qh_fd, 0, SEEK_SET);
+               if (read(h->qh_fd, &ddqblk, sizeof(ddqblk)) != sizeof(ddqblk))
+                       return -1;
+               h->qh_info.dqi_bgrace = ddqblk.dqb_btime;
+               h->qh_info.dqi_igrace = ddqblk.dqb_itime;
+       }
+       if (!h->qh_info.dqi_bgrace)
+               h->qh_info.dqi_bgrace = MAX_DQ_TIME;
+       if (!h->qh_info.dqi_igrace)
+               h->qh_info.dqi_igrace = MAX_IQ_TIME;
+
+       return 0;
+}
+
+/*
+ *     Initialize new quotafile
+ */
+static int v1_new_io(struct quota_handle *h)
+{
+       struct v1_disk_dqblk ddqblk;
+
+       /* Write at least roots dquot with grace times */
+       memset(&ddqblk, 0, sizeof(ddqblk));
+       ddqblk.dqb_btime = MAX_DQ_TIME;
+       ddqblk.dqb_itime = MAX_IQ_TIME;
+       h->qh_info.dqi_bgrace = MAX_DQ_TIME;
+       h->qh_info.dqi_igrace = MAX_IQ_TIME;
+       lseek(h->qh_fd, 0, SEEK_SET);
+       if (write(h->qh_fd, &ddqblk, sizeof(ddqblk)) != sizeof(ddqblk))
+               return -1;
+       return 0;
+}
+
+/*
+ *     Write information (grace times to file)
+ */
+static int v1_write_info(struct quota_handle *h)
+{
+       if (QIO_RO(h)) {
+               errstr(_("Trying to write info to readonly quotafile on %s.\n"), h->qh_quotadev);
+               errno = EPERM;
+               return -1;
+       }
+       if (QIO_ENABLED(h)) {
+               if (kernel_iface == IFACE_GENERIC) {
+                       if (vfs_set_info(h, IIF_BGRACE | IIF_IGRACE) < 0)
+                               return -1;
+               }
+               else {
+                       struct v1_kern_dqblk kdqblk;
+
+                       if (quotactl(QCMD(Q_V1_GETQUOTA, h->qh_type), h->qh_quotadev, 0, (void *)&kdqblk) < 0)
+                               return -1;
+                       kdqblk.dqb_btime = h->qh_info.dqi_bgrace;
+                       kdqblk.dqb_itime = h->qh_info.dqi_igrace;
+                       if (quotactl(QCMD(Q_V1_SETQUOTA, h->qh_type), h->qh_quotadev, 0, (void *)&kdqblk) < 0)
+                               return -1;
+               }
+       }
+       else {
+               struct v1_disk_dqblk ddqblk;
+
+               lseek(h->qh_fd, 0, SEEK_SET);
+               if (read(h->qh_fd, &ddqblk, sizeof(ddqblk)) != sizeof(ddqblk))
+                       return -1;
+               ddqblk.dqb_btime = h->qh_info.dqi_bgrace;
+               ddqblk.dqb_itime = h->qh_info.dqi_igrace;
+               lseek(h->qh_fd, 0, SEEK_SET);
+               if (write(h->qh_fd, &ddqblk, sizeof(ddqblk)) != sizeof(ddqblk))
+                       return -1;
+       }
+       return 0;
+}
+
+/*
+ *     Read a dqblk struct from the quotafile.
+ *     User can use 'errno' to detect errstr.
+ */
+static struct dquot *v1_read_dquot(struct quota_handle *h, qid_t id)
+{
+       struct v1_disk_dqblk ddqblk;
+       struct dquot *dquot = get_empty_dquot();
+
+       dquot->dq_id = id;
+       dquot->dq_h = h;
+       if (QIO_ENABLED(h)) {   /* Does kernel use the file? */
+               if (kernel_iface == IFACE_GENERIC) {
+                       if (vfs_get_dquot(dquot) < 0) {
+                               free(dquot);
+                               return NULL;
+                       }
+               }
+               else {
+                       struct v1_kern_dqblk kdqblk;
+
+                       if (quotactl(QCMD(Q_V1_GETQUOTA, h->qh_type), h->qh_quotadev, id, (void *)&kdqblk) < 0) {
+                               free(dquot);
+                               return NULL;
+                       }
+                       v1_kern2utildqblk(&dquot->dq_dqb, &kdqblk);
+               }
+       }
+       else {
+               lseek(h->qh_fd, (long)V1_DQOFF(id), SEEK_SET);
+               switch (read(h->qh_fd, &ddqblk, sizeof(ddqblk))) {
+                       case 0: /* EOF */
+                               /*
+                                * Convert implicit 0 quota (EOF) into an
+                                * explicit one (zero'ed dqblk)
+                                */
+                               memset(&dquot->dq_dqb, 0, sizeof(struct util_dqblk));
+                               break;
+                       case sizeof(struct v1_disk_dqblk):      /* OK */
+                               v1_disk2memdqblk(&dquot->dq_dqb, &ddqblk);
+                               break;
+                       default:        /* ERROR */
+                               free(dquot);
+                               return NULL;
+               }
+       }
+       return dquot;
+}
+
+/*
+ *     Write a dqblk struct to the quotafile.
+ *     User can process use 'errno' to detect errstr
+ */
+static int v1_commit_dquot(struct dquot *dquot, int flags)
+{
+       struct v1_disk_dqblk ddqblk;
+       struct quota_handle *h = dquot->dq_h;
+
+       if (QIO_RO(h)) {
+               errstr(_("Trying to write quota to readonly quotafile on %s\n"), h->qh_quotadev);
+               errno = EPERM;
+               return -1;
+       }
+       if (QIO_ENABLED(h)) {   /* Kernel uses same file? */
+               if (kernel_iface == IFACE_GENERIC) {
+                       if (vfs_set_dquot(dquot, flags) < 0)
+                               return -1;
+               }
+               else {
+                       struct v1_kern_dqblk kdqblk;
+                       int cmd;
+
+                       if (flags == COMMIT_USAGE)
+                               cmd = Q_V1_SETUSE;
+                       else if (flags == COMMIT_LIMITS)
+                               cmd = Q_V1_SETQLIM;
+                       else if (flags & COMMIT_TIMES) {
+                               errno = EINVAL;
+                               return -1;
+                       }
+                       else
+                               cmd = Q_V1_SETQUOTA;
+                       v1_util2kerndqblk(&kdqblk, &dquot->dq_dqb);
+                       if (quotactl(QCMD(cmd, h->qh_type), h->qh_quotadev, dquot->dq_id,
+                            (void *)&kdqblk) < 0)
+                               return -1;
+               }
+       }
+       else {
+               v1_mem2diskdqblk(&ddqblk, &dquot->dq_dqb);
+               lseek(h->qh_fd, (long)V1_DQOFF(dquot->dq_id), SEEK_SET);
+               if (write(h->qh_fd, &ddqblk, sizeof(ddqblk)) != sizeof(ddqblk))
+                       return -1;
+       }
+       return 0;
+}
+
+/*
+ *     Scan all dquots in file and call callback on each
+ */
+#define SCANBUFSIZE 256
+
+static int v1_scan_dquots(struct quota_handle *h, int (*process_dquot) (struct dquot *, char *))
+{
+       int rd, scanbufpos = 0, scanbufsize = 0;
+       char scanbuf[sizeof(struct v1_disk_dqblk)*SCANBUFSIZE];
+       struct v1_disk_dqblk *ddqblk;
+       struct dquot *dquot = get_empty_dquot();
+       qid_t id = 0;
+
+       if (QIO_ENABLED(h))     /* Kernel uses same file? */
+               if (quotactl(QCMD((kernel_iface == IFACE_GENERIC) ? Q_SYNC : Q_6_5_SYNC, h->qh_type),
+                            h->qh_quotadev, 0, NULL) < 0)
+                       die(4, _("Cannot sync quotas on device %s: %s\n"), h->qh_quotadev,
+                           strerror(errno));
+       memset(dquot, 0, sizeof(*dquot));
+       dquot->dq_h = h;
+       lseek(h->qh_fd, 0, SEEK_SET);
+       for(id = 0; ; id++, scanbufpos++) {
+               if (scanbufpos >= scanbufsize) {
+                       rd = read(h->qh_fd, scanbuf, sizeof(scanbuf));
+                       if (rd < 0 || rd % sizeof(struct v1_disk_dqblk))
+                               goto out_err;
+                       if (!rd)
+                               break;
+                       scanbufpos = 0;
+                       scanbufsize = rd / sizeof(struct v1_disk_dqblk);
+               }
+               ddqblk = ((struct v1_disk_dqblk *)scanbuf) + scanbufpos;
+               if ((ddqblk->dqb_ihardlimit | ddqblk->dqb_isoftlimit |
+                    ddqblk->dqb_bhardlimit | ddqblk->dqb_bsoftlimit |
+                    ddqblk->dqb_curblocks | ddqblk->dqb_curinodes |
+                    ddqblk->dqb_itime | ddqblk->dqb_btime) == 0)
+                       continue;
+               v1_disk2memdqblk(&dquot->dq_dqb, ddqblk);
+               dquot->dq_id = id;
+               if ((rd = process_dquot(dquot, NULL)) < 0) {
+                       free(dquot);
+                       return rd;
+               }
+       }
+       if (!rd) {              /* EOF? */
+               free(dquot);
+               return 0;
+       }
+out_err:
+       free(dquot);
+       return -1;              /* Some read errstr... */
+}
diff --git a/quotaio_v1.h b/quotaio_v1.h
new file mode 100644 (file)
index 0000000..b74290b
--- /dev/null
@@ -0,0 +1,49 @@
+/*
+ *     Headerfile for old quotafile format
+ */
+
+#ifndef GUARD_QUOTAIO_V1_H
+#define GUARD_QUOTAIO_V1_H
+
+#include <sys/types.h>
+
+#define V1_DQBLK_SIZE_BITS 10
+#define V1_DQBLK_SIZE (1 << V1_DQBLK_SIZE_BITS)        /* Size of one quota block in bytes in old format */
+
+#define V1_DQOFF(id) ((loff_t) ((id) * sizeof(struct v1_disk_dqblk)))
+
+/* Structure of quota on disk */
+struct v1_disk_dqblk {
+       u_int32_t dqb_bhardlimit;       /* absolute limit on disk blks alloc */
+       u_int32_t dqb_bsoftlimit;       /* preferred limit on disk blks */
+       u_int32_t dqb_curblocks;        /* current block count */
+       u_int32_t dqb_ihardlimit;       /* maximum # allocated inodes */
+       u_int32_t dqb_isoftlimit;       /* preferred limit on inodes */
+       u_int32_t dqb_curinodes;        /* current # allocated inodes */
+       time_t dqb_btime;       /* time limit for excessive disk use */
+       time_t dqb_itime;       /* time limit for excessive files */
+} __attribute__ ((packed));
+
+/* Structure used for communication with kernel */
+struct v1_kern_dqblk {
+       u_int32_t dqb_bhardlimit;       /* absolute limit on disk blks alloc */
+       u_int32_t dqb_bsoftlimit;       /* preferred limit on disk blks */
+       u_int32_t dqb_curblocks;        /* current block count */
+       u_int32_t dqb_ihardlimit;       /* maximum # allocated inodes */
+       u_int32_t dqb_isoftlimit;       /* preferred inode limit */
+       u_int32_t dqb_curinodes;        /* current # allocated inodes */
+       time_t dqb_btime;       /* time limit for excessive disk use */
+       time_t dqb_itime;       /* time limit for excessive files */
+};
+
+struct v1_dqstats {
+       u_int32_t lookups;
+       u_int32_t drops;
+       u_int32_t reads;
+       u_int32_t writes;
+       u_int32_t cache_hits;
+       u_int32_t allocated_dquots;
+       u_int32_t free_dquots;
+       u_int32_t syncs;
+};                                                                               
+#endif
diff --git a/quotaio_v2.c b/quotaio_v2.c
new file mode 100644 (file)
index 0000000..2e3c725
--- /dev/null
@@ -0,0 +1,506 @@
+/*
+ *     Implementation of new quotafile format
+ *
+ *     Jan Kara <jack@suse.cz> - sponsored by SuSE CR
+ */
+
+#include "config.h"
+
+#include <sys/types.h>
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <asm/byteorder.h>
+
+#include "pot.h"
+#include "common.h"
+#include "quotaio_v2.h"
+#include "dqblk_v2.h"
+#include "quotaio.h"
+#include "quotasys.h"
+#include "quotaio_generic.h"
+
+typedef char *dqbuf_t;
+
+static int v2_check_file(int fd, int type, int fmt);
+static int v2_init_io(struct quota_handle *h);
+static int v2_new_io(struct quota_handle *h);
+static int v2_write_info(struct quota_handle *h);
+static struct dquot *v2_read_dquot(struct quota_handle *h, qid_t id);
+static int v2_commit_dquot(struct dquot *dquot, int flags);
+static int v2_scan_dquots(struct quota_handle *h, int (*process_dquot) (struct dquot *dquot, char *dqname));
+static int v2_report(struct quota_handle *h, int verbose);
+
+struct quotafile_ops quotafile_ops_2 = {
+check_file:    v2_check_file,
+init_io:       v2_init_io,
+new_io:                v2_new_io,
+write_info:    v2_write_info,
+read_dquot:    v2_read_dquot,
+commit_dquot:  v2_commit_dquot,
+scan_dquots:   v2_scan_dquots,
+report:        v2_report
+};
+
+#define getdqbuf() smalloc(V2_DQBLKSIZE)
+#define freedqbuf(buf) free(buf)
+
+/*
+ *     Copy dquot from disk to memory
+ */
+static void v2r0_disk2memdqblk(struct dquot *dquot, void *dp)
+{
+       struct util_dqblk *m = &dquot->dq_dqb;
+       struct v2r0_disk_dqblk *d = dp, empty;
+
+       dquot->dq_id = __le32_to_cpu(d->dqb_id);
+       m->dqb_ihardlimit = __le32_to_cpu(d->dqb_ihardlimit);
+       m->dqb_isoftlimit = __le32_to_cpu(d->dqb_isoftlimit);
+       m->dqb_bhardlimit = __le32_to_cpu(d->dqb_bhardlimit);
+       m->dqb_bsoftlimit = __le32_to_cpu(d->dqb_bsoftlimit);
+       m->dqb_curinodes = __le32_to_cpu(d->dqb_curinodes);
+       m->dqb_curspace = __le64_to_cpu(d->dqb_curspace);
+       m->dqb_itime = __le64_to_cpu(d->dqb_itime);
+       m->dqb_btime = __le64_to_cpu(d->dqb_btime);
+
+       memset(&empty, 0, sizeof(struct v2r0_disk_dqblk));
+       empty.dqb_itime = __cpu_to_le64(1);
+       if (!memcmp(&empty, dp, sizeof(struct v2r0_disk_dqblk)))
+               m->dqb_itime = 0;
+}
+
+/*
+ *     Copy dquot from memory to disk
+ */
+static void v2r0_mem2diskdqblk(void *dp, struct dquot *dquot)
+{
+       struct util_dqblk *m = &dquot->dq_dqb;
+       struct v2r0_disk_dqblk *d = dp;
+       struct qtree_mem_dqinfo *info = &dquot->dq_h->qh_info.u.v2_mdqi.dqi_qtree;
+
+       d->dqb_ihardlimit = __cpu_to_le32(m->dqb_ihardlimit);
+       d->dqb_isoftlimit = __cpu_to_le32(m->dqb_isoftlimit);
+       d->dqb_bhardlimit = __cpu_to_le32(m->dqb_bhardlimit);
+       d->dqb_bsoftlimit = __cpu_to_le32(m->dqb_bsoftlimit);
+       d->dqb_curinodes = __cpu_to_le32(m->dqb_curinodes);
+       d->dqb_curspace = __cpu_to_le64(m->dqb_curspace);
+       d->dqb_itime = __cpu_to_le64(m->dqb_itime);
+       d->dqb_btime = __cpu_to_le64(m->dqb_btime);
+       d->dqb_id = __cpu_to_le32(dquot->dq_id);
+       if (qtree_entry_unused(info, dp))
+               d->dqb_itime = __cpu_to_le64(1);
+}
+
+static int v2r0_is_id(void *dp, struct dquot *dquot)
+{
+       struct v2r0_disk_dqblk *d = dp;
+       struct qtree_mem_dqinfo *info = &dquot->dq_h->qh_info.u.v2_mdqi.dqi_qtree;
+
+       if (qtree_entry_unused(info, dp))
+               return 0;
+       return __le32_to_cpu(d->dqb_id) == dquot->dq_id;
+}
+
+/*
+ *     Copy dquot from disk to memory
+ */
+static void v2r1_disk2memdqblk(struct dquot *dquot, void *dp)
+{
+       struct util_dqblk *m = &dquot->dq_dqb;
+       struct v2r1_disk_dqblk *d = dp, empty;
+
+       dquot->dq_id = __le32_to_cpu(d->dqb_id);
+       m->dqb_ihardlimit = __le64_to_cpu(d->dqb_ihardlimit);
+       m->dqb_isoftlimit = __le64_to_cpu(d->dqb_isoftlimit);
+       m->dqb_bhardlimit = __le64_to_cpu(d->dqb_bhardlimit);
+       m->dqb_bsoftlimit = __le64_to_cpu(d->dqb_bsoftlimit);
+       m->dqb_curinodes = __le64_to_cpu(d->dqb_curinodes);
+       m->dqb_curspace = __le64_to_cpu(d->dqb_curspace);
+       m->dqb_itime = __le64_to_cpu(d->dqb_itime);
+       m->dqb_btime = __le64_to_cpu(d->dqb_btime);
+
+       memset(&empty, 0, sizeof(struct v2r1_disk_dqblk));
+       empty.dqb_itime = __cpu_to_le64(1);
+       if (!memcmp(&empty, dp, sizeof(struct v2r1_disk_dqblk)))
+               m->dqb_itime = 0;
+}
+
+/*
+ *     Copy dquot from memory to disk
+ */
+static void v2r1_mem2diskdqblk(void *dp, struct dquot *dquot)
+{
+       struct util_dqblk *m = &dquot->dq_dqb;
+       struct v2r1_disk_dqblk *d = dp;
+
+       d->dqb_ihardlimit = __cpu_to_le64(m->dqb_ihardlimit);
+       d->dqb_isoftlimit = __cpu_to_le64(m->dqb_isoftlimit);
+       d->dqb_bhardlimit = __cpu_to_le64(m->dqb_bhardlimit);
+       d->dqb_bsoftlimit = __cpu_to_le64(m->dqb_bsoftlimit);
+       d->dqb_curinodes = __cpu_to_le64(m->dqb_curinodes);
+       d->dqb_curspace = __cpu_to_le64(m->dqb_curspace);
+       d->dqb_itime = __cpu_to_le64(m->dqb_itime);
+       d->dqb_btime = __cpu_to_le64(m->dqb_btime);
+       d->dqb_id = __cpu_to_le32(dquot->dq_id);
+       if (qtree_entry_unused(&dquot->dq_h->qh_info.u.v2_mdqi.dqi_qtree, dp))
+               d->dqb_itime = __cpu_to_le64(1);
+}
+
+static int v2r1_is_id(void *dp, struct dquot *dquot)
+{
+       struct v2r1_disk_dqblk *d = dp;
+       struct qtree_mem_dqinfo *info = &dquot->dq_h->qh_info.u.v2_mdqi.dqi_qtree;
+
+       if (qtree_entry_unused(info, dp))
+               return 0;
+       return __le32_to_cpu(d->dqb_id) == dquot->dq_id;
+}
+
+static struct qtree_fmt_operations v2r0_fmt_ops = {
+       .mem2disk_dqblk = v2r0_mem2diskdqblk,
+       .disk2mem_dqblk = v2r0_disk2memdqblk,
+       .is_id = v2r0_is_id,
+};
+
+static struct qtree_fmt_operations v2r1_fmt_ops = {
+       .mem2disk_dqblk = v2r1_mem2diskdqblk,
+       .disk2mem_dqblk = v2r1_disk2memdqblk,
+       .is_id = v2r1_is_id,
+};
+
+/*
+ *     Copy dqinfo from disk to memory
+ */
+static inline void v2_disk2memdqinfo(struct util_dqinfo *m, struct v2_disk_dqinfo *d)
+{
+       m->dqi_bgrace = __le32_to_cpu(d->dqi_bgrace);
+       m->dqi_igrace = __le32_to_cpu(d->dqi_igrace);
+       m->u.v2_mdqi.dqi_flags = __le32_to_cpu(d->dqi_flags) & V2_DQF_MASK;
+       m->u.v2_mdqi.dqi_qtree.dqi_blocks = __le32_to_cpu(d->dqi_blocks);
+       m->u.v2_mdqi.dqi_qtree.dqi_free_blk = __le32_to_cpu(d->dqi_free_blk);
+       m->u.v2_mdqi.dqi_qtree.dqi_free_entry = __le32_to_cpu(d->dqi_free_entry);
+}
+
+/*
+ *     Copy dqinfo from memory to disk
+ */
+static inline void v2_mem2diskdqinfo(struct v2_disk_dqinfo *d, struct util_dqinfo *m)
+{
+       d->dqi_bgrace = __cpu_to_le32(m->dqi_bgrace);
+       d->dqi_igrace = __cpu_to_le32(m->dqi_igrace);
+       d->dqi_flags = __cpu_to_le32(m->u.v2_mdqi.dqi_flags & V2_DQF_MASK);
+       d->dqi_blocks = __cpu_to_le32(m->u.v2_mdqi.dqi_qtree.dqi_blocks);
+       d->dqi_free_blk = __cpu_to_le32(m->u.v2_mdqi.dqi_qtree.dqi_free_blk);
+       d->dqi_free_entry = __cpu_to_le32(m->u.v2_mdqi.dqi_qtree.dqi_free_entry);
+}
+
+/* Convert kernel quotablock format to utility one */
+static inline void v2_kern2utildqblk(struct util_dqblk *u, struct v2_kern_dqblk *k)
+{
+       u->dqb_ihardlimit = k->dqb_ihardlimit;
+       u->dqb_isoftlimit = k->dqb_isoftlimit;
+       u->dqb_bhardlimit = k->dqb_bhardlimit;
+       u->dqb_bsoftlimit = k->dqb_bsoftlimit;
+       u->dqb_curinodes = k->dqb_curinodes;
+       u->dqb_curspace = k->dqb_curspace;
+       u->dqb_itime = k->dqb_itime;
+       u->dqb_btime = k->dqb_btime;
+}
+
+/* Convert utility quotablock format to kernel one */
+static inline void v2_util2kerndqblk(struct v2_kern_dqblk *k, struct util_dqblk *u)
+{
+       k->dqb_ihardlimit = u->dqb_ihardlimit;
+       k->dqb_isoftlimit = u->dqb_isoftlimit;
+       k->dqb_bhardlimit = u->dqb_bhardlimit;
+       k->dqb_bsoftlimit = u->dqb_bsoftlimit;
+       k->dqb_curinodes = u->dqb_curinodes;
+       k->dqb_curspace = u->dqb_curspace;
+       k->dqb_itime = u->dqb_itime;
+       k->dqb_btime = u->dqb_btime;
+}
+
+static int v2_read_header(int fd, struct v2_disk_dqheader *h)
+{
+       lseek(fd, 0, SEEK_SET);
+       if (read(fd, h, sizeof(struct v2_disk_dqheader)) != sizeof(struct v2_disk_dqheader))
+               return 0;
+       return 1;
+}
+
+/*
+ *     Check whether given quota file is in our format
+ */
+static int v2_check_file(int fd, int type, int fmt)
+{
+       struct v2_disk_dqheader h;
+       int file_magics[] = INITQMAGICS;
+       int known_versions[] = INIT_V2_VERSIONS;
+       int version;
+
+       if (!v2_read_header(fd, &h))
+               return 0;
+       if (fmt == QF_VFSV0)
+               version = 0;
+       else if (fmt == QF_VFSV1)
+               version = 1;
+       else
+               return 0;
+
+       if (__le32_to_cpu(h.dqh_magic) != file_magics[type]) {
+               if (__be32_to_cpu(h.dqh_magic) == file_magics[type])
+                       die(3, _("Your quota file is stored in wrong endianity. Please use convertquota(8) to convert it.\n"));
+               return 0;
+       }
+       if (__le32_to_cpu(h.dqh_version) > known_versions[type])
+               return 0;
+       if (version != __le32_to_cpu(h.dqh_version))
+               return 0;
+       return 1;
+}
+
+/*
+ *     Open quotafile
+ */
+static int v2_init_io(struct quota_handle *h)
+{
+       if (QIO_ENABLED(h)) {
+               if (kernel_iface == IFACE_GENERIC) {
+                       if (vfs_get_info(h) < 0)
+                               return -1;
+               }
+               else {
+                       struct v2_kern_dqinfo kdqinfo;
+
+                       if (quotactl(QCMD(Q_V2_GETINFO, h->qh_type), h->qh_quotadev, 0, (void *)&kdqinfo) < 0) {
+                               /* Temporary check just before fix gets to kernel */
+                               if (errno == EPERM)     /* Don't have permission to get information? */
+                                       return 0;
+                               return -1;
+                       }
+                       h->qh_info.dqi_bgrace = kdqinfo.dqi_bgrace;
+                       h->qh_info.dqi_igrace = kdqinfo.dqi_igrace;
+                       h->qh_info.u.v2_mdqi.dqi_flags = kdqinfo.dqi_flags;
+                       h->qh_info.u.v2_mdqi.dqi_qtree.dqi_blocks = kdqinfo.dqi_blocks;
+                       h->qh_info.u.v2_mdqi.dqi_qtree.dqi_free_blk = kdqinfo.dqi_free_blk;
+                       h->qh_info.u.v2_mdqi.dqi_qtree.dqi_free_entry = kdqinfo.dqi_free_entry;
+               }
+       }
+       if (h->qh_fd != -1) {
+               struct v2_disk_dqinfo ddqinfo;
+               struct v2_disk_dqheader header;
+
+               if (!v2_read_header(h->qh_fd, &header))
+                       return -1;
+
+               lseek(h->qh_fd, V2_DQINFOOFF, SEEK_SET);
+               if (read(h->qh_fd, &ddqinfo, sizeof(ddqinfo)) != sizeof(ddqinfo))
+                       return -1;
+               /* Convert everything */
+               if (!QIO_ENABLED(h))
+                       v2_disk2memdqinfo(&h->qh_info, &ddqinfo);
+               else    /* We need just the number of blocks */
+                       h->qh_info.u.v2_mdqi.dqi_qtree.dqi_blocks = __le32_to_cpu(ddqinfo.dqi_blocks);
+
+               if (__le32_to_cpu(header.dqh_version) == 0) {
+                       h->qh_info.u.v2_mdqi.dqi_qtree.dqi_entry_size = sizeof(struct v2r0_disk_dqblk);
+                       h->qh_info.u.v2_mdqi.dqi_qtree.dqi_ops = &v2r0_fmt_ops;
+               } else {
+                       h->qh_info.u.v2_mdqi.dqi_qtree.dqi_entry_size = sizeof(struct v2r1_disk_dqblk);
+                       h->qh_info.u.v2_mdqi.dqi_qtree.dqi_ops = &v2r1_fmt_ops;
+               }
+       } else {
+               /* We don't have the file open -> we don't need quota tree operations */
+               h->qh_info.u.v2_mdqi.dqi_qtree.dqi_ops = NULL;
+       }
+       return 0;
+}
+
+/*
+ *     Initialize new quotafile
+ */
+static int v2_new_io(struct quota_handle *h)
+{
+       int file_magics[] = INITQMAGICS;
+       struct v2_disk_dqheader ddqheader;
+       struct v2_disk_dqinfo ddqinfo;
+       int version;
+
+       if (h->qh_fmt == QF_VFSV0)
+               version = 0;
+       else if (h->qh_fmt == QF_VFSV1)
+               version = 1;
+       else
+               return -1;
+
+       /* Write basic quota header */
+       ddqheader.dqh_magic = __cpu_to_le32(file_magics[h->qh_type]);
+       ddqheader.dqh_version = __cpu_to_le32(version);
+       lseek(h->qh_fd, 0, SEEK_SET);
+       if (write(h->qh_fd, &ddqheader, sizeof(ddqheader)) != sizeof(ddqheader))
+               return -1;
+       /* Write information about quotafile */
+       h->qh_info.dqi_bgrace = MAX_DQ_TIME;
+       h->qh_info.dqi_igrace = MAX_IQ_TIME;
+       h->qh_info.u.v2_mdqi.dqi_flags = 0;
+       h->qh_info.u.v2_mdqi.dqi_qtree.dqi_blocks = QT_TREEOFF + 1;
+       h->qh_info.u.v2_mdqi.dqi_qtree.dqi_free_blk = 0;
+       h->qh_info.u.v2_mdqi.dqi_qtree.dqi_free_entry = 0;
+       if (version == 0) {
+               h->qh_info.u.v2_mdqi.dqi_qtree.dqi_entry_size = sizeof(struct v2r0_disk_dqblk);
+               h->qh_info.u.v2_mdqi.dqi_qtree.dqi_ops = &v2r0_fmt_ops;
+       } else if (version == 1) {
+               h->qh_info.u.v2_mdqi.dqi_qtree.dqi_entry_size = sizeof(struct v2r1_disk_dqblk);
+               h->qh_info.u.v2_mdqi.dqi_qtree.dqi_ops = &v2r1_fmt_ops;
+       }
+       v2_mem2diskdqinfo(&ddqinfo, &h->qh_info);
+       lseek(h->qh_fd, V2_DQINFOOFF, SEEK_SET);
+       if (write(h->qh_fd, &ddqinfo, sizeof(ddqinfo)) != sizeof(ddqinfo))
+               return -1;
+       return 0;
+}
+
+/*
+ *     Write information (grace times to file)
+ */
+static int v2_write_info(struct quota_handle *h)
+{
+       if (QIO_RO(h)) {
+               errstr(_("Trying to write info to readonly quotafile on %s\n"), h->qh_quotadev);
+               errno = EPERM;
+               return -1;
+       }
+       if (QIO_ENABLED(h)) {
+               if (kernel_iface == IFACE_GENERIC) {
+                       if (vfs_set_info(h, IIF_BGRACE | IIF_IGRACE))
+                               return -1;
+               }
+               else {
+                       struct v2_kern_dqinfo kdqinfo;
+
+                       kdqinfo.dqi_bgrace = h->qh_info.dqi_bgrace;
+                       kdqinfo.dqi_igrace = h->qh_info.dqi_igrace;
+                       kdqinfo.dqi_flags = h->qh_info.u.v2_mdqi.dqi_flags;
+                       kdqinfo.dqi_blocks = h->qh_info.u.v2_mdqi.dqi_qtree.dqi_blocks;
+                       kdqinfo.dqi_free_blk = h->qh_info.u.v2_mdqi.dqi_qtree.dqi_free_blk;
+                       kdqinfo.dqi_free_entry = h->qh_info.u.v2_mdqi.dqi_qtree.dqi_free_entry;
+                       if (quotactl(QCMD(Q_V2_SETGRACE, h->qh_type), h->qh_quotadev, 0, (void *)&kdqinfo) < 0 ||
+                           quotactl(QCMD(Q_V2_SETFLAGS, h->qh_type), h->qh_quotadev, 0, (void *)&kdqinfo) < 0)
+                                       return -1;
+               }
+       }
+       else {
+               struct v2_disk_dqinfo ddqinfo;
+
+               v2_mem2diskdqinfo(&ddqinfo, &h->qh_info);
+               lseek(h->qh_fd, V2_DQINFOOFF, SEEK_SET);
+               if (write(h->qh_fd, &ddqinfo, sizeof(ddqinfo)) != sizeof(ddqinfo))
+                       return -1;
+       }
+       return 0;
+}
+
+/*
+ *  Read dquot (either from disk or from kernel)
+ *  User can use errno to detect errstr when NULL is returned
+ */
+static struct dquot *v2_read_dquot(struct quota_handle *h, qid_t id)
+{
+       if (QIO_ENABLED(h)) {
+               struct dquot *dquot = get_empty_dquot();
+
+               dquot->dq_id = id;
+               dquot->dq_h = h;
+               dquot->dq_dqb.u.v2_mdqb.dqb_off = 0;
+               memset(&dquot->dq_dqb, 0, sizeof(struct util_dqblk));
+               if (kernel_iface == IFACE_GENERIC) {
+                       if (vfs_get_dquot(dquot) < 0) {
+                               free(dquot);
+                               return NULL;
+                       }
+               }
+               else {
+                       struct v2_kern_dqblk kdqblk;
+
+                       if (quotactl(QCMD(Q_V2_GETQUOTA, h->qh_type), h->qh_quotadev, id, (void *)&kdqblk) < 0) {
+                               free(dquot);
+                               return NULL;
+                       }
+                       v2_kern2utildqblk(&dquot->dq_dqb, &kdqblk);
+               }
+               return dquot;
+       }
+       return qtree_read_dquot(h, id);
+}
+
+/* 
+ *  Commit changes of dquot to disk - it might also mean deleting it when quota became fake one and user has no blocks...
+ *  User can process use 'errno' to detect errstr
+ */
+static int v2_commit_dquot(struct dquot *dquot, int flags)
+{
+       struct util_dqblk *b = &dquot->dq_dqb;
+
+       if (QIO_RO(dquot->dq_h)) {
+               errstr(_("Trying to write quota to readonly quotafile on %s\n"), dquot->dq_h->qh_quotadev);
+               errno = EPERM;
+               return -1;
+       }
+       if (QIO_ENABLED(dquot->dq_h)) {
+               if (kernel_iface == IFACE_GENERIC) {
+                       if (vfs_set_dquot(dquot, flags) < 0)
+                               return -1;
+               }
+               else {
+                       struct v2_kern_dqblk kdqblk;
+                       int cmd;
+
+                       if (flags == COMMIT_USAGE)
+                               cmd = Q_V2_SETUSE;
+                       else if (flags == COMMIT_LIMITS)
+                               cmd = Q_V2_SETQLIM;
+                       else if (flags & COMMIT_TIMES) {
+                               errno = EINVAL;
+                               return -1;
+                       }
+                       else
+                               cmd = Q_V2_SETQUOTA;
+                       v2_util2kerndqblk(&kdqblk, &dquot->dq_dqb);
+                       if (quotactl(QCMD(cmd, dquot->dq_h->qh_type), dquot->dq_h->qh_quotadev,
+                            dquot->dq_id, (void *)&kdqblk) < 0)
+                               return -1;
+               }
+               return 0;
+       }
+       if (!b->dqb_curspace && !b->dqb_curinodes && !b->dqb_bsoftlimit && !b->dqb_isoftlimit
+           && !b->dqb_bhardlimit && !b->dqb_ihardlimit)
+               qtree_delete_dquot(dquot);
+       else
+               qtree_write_dquot(dquot);
+       return 0;
+}
+
+static int v2_scan_dquots(struct quota_handle *h, int (*process_dquot) (struct dquot *, char *))
+{
+       if (QIO_ENABLED(h))     /* Kernel uses same file? */
+               if (quotactl(QCMD((kernel_iface == IFACE_GENERIC) ? Q_SYNC : Q_6_5_SYNC, h->qh_type),
+                            h->qh_quotadev, 0, NULL) < 0)
+                       die(4, _("Cannot sync quotas on device %s: %s\n"), h->qh_quotadev,
+                           strerror(errno));
+       return qtree_scan_dquots(h, process_dquot);
+}
+
+/* Report information about quotafile */
+static int v2_report(struct quota_handle *h, int verbose)
+{
+       if (verbose) {
+               struct v2_mem_dqinfo *info = &h->qh_info.u.v2_mdqi;
+
+               printf(_("Statistics:\nTotal blocks: %u\nData blocks: %u\nEntries: %u\nUsed average: %f\n"),
+                        info->dqi_qtree.dqi_blocks, info->dqi_data_blocks, info->dqi_used_entries,
+                        ((float)info->dqi_used_entries) / info->dqi_data_blocks);
+       }
+       return 0;
+}
diff --git a/quotaio_v2.h b/quotaio_v2.h
new file mode 100644 (file)
index 0000000..197bb65
--- /dev/null
@@ -0,0 +1,95 @@
+/*
+ *
+ *     Header file for disk format of new quotafile format
+ *
+ */
+
+#ifndef GUARD_QUOTAIO_V2_H
+#define GUARD_QUOTAIO_V2_H
+
+#include <sys/types.h>
+#include "quota.h"
+
+#define V2_DQINFOOFF   sizeof(struct v2_disk_dqheader) /* Offset of info header in file */
+#define INIT_V2_VERSIONS { 1, 1}
+
+struct v2_disk_dqheader {
+       u_int32_t dqh_magic;    /* Magic number identifying file */
+       u_int32_t dqh_version;  /* File version */
+} __attribute__ ((packed));
+
+/* Flags for version specific files */
+#define V2_DQF_MASK  0x0000    /* Mask for all valid ondisk flags */
+
+/* Header with type and version specific information */
+struct v2_disk_dqinfo {
+       u_int32_t dqi_bgrace;   /* Time before block soft limit becomes hard limit */
+       u_int32_t dqi_igrace;   /* Time before inode soft limit becomes hard limit */
+       u_int32_t dqi_flags;    /* Flags for quotafile (DQF_*) */
+       u_int32_t dqi_blocks;   /* Number of blocks in file */
+       u_int32_t dqi_free_blk; /* Number of first free block in the list */
+       u_int32_t dqi_free_entry;       /* Number of block with at least one free entry */
+} __attribute__ ((packed));
+
+/* Structure of quota for one user on disk */
+struct v2r0_disk_dqblk {
+       u_int32_t dqb_id;       /* id this quota applies to */
+       u_int32_t dqb_ihardlimit;       /* absolute limit on allocated inodes */
+       u_int32_t dqb_isoftlimit;       /* preferred inode limit */
+       u_int32_t dqb_curinodes;        /* current # allocated inodes */
+       u_int32_t dqb_bhardlimit;       /* absolute limit on disk space (in QUOTABLOCK_SIZE) */
+       u_int32_t dqb_bsoftlimit;       /* preferred limit on disk space (in QUOTABLOCK_SIZE) */
+       u_int64_t dqb_curspace; /* current space occupied (in bytes) */
+       u_int64_t dqb_btime;    /* time limit for excessive disk use */
+       u_int64_t dqb_itime;    /* time limit for excessive inode use */
+} __attribute__ ((packed));
+
+struct v2r1_disk_dqblk {
+       u_int32_t dqb_id;       /* id this quota applies to */
+       u_int32_t dqb_pad;
+       u_int64_t dqb_ihardlimit;       /* absolute limit on allocated inodes */
+       u_int64_t dqb_isoftlimit;       /* preferred inode limit */
+       u_int64_t dqb_curinodes;        /* current # allocated inodes */
+       u_int64_t dqb_bhardlimit;       /* absolute limit on disk space (in QUOTABLOCK_SIZE) */
+       u_int64_t dqb_bsoftlimit;       /* preferred limit on disk space (in QUOTABLOCK_SIZE) */
+       u_int64_t dqb_curspace; /* current space occupied (in bytes) */
+       u_int64_t dqb_btime;    /* time limit for excessive disk use */
+       u_int64_t dqb_itime;    /* time limit for excessive inode use */
+} __attribute__ ((packed));
+
+/* Structure of quota for communication with kernel */
+struct v2_kern_dqblk {
+       unsigned int dqb_ihardlimit;
+       unsigned int dqb_isoftlimit;
+       unsigned int dqb_curinodes;
+       unsigned int dqb_bhardlimit;
+       unsigned int dqb_bsoftlimit;
+       qsize_t dqb_curspace;
+       time_t dqb_btime;
+       time_t dqb_itime;
+};
+
+/* Structure of quotafile info for communication with kernel (obsolete) */
+struct v2_kern_dqinfo {
+       unsigned int dqi_bgrace;
+       unsigned int dqi_igrace;
+       unsigned int dqi_flags;
+       unsigned int dqi_blocks;
+       unsigned int dqi_free_blk;
+       unsigned int dqi_free_entry;
+};
+
+/* Structure with gathered statistics from kernel */
+struct v2_dqstats {
+       u_int32_t lookups;
+       u_int32_t drops;
+       u_int32_t reads;
+       u_int32_t writes;
+       u_int32_t cache_hits;
+       u_int32_t allocated_dquots;
+       u_int32_t free_dquots;
+       u_int32_t syncs;
+       u_int32_t version;
+};
+
+#endif
diff --git a/quotaio_xfs.c b/quotaio_xfs.c
new file mode 100644 (file)
index 0000000..4729317
--- /dev/null
@@ -0,0 +1,293 @@
+/*
+ *     Implementation of XFS quota manager.
+ *      Copyright (c) 2001 Silicon Graphics, Inc.
+ */
+
+#include "config.h"
+
+#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <pwd.h>
+#include <grp.h>
+
+#include "pot.h"
+#include "common.h"
+#include "bylabel.h"
+#include "quotaio.h"
+#include "quotasys.h"
+#include "dqblk_xfs.h"
+
+#define XFS_USRQUOTA(h)        ((h)->qh_type == USRQUOTA && \
+                       (h)->qh_info.u.xfs_mdqi.qs_flags & XFS_QUOTA_UDQ_ACCT)
+#define XFS_GRPQUOTA(h)        ((h)->qh_type == GRPQUOTA && \
+                       (h)->qh_info.u.xfs_mdqi.qs_flags & XFS_QUOTA_GDQ_ACCT)
+
+static int xfs_init_io(struct quota_handle *h);
+static int xfs_write_info(struct quota_handle *h);
+static struct dquot *xfs_read_dquot(struct quota_handle *h, qid_t id);
+static int xfs_commit_dquot(struct dquot *dquot, int flags);
+static int xfs_scan_dquots(struct quota_handle *h, int (*process_dquot) (struct dquot *dquot, char *dqname));
+static int xfs_report(struct quota_handle *h, int verbose);
+
+struct quotafile_ops quotafile_ops_xfs = {
+init_io:       xfs_init_io,
+write_info:    xfs_write_info,
+read_dquot:    xfs_read_dquot,
+commit_dquot:  xfs_commit_dquot,
+scan_dquots:   xfs_scan_dquots,
+report:                xfs_report
+};
+
+/*
+ *     Convert XFS kernel quota format to utility format
+ */
+static inline void xfs_kern2utildqblk(struct util_dqblk *u, struct xfs_kern_dqblk * k)
+{
+       u->dqb_ihardlimit = k->d_ino_hardlimit;
+       u->dqb_isoftlimit = k->d_ino_softlimit;
+       u->dqb_bhardlimit = k->d_blk_hardlimit >> 1;
+       u->dqb_bsoftlimit = k->d_blk_softlimit >> 1;
+       u->dqb_curinodes = k->d_icount;
+       u->dqb_curspace = ((qsize_t)k->d_bcount) << 9;
+       u->dqb_itime = k->d_itimer;
+       u->dqb_btime = k->d_btimer;
+}
+
+/*
+ *     Convert utility quota format to XFS kernel format
+ */
+static inline void xfs_util2kerndqblk(struct xfs_kern_dqblk *k, struct util_dqblk *u)
+{
+       memset(k, 0, sizeof(struct xfs_kern_dqblk));
+       k->d_ino_hardlimit = u->dqb_ihardlimit;
+       k->d_ino_softlimit = u->dqb_isoftlimit;
+       k->d_blk_hardlimit = u->dqb_bhardlimit << 1;
+       k->d_blk_softlimit = u->dqb_bsoftlimit << 1;
+       k->d_icount = u->dqb_curinodes;
+       k->d_bcount = u->dqb_curspace >> 9;
+       k->d_itimer = u->dqb_itime;
+       k->d_btimer = u->dqb_btime;
+}
+
+/*
+ *     Initialize quota information
+ */
+static int xfs_init_io(struct quota_handle *h)
+{
+       struct xfs_mem_dqinfo info;
+       int qcmd;
+
+       qcmd = QCMD(Q_XFS_GETQSTAT, 0);
+       memset(&info, 0, sizeof(struct xfs_mem_dqinfo));
+       if (quotactl(qcmd, h->qh_quotadev, 0, (void *)&info) < 0)
+               return -1;
+       h->qh_info.dqi_bgrace = info.qs_btimelimit;
+       h->qh_info.dqi_igrace = info.qs_itimelimit;
+       h->qh_info.u.xfs_mdqi = info;
+       return 0;
+}
+
+/*
+ *     Write information (grace times)
+ */
+static int xfs_write_info(struct quota_handle *h)
+{
+       struct xfs_kern_dqblk xdqblk;
+       int qcmd;
+
+       if (!XFS_USRQUOTA(h) && !XFS_GRPQUOTA(h))
+               return 0;
+
+       memset(&xdqblk, 0, sizeof(struct xfs_kern_dqblk));
+
+       xdqblk.d_btimer = h->qh_info.dqi_bgrace;
+       xdqblk.d_itimer = h->qh_info.dqi_igrace;
+       xdqblk.d_fieldmask |= FS_DQ_TIMER_MASK;
+       qcmd = QCMD(Q_XFS_SETQLIM, h->qh_type);
+       if (quotactl(qcmd, h->qh_quotadev, 0, (void *)&xdqblk) < 0)
+               return -1;
+       return 0;
+}
+
+/*
+ *     Read a dqblk struct from the quota manager
+ */
+static struct dquot *xfs_read_dquot(struct quota_handle *h, qid_t id)
+{
+       struct dquot *dquot = get_empty_dquot();
+       struct xfs_kern_dqblk xdqblk;
+       int qcmd;
+
+       dquot->dq_id = id;
+       dquot->dq_h = h;
+
+       if (!XFS_USRQUOTA(h) && !XFS_GRPQUOTA(h))
+               return dquot;
+
+       qcmd = QCMD(Q_XFS_GETQUOTA, h->qh_type);
+       if (quotactl(qcmd, h->qh_quotadev, id, (void *)&xdqblk) < 0) {
+               ;
+       }
+       else {
+               xfs_kern2utildqblk(&dquot->dq_dqb, &xdqblk);
+       }
+       return dquot;
+}
+
+/*
+ *     Write a dqblk struct to the XFS quota manager
+ */
+static int xfs_commit_dquot(struct dquot *dquot, int flags)
+{
+       struct quota_handle *h = dquot->dq_h;
+       struct xfs_kern_dqblk xdqblk;
+       qid_t id = dquot->dq_id;
+       int qcmd;
+
+       if (!XFS_USRQUOTA(h) && !XFS_GRPQUOTA(h))
+               return 0;
+
+       xfs_util2kerndqblk(&xdqblk, &dquot->dq_dqb);
+       xdqblk.d_fieldmask |= FS_DQ_LIMIT_MASK;
+       qcmd = QCMD(Q_XFS_SETQLIM, h->qh_type);
+       if (quotactl(qcmd, h->qh_quotadev, id, (void *)&xdqblk) < 0) {
+               ;
+       }
+       else {
+               return 0;
+       }
+       return -1;
+}
+
+/*
+ *     xfs_scan_dquots helper - processes a single dquot
+ */
+static int xfs_scan_dquot(struct quota_handle *h,
+                         struct xfs_kern_dqblk *d,
+                         char *name, struct dquot *dq,
+                         int (*process_dquot) (struct dquot *dquot, char *dqname))
+{
+       int qcmd = QCMD(Q_XFS_GETQUOTA, h->qh_type);
+
+       memset(d, 0, sizeof(struct xfs_kern_dqblk));
+
+       if (quotactl(qcmd, h->qh_quotadev, dq->dq_id, (void *)d) < 0) {
+               return 0;
+       }
+       if (d->d_blk_hardlimit == 0 &&
+           d->d_blk_softlimit == 0 &&
+           d->d_ino_hardlimit == 0 &&
+           d->d_ino_softlimit == 0 && d->d_bcount == 0 && d->d_icount == 0) return 0;
+       xfs_kern2utildqblk(&dq->dq_dqb, d);
+       return process_dquot(dq, name);
+}
+
+/*
+ *     Scan all known dquots and call callback on each
+ */
+static int xfs_scan_dquots(struct quota_handle *h, int (*process_dquot) (struct dquot *dquot, char *dqname))
+{
+       struct dquot *dq;
+       struct xfs_kern_dqblk d;
+       int rd = 0;
+
+       if (!XFS_USRQUOTA(h) && !XFS_GRPQUOTA(h))
+               return rd;
+
+       dq = get_empty_dquot();
+       dq->dq_h = h;
+       if (h->qh_type == USRQUOTA) {
+               struct passwd *usr;
+
+               setpwent();
+               while ((usr = getpwent()) != NULL) {
+                       dq->dq_id = usr->pw_uid;
+                       rd = xfs_scan_dquot(h, &d, usr->pw_name, dq, process_dquot);
+                       if (rd < 0)
+                               break;
+               }
+               endpwent();
+       }
+       else {                  /* GRPQUOTA */
+               struct group *grp;
+
+               setgrent();
+               while ((grp = getgrent()) != NULL) {
+                       dq->dq_id = grp->gr_gid;
+                       rd = xfs_scan_dquot(h, &d, grp->gr_name, dq, process_dquot);
+                       if (rd < 0)
+                               break;
+               }
+               endgrent();
+       }
+
+       free(dq);
+       return rd;
+}
+
+/*
+ *     Report information about XFS quota on given filesystem
+ */
+static int xfs_report(struct quota_handle *h, int verbose)
+{
+       u_int16_t sbflags;
+       struct xfs_mem_dqinfo *info = &h->qh_info.u.xfs_mdqi;
+
+       if (!verbose)
+               return 0;
+
+       /* quotaon/off flags */
+       printf(_("*** Status for %s quotas on device %s\n"), type2name(h->qh_type), h->qh_quotadev);
+
+#define XQM_ON(flag) ((info->qs_flags & (flag)) ? _("ON") : _("OFF"))
+       if (h->qh_type == USRQUOTA) {
+               printf(_("Accounting: %s; Enforcement: %s\n"),
+                      XQM_ON(XFS_QUOTA_UDQ_ACCT), XQM_ON(XFS_QUOTA_UDQ_ENFD));
+       }
+       else {                  /* qh_type == USRQUOTA */
+               printf(_("Accounting: %s; Enforcement: %s\n"),
+                      XQM_ON(XFS_QUOTA_GDQ_ACCT), XQM_ON(XFS_QUOTA_GDQ_ENFD));
+       }
+#undef XQM_ON
+
+       /*
+        * If this is the root file system, it is possible that quotas are
+        * on ondisk, but not incore. Those flags will be in the HI 8 bits.
+        */
+#define XQM_ONDISK(flag) ((sbflags & (flag)) ? _("ON") : _("OFF"))
+       if ((sbflags = (info->qs_flags & 0xff00) >> 8) != 0) {
+               if (h->qh_type == USRQUOTA) {
+                       printf(_("Accounting [ondisk]: %s; Enforcement [ondisk]: %s\n"),
+                              XQM_ONDISK(XFS_QUOTA_UDQ_ACCT), XQM_ONDISK(XFS_QUOTA_UDQ_ENFD));
+               }
+               else {          /* qh_type == USRQUOTA */
+                       printf(_("Accounting [ondisk]: %s; Enforcement [ondisk]: %s\n"),
+                              XQM_ONDISK(XFS_QUOTA_GDQ_ACCT), XQM_ONDISK(XFS_QUOTA_GDQ_ENFD));
+               }
+#undef XQM_ONDISK
+       }
+
+       /* user and group quota file status information */
+       if (h->qh_type == USRQUOTA) {
+               if (info->qs_uquota.qfs_ino == -1 || info->qs_uquota.qfs_ino == 0)
+                       printf(_("Inode: none\n"));
+               else
+                       printf(_("Inode: #%llu (%llu blocks, %u extents)\n"),
+                              (unsigned long long)info->qs_uquota.qfs_ino,
+                              (unsigned long long)info->qs_uquota.qfs_nblks,
+                              info->qs_uquota.qfs_nextents);
+       }
+       else {                  /* qh_type == GRPQUOTA */
+               if (info->qs_gquota.qfs_ino == -1)
+                       printf(_("Inode: none\n"));
+               else
+                       printf(_("Inode: #%llu (%llu blocks, %u extents)\n"),
+                              (unsigned long long)info->qs_gquota.qfs_ino,
+                              (unsigned long long)info->qs_gquota.qfs_nblks,
+                              info->qs_gquota.qfs_nextents);
+       }
+       return 0;
+}
diff --git a/quotaio_xfs.h b/quotaio_xfs.h
new file mode 100644 (file)
index 0000000..cf89973
--- /dev/null
@@ -0,0 +1,150 @@
+/*
+ * Copyright (c) 2000 Silicon Graphics, Inc.  All Rights Reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of version 2 of the GNU General Public License as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it would be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * Further, this software is distributed without any warranty that it is
+ * free of the rightful claim of any third person regarding infringement
+ * or the like.  Any license provided herein, whether implied or
+ * otherwise, applies only to this software file.  Patent licenses, if
+ * any, provided herein do not apply to combinations of this program with
+ * other software, or any other product whatsoever.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write the Free Software Foundation, Inc., 59
+ * Temple Place - Suite 330, Boston MA 02111-1307, USA.
+ *
+ * Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy,
+ * Mountain View, CA  94043, or:
+ *
+ * http://www.sgi.com
+ *
+ * For further information regarding this notice, see:
+ *
+ * http://oss.sgi.com/projects/GenInfo/SGIGPLNoticeExplan/
+ */
+#ifndef GUARD_QUOTAIO_XFS_H
+#define GUARD_QUOTAIO_XFS_H
+
+#include <asm/types.h>
+
+#define XQM_CMD(cmd)   ( ('X'<<8)+(cmd) )
+#define IS_XQM_CMD(cmd)        ( ((int)(cmd)>>8) == 'X' )
+
+/*
+ * Disk quota - quotactl(2) commands for XFS Quota Manager (XQM).
+ */
+#define Q_XQUOTAON   XQM_CMD(0x1)      /* enable quota accounting/enforcement */
+#define Q_XQUOTAOFF  XQM_CMD(0x2)      /* disable quota accounting/enforcement */
+#define Q_XGETQUOTA  XQM_CMD(0x3)      /* get disk limits & usage */
+#define Q_XSETQLIM   XQM_CMD(0x4)      /* set disk limits only */
+#define Q_XGETQSTAT  XQM_CMD(0x5)      /* returns fs_quota_stat_t struct */
+#define Q_XQUOTARM   XQM_CMD(0x6)      /* free quota files' space */
+
+/*
+ * fs_disk_quota structure:
+ *
+ * This contains the current quota information regarding a user/proj/group.
+ * It is 64-bit aligned, and all the blk units are in BBs (Basic Blocks) of
+ * 512 bytes.
+ */
+#define FS_DQUOT_VERSION       1       /* fs_disk_quota.d_version */
+typedef struct fs_disk_quota {
+       __s8 d_version;         /* version of this structure */
+       __s8 d_flags;           /* XFS_{USER,PROJ,GROUP}_QUOTA */
+       __u16 d_fieldmask;      /* field specifier */
+       __u32 d_id;             /* user, project, or group ID */
+       __u64 d_blk_hardlimit;  /* absolute limit on disk blks */
+       __u64 d_blk_softlimit;  /* preferred limit on disk blks */
+       __u64 d_ino_hardlimit;  /* maximum # allocated inodes */
+       __u64 d_ino_softlimit;  /* preferred inode limit */
+       __u64 d_bcount;         /* # disk blocks owned by the user */
+       __u64 d_icount;         /* # inodes owned by the user */
+       __s32 d_itimer;         /* zero if within inode limits */
+       /* if not, we refuse service */
+       __s32 d_btimer;         /* similar to above; for disk blocks */
+       __u16 d_iwarns;         /* # warnings issued wrt num inodes */
+       __u16 d_bwarns;         /* # warnings issued wrt disk blocks */
+       __s32 d_padding2;       /* padding2 - for future use */
+       __u64 d_rtb_hardlimit;  /* absolute limit on realtime blks */
+       __u64 d_rtb_softlimit;  /* preferred limit on RT disk blks */
+       __u64 d_rtbcount;       /* # realtime blocks owned */
+       __s32 d_rtbtimer;       /* similar to above; for RT disk blks */
+       __u16 d_rtbwarns;       /* # warnings issued wrt RT disk blks */
+       __s16 d_padding3;       /* padding3 - for future use */
+       char d_padding4[8];     /* yet more padding */
+} fs_disk_quota_t;
+
+/*
+ * These fields are sent to Q_XSETQLIM to specify fields that need to change.
+ */
+#define FS_DQ_ISOFT    (1<<0)
+#define FS_DQ_IHARD    (1<<1)
+#define FS_DQ_BSOFT    (1<<2)
+#define FS_DQ_BHARD    (1<<3)
+#define FS_DQ_RTBSOFT  (1<<4)
+#define FS_DQ_RTBHARD  (1<<5)
+#define FS_DQ_LIMIT_MASK       (FS_DQ_ISOFT | FS_DQ_IHARD | FS_DQ_BSOFT | \
+                                FS_DQ_BHARD | FS_DQ_RTBSOFT | FS_DQ_RTBHARD)
+/*
+ * These timers can only be set in super user's dquot. For others, timers are
+ * automatically started and stopped. Superusers timer values set the limits
+ * for the rest.  In case these values are zero, the DQ_{F,B}TIMELIMIT values
+ * defined below are used. 
+ * These values also apply only to the d_fieldmask field for Q_XSETQLIM.
+ */
+#define FS_DQ_BTIMER   (1<<6)
+#define FS_DQ_ITIMER   (1<<7)
+#define FS_DQ_RTBTIMER         (1<<8)
+#define FS_DQ_TIMER_MASK       (FS_DQ_BTIMER | FS_DQ_ITIMER | FS_DQ_RTBTIMER)
+
+/*
+ * Various flags related to quotactl(2).  Only relevant to XFS filesystems.
+ */
+#define XFS_QUOTA_UDQ_ACCT     (1<<0)  /* user quota accounting */
+#define XFS_QUOTA_UDQ_ENFD     (1<<1)  /* user quota limits enforcement */
+#define XFS_QUOTA_GDQ_ACCT     (1<<2)  /* group quota accounting */
+#define XFS_QUOTA_GDQ_ENFD     (1<<3)  /* group quota limits enforcement */
+
+#define XFS_USER_QUOTA         (1<<0)  /* user quota type */
+#define XFS_PROJ_QUOTA         (1<<1)  /* (IRIX) project quota type */
+#define XFS_GROUP_QUOTA                (1<<2)  /* group quota type */
+
+/*
+ * fs_quota_stat is the struct returned in Q_XGETQSTAT for a given file system.
+ * Provides a centralized way to get meta infomation about the quota subsystem.
+ * eg. space taken up for user and group quotas, number of dquots currently
+ * incore.
+ */
+#define FS_QSTAT_VERSION       1       /* fs_quota_stat.qs_version */
+
+/*
+ * Some basic infomation about 'quota files'.
+ */
+typedef struct fs_qfilestat {
+       __u64 qfs_ino;          /* inode number */
+       __u64 qfs_nblks;        /* number of BBs 512-byte-blks */
+       __u32 qfs_nextents;     /* number of extents */
+} fs_qfilestat_t;
+
+typedef struct fs_quota_stat {
+       __s8 qs_version;        /* version number for future changes */
+       __u16 qs_flags;         /* XFS_QUOTA_{U,P,G}DQ_{ACCT,ENFD} */
+       __s8 qs_pad;            /* unused */
+       fs_qfilestat_t qs_uquota;       /* user quota storage information */
+       fs_qfilestat_t qs_gquota;       /* group quota storage information */
+       __u32 qs_incoredqs;     /* number of dquots incore */
+       __s32 qs_btimelimit;    /* limit for blks timer */
+       __s32 qs_itimelimit;    /* limit for inodes timer */
+       __s32 qs_rtbtimelimit;  /* limit for rt blks timer */
+       __u16 qs_bwarnlimit;    /* limit for num warnings */
+       __u16 qs_iwarnlimit;    /* limit for num warnings */
+} fs_quota_stat_t;
+
+#endif /* GUARD_QUOTAIO_XFS_H */
diff --git a/quotaon.8 b/quotaon.8
new file mode 100644 (file)
index 0000000..91756a9
--- /dev/null
+++ b/quotaon.8
@@ -0,0 +1,207 @@
+.TH QUOTAON 8
+.UC 4
+.SH NAME
+quotaon, quotaoff \- turn filesystem quotas on and off
+.SH SYNOPSIS
+.B /usr/sbin/quotaon
+[
+.B \-vugfp
+] [
+.B \-F
+.I format-name
+]
+.IR filesystem .\|.\|.
+.br
+.B /usr/sbin/quotaon
+[
+.B \-avugfp
+] [
+.B \-F
+.I format-name
+]
+.LP
+.B /usr/sbin/quotaoff
+[
+.B \-vugp
+]
+[
+.B \-x
+.I state
+]
+.IR filesystem .\|.\|.
+.br
+.B /usr/sbin/quotaoff
+[
+.B \-avugp
+]
+.SH DESCRIPTION
+.SS quotaon
+.IX  "quotaon command"  ""  "\fLquotaon\fP \(em turn filesystem quotas on"
+.IX  "user quotas"  "quotaon command"  ""  "\fLquotaon\fP \(em turn filesystem quotas on"
+.IX  "disk quotas"  "quotaon command"  ""  "\fLquotaon\fP \(em turn filesystem quotas on"
+.IX  "quotas"  "quotaon command"  ""  "\fLquotaon\fP \(em turn filesystem quotas on"
+.IX  "filesystem"  "quotaon command"  ""  "\fLquotaon\fP \(em turn filesystem quotas on"
+.LP
+.B quotaon
+announces to the system that disk quotas should be enabled on one or
+more filesystems. The filesystem quota files must be present in the root
+directory of the specified filesystem and be named either
+.IR aquota.user
+(for version 2 user quota),
+.IR quota.user
+(for version 1 user quota),
+.IR aquota.group
+(for version 2 group quota), or
+.IR quota.group
+(for version 1 group quota).
+.PP
+XFS filesystems are a special case - XFS considers quota
+information as filesystem metadata and uses journaling to provide
+a higher level guarantee of consistency.
+There are two components to the XFS disk quota system:
+accounting and limit enforcement.
+XFS filesystems require that quota accounting be turned on at mount time.
+It is possible to enable and disable limit enforcement on an XFS
+filesystem after quota accounting is already turned on.
+The default is to turn on both accounting and enforcement.
+.PP
+The XFS quota implementation does not maintain quota information in
+user-visible files, but rather stores this information internally.
+.SS quotaoff
+.IX  "quotaoff command"  ""  "\fLquotaoff\fP \(em turn filesystem quotas off"
+.IX  "user quotas"  "quotaoff command"  ""  "\fLquotaoff\fP \(em turn filesystem quotas off"
+.IX  "disk quotas"  "quotaoff command"  ""  "\fLquotaoff\fP \(em turn filesystem quotas off"
+.IX  "quotas"  "quotaoff command"  ""  "\fLquotaoff\fP \(em turn filesystem quotas off"
+.IX  "filesystem"  "quotaoff command"  ""  "\fLquotaoff\fP \(em turn filesystem quotas off"
+.LP
+.B quotaoff
+announces to the system that the specified filesystems should
+have any disk quotas turned off.
+.SH OPTIONS
+.SS quotaon
+.TP
+.B -F, --format=\f2format-name\f1
+Report quota for specified format (ie. don't perform format autodetection).
+Possible format names are:
+.B vfsold
+Original quota format with 16-bit UIDs / GIDs,
+.B vfsv0
+Quota format with 32-bit UIDs / GIDs, 64-bit space usage, 32-bit inode usage and limits,
+.B vfsv1
+Quota format with 64-bit quota limits and usage,
+.B xfs
+(quota on XFS filesystem)
+.TP
+.B -a, --all
+All automatically mounted (no
+.B noauto
+option) non-NFS filesystems in
+.B /etc/fstab
+with quotas will have their quotas turned on.
+This is normally used at boot time to enable quotas.
+.TP
+.B -v, --verbose
+Display a message for each filesystem where quotas are turned on.
+.TP
+.B -u, --user
+Manipulate user quotas. This is the default.
+.TP
+.B -g, --group
+Manipulate group quotas.
+.TP
+.B -p, --print-state
+Instead of turning quotas on just print state of quotas (ie. whether. quota is on or off)
+.TP
+.B -f, --off
+Make
+.B quotaon
+behave like being called as
+.BR quotaoff .
+.SS quotaoff
+.TP
+.B -F, --format=\f2format-name\f1
+Report quota for specified format (ie. don't perform format autodetection).
+Possible format names are:
+.B vfsold
+(version 1 quota),
+.B vfsv0
+(version 2 quota),
+.B xfs
+(quota on XFS filesystem)
+.TP
+.B -a, --all
+Force all filesystems in
+.B /etc/fstab
+to have their quotas disabled.
+.TP
+.B -v, --verbose
+Display a message for each filesystem affected.
+.TP
+.B -u, --user
+Manipulate user quotas. This is the default.
+.TP
+.B -g, --group
+Manipulate group quotas.
+.TP
+.B -p, --print-state
+Instead of turning quotas off just print state of quotas (ie. whether. quota is on or off)
+.TP
+.B -x, --xfs-command delete
+Free up the space used to hold quota information (maintained
+internally) within XFS.
+This option is only applicable to XFS, and is silently
+ignored for other filesystem types.
+It can only be used on a filesystem with quota previously turned off.
+.TP
+.B -x, --xfs-command enforce
+Switch on/off limit enforcement for XFS filesystems (perform
+quota accounting only).
+This option is only applicable to XFS, and is silently
+ignored for other filesystem types.
+.SH "NOTES ON XFS FILESYSTEMS"
+To enable quotas on an XFS filesystem, use
+.IR mount (8)
+or
+.B /etc/fstab
+quota option to enable both accounting and limit enforcement.
+.B quotaon
+utility cannot be used for this purpose.
+.PP
+Turning on quotas on an XFS root filesystem requires the quota mount
+options be passed into the kernel at boot time through the Linux
+.B rootflags
+boot option.
+.PP
+To turn off quota limit enforcement on any XFS filesystem, first make
+sure that quota accounting and enforcement are both turned on using
+.B "repquota -v"
+.IR filesystem .
+Then, use
+.B "quotaoff -v
+.I filesystem
+to disable limit enforcement.
+This may be done while the filesystem is mounted.
+.PP
+Turning on quota limit enforcement on an XFS filesystem is
+achieved using
+.B "quotaon -v"
+.IR filesystem .
+This may be done while the filesystem is mounted.
+.SH FILES
+.PD 0
+.TP 20
+.B aquota.user or aquota.group
+quota file at the filesystem root (version 2 quota, non-XFS filesystems)
+.TP
+.B quota.user or quota.group
+quota file at the filesystem root (version 1 quota, non-XFS filesystems)
+.TP
+.B /etc/fstab
+default filesystems
+.PD
+.SH "SEE ALSO"
+.BR quotactl (2),
+.BR fstab (5),
+.BR quota_nld (8),
+.BR repquota (8),
+.BR warnquota (8)
diff --git a/quotaon.c b/quotaon.c
new file mode 100644 (file)
index 0000000..813c021
--- /dev/null
+++ b/quotaon.c
@@ -0,0 +1,396 @@
+/*
+ * Copyright (c) 1980, 1990 Regents of the University of California. All
+ * rights reserved.
+ * 
+ * This code is derived from software contributed to Berkeley by Robert Elz at
+ * The University of Melbourne.
+ * 
+ * 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. 3. All advertising
+ * materials mentioning features or use of this software must display the
+ * following acknowledgement: This product includes software developed by the
+ * University of California, Berkeley and its contributors. 4. Neither the
+ * name of the University nor the names of its contributors may be used to
+ * endorse or promote products derived from this software without specific
+ * prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS 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 REGENTS 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 "config.h"
+
+/*
+ * Turn quota on/off for a filesystem.
+ */
+#include <stdio.h>
+#include <errno.h>
+#include <getopt.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include "quotaon.h"
+#include "quota.h"
+#include "quotasys.h"
+
+#define FL_USER 1
+#define FL_GROUP 2
+#define FL_VERBOSE 4
+#define FL_ALL 8
+#define FL_STAT 16
+#define FL_OFF 32
+
+int flags, fmt = -1;
+char *progname;
+char **mntpoints;
+int mntcnt;
+char *xarg = NULL;
+
+static void usage(void)
+{
+       errstr(_("Usage:\n\t%s [-guvp] [-F quotaformat] [-x state] -a\n\
+\t%s [-guvp] [-F quotaformat] [-x state] filesys ...\n\n\
+-a, --all                turn quotas on for all filesystems\n\
+-f, --off                turn quotas off\n\
+-u, --user               operate on user quotas\n\
+-g, --group              operate on group quotas\n\
+-p, --print-state        print whether quotas are on or off\n\
+-x, --xfs-command=cmd    perform XFS quota command\n\
+-F, --format=formatname  operate on specific quota format\n\
+-v, --verbose            print more messages\n\
+-h, --help               display this help text and exit\n\
+-V, --version            display version information and exit\n"), progname, progname);
+       exit(1);
+}
+
+static void parse_options(int argcnt, char **argstr)
+{
+       int c;
+       struct option long_opts[] = {
+               { "all", 0, NULL, 'a' },
+               { "off", 0, NULL, 'f' },
+               { "verbose", 0, NULL, 'v' },
+               { "user", 0, NULL, 'u' },
+               { "group", 0, NULL, 'g' },
+               { "print-state", 0, NULL, 'p' },
+               { "xfs-command", 1, NULL, 'x' },
+               { "format", 1, NULL, 'F' },
+               { "version", 0, NULL, 'V' },
+               { "help", 0, NULL, 'h' },
+               { NULL, 0, NULL, 0 }
+       };
+
+       while ((c = getopt_long(argcnt, argstr, "afvugpx:VF:h", long_opts, NULL)) != -1) {
+               switch (c) {
+                 case 'a':
+                         flags |= FL_ALL;
+                         break;
+                 case 'f':
+                         flags |= FL_OFF;
+                         break;
+                 case 'g':
+                         flags |= FL_GROUP;
+                         break;
+                 case 'u':
+                         flags |= FL_USER;
+                         break;
+                 case 'v':
+                         flags |= FL_VERBOSE;
+                         break;
+                 case 'x':
+                         xarg = optarg;
+                         break;
+                 case 'p':
+                         flags |= FL_STAT;
+                         break;
+                 case 'F':
+                         if ((fmt = name2fmt(optarg)) == QF_ERROR)
+                               exit(1);
+                         break;
+                 case 'V':
+                         version();
+                         exit(0);
+                 case 'h':
+                 default:
+                         usage();
+               }
+       }
+       if ((flags & FL_ALL && optind != argcnt) || (!(flags & FL_ALL) && optind == argcnt)) {
+               fputs(_("Bad number of arguments.\n"), stderr);
+               usage();
+       }
+       if (fmt == QF_RPC) {
+               fputs(_("Cannot turn on/off quotas via RPC.\n"), stderr);
+               exit(1);
+       }
+       if (!(flags & (FL_USER | FL_GROUP)))
+               flags |= FL_USER | FL_GROUP;
+       if (!(flags & FL_ALL)) {
+               mntpoints = argstr + optind;
+               mntcnt = argcnt - optind;
+       }
+}
+
+/*
+ *     Enable/disable rsquash on given filesystem
+ */
+static int quotarsquashonoff(const char *quotadev, int type, int flags)
+{
+#if defined(MNTOPT_RSQUASH)
+       int ret;
+
+       if (kernel_iface == IFACE_GENERIC) {
+               int qcmd = QCMD(Q_SETINFO, type);
+               struct if_dqinfo info;
+
+               info.dqi_flags = V1_DQF_RSQUASH;
+               info.dqi_valid = IIF_FLAGS;
+               ret = quotactl(qcmd, quotadev, 0, (void *)&info);
+       }
+       else {
+               int mode = (flags & STATEFLAG_OFF) ? 0 : 1;
+               int qcmd = QCMD(Q_V1_RSQUASH, type);
+
+               ret = quotactl(qcmd, quotadev, 0, (void *)&mode);
+       }
+       if (ret < 0) {
+               errstr(_("set root_squash on %s: %s\n"), quotadev, strerror(errno));
+               return 1;
+       }
+       if ((flags & STATEFLAG_VERBOSE) && (flags & STATEFLAG_OFF))
+               printf(_("%s: %s root_squash turned off\n"), quotadev, type2name(type));
+       else if ((flags & STATEFLAG_VERBOSE) && (flags & STATEFLAG_ON))
+               printf(_("%s: %s root_squash turned on\n"), quotadev, type2name(type));
+#endif
+       return 0;
+}
+
+/*
+ *     Enable/disable VFS quota on given filesystem
+ */
+static int quotaonoff(char *quotadev, char *quotadir, char *quotafile, int type, int fmt, int flags)
+{
+       int qcmd, kqf;
+
+       if (flags & STATEFLAG_OFF) {
+               if (kernel_iface == IFACE_GENERIC)
+                       qcmd = QCMD(Q_QUOTAOFF, type);
+               else
+                       qcmd = QCMD(Q_6_5_QUOTAOFF, type);
+               if (quotactl(qcmd, quotadev, 0, NULL) < 0) {
+                       errstr(_("quotactl on %s [%s]: %s\n"), quotadev, quotadir, strerror(errno));
+                       return 1;
+               }
+               if (flags & STATEFLAG_VERBOSE)
+                       printf(_("%s [%s]: %s quotas turned off\n"), quotadev, quotadir, type2name(type));
+               return 0;
+       }
+       if (kernel_iface == IFACE_GENERIC) {
+               qcmd = QCMD(Q_QUOTAON, type);
+               kqf = util2kernfmt(fmt);
+       }
+       else {
+               qcmd = QCMD(Q_6_5_QUOTAON, type);
+               kqf = 0;
+       }
+       if (quotactl(qcmd, quotadev, kqf, (void *)quotafile) < 0) {
+               if (errno == ENOENT)
+                       errstr(_("cannot find %s on %s [%s]\n"), quotafile, quotadev, quotadir);
+               else
+                       errstr(_("using %s on %s [%s]: %s\n"), quotafile, quotadev, quotadir, strerror(errno));
+               if (errno == EINVAL)
+                       errstr(_("Maybe create new quota files with quotacheck(8)?\n"));
+               else if (errno == ESRCH)
+                       errstr(_("Quota format not supported in kernel.\n"));
+               return 1;
+       }
+       if (flags & STATEFLAG_VERBOSE)
+               printf(_("%s [%s]: %s quotas turned on\n"), quotadev, quotadir, type2name(type));
+       return 0;
+}
+
+/*
+ *     Enable/disable quota/rootsquash on given filesystem (version 1)
+ */
+static int v1_newstate(struct mntent *mnt, int type, char *file, int flags, int fmt)
+{
+       int errs = 0;
+       const char *dev = get_device_name(mnt->mnt_fsname);
+
+       if (!dev)
+               return 1;
+       if ((flags & STATEFLAG_OFF) && hasmntopt(mnt, MNTOPT_RSQUASH))
+               errs += quotarsquashonoff(dev, type, flags);
+       if (hasquota(mnt, type, 0))
+               errs += quotaonoff((char *)dev, mnt->mnt_dir, file, type, QF_VFSOLD, flags);
+       if ((flags & STATEFLAG_ON) && hasmntopt(mnt, MNTOPT_RSQUASH))
+               errs += quotarsquashonoff(dev, type, flags);
+       free((char *)dev);
+       return errs;
+}
+
+/*
+ *     Enable/disable quota on given filesystem (generic VFS quota)
+ */
+static int v2_newstate(struct mntent *mnt, int type, char *file, int flags, int fmt)
+{
+       const char *dev = get_device_name(mnt->mnt_fsname);
+       int errs = 0;
+
+       if (!dev)
+               return 1;
+       if (hasquota(mnt, type, 0))
+               errs = quotaonoff((char *)dev, mnt->mnt_dir, file, type, fmt, flags);
+       free((char *)dev);
+       return errs;
+}
+
+/*
+ *     For both VFS quota formats, need to pass in the quota file;
+ *     for XFS quota manager, pass on the -x command line option.
+ */
+static int newstate(struct mntent *mnt, int type, char *extra)
+{
+       int sflags, ret = 0;
+
+       sflags = flags & FL_OFF ? STATEFLAG_OFF : STATEFLAG_ON;
+       if (flags & FL_VERBOSE)
+               sflags |= STATEFLAG_VERBOSE;
+       if (flags & FL_ALL)
+               sflags |= STATEFLAG_ALL;
+
+       if (!strcmp(mnt->mnt_type, MNTTYPE_XFS)) {      /* XFS filesystem has special handling... */
+               if (!kern_qfmt_supp(QF_XFS)) {
+                       errstr(_("Cannot change state of XFS quota. It's not compiled in kernel.\n"));
+                       return 1;
+               }
+               if ((flags & FL_OFF && (kern_quota_on(mnt->mnt_fsname, USRQUOTA, QF_XFS) != -1
+                   || kern_quota_on(mnt->mnt_fsname, GRPQUOTA, QF_XFS) != -1))
+                   || (!(flags & FL_OFF) && kern_quota_on(mnt->mnt_fsname, type, QF_XFS) == -1))
+                       ret = xfs_newstate(mnt, type, extra, sflags);
+       }
+       else if (meta_qf_fstype(mnt->mnt_type)) {
+               if (!hasquota(mnt, type, 0))
+                       return 0;
+               /* Must be non-empty because empty path is always invalid. */
+               ret = v2_newstate(mnt, type, ".", sflags, QF_VFSV0);
+       }
+       else {
+               int usefmt;
+
+               if (!hasquota(mnt, type, 0))
+                       return 0;
+               if (fmt == -1) {
+                       if (get_qf_name(mnt, type, QF_VFSV0,
+                                       NF_FORMAT, &extra) >= 0)
+                               usefmt = QF_VFSV0;
+                       else if (get_qf_name(mnt, type, QF_VFSV1,
+                                       NF_FORMAT, &extra) >= 0)
+                               usefmt = QF_VFSV1;
+                       else if (get_qf_name(mnt, type, QF_VFSOLD,
+                                       NF_FORMAT, &extra) >= 0)
+                               usefmt = QF_VFSOLD;
+                       else {
+                               errstr(_("Cannot find quota file on %s [%s] to turn quotas on/off.\n"), mnt->mnt_dir, mnt->mnt_fsname);
+                               return 1;
+                       }
+               } else {
+                       if (get_qf_name(mnt, type, fmt, NF_FORMAT, &extra) < 0) {
+                               errstr(_("Quota file on %s [%s] does not exist or has wrong format.\n"), mnt->mnt_dir, mnt->mnt_fsname);
+                               return 1;
+                       }
+                       usefmt = fmt;
+               }
+               if (is_tree_qfmt(usefmt))
+                       ret = v2_newstate(mnt, type, extra, sflags, usefmt);
+               else
+                       ret = v1_newstate(mnt, type, extra, sflags, QF_VFSOLD);
+               free(extra);
+       }
+       return ret;
+}
+
+/* Print state of quota (on/off) */
+static int print_state(struct mntent *mnt, int type)
+{
+       int on = 0;
+
+       if (!strcmp(mnt->mnt_type, MNTTYPE_XFS)) {
+               if (kern_qfmt_supp(QF_XFS))
+                       on = kern_quota_on(mnt->mnt_fsname, type, QF_XFS) != -1;
+       }
+       else if (kernel_iface == IFACE_GENERIC)
+               on = kern_quota_on(mnt->mnt_fsname, type, -1) != -1;
+       else if (kern_qfmt_supp(QF_VFSV0))
+               on = kern_quota_on(mnt->mnt_fsname, type, QF_VFSV0) != -1;
+       else if (kern_qfmt_supp(QF_VFSOLD))
+               on = kern_quota_on(mnt->mnt_fsname, type, QF_VFSOLD) != -1;
+
+       printf(_("%s quota on %s (%s) is %s\n"), type2name(type), mnt->mnt_dir, mnt->mnt_fsname,
+         on ? _("on") : _("off"));
+       
+       return on;
+}
+
+int main(int argc, char **argv)
+{
+       struct mntent *mnt;
+       int errs = 0;
+
+       gettexton();
+
+       progname = basename(argv[0]);
+       if (strcmp(progname, "quotaoff") == 0)
+               flags |= FL_OFF;
+       else if (strcmp(progname, "quotaon") != 0)
+               die(1, _("Name must be quotaon or quotaoff not %s\n"), progname);
+
+       parse_options(argc, argv);
+
+       init_kernel_interface();
+       if (fmt != -1 && !kern_qfmt_supp(fmt))
+               die(1, _("Required format %s not supported by kernel.\n"), fmt2name(fmt));
+       else if (!kern_qfmt_supp(-1))
+               errstr(_("Warning: No quota format detected in the kernel.\n"));
+
+       if (init_mounts_scan(mntcnt, mntpoints, MS_XFS_DISABLED | MS_LOCALONLY) < 0)
+               return 1;
+       while ((mnt = get_next_mount())) {
+               if (nfs_fstype(mnt->mnt_type)) {
+                       if (!(flags & FL_ALL))
+                               fprintf(stderr, "%s: Quota cannot be turned on on NFS filesystem\n", mnt->mnt_fsname);
+                       continue;
+               }
+
+               if (!(flags & FL_STAT)) {
+                       if (flags & FL_GROUP)
+                               errs += newstate(mnt, GRPQUOTA, xarg);
+                       if (flags & FL_USER)
+                               errs += newstate(mnt, USRQUOTA, xarg);
+               }
+               else {
+                       if (flags & FL_GROUP)
+                               errs += print_state(mnt, GRPQUOTA);
+                       if (flags & FL_USER)
+                               errs += print_state(mnt, USRQUOTA);
+               }
+       }
+       end_mounts_scan();
+
+       return errs;
+}
+
diff --git a/quotaon.h b/quotaon.h
new file mode 100644 (file)
index 0000000..4e92f09
--- /dev/null
+++ b/quotaon.h
@@ -0,0 +1,19 @@
+/*
+ *     Common types, macros, and routines for enabling/disabling
+ *     quota for each of the various Linux quota formats.
+ */
+
+#include "pot.h"
+#include "quota.h"
+#include "quotasys.h"
+#include "bylabel.h"
+#include "common.h"
+#include "quotaio.h"
+
+#define STATEFLAG_ON           0x01
+#define STATEFLAG_OFF          0x02
+#define STATEFLAG_ALL          0x04
+#define STATEFLAG_VERBOSE      0x08
+
+typedef int (newstate_t) (struct mntent * mnt, int type, char *file, int flags);
+extern int xfs_newstate(struct mntent *mnt, int type, char *file, int flags);
diff --git a/quotaon_xfs.c b/quotaon_xfs.c
new file mode 100644 (file)
index 0000000..a2c9f5e
--- /dev/null
@@ -0,0 +1,237 @@
+/*
+ *     State changes for the XFS Quota Manager.
+ *     Copyright (c) 2001 Silicon Graphics, Inc.
+ */
+
+#include "config.h"
+
+#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+
+#include "quotaon.h"
+#include "dqblk_xfs.h"
+
+#define QOFF   1
+#define ACCT   2
+#define ENFD   3
+
+/*
+ *     Ensure we don't attempt to go into a dodgey state.
+ */
+
+static int xfs_state_check(int qcmd, int type, int flags, char *dev, int roothack, int xopts)
+{
+       struct xfs_mem_dqinfo info;
+       int state;
+       char *acctstr = "";
+
+       /* we never want to operate via -a in XFS quota */
+       if (flags & STATEFLAG_ALL)
+               return 0;       /* noop */
+
+       if (quotactl(QCMD(Q_XFS_GETQSTAT, 0), dev, 0, (void *)&info) < 0) {
+               errstr(_("quotactl() on %s: %s\n"), dev, strerror(errno));
+               return -1;
+       }
+
+       /* establish current state before any transition */
+       state = QOFF;
+       if (type == USRQUOTA) {
+               if (info.qs_flags & XFS_QUOTA_UDQ_ACCT)
+                       state = ACCT;
+               if (info.qs_flags & XFS_QUOTA_UDQ_ENFD)
+                       state = ENFD;
+       }
+       else {                  /* GRPQUOTA */
+               if (info.qs_flags & XFS_QUOTA_GDQ_ACCT)
+                       state = ACCT;
+               if (info.qs_flags & XFS_QUOTA_GDQ_ENFD)
+                       state = ENFD;
+       }
+
+       switch (state) {
+         case QOFF:
+                 switch (qcmd) {
+                   case Q_XFS_QUOTARM:
+                           return 1;
+                   case Q_XFS_QUOTAON:
+                           if (roothack) {
+                                   printf(_("Enabling %s quota on root filesystem"
+                                            " (reboot to take effect)\n"), type2name(type));
+                                   return 1;
+                           }
+                           errstr(_("Enable XFS %s quota accounting during mount\n"),
+                                   type2name(type));
+                           return -1;
+                   case Q_XFS_QUOTAOFF:
+                           return 0;   /* noop */
+                 }
+                 break;
+         case ACCT:
+                 switch (qcmd) {
+                   case Q_XFS_QUOTARM:
+                           errstr(_("Cannot delete %s quota on %s - "
+                                             "switch quota accounting off first\n"),
+                                   type2name(type), dev);
+                           return -1;
+                   case Q_XFS_QUOTAON:
+                           if (roothack) {
+                                   printf(_("Enabling %s quota on root filesystem"
+                                            " (reboot to take effect)\n"), type2name(type));
+                                   return 1;
+                           }
+                           if (xopts & XFS_QUOTA_UDQ_ENFD || xopts & XFS_QUOTA_GDQ_ENFD) {
+                                   printf(_("Enabling %s quota enforcement on %s\n"), type2name(type), dev);
+                                   return 1;
+                           }
+                           errstr(_("Already accounting %s quota on %s\n"),
+                                       type2name(type), dev);
+                           return -1;
+                   case Q_XFS_QUOTAOFF:
+                           if (xopts & XFS_QUOTA_UDQ_ACCT || xopts & XFS_QUOTA_GDQ_ACCT) {
+                                   printf(_("Disabling %s quota accounting on %s\n"),
+                                          type2name(type), dev);
+                                   return 1;
+                           }
+                           errstr(_("Quota enforcement already disabled for %s on %s\n"),
+                                       type2name(type), dev);
+                           return -1;
+                 }
+                 break;
+
+         case ENFD:
+                 switch (qcmd) {
+                   case Q_XFS_QUOTARM:
+                           errstr(_("Cannot delete %s quota on %s - "
+                                     "switch quota enforcement and accounting off first\n"),
+                                   type2name(type), dev);
+                           return -1;
+                   case Q_XFS_QUOTAON:
+                           errstr(_("Enforcing %s quota already on %s\n"),
+                                   type2name(type), dev);
+                           return -1;
+                   case Q_XFS_QUOTAOFF:
+                           if (xopts == XFS_QUOTA_UDQ_ACCT || xopts == XFS_QUOTA_GDQ_ACCT) {
+                                   errstr(_("Cannot switch off %s quota "
+                                       "accounting on %s when enforcement is on\n"),
+                                       type2name(type), dev);
+                                   return -1;
+                           }
+                           if (xopts & XFS_QUOTA_UDQ_ACCT || xopts & XFS_QUOTA_GDQ_ACCT)
+                                   acctstr = _("and accounting ");
+                           printf(_("Disabling %s quota enforcement %son %s\n"),
+                                  type2name(type), acctstr, dev);
+                           return 1;
+                 }
+                 break;
+       }
+       errstr(_("Unexpected XFS quota state sought on %s\n"), dev);
+       return -1;
+}
+
+static int xfs_onoff(char *dev, int type, int flags, int roothack, int xopts)
+{
+       int qoff, qcmd, check;
+
+       qoff = (flags & STATEFLAG_OFF);
+       qcmd = qoff ? Q_XFS_QUOTAOFF : Q_XFS_QUOTAON;
+       check = xfs_state_check(qcmd, type, flags, dev, roothack, xopts);
+       if (check != 1)
+               return (check < 0);
+
+       if (quotactl(QCMD(qcmd, type), dev, 0, (void *)&xopts) < 0) {
+               errstr(_("quotactl on %s: %s\n"), dev, strerror(errno));
+               return 1;
+       }
+       if ((flags & STATEFLAG_VERBOSE) && qoff)
+               printf(_("%s: %s quotas turned off\n"), dev, type2name(type));
+       else if ((flags & STATEFLAG_VERBOSE) && !qoff)
+               printf(_("%s: %s quotas turned on\n"), dev, type2name(type));
+       return 0;
+}
+
+static int xfs_delete(char *dev, int type, int flags, int roothack, int xopts)
+{
+       int qcmd, check;
+
+       qcmd = Q_XFS_QUOTARM;
+       check = xfs_state_check(qcmd, type, flags, dev, roothack, xopts);
+       if (check != 1)
+               return (check < 0);
+
+       if (quotactl(QCMD(qcmd, type), dev, 0, (void *)&xopts) < 0) {
+               errstr(_("Failed to delete quota: %s\n"),
+                       strerror(errno));
+               return 1;
+       }
+
+       if (flags & STATEFLAG_VERBOSE)
+               printf(_("%s: deleted %s quota blocks\n"), dev, type2name(type));
+       return 0;
+}
+
+/*
+ *     Change state for given filesystem - on/off, acct/enfd, & delete.
+ *     Must consider existing state and also whether or not this is the
+ *     root filesystem.
+ *     We are passed in the new requested state through "type" & "xarg".
+ */
+int xfs_newstate(struct mntent *mnt, int type, char *xarg, int flags)
+{
+       int err = 1;
+       int xopts = 0;
+       int roothack = 0;
+       const char *dev = get_device_name(mnt->mnt_fsname);
+
+       if (!dev)
+               return err;
+
+#ifdef XFS_ROOTHACK
+       /*
+        * Old XFS filesystems (up to XFS 1.2 / Linux 2.5.47) had a
+        * hack to allow enabling quota on the root filesystem without
+        * having to specify it at mount time.
+        */
+       if ((strcmp(mnt->mnt_dir, "/") == 0)) {
+               struct xfs_mem_dqinfo info;
+               u_int16_t sbflags = 0;
+
+               if (!quotactl(QCMD(Q_XFS_GETQSTAT, type), dev, 0, (void *)&info))
+                       sbflags = (info.qs_flags & 0xff00) >> 8;
+
+               if ((type == USRQUOTA && (sbflags & XFS_QUOTA_UDQ_ACCT)) &&
+                   (type == GRPQUOTA && (sbflags & XFS_QUOTA_GDQ_ACCT)))
+                       roothack = 1;
+       }
+#endif /* XFS_ROOTHACK */
+
+       if (xarg == NULL) {     /* both acct & enfd on/off */
+               xopts |= (type == USRQUOTA) ?
+                       (XFS_QUOTA_UDQ_ACCT | XFS_QUOTA_UDQ_ENFD) :
+                       (XFS_QUOTA_GDQ_ACCT | XFS_QUOTA_GDQ_ENFD);
+               err = xfs_onoff((char *)dev, type, flags, roothack, xopts);
+       }
+       else if (strcmp(xarg, "account") == 0) {
+               /* only useful if we want root accounting only */
+               if (!roothack || !(flags & STATEFLAG_ON))
+                       goto done;
+               xopts |= (type == USRQUOTA) ? XFS_QUOTA_UDQ_ACCT : XFS_QUOTA_GDQ_ACCT;
+               err = xfs_onoff((char *)dev, type, flags, roothack, xopts);
+       }
+       else if (strcmp(xarg, "enforce") == 0) {
+               xopts |= (type == USRQUOTA) ? XFS_QUOTA_UDQ_ENFD : XFS_QUOTA_GDQ_ENFD;
+               err = xfs_onoff((char *)dev, type, flags, roothack, xopts);
+       }
+       else if (strcmp(xarg, "delete") == 0) {
+               xopts |= (type == USRQUOTA) ? XFS_USER_QUOTA : XFS_GROUP_QUOTA;
+               err = xfs_delete((char *)dev, type, flags, roothack, xopts);
+       }
+       else
+               die(1, _("Invalid argument \"%s\"\n"), xarg);
+      done:
+       free((char *)dev);
+       return err;
+}
diff --git a/quotaops.c b/quotaops.c
new file mode 100644 (file)
index 0000000..4f230d0
--- /dev/null
@@ -0,0 +1,674 @@
+/*
+ * Copyright (c) 1980, 1990 Regents of the University of California. All
+ * rights reserved.
+ * 
+ * This code is derived from software contributed to Berkeley by Robert Elz at
+ * The University of Melbourne.
+ * 
+ * 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. 3. All advertising
+ * materials mentioning features or use of this software must display the
+ * following acknowledgement: This product includes software developed by the
+ * University of California, Berkeley and its contributors. 4. Neither the
+ * name of the University nor the names of its contributors may be used to
+ * endorse or promote products derived from this software without specific
+ * prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS 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 REGENTS 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 "config.h"
+
+#include <rpc/rpc.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/file.h>
+#include <sys/wait.h>
+#include <errno.h>
+#include <pwd.h>
+#include <grp.h>
+#include <stdio.h>
+#include <string.h>
+#include <signal.h>
+#include <paths.h>
+#include <unistd.h>
+#include <time.h>
+#include <ctype.h>
+
+#if defined(RPC)
+#include "rquota.h"
+#endif
+
+#include "mntopt.h"
+#include "quotaops.h"
+#include "pot.h"
+#include "bylabel.h"
+#include "common.h"
+#include "quotasys.h"
+#include "quotaio.h"
+
+/*
+ * Set grace time if needed
+ */
+void update_grace_times(struct dquot *q)
+{
+       time_t now;
+
+       time(&now);
+       if (q->dq_dqb.dqb_bsoftlimit && toqb(q->dq_dqb.dqb_curspace) > q->dq_dqb.dqb_bsoftlimit) {
+               if (!q->dq_dqb.dqb_btime)
+                       q->dq_dqb.dqb_btime = now + q->dq_h->qh_info.dqi_bgrace;
+       }
+       else
+               q->dq_dqb.dqb_btime = 0;
+       if (q->dq_dqb.dqb_isoftlimit && q->dq_dqb.dqb_curinodes > q->dq_dqb.dqb_isoftlimit) {
+               if (!q->dq_dqb.dqb_itime)
+                       q->dq_dqb.dqb_itime = now + q->dq_h->qh_info.dqi_igrace;
+       }
+       else
+               q->dq_dqb.dqb_itime = 0;
+}
+
+/*
+ * Collect the requested quota information.
+ */
+struct dquot *getprivs(qid_t id, struct quota_handle **handles, int quiet)
+{
+       struct dquot *q, *qtail = NULL, *qhead = NULL;
+       int i;
+#if defined(BSD_BEHAVIOUR)
+       int j, ngroups;
+       uid_t euid;
+       gid_t gidset[NGROUPS], *gidsetp;
+       char name[MAXNAMELEN];
+#endif
+
+       for (i = 0; handles[i]; i++) {
+#if defined(BSD_BEHAVIOUR)
+               switch (handles[i]->qh_type) {
+                       case USRQUOTA:
+                               euid = geteuid();
+                               if (euid != id && euid != 0) {
+                                       uid2user(id, name);
+                                       errstr(_("%s (uid %d): Permission denied\n"), name, id);
+                                       return (struct dquot *)NULL;
+                               }
+                               break;
+                       case GRPQUOTA:
+                               if (geteuid() == 0)
+                                       break;
+                               ngroups = sysconf(_SC_NGROUPS_MAX);
+                               if (ngroups > NGROUPS) {
+                                       gidsetp = malloc(ngroups * sizeof(gid_t));
+                                       if (!gidsetp) {
+                                               gid2group(id, name);
+                                               errstr(_("%s (gid %d): gid set allocation (%d): %s\n"), name, id, ngroups, strerror(errno));
+                                               return (struct dquot *)NULL;
+                                       }
+                               }
+                               else
+                                       gidsetp = &gidset[0];
+                               ngroups = getgroups(ngroups, gidsetp);
+                               if (ngroups < 0) {
+                                       if (gidsetp != gidset)
+                                               free(gidsetp);
+                                       gid2group(id, name);
+                                       errstr(_("%s (gid %d): error while trying getgroups(): %s\n"), name, id, strerror(errno));
+                                       return (struct dquot *)NULL;
+                               }
+
+                               for (j = 0; j < ngroups; j++)
+                                       if (id == gidsetp[j])
+                                               break;
+                               if (gidsetp != gidset)
+                                       free(gidsetp);
+                               if (j >= ngroups) {
+                                       gid2group(id, name);
+                                       errstr(_("%s (gid %d): Permission denied\n"),
+                                               name, id);
+                                       return (struct dquot *)NULL;
+                               }
+                               break;
+                       default:
+                               break;
+               }
+#endif
+
+               if (!(q = handles[i]->qh_ops->read_dquot(handles[i], id))) {
+                       /* If rpc.rquotad is not running filesystem might be just without quotas... */
+                       if (errno != ENOENT && (errno != ECONNREFUSED || !quiet)) {
+                               int olderrno = errno;
+
+                               id2name(id, handles[i]->qh_type, name);
+                               errstr(_("error while getting quota from %s for %s (id %u): %s\n"),
+                                       handles[i]->qh_quotadev, name, id, strerror(olderrno));
+                       }
+                       continue;
+               }
+               if (qhead == NULL)
+                       qhead = q;
+               else
+                       qtail->dq_next = q;
+               qtail = q;
+               q->dq_next = NULL;      /* This should be already set, but just for sure... */
+       }
+       return qhead;
+}
+
+/*
+ * Store the requested quota information.
+ */
+int putprivs(struct dquot *qlist, int flags)
+{
+       struct dquot *q;
+       int ret = 0;
+
+       for (q = qlist; q; q = q->dq_next) {
+               if (q->dq_h->qh_ops->commit_dquot(q, flags) == -1) {
+                       errstr(_("Cannot write quota for %u on %s: %s\n"),
+                               q->dq_id, q->dq_h->qh_quotadev, strerror(errno));
+                       ret = -1;
+                       continue;
+               }
+       }
+       return ret;
+}
+
+/*
+ * Take a list of priviledges and get it edited.
+ */
+#define MAX_ED_PARS 128
+int editprivs(char *tmpfile)
+{
+       sigset_t omask, nmask;
+       pid_t pid;
+       int stat;
+
+       sigemptyset(&nmask);
+       sigaddset(&nmask, SIGINT);
+       sigaddset(&nmask, SIGQUIT);
+       sigaddset(&nmask, SIGHUP);
+       sigprocmask(SIG_SETMASK, &nmask, &omask);
+       if ((pid = fork()) < 0) {
+               errstr("Cannot fork(): %s\n", strerror(errno));
+               return -1;
+       }
+       if (pid == 0) {
+               char *ed, *actp, *nextp;
+               char *edpars[MAX_ED_PARS];
+               int i;
+
+               sigprocmask(SIG_SETMASK, &omask, NULL);
+               setgid(getgid());
+               setuid(getuid());
+               if (!(ed = getenv("VISUAL")))
+                       if (!(ed = getenv("EDITOR")))
+                               ed = _PATH_VI;
+               i = 0;
+               ed = actp = sstrdup(ed);
+               while (actp) {
+                       nextp = strchr(actp, ' ');
+                       if (nextp) {
+                               *nextp = 0;
+                               nextp++;
+                       }
+                       edpars[i++] = actp;
+                       if (i == MAX_ED_PARS-2) {
+                               errstr(_("Too many parameters to editor.\n"));
+                               break;
+                       }
+                       actp = nextp;
+               }
+               edpars[i++] = tmpfile;
+               edpars[i] = NULL;
+               execvp(edpars[0], edpars);
+               die(1, _("Cannot exec %s\n"), ed);
+       }
+       waitpid(pid, &stat, 0);
+       sigprocmask(SIG_SETMASK, &omask, NULL);
+
+       return 0;
+}
+
+/*
+ * Convert a dquot list to an ASCII file.
+ */
+int writeprivs(struct dquot *qlist, int outfd, char *name, int quotatype)
+{
+       struct dquot *q;
+       FILE *fd;
+
+       ftruncate(outfd, 0);
+       lseek(outfd, 0, SEEK_SET);
+       if (!(fd = fdopen(dup(outfd), "w")))
+               die(1, _("Cannot duplicate descriptor of file to write to: %s\n"), strerror(errno));
+
+#if defined(ALT_FORMAT)
+       fprintf(fd, _("Disk quotas for %s %s (%cid %d):\n"),
+               type2name(quotatype), name, *type2name(quotatype), qlist->dq_id);
+
+       fprintf(fd,
+               _("  Filesystem                   blocks       soft       hard     inodes     soft     hard\n"));
+
+       for (q = qlist; q; q = q->dq_next) {
+               fprintf(fd, "  %-24s %10llu %10llu %10llu %10llu %8llu %8llu\n",
+                       q->dq_h->qh_quotadev,
+                       (long long)toqb(q->dq_dqb.dqb_curspace),
+                       (long long)q->dq_dqb.dqb_bsoftlimit,
+                       (long long)q->dq_dqb.dqb_bhardlimit,
+                       (long long)q->dq_dqb.dqb_curinodes,
+                       (long long)q->dq_dqb.dqb_isoftlimit, (long long)q->dq_dqb.dqb_ihardlimit);
+       }
+#else
+       fprintf(fd, _("Quotas for %s %s:\n"), type2name(quotatype), name);
+       for (q = qlist; q; q = q->dq_next) {
+               fprintf(fd, _("%s %d, limits (soft = %d, hard = %d)\n"),
+                       q->dq_h->qh_quotadev, _("blocks in use:"),
+                       (int)toqb(q->dq_dqb.dqb_curspace),
+                       q->dq_dqb.dqb_bsoftlimit, q->dq_dqb.dqb_bhardlimit);
+               fprintf(fd, _("%s %d, limits (soft = %d, hard = %d)\n"),
+                       _("\tinodes in use:"), q->dq_dqb.dqb_curinodes,
+                       q->dq_dqb.dqb_isoftlimit, q->dq_dqb.dqb_ihardlimit);
+       }
+#endif
+       fclose(fd);
+       return 0;
+}
+
+/* Merge changes on one dev to proper structure in the list */
+static void merge_limits_to_list(struct dquot *qlist, char *dev, u_int64_t blocks, u_int64_t bsoft,
+                         u_int64_t bhard, u_int64_t inodes, u_int64_t isoft, u_int64_t ihard)
+{
+       struct dquot *q;
+
+       for (q = qlist; q; q = q->dq_next) {
+               if (!devcmp_handle(dev, q->dq_h))
+                       continue;
+
+               q->dq_dqb.dqb_bsoftlimit = bsoft;
+               q->dq_dqb.dqb_bhardlimit = bhard;
+               q->dq_dqb.dqb_isoftlimit = isoft;
+               q->dq_dqb.dqb_ihardlimit = ihard;
+               q->dq_flags |= DQ_FOUND;
+               update_grace_times(q);
+
+               if (blocks != toqb(q->dq_dqb.dqb_curspace))
+                       errstr(_("WARNING - %s: cannot change current block allocation\n"),
+                               q->dq_h->qh_quotadev);
+               if (inodes != q->dq_dqb.dqb_curinodes)
+                       errstr(_("WARNING - %s: cannot change current inode allocation\n"),
+                               q->dq_h->qh_quotadev);
+       }
+}
+
+/*
+ * Merge changes to an ASCII file into a dquot list.
+ */
+int readprivs(struct dquot *qlist, int infd)
+{
+       FILE *fd;
+       int cnt;
+       long long blocks, bsoft, bhard, inodes, isoft, ihard;
+       struct dquot *q;
+
+#if defined(ALT_FORMAT)
+       char fsp[BUFSIZ], line[BUFSIZ];
+#else
+       char *fsp, line1[BUFSIZ], line2[BUFSIZ];
+#endif
+
+       lseek(infd, 0, SEEK_SET);
+       if (!(fd = fdopen(dup(infd), "r")))
+               die(1, _("Cannot duplicate descriptor of temp file: %s\n"), strerror(errno));
+
+#if defined(ALT_FORMAT)
+       /*
+        * Discard title lines, then read lines to process.
+        */
+       fgets(line, sizeof(line), fd);
+       fgets(line, sizeof(line), fd);
+
+       while (fgets(line, sizeof(line), fd)) {
+               cnt = sscanf(line, "%s %llu %llu %llu %llu %llu %llu",
+                            fsp, &blocks, &bsoft, &bhard, &inodes, &isoft, &ihard);
+
+               if (cnt != 7) {
+                       errstr(_("Bad format:\n%s\n"), line);
+                       return -1;
+               }
+
+               merge_limits_to_list(qlist, fsp, blocks, bsoft, bhard, inodes, isoft, ihard);
+       }
+#else
+       /*
+        * Discard title line, then read pairs of lines to process.
+        */
+       fgets(line1, sizeof(line1), fd);
+       while (fgets(line1, sizeof(line1), fd) && fgets(line2, sizeof(line2), fd)) {
+               if (!(fsp = strtok(line1, " \t:"))) {
+                       errstr(_("%s - bad format\n"), line1);
+                       return -1;
+               }
+               if (!(cp = strtok(NULL, "\n"))) {
+                       errstr(_("%s -  %s -- bad format\n"),
+                               fsp, &fsp[strlen(fsp) + 1]);
+                       return -1;
+               }
+
+               cnt = sscanf(cp, _(" blocks in use: %llu, limits (soft = %llu, hard = %llu)"),
+                            &blocks, &bsoft, &bhard);
+               if (cnt != 3) {
+                       errstr(_("%s - %s -- bad format\n"),
+                               fsp, cp);
+                       return -1;
+               }
+
+               if (!(cp = strtok(line2, "\n"))) {
+                       errstr(_("%s - %s -- bad format\n"),
+                               fsp, line2);
+                       return -1;
+               }
+
+               cnt = sscanf(cp, _("\tinodes in use: %llu, limits (soft = %llu, hard = %llu)"),
+                            &inodes, &isoft, &ihard);
+               if (cnt != 3) {
+                       errstr(_("%s - %s -- bad format\n"),
+                               fsp, line2);
+                       return -1;
+               }
+
+               merge_limits_to_list(qlist, fsp, blocks, bsoft, bhard, inodes, isoft, ihard);
+       }
+#endif
+       fclose(fd);
+
+       /*
+        * Disable quotas for any filesystems that have not been found.
+        */
+       for (q = qlist; q; q = q->dq_next) {
+               if (q->dq_flags & DQ_FOUND) {
+                       q->dq_flags &= ~DQ_FOUND;
+                       continue;
+               }
+               q->dq_dqb.dqb_bsoftlimit = 0;
+               q->dq_dqb.dqb_bhardlimit = 0;
+               q->dq_dqb.dqb_isoftlimit = 0;
+               q->dq_dqb.dqb_ihardlimit = 0;
+       }
+       return 0;
+}
+
+/* Merge changes on one dev to proper structure in the list */
+static void merge_times_to_list(struct dquot *qlist, char *dev, time_t btime, time_t itime)
+{
+       struct dquot *q;
+
+       for (q = qlist; q; q = q->dq_next) {
+               if (!devcmp_handle(dev, q->dq_h))
+                       continue;
+
+               q->dq_dqb.dqb_btime = btime;
+               q->dq_dqb.dqb_itime = itime;
+               q->dq_flags |= DQ_FOUND;
+       }
+}
+
+/*
+ * Write grace times of user to file
+ */
+int writeindividualtimes(struct dquot *qlist, int outfd, char *name, int quotatype)
+{
+       struct dquot *q;
+       FILE *fd;
+       time_t now;
+       char btimestr[MAXTIMELEN], itimestr[MAXTIMELEN];
+
+       ftruncate(outfd, 0);
+       lseek(outfd, 0, SEEK_SET);
+       if (!(fd = fdopen(dup(outfd), "w")))
+               die(1, _("Cannot duplicate descriptor of file to write to: %s\n"), strerror(errno));
+
+       fprintf(fd, _("Times to enforce softlimit for %s %s (%cid %d):\n"),
+               type2name(quotatype), name, *type2name(quotatype), qlist->dq_id);
+       fprintf(fd, _("Time units may be: days, hours, minutes, or seconds\n"));
+       fprintf(fd,
+               _("  Filesystem                         block grace               inode grace\n"));
+
+       time(&now);
+       for (q = qlist; q; q = q->dq_next) {
+               if (!q->dq_dqb.dqb_btime)
+                       strcpy(btimestr, _("unset"));
+               else if (q->dq_dqb.dqb_btime <= now)
+                       strcpy(btimestr, _("0seconds"));
+               else
+                       sprintf(btimestr, "%useconds", (unsigned)(q->dq_dqb.dqb_btime - now));
+               if (!q->dq_dqb.dqb_itime)
+                       strcpy(itimestr, _("unset"));
+               else if (q->dq_dqb.dqb_itime <= now)
+                       strcpy(itimestr, _("0seconds"));
+               else
+                       sprintf(itimestr, _("%useconds"), (unsigned)(q->dq_dqb.dqb_itime - now));
+
+               fprintf(fd, "  %-24s %22s %22s\n", q->dq_h->qh_quotadev, btimestr, itimestr);
+       }
+       fclose(fd);
+       return 0;
+}
+
+/*
+ *  Read list of grace times for a user and convert it
+ */
+int readindividualtimes(struct dquot *qlist, int infd)
+{
+       FILE *fd;
+       int cnt, btime, itime;
+       char line[BUFSIZ], fsp[BUFSIZ], btimestr[BUFSIZ], itimestr[BUFSIZ];
+       char iunits[BUFSIZ], bunits[BUFSIZ];
+       time_t now, bseconds, iseconds;
+
+       lseek(infd, 0, SEEK_SET);
+       if (!(fd = fdopen(dup(infd), "r")))
+               die(1, _("Cannot duplicate descriptor of temp file: %s\n"), strerror(errno));
+
+       /*
+        * Discard title lines, then read lines to process.
+        */
+       fgets(line, sizeof(line), fd);
+       fgets(line, sizeof(line), fd);
+       fgets(line, sizeof(line), fd);
+
+       time(&now);
+       while (fgets(line, sizeof(line), fd)) {
+               cnt = sscanf(line, "%s %s %s", fsp, btimestr, itimestr);
+               if (cnt != 3) {
+format_err:
+                       errstr(_("bad format:\n%s\n"), line);
+                       return -1;
+               }
+               if (!strcmp(btimestr, _("unset")))
+                       bseconds = 0;
+               else {
+                       if (sscanf(btimestr, "%d%s", &btime, bunits) != 2)
+                               goto format_err;
+                       if (str2timeunits(btime, bunits, &bseconds) < 0) {
+units_err:
+                               errstr(_("Bad time units. Units are 'second', 'minute', 'hour', and 'day'.\n"));
+                               return -1;
+                       }
+                       bseconds += now;
+               }
+               if (!strcmp(itimestr, _("unset")))
+                       iseconds = 0;
+               else {
+                       if (sscanf(itimestr, "%d%s", &itime, iunits) != 2)
+                               goto format_err;
+                       if (str2timeunits(itime, iunits, &iseconds) < 0)
+                               goto units_err;
+                       iseconds += now;
+               }
+               merge_times_to_list(qlist, fsp, bseconds, iseconds);
+       }
+       fclose(fd);
+
+       return 0;
+}
+
+/*
+ * Convert a dquot list to an ASCII file of grace times.
+ */
+int writetimes(struct quota_handle **handles, int outfd)
+{
+       FILE *fd;
+       char itimebuf[MAXTIMELEN], btimebuf[MAXTIMELEN];
+       int i;
+
+       if (!handles[0])
+               return 0;
+
+       ftruncate(outfd, 0);
+       lseek(outfd, 0, SEEK_SET);
+       if ((fd = fdopen(dup(outfd), "w")) == NULL)
+               die(1, _("Cannot duplicate descriptor of file to edit: %s\n"), strerror(errno));
+
+#if defined(ALT_FORMAT)
+       fprintf(fd, _("Grace period before enforcing soft limits for %ss:\n"),
+               type2name(handles[0]->qh_type));
+       fprintf(fd, _("Time units may be: days, hours, minutes, or seconds\n"));
+       fprintf(fd, _("  Filesystem             Block grace period     Inode grace period\n"));
+
+       for (i = 0; handles[i]; i++) {
+               time2str(handles[i]->qh_info.dqi_bgrace, btimebuf, 0);
+               time2str(handles[i]->qh_info.dqi_igrace, itimebuf, 0);
+               fprintf(fd, "  %-12s %22s %22s\n", handles[i]->qh_quotadev, btimebuf, itimebuf);
+       }
+#else
+       fprintf(fd, _("Time units may be: days, hours, minutes, or seconds\n"));
+       fprintf(fd, _("Grace period before enforcing soft limits for %ss:\n"),
+               type2name(handles[0]->qh_type));
+       for (i = 0; handles[i]; i++) {
+               time2str(handles[i]->qh_info.dqi_bgrace, btimebuf, 0);
+               time2str(handles[i]->qh_info.dqi_igrace, itimebuf, 0);
+               fprintf(fd, _("block grace period: %s, file grace period: %s\n"),
+                       handles[i]->qh_quotadev, btimebuf, itimebuf);
+       }
+#endif
+
+       fclose(fd);
+       return 0;
+}
+
+/*
+ * Merge changes of grace times in an ASCII file into a dquot list.
+ */
+int readtimes(struct quota_handle **handles, int infd)
+{
+       FILE *fd;
+       int itime, btime, i, cnt;
+       time_t iseconds, bseconds;
+
+#if defined(ALT_FORMAT)
+       char fsp[BUFSIZ], bunits[10], iunits[10], line[BUFSIZ];
+#else
+       char *fsp, bunits[10], iunits[10], line1[BUFSIZ];
+#endif
+
+       if (!handles[0])
+               return 0;
+       lseek(infd, 0, SEEK_SET);
+       if (!(fd = fdopen(dup(infd), "r"))) {
+               errstr(_("Cannot reopen temp file: %s\n"),
+                       strerror(errno));
+               return -1;
+       }
+
+       /* Set all grace times to default values */
+       for (i = 0; handles[i]; i++) {
+               handles[i]->qh_info.dqi_bgrace = MAX_DQ_TIME;
+               handles[i]->qh_info.dqi_igrace = MAX_IQ_TIME;
+               mark_quotafile_info_dirty(handles[i]);
+       }
+#if defined(ALT_FORMAT)
+       /*
+        * Discard three title lines, then read lines to process.
+        */
+       fgets(line, sizeof(line), fd);
+       fgets(line, sizeof(line), fd);
+       fgets(line, sizeof(line), fd);
+
+       while (fgets(line, sizeof(line), fd)) {
+               cnt = sscanf(line, "%s %d %s %d %s", fsp, &btime, bunits, &itime, iunits);
+               if (cnt != 5) {
+                       errstr(_("bad format:\n%s\n"), line);
+                       return -1;
+               }
+#else
+       /*
+        * Discard two title lines, then read lines to process.
+        */
+       fgets(line1, sizeof(line1), fd);
+       fgets(line1, sizeof(line1), fd);
+
+       while (fgets(line1, sizeof(line1), fd)) {
+               if (!(fsp = strtok(line1, " \t:"))) {
+                       errstr(_("%s - bad format\n"), line1);
+                       return -1;
+               }
+               if (!(cp = strtok(NULL, "\n"))) {
+                       errstr(_("%s - %s -- bad format\n"),
+                               fsp, &fsp[strlen(fsp) + 1]);
+                       return -1;
+               }
+               cnt = sscanf(cp, _(" block grace period: %d %s file grace period: %d %s"),
+                            &btime, bunits, &itime, iunits);
+               if (cnt != 4) {
+                       errstr(_("%s - %s -- bad format\n"),
+                               fsp, cp);
+                       return -1;
+               }
+#endif
+               if (str2timeunits(btime, bunits, &bseconds) < 0 ||
+                   str2timeunits(itime, iunits, &iseconds) < 0) {
+                       errstr(_("Bad time units. Units are 'second', 'minute', 'hour', and 'day'.\n"));
+                       return -1;
+               }
+               for (i = 0; handles[i]; i++) {
+                       if (!devcmp_handle(fsp, handles[i]))
+                               continue;
+                       handles[i]->qh_info.dqi_bgrace = bseconds;
+                       handles[i]->qh_info.dqi_igrace = iseconds;
+                       mark_quotafile_info_dirty(handles[i]);
+                       break;
+               }
+       }
+       fclose(fd);
+
+       return 0;
+}
+
+/*
+ * Free a list of dquot structures.
+ */
+void freeprivs(struct dquot *qlist)
+{
+       struct dquot *q, *nextq;
+
+       for (q = qlist; q; q = nextq) {
+               nextq = q->dq_next;
+               free(q);
+       }
+}
diff --git a/quotaops.h b/quotaops.h
new file mode 100644 (file)
index 0000000..acd8d30
--- /dev/null
@@ -0,0 +1,18 @@
+#ifndef GUARD_QUOTAOPS_H
+#define GUARD_QUOTAOPS_H
+
+#include "quotaio.h"
+
+struct dquot *getprivs(qid_t id, struct quota_handle ** handles, int quiet);
+int putprivs(struct dquot * qlist, int flags);
+int editprivs(char *tmpfile);
+int writeprivs(struct dquot * qlist, int outfd, char *name, int quotatype);
+int readprivs(struct dquot * qlist, int infd);
+int writeindividualtimes(struct dquot * qlist, int outfd, char *name, int quotatype);
+int readindividualtimes(struct dquot * qlist, int infd);
+int writetimes(struct quota_handle ** handles, int outfd);
+int readtimes(struct quota_handle ** handles, int infd);
+void freeprivs(struct dquot * qlist);
+void update_grace_times(struct dquot *q);
+
+#endif /* GUARD_QUOTAOPS_H */
diff --git a/quotastats.8 b/quotastats.8
new file mode 100644 (file)
index 0000000..6ebfccf
--- /dev/null
@@ -0,0 +1,41 @@
+.\" 2004, Max Vozeler <max@hinterhof.net>
+.\" Released under the Gnu GPL
+.TH QUOTASTATS 8 "April 2, 2004" "" "quota"
+.SH NAME
+.B quotastats
+\- Program to query quota statistics
+.SH SYNOPSIS
+.I /usr/sbin/quotastats
+.SH DESCRIPTION
+.B quotastats
+queries the kernel for quota statistics.
+It displays:
+.P
+.PD 0
+.RS 4
+.IP \[bu]
+Supported kernel quota version
+.IP \[bu]
+Number of dquot lookups
+.IP \[bu]
+Number of dquot drops
+.IP \[bu]
+Number of dquot reads
+.IP \[bu]
+Number of dquot writes
+.IP \[bu]
+Number of quotafile syncs
+.IP \[bu]
+Number of dquot cache hits
+.IP \[bu]
+Number of allocated dquots
+.IP \[bu]
+Number of free dquots
+.IP \[bu]
+Number of in use dquot entries (user/group)
+.RE
+.PD
+.SH OPTIONS
+None.
+.SH SEE ALSO
+.BR quota (1).
diff --git a/quotastats.c b/quotastats.c
new file mode 100644 (file)
index 0000000..1ec2137
--- /dev/null
@@ -0,0 +1,129 @@
+/*
+ * QUOTA    An implementation of the diskquota system for the LINUX operating
+ *          system. QUOTA is implemented using the BSD systemcall interface
+ *          as the means of communication with the user level. Should work for
+ *          all filesystems because of integration into the VFS layer of the
+ *          operating system. This is based on the Melbourne quota system wich
+ *          uses both user and group quota files.
+ * 
+ *          Program to query for the internal statistics.
+ * 
+ * Author:  Marco van Wieringen <mvw@planets.elm.net>
+ *
+ * Version: $Id: quotastats.c,v 1.12 2010/01/05 16:04:57 jkar8572 Exp $
+ *
+ *          This program is free software; you can redistribute it and/or
+ *          modify it under the terms of the GNU General Public License as
+ *          published by the Free Software Foundation; either version 2 of
+ *          the License, or (at your option) any later version.
+ */
+
+#include "config.h"
+
+#include <sys/types.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <errno.h>
+#include <string.h>
+#include <signal.h>
+
+#include "pot.h"
+#include "common.h"
+#include "quota.h"
+#include "quotasys.h"
+#include "quotaio.h"
+#include "quotaio_v1.h"
+#include "dqblk_v1.h"
+#include "quotaio_v2.h"
+#include "dqblk_v2.h"
+
+char *progname;
+
+static int get_proc_num(char *name)
+{
+       int ret;
+       char namebuf[PATH_MAX] = "/proc/sys/fs/quota/";
+       FILE *f;
+
+       sstrncat(namebuf, name, PATH_MAX);
+       if (!(f = fopen(namebuf, "r"))) {
+               errstr(_("Cannot read stat file %s: %s\n"), namebuf, strerror(errno));
+               return -1;
+       }
+       fscanf(f, "%d", &ret);
+       fclose(f);
+       return ret;
+}
+
+static int get_stats(struct util_dqstats *dqstats)
+{
+       struct v1_dqstats old_dqstats;
+       struct v2_dqstats v0_dqstats;
+       int ret = -1;
+       struct stat st;
+
+       signal(SIGSEGV, SIG_IGN);       /* Ignore SIGSEGV due to bad quotactl() */
+       if (!stat("/proc/sys/fs/quota", &st)) {
+               dqstats->version = 6*10000+5*100+1;
+               dqstats->lookups = get_proc_num("lookups");
+               dqstats->drops = get_proc_num("drops");
+               dqstats->reads = get_proc_num("reads");
+               dqstats->writes = get_proc_num("writes");
+               dqstats->cache_hits = get_proc_num("cache_hits");
+               dqstats->allocated_dquots = get_proc_num("allocated_dquots");
+               dqstats->free_dquots = get_proc_num("free_dquots");
+               dqstats->syncs = get_proc_num("syncs");
+       }
+       else if (quotactl(QCMD(Q_V1_GETSTATS, 0), NULL, 0, (caddr_t)&old_dqstats) >= 0) {
+               /* Structures are currently the same */
+               memcpy(dqstats, &old_dqstats, sizeof(old_dqstats));
+               dqstats->version = 0;
+       }
+       else {
+               /* Sadly these all are possible to get from kernel :( */
+               if (errno != EINVAL && errno != EPERM && errno != EFAULT) {
+                       errstr(_("Error while getting quota statistics from kernel: %s\n"), strerror(errno));
+                       goto out;
+               }
+               if (quotactl(QCMD(Q_V2_GETSTATS, 0), NULL, 0, (caddr_t)&v0_dqstats) < 0) {
+                       errstr(_("Error while getting old quota statistics from kernel: %s\n"), strerror(errno));
+                       goto out;
+               }
+               memcpy(dqstats, &v0_dqstats, sizeof(v0_dqstats));
+       }
+       ret = 0;
+out:
+       signal(SIGSEGV, SIG_DFL);
+       return ret;
+}
+
+static inline int print_stats(struct util_dqstats *dqstats)
+{
+       if (!dqstats->version)
+               printf(_("Kernel quota version: old\n"));
+       else
+               printf(_("Kernel quota version: %u.%u.%u\n"), dqstats->version/10000, dqstats->version/100%100, dqstats->version%100);
+       printf(_("Number of dquot lookups: %ld\n"), (long)dqstats->lookups);
+       printf(_("Number of dquot drops: %ld\n"), (long)dqstats->drops);
+       printf(_("Number of dquot reads: %ld\n"), (long)dqstats->reads);
+       printf(_("Number of dquot writes: %ld\n"), (long)dqstats->writes);
+       printf(_("Number of quotafile syncs: %ld\n"), (long)dqstats->syncs);
+       printf(_("Number of dquot cache hits: %ld\n"), (long)dqstats->cache_hits);
+       printf(_("Number of allocated dquots: %ld\n"), (long)dqstats->allocated_dquots);
+       printf(_("Number of free dquots: %ld\n"), (long)dqstats->free_dquots);
+       printf(_("Number of in use dquot entries (user/group): %ld\n"),
+               (long)(dqstats->allocated_dquots - dqstats->free_dquots));
+       return 0;
+}
+
+int main(int argc, char **argv)
+{
+       struct util_dqstats dqstats;
+
+       gettexton();
+       progname = basename(argv[0]);
+
+       if (!get_stats(&dqstats))
+               print_stats(&dqstats);
+       return 0;
+}
diff --git a/quotasys.c b/quotasys.c
new file mode 100644 (file)
index 0000000..8df5e3b
--- /dev/null
@@ -0,0 +1,1279 @@
+/*
+ *
+ *     Interactions of quota with system - filenames, fstab and so on...
+ *
+ *     Jan Kara <jack@suse.cz> - sponsored by SuSE CR
+ */
+
+#include "config.h"
+
+#include <stdio.h>
+#include <errno.h>
+#include <string.h>
+#include <limits.h>
+#include <pwd.h>
+#include <grp.h>
+#include <stdlib.h>
+#include <time.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <signal.h>
+#include <ctype.h>
+#include <paths.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/vfs.h>
+
+#include "pot.h"
+#include "bylabel.h"
+#include "common.h"
+#include "quotasys.h"
+#include "quotaio.h"
+#include "dqblk_v1.h"
+#include "dqblk_v2.h"
+#include "dqblk_xfs.h"
+#include "quotaio_v2.h"
+
+#define min(x,y) (((x) < (y)) ? (x) : (y))
+
+#define QFMT_NAMES 5
+
+static char extensions[MAXQUOTAS + 2][20] = INITQFNAMES;
+static char *basenames[] = INITQFBASENAMES;
+static char *fmtnames[] = { "vfsold",
+                           "vfsv0",
+                           "vfsv1",
+                           "rpc",
+                           "xfs",
+};
+
+/*
+ *     Check for various kinds of NFS filesystem
+ */
+int nfs_fstype(char *type)
+{
+       return !strcmp(type, MNTTYPE_NFS) || !strcmp(type, MNTTYPE_NFS4) ||
+               !strcmp(type, MNTTYPE_MPFS);
+}
+
+/*
+ *     Check whether filesystem has hidden quota files which is handles
+ *     as metadata (and thus always tracks usage).
+ */
+int meta_qf_fstype(char *type)
+{
+       return !strcmp(type, MNTTYPE_OCFS2);
+}
+
+/*
+ *     Check whether give filesystem type is supported
+ */
+
+static int correct_fstype(char *type)
+{
+       char *mtype = sstrdup(type), *next;
+
+       type = mtype;
+       do {
+               next = strchr(type, ',');
+               if (next)
+                       *next = 0;
+               if (!strcmp(type, MNTTYPE_EXT2) ||
+                   !strcmp(type, MNTTYPE_EXT3) ||
+                   !strcmp(type, MNTTYPE_EXT4) ||
+                   !strcmp(type, MNTTYPE_EXT4DEV) ||
+                   !strcmp(type, MNTTYPE_JFS) ||
+                   !strcmp(type, MNTTYPE_MINIX) ||
+                   !strcmp(type, MNTTYPE_UFS) ||
+                   !strcmp(type, MNTTYPE_UDF) ||
+                   !strcmp(type, MNTTYPE_REISER) ||
+                   !strcmp(type, MNTTYPE_XFS) ||
+                   !strcmp(type, MNTTYPE_NFS) ||
+                   !strcmp(type, MNTTYPE_NFS4) ||
+                   !strcmp(type, MNTTYPE_OCFS2) ||
+                   !strcmp(type, MNTTYPE_MPFS)) {
+                       free(mtype);
+                       return 1;
+               }
+               type = next+1;  
+       } while (next);
+       free(mtype);
+       return 0;
+}
+
+/*
+ *     Convert type of quota to written representation
+ */
+char *type2name(int type)
+{
+       return extensions[type];
+}
+
+/*
+ *     Convert name to uid
+ */
+uid_t user2uid(char *name, int flag, int *err)
+{
+       struct passwd *entry;
+       uid_t ret;
+       char *errch;
+
+       if (err)
+               *err = 0;
+       if (!flag) {
+               ret = strtoul(name, &errch, 0);
+               if (!*errch)            /* Is name number - we got directly uid? */
+                       return ret;
+       }
+       if (!(entry = getpwnam(name))) {
+               if (!err) {
+                       errstr(_("user %s does not exist.\n"), name);
+                       exit(1);
+               }
+               else {
+                       *err = -1;
+                       return 0;
+               }
+       }
+       return entry->pw_uid;
+}
+
+/*
+ *     Convert group name to gid
+ */
+gid_t group2gid(char *name, int flag, int *err)
+{
+       struct group *entry;
+       gid_t ret;
+       char *errch;
+
+       if (err)
+               *err = 0;
+       if (!flag) {
+               ret = strtoul(name, &errch, 0);
+               if (!*errch)            /* Is name number - we got directly gid? */
+                       return ret;
+       }
+       if (!(entry = getgrnam(name))) {
+               if (!err) {
+                       errstr(_("group %s does not exist.\n"), name);
+                       exit(1);
+               }
+               else {
+                       *err = -1;
+                       return 0;
+               }
+       }
+       return entry->gr_gid;
+}
+
+/*
+ *     Convert name to id
+ */
+int name2id(char *name, int qtype, int flag, int *err)
+{
+       if (qtype == USRQUOTA)
+               return user2uid(name, flag, err);
+       else
+               return group2gid(name, flag, err);
+}
+
+/*
+ *     Convert uid to name
+ */
+int uid2user(uid_t id, char *buf)
+{
+       struct passwd *entry;
+
+       if (!(entry = getpwuid(id))) {
+               snprintf(buf, MAXNAMELEN, "#%u", (uint) id);
+               return 1;
+       }
+       else
+               sstrncpy(buf, entry->pw_name, MAXNAMELEN);
+       return 0;
+}
+
+/*
+ *     Convert gid to name
+ */
+int gid2group(gid_t id, char *buf)
+{
+       struct group *entry;
+
+       if (!(entry = getgrgid(id))) {
+               snprintf(buf, MAXNAMELEN, "#%u", (uint) id);
+               return 1;
+       }
+       else
+               sstrncpy(buf, entry->gr_name, MAXNAMELEN);
+       return 0;
+}
+
+/*
+ *     Convert id to user/groupname
+ */
+int id2name(int id, int qtype, char *buf)
+{
+       if (qtype == USRQUOTA)
+               return uid2user(id, buf);
+       else
+               return gid2group(id, buf);
+}
+
+/*
+ *     Parse /etc/nsswitch.conf and return type of default passwd handling
+ */
+int passwd_handling(void)
+{
+       FILE *f;
+       char buf[1024], *colpos, *spcpos;
+       int ret = PASSWD_FILES;
+
+       if (!(f = fopen("/etc/nsswitch.conf", "r")))
+               return PASSWD_FILES;    /* Can't open nsswitch.conf - fallback on compatible mode */
+       while (fgets(buf, sizeof(buf), f)) {
+               if (strncmp(buf, "passwd:", 7)) /* Not passwd entry? */
+                       continue;
+               for (colpos = buf+7; isspace(*colpos); colpos++);
+               if (!*colpos)   /* Not found any type of handling? */
+                       break;
+               for (spcpos = colpos; !isspace(*spcpos) && *spcpos; spcpos++);
+               *spcpos = 0;
+               if (!strcmp(colpos, "db") || !strcmp(colpos, "nis") || !strcmp(colpos, "nis+"))
+                       ret = PASSWD_DB;
+               break;
+       }
+       fclose(f);
+       return ret;
+}
+
+/*
+ *     Convert quota format name to number
+ */
+int name2fmt(char *str)
+{
+       int fmt;
+
+       for (fmt = 0; fmt < QFMT_NAMES; fmt++)
+               if (!strcmp(str, fmtnames[fmt]))
+                       return fmt;
+       errstr(_("Unknown quota format: %s\nSupported formats are:\n\
+  vfsold - original quota format\n\
+  vfsv0 - standard quota format\n\
+  vfsv1 - quota format with 64-bit limits\n\
+  rpc - use RPC calls\n\
+  xfs - XFS quota format\n"), str);
+       return QF_ERROR;
+}
+
+/*
+ *     Convert quota format number to name
+ */
+char *fmt2name(int fmt)
+{
+       return fmtnames[fmt];
+}
+
+/*
+ *     Convert kernel to utility quota format number
+ */
+int kern2utilfmt(int kernfmt)
+{
+       switch (kernfmt) {
+               case QFMT_VFS_OLD:
+                       return QF_VFSOLD;
+               case QFMT_VFS_V0:
+                       return QF_VFSV0;
+               case QFMT_VFS_V1:
+                       return QF_VFSV1;
+               case QFMT_OCFS2:
+                       return QF_META;
+       }
+       return -1;
+}
+
+/*
+ *     Convert utility to kernel quota format number
+ */
+int util2kernfmt(int fmt)
+{
+       switch (fmt) {
+               case QF_VFSOLD:
+                       return QFMT_VFS_OLD;
+               case QF_VFSV0:
+                       return QFMT_VFS_V0;
+               case QF_VFSV1:
+                       return QFMT_VFS_V1;
+       }
+       return -1;
+}
+
+/*
+ * Convert time difference of seconds and current time
+ */
+void difftime2str(time_t seconds, char *buf)
+{
+       time_t now;
+
+       buf[0] = 0;
+       if (!seconds)
+               return;
+       time(&now);
+       if (seconds <= now) {
+               strcpy(buf, _("none"));
+               return;
+       }
+       time2str(seconds - now, buf, TF_ROUND);
+}
+
+/*
+ * Convert time to printable form
+ */
+void time2str(time_t seconds, char *buf, int flags)
+{
+       uint minutes, hours, days;
+
+       if (flags & TF_ROUND) {
+               minutes = (seconds + 30) / 60;  /* Rounding */
+               hours = minutes / 60;
+               minutes %= 60;
+               days = hours / 24;
+               hours %= 24;
+               if (days >= 2)
+                       snprintf(buf, MAXTIMELEN, _("%ddays"), days);
+               else
+                       snprintf(buf, MAXTIMELEN, _("%02d:%02d"), hours + days * 24, minutes);
+       }
+       else {
+               minutes = seconds / 60;
+               seconds %= 60;
+               hours = minutes / 60;
+               minutes %= 60;
+               days = hours / 24;
+               hours %= 24;
+               if (seconds || (!minutes && !hours && !days))
+                       snprintf(buf, MAXTIMELEN, _("%useconds"), (uint)(seconds+minutes*60+hours*3600+days*3600*24));
+               else if (minutes)
+                       snprintf(buf, MAXTIMELEN, _("%uminutes"), (uint)(minutes+hours*60+days*60*24));
+               else if (hours)
+                       snprintf(buf, MAXTIMELEN, _("%uhours"), (uint)(hours+days*24));
+               else
+                       snprintf(buf, MAXTIMELEN, _("%udays"), days);
+       }
+}
+
+/*
+ * Convert number with unit to time in seconds
+ */
+int str2timeunits(time_t num, char *unit, time_t *res)
+{
+       if (memcmp(unit, "second", 6) == 0)
+               *res = num;
+       else if (memcmp(unit, "minute", 6) == 0)
+               *res = num * 60;
+       else if (memcmp(unit, "hour", 4) == 0)
+               *res = num * 60 * 60;
+       else if (memcmp(unit, "day", 3) == 0)
+               *res = num * 24 * 60 * 60;
+       else
+               return -1;
+       return 0;
+}
+
+/*
+ * Convert number in quota blocks to some nice short form for printing
+ */
+void space2str(qsize_t space, char *buf, int format)
+{
+       int i;
+       char suffix[8] = " MGT";
+
+       space = qb2kb(space);
+       if (format) {
+               for (i = 3; i > 0; i--)
+                       if (space >= (1LL << (QUOTABLOCK_BITS*i))*100) {
+                               sprintf(buf, "%llu%c", (unsigned long long)(space+(1 << (QUOTABLOCK_BITS*i))-1) >> (QUOTABLOCK_BITS*i), suffix[i]);
+                               return;
+                       }
+               sprintf(buf, "%lluK", (unsigned long long)space);
+               return;
+       }
+       sprintf(buf, "%llu", (unsigned long long)space);
+}
+
+/*
+ *  Convert number to some nice short form for printing
+ */
+void number2str(unsigned long long num, char *buf, int format)
+{
+       int i;
+       unsigned long long div;
+       char suffix[8] = " kmgt";
+
+       if (format)
+               for (i = 4, div = 1000000000000LL; i > 0; i--, div /= 1000)
+                       if (num >= 100*div) {
+                               sprintf(buf, "%llu%c", (num+div-1) / div, suffix[i]);
+                               return;
+                       }
+       sprintf(buf, "%llu", num);
+}
+
+/*
+ *     Check for XFS filesystem with quota accounting enabled
+ */
+static int hasxfsquota(struct mntent *mnt, int type, int flags)
+{
+       int ret = 0;
+       u_int16_t sbflags;
+       struct xfs_mem_dqinfo info;
+       const char *dev;
+       char *opt, *endopt;
+
+       if (flags & MS_XFS_DISABLED)
+               return 1;
+
+       dev = get_device_name(mnt->mnt_fsname);
+       if (!dev)
+               return 0;
+       /* Loopback mounted device with a loopback device in the arguments? */
+       if ((opt = hasmntopt(mnt, MNTOPT_LOOP)) && (opt = strchr(opt, '='))) {
+               free((char *)dev);
+               endopt = strchr(opt+1, ',');
+               if (!endopt)
+                       dev = strdup(opt+1);
+               else
+                       dev = strndup(opt+1, endopt-opt-1);
+               if (!dev)
+                       return 0;
+       }
+
+       memset(&info, 0, sizeof(struct xfs_mem_dqinfo));
+       if (!quotactl(QCMD(Q_XFS_GETQSTAT, type), dev, 0, (void *)&info)) {
+               sbflags = (info.qs_flags & 0xff00) >> 8;
+               if (type == USRQUOTA && (info.qs_flags & XFS_QUOTA_UDQ_ACCT))
+                       ret = 1;
+               else if (type == GRPQUOTA && (info.qs_flags & XFS_QUOTA_GDQ_ACCT))
+                       ret = 1;
+#ifdef XFS_ROOTHACK
+               /*
+                * Old XFS filesystems (up to XFS 1.2 / Linux 2.5.47) had a
+                * hack to allow enabling quota on the root filesystem without
+                * having to specify it at mount time.
+                */
+               else if (strcmp(mnt->mnt_dir, "/"))
+                       ret = 0;
+               else if (type == USRQUOTA && (sbflags & XFS_QUOTA_UDQ_ACCT))
+                       ret = 1;
+               else if (type == GRPQUOTA && (sbflags & XFS_QUOTA_GDQ_ACCT))
+                       ret = 1;
+#endif /* XFS_ROOTHACK */
+       }
+       free((char *)dev);
+       return ret;
+}
+
+/* Return if given option has nonempty argument */
+char *hasmntoptarg(struct mntent *mnt, char *opt)
+{
+       char *p = hasmntopt(mnt, opt);
+
+       if (!p)
+               return NULL;
+       p += strlen(opt);
+       if (*p == '=' && p[1] != ',')
+               return p+1;
+       return NULL;
+}
+
+/*
+ *     Check to see if a particular quota is to be enabled (filesystem mounted with proper option)
+ */
+int hasquota(struct mntent *mnt, int type, int flags)
+{
+       if (!correct_fstype(mnt->mnt_type) || hasmntopt(mnt, MNTOPT_NOQUOTA))
+               return 0;
+       
+       if (!strcmp(mnt->mnt_type, MNTTYPE_XFS))
+               return hasxfsquota(mnt, type, flags);
+       if (nfs_fstype(mnt->mnt_type))  /* NFS always has quota or better there is no good way how to detect it */
+               return 1;
+
+       if ((type == USRQUOTA) && (hasmntopt(mnt, MNTOPT_USRQUOTA) || hasmntoptarg(mnt, MNTOPT_USRJQUOTA)))
+               return 1;
+       if ((type == GRPQUOTA) && (hasmntopt(mnt, MNTOPT_GRPQUOTA) || hasmntoptarg(mnt, MNTOPT_GRPJQUOTA)))
+               return 1;
+       if ((type == USRQUOTA) && hasmntopt(mnt, MNTOPT_QUOTA))
+               return 1;
+       return 0;
+}
+
+/* Check whether quotafile for given format exists - return its name in namebuf */
+static int check_fmtfile_ok(char *name, int type, int fmt, int flags)
+{
+       if (!flags)
+               return 1;
+       if (flags & NF_EXIST) {
+               struct stat st;
+
+               if (stat(name, &st) < 0) {
+                       if (errno != ENOENT)
+                               errstr(_("Cannot stat quota file %s: %s\n"), name, strerror(errno));
+                       return 0;
+               }
+       } 
+       if (flags & NF_FORMAT) {
+               int fd, ret = 0;
+
+               if ((fd = open(name, O_RDONLY)) >= 0) {
+                       if (is_tree_qfmt(fmt))
+                               ret = quotafile_ops_2.check_file(fd, type, fmt);
+                       else
+                               ret = quotafile_ops_1.check_file(fd, type, fmt);
+                       close(fd);
+                       if (ret <= 0)
+                               return 0;
+               }
+               else if (errno != ENOENT && errno != EPERM) {
+                       errstr(_("Cannot open quotafile %s: %s\n"), name, strerror(errno));
+                       return 0;
+               }
+       }
+       return 1;
+}
+
+/*
+ *     Get quotafile name for given entry. Return 0 in case format check succeeded,
+ *     otherwise return -1.
+ *     Note that formats without quotafile *must* be detected prior to calling this function
+ */
+int get_qf_name(struct mntent *mnt, int type, int fmt, int flags, char **filename)
+{
+       char *option, *pathname, has_quota_file_definition = 0;
+       char qfullname[PATH_MAX];
+
+       qfullname[0] = 0;
+       if (type == USRQUOTA && (option = hasmntopt(mnt, MNTOPT_USRQUOTA))) {
+               if (*(pathname = option + strlen(MNTOPT_USRQUOTA)) == '=')
+                       has_quota_file_definition = 1;
+       }
+       else if (type == USRQUOTA && (option = hasmntoptarg(mnt, MNTOPT_USRJQUOTA))) {
+               pathname = option;
+               has_quota_file_definition = 1;
+               sstrncpy(qfullname, mnt->mnt_dir, sizeof(qfullname));
+               sstrncat(qfullname, "/", sizeof(qfullname));
+       }
+       else if (type == GRPQUOTA && (option = hasmntopt(mnt, MNTOPT_GRPQUOTA))) {
+               pathname = option + strlen(MNTOPT_GRPQUOTA);
+               if (*pathname == '=') {
+                       has_quota_file_definition = 1;
+                       pathname++;
+               }
+       }
+       else if (type == GRPQUOTA && (option = hasmntoptarg(mnt, MNTOPT_GRPJQUOTA))) {
+               pathname = option;
+               has_quota_file_definition = 1;
+               sstrncpy(qfullname, mnt->mnt_dir, sizeof(qfullname));
+               sstrncat(qfullname, "/", sizeof(qfullname));
+       }
+       else if (type == USRQUOTA && (option = hasmntopt(mnt, MNTOPT_QUOTA))) {
+               pathname = option + strlen(MNTOPT_QUOTA);
+               if (*pathname == '=') {
+                       has_quota_file_definition = 1;
+                       pathname++;
+               }
+       }
+       else
+               return -1;
+
+       if (has_quota_file_definition) {
+               if ((option = strchr(pathname, ','))) {
+                       int tocopy = min(option - pathname + 1,
+                                        sizeof(qfullname) - strlen(qfullname));
+                       sstrncpy(qfullname + strlen(qfullname), pathname, tocopy);
+               } else
+                       sstrncat(qfullname, pathname, sizeof(qfullname));
+       } else {
+               snprintf(qfullname, PATH_MAX, "%s/%s.%s", mnt->mnt_dir,
+                        basenames[fmt], extensions[type]);
+       }
+       if (check_fmtfile_ok(qfullname, type, fmt, flags)) {
+               *filename = sstrdup(qfullname);
+               return 0;
+       }
+       return -1;
+}
+
+#define START_MNT_POINTS 256   /* The number of mount points we start with... */
+
+/*
+ *     Create NULL terminated list of quotafile handles from given list of mountpoints
+ *     List of zero length means scan all entries in /etc/mtab
+ */
+struct quota_handle **create_handle_list(int count, char **mntpoints, int type, int fmt,
+                                        int ioflags, int mntflags)
+{
+       struct mntent *mnt;
+       int gotmnt = 0;
+       static int hlist_allocated = 0;
+       static struct quota_handle **hlist = NULL;
+
+       if (!hlist_allocated) {
+               hlist = smalloc(START_MNT_POINTS * sizeof(struct quota_handle *));
+               hlist_allocated = START_MNT_POINTS;
+       }
+
+       /* If directories are specified, cache all NFS mountpoints */
+       if (count && !(mntflags & MS_LOCALONLY))
+               mntflags |= MS_NFS_ALL;
+
+       if (init_mounts_scan(count, mntpoints, mntflags) < 0)
+               die(2, _("Cannot initialize mountpoint scan.\n"));
+       while ((mnt = get_next_mount())) {
+#ifndef RPC
+               if (nfs_fstype(mnt->mnt_type))
+                       continue;
+#endif
+               if (fmt == -1 || count) {
+add_entry:
+                       if (gotmnt+1 >= hlist_allocated) {
+                               hlist_allocated += START_MNT_POINTS;
+                               hlist = srealloc(hlist, hlist_allocated * sizeof(struct quota_handle *));
+                       }
+                       if (!(hlist[gotmnt] = init_io(mnt, type, fmt, ioflags)))
+                               continue;
+                       gotmnt++;
+               }
+               else {
+                       switch (fmt) {
+                       case QF_RPC:
+                               if (nfs_fstype(mnt->mnt_type))
+                                       goto add_entry;
+                               break;
+                       case QF_XFS:
+                               if (!strcmp(mnt->mnt_type, MNTTYPE_XFS))
+                                       goto add_entry;
+                               break;
+                       default:
+                               if (strcmp(mnt->mnt_type, MNTTYPE_XFS) && !nfs_fstype(mnt->mnt_type))
+                                       goto add_entry;
+                               break;
+                       }
+               }
+       }
+       end_mounts_scan();
+       hlist[gotmnt] = NULL;
+       if (count && gotmnt != count)
+               die(1, _("Not all specified mountpoints are using quota.\n"));
+       return hlist;
+}
+
+/*
+ *     Free given list of handles
+ */
+int dispose_handle_list(struct quota_handle **hlist)
+{
+       int i;
+       int ret = 0;
+
+       for (i = 0; hlist[i]; i++)
+               if (end_io(hlist[i]) < 0) {
+                       errstr(_("Error while releasing file on %s\n"),
+                               hlist[i]->qh_quotadev);
+                       ret = -1;
+               }
+       return ret;
+}
+
+/*
+ *     Check whether given device name matches this quota handle
+ */
+int devcmp_handle(const char *dev, struct quota_handle *h)
+{
+       struct stat sbuf;
+
+       if (stat(dev, &sbuf) < 0)
+               return (strcmp(dev, h->qh_quotadev) == 0);
+       if (!S_ISBLK(sbuf.st_mode))
+               return (strcmp(dev, h->qh_quotadev) == 0);
+       if (sbuf.st_rdev != h->qh_stat.st_rdev)
+               return 0;
+       return 1;
+}
+
+/*
+ *     Check whether two quota handles are for the same device
+ */
+int devcmp_handles(struct quota_handle *a, struct quota_handle *b)
+{
+       if (!S_ISBLK(a->qh_stat.st_mode) || !S_ISBLK(b->qh_stat.st_mode))
+               return (strcmp(a->qh_quotadev, b->qh_quotadev) == 0);
+       if (a->qh_stat.st_rdev != b->qh_stat.st_rdev)
+               return 0;
+       return 1;
+}
+
+/*
+ *     Check kernel quota version
+ */
+
+int kernel_iface;      /* Kernel interface type */
+static int kernel_qfmt_num;    /* Number of different supported formats */
+static int kernel_qfmt[QUOTAFORMATS]; /* Formats supported by kernel */
+
+#ifndef FS_DQSTATS
+#define FS_DQSTATS 16
+#endif
+#ifndef FS_DQ_SYNCS
+#define FS_DQ_SYNCS 8
+#endif
+
+void init_kernel_interface(void)
+{
+       struct stat st;
+       struct sigaction sig, oldsig;
+       
+       /* This signal handling is needed because old kernels send us SIGSEGV as they try to resolve the device */
+       sig.sa_handler = SIG_IGN;
+       sig.sa_sigaction = NULL;
+       if (sigemptyset(&sig.sa_mask) < 0)
+               die(2, _("Cannot create set for sigaction(): %s\n"), strerror(errno));
+       sig.sa_flags = 0;
+       if (sigaction(SIGSEGV, &sig, &oldsig) < 0)
+               die(2, _("Cannot set signal handler: %s\n"), strerror(errno));
+
+       kernel_qfmt_num = 0;
+       if (!stat("/proc/fs/xfs/stat", &st))
+               kernel_qfmt[kernel_qfmt_num++] = QF_XFS;
+       else
+               if (!quotactl(QCMD(Q_XGETQSTAT, 0), NULL, 0, NULL) || (errno != EINVAL && errno != ENOSYS))
+                       kernel_qfmt[kernel_qfmt_num++] = QF_XFS;
+       /* Detect new kernel interface; Assume generic interface unless we can prove there is not one... */
+       if (!stat("/proc/sys/fs/quota", &st) || errno != ENOENT) {
+               kernel_iface = IFACE_GENERIC;
+               kernel_qfmt[kernel_qfmt_num++] = QF_META;
+               kernel_qfmt[kernel_qfmt_num++] = QF_VFSOLD;
+               kernel_qfmt[kernel_qfmt_num++] = QF_VFSV0;
+               kernel_qfmt[kernel_qfmt_num++] = QF_VFSV1;
+       }
+       else {
+               struct v2_dqstats v2_stats;
+
+               if (quotactl(QCMD(Q_V2_GETSTATS, 0), NULL, 0, (void *)&v2_stats) >= 0) {
+                       kernel_qfmt[kernel_qfmt_num++] = QF_VFSV0;
+                       kernel_iface = IFACE_VFSV0;
+               }
+               else if (errno != ENOSYS && errno != ENOTSUP) {
+                       /* RedHat 7.1 (2.4.2-2) newquota check 
+                        * Q_V2_GETSTATS in it's old place, Q_GETQUOTA in the new place
+                        * (they haven't moved Q_GETSTATS to its new value) */
+                       int err_stat = 0;
+                       int err_quota = 0;
+                       char tmp[1024];         /* Just temporary buffer */
+
+                       if (quotactl(QCMD(Q_V1_GETSTATS, 0), NULL, 0, tmp))
+                               err_stat = errno;
+                       if (quotactl(QCMD(Q_V1_GETQUOTA, 0), "/dev/null", 0, tmp))
+                               err_quota = errno;
+
+                       /* On a RedHat 2.4.2-2  we expect 0, EINVAL
+                        * On a 2.4.x           we expect 0, ENOENT
+                        * On a 2.4.x-ac        we wont get here */
+                       if (err_stat == 0 && err_quota == EINVAL) {
+                               kernel_qfmt[kernel_qfmt_num++] = QF_VFSV0;
+                               kernel_iface = IFACE_VFSV0;
+                       }
+                       else {
+                               kernel_qfmt[kernel_qfmt_num++] = QF_VFSOLD;
+                               kernel_iface = IFACE_VFSOLD;
+                       }
+               }
+       }
+       if (sigaction(SIGSEGV, &oldsig, NULL) < 0)
+               die(2, _("Cannot reset signal handler: %s\n"), strerror(errno));
+}
+
+/* Return whether kernel is able to handle given format */
+int kern_qfmt_supp(int fmt)
+{
+       int i;
+
+       if (fmt == -1)
+               return kernel_qfmt_num > 0;
+
+       for (i = 0; i < kernel_qfmt_num; i++)
+               if (fmt == kernel_qfmt[i])
+                       return 1;
+       return 0;
+}
+
+/* Check whether old quota is turned on on given device */
+static int v1_kern_quota_on(const char *dev, int type)
+{
+       char tmp[1024];         /* Just temporary buffer */
+       qid_t id = (type == USRQUOTA) ? getuid() : getgid();
+
+       if (!quotactl(QCMD(Q_V1_GETQUOTA, type), dev, id, tmp)) /* OK? */
+               return 1;
+       return 0;
+}
+
+/* Check whether new quota is turned on on given device */
+static int v2_kern_quota_on(const char *dev, int type)
+{
+       char tmp[1024];         /* Just temporary buffer */
+       qid_t id = (type == USRQUOTA) ? getuid() : getgid();
+
+       if (!quotactl(QCMD(Q_V2_GETQUOTA, type), dev, id, tmp)) /* OK? */
+               return 1;
+       return 0;
+}
+
+/* Check whether XFS quota is turned on on given device */
+static int xfs_kern_quota_on(const char *dev, int type)
+{
+       struct xfs_mem_dqinfo info;
+
+       if (!quotactl(QCMD(Q_XFS_GETQSTAT, type), dev, 0, (void *)&info)) {
+               if (type == USRQUOTA && (info.qs_flags & XFS_QUOTA_UDQ_ACCT))
+                       return 1;
+               if (type == GRPQUOTA && (info.qs_flags & XFS_QUOTA_GDQ_ACCT))
+                       return 1;
+       }
+       return 0;
+}
+
+/*
+ *     Check whether is quota turned on on given device for given type
+ */
+int kern_quota_on(const char *dev, int type, int fmt)
+{
+       /* Check whether quota is turned on... */
+       if (kernel_iface == IFACE_GENERIC) {
+               int actfmt;
+
+               if (quotactl(QCMD(Q_GETFMT, type), dev, 0, (void *)&actfmt) < 0)
+                       return -1;
+               actfmt = kern2utilfmt(actfmt);
+               if (actfmt < 0)
+                       return -1;
+               return actfmt;
+       }
+       if ((fmt == -1 || fmt == QF_VFSV0) &&
+           v2_kern_quota_on(dev, type))        /* VFSv0 quota format */
+               return QF_VFSV0;
+       if ((fmt == -1 || fmt == QF_XFS) &&
+           xfs_kern_quota_on(dev, type))       /* XFS quota format */
+               return QF_XFS;
+       if ((fmt == -1 || fmt == QF_VFSOLD) &&
+           v1_kern_quota_on(dev, type))        /* Old quota format */
+               return QF_VFSOLD;
+       return -1;
+}
+
+/*
+ *
+ *     mtab/fstab handling routines
+ *
+ */
+
+struct mount_entry {
+       char *me_type;          /* Type of filesystem for given entry */
+       char *me_opts;          /* Options of filesystem */
+       dev_t me_dev;           /* Device filesystem is mounted on */
+       ino_t me_ino;           /* Inode number of root of filesystem */
+       const char *me_devname; /* Name of device (after pass through get_device_name()) */
+       const char *me_dir;     /* One of mountpoints of filesystem */
+};
+
+struct searched_dir {
+       int sd_dir;             /* Is searched dir mountpoint or in fact device? */
+       dev_t sd_dev;           /* Device mountpoint lies on */
+       ino_t sd_ino;           /* Inode number of mountpoint */
+       const char *sd_name;    /* Name of given dir/device */
+};
+
+#define ALLOC_ENTRIES_NUM 16   /* Allocate entries by this number */
+#define AUTOFS_DIR_MAX 64      /* Maximum number of autofs directories */
+
+static int mnt_entries_cnt;    /* Number of cached mountpoint entries */
+static struct mount_entry *mnt_entries;        /* Cached mounted filesystems */
+static int check_dirs_cnt, act_checked;        /* Number of dirs to check; Actual checked dir/(mountpoint in case of -a) */
+static struct searched_dir *check_dirs;        /* Directories to check */
+
+/* Cache mtab/fstab */
+static int cache_mnt_table(int flags)
+{
+       FILE *mntf;
+       struct mntent *mnt;
+       struct stat st;
+       struct statfs fsstat;
+       int allocated = 0, i = 0;
+       dev_t dev = 0;
+       char mntpointbuf[PATH_MAX];
+       int autofsdircnt = 0;
+       char autofsdir[AUTOFS_DIR_MAX][PATH_MAX];
+
+#ifdef ALT_MTAB
+       mntf = setmntent(ALT_MTAB, "r");
+       if (mntf)
+               goto alloc;
+#endif
+       mntf = setmntent(_PATH_MOUNTED, "r");
+       if (mntf)
+               goto alloc;
+       /* Fallback to fstab when mtab not available */
+       if (!(mntf = setmntent(_PATH_MNTTAB, "r"))) {
+               errstr(_("Cannot open any file with mount points.\n"));
+               return -1;
+       }
+alloc:
+       mnt_entries = smalloc(sizeof(struct mount_entry) * ALLOC_ENTRIES_NUM);
+       mnt_entries_cnt = 0;
+       allocated += ALLOC_ENTRIES_NUM;
+       while ((mnt = getmntent(mntf))) {
+               const char *devname;
+
+               if (!(devname = get_device_name(mnt->mnt_fsname))) {
+                       errstr(_("Cannot get device name for %s\n"), mnt->mnt_fsname);
+                       continue;
+               }
+
+               /* Check for mountpoints under autofs and skip them*/
+               for (i = 0; i < autofsdircnt; i++) {
+                       int slen = strlen(autofsdir[i]);
+
+                       if (slen <= strlen(mnt->mnt_dir) && !strncmp(autofsdir[i], mnt->mnt_dir, slen))
+                               break;
+               }
+               if (i < autofsdircnt) {
+                       free((char *)devname);
+                       continue;
+               }
+                               
+               if (flags & MS_NO_AUTOFS && !strcmp(mnt->mnt_type, MNTTYPE_AUTOFS)) {   /* Autofs dir to remember? */
+                       if (autofsdircnt == AUTOFS_DIR_MAX)
+                               die(3, "Too many autofs mountpoints. Please contact <jack@suse.cz>\n");
+                       snprintf(autofsdir[autofsdircnt++], PATH_MAX, "%s/", mnt->mnt_dir);
+                       free((char *)devname);
+                       continue;
+               }
+               
+               if (flags & MS_LOCALONLY && nfs_fstype(mnt->mnt_type)) {
+                       free((char *)devname);
+                       continue;
+               }
+
+               /* Further we are not interested in mountpoints without quotas and
+                  we don't want to touch them */
+               if (!hasquota(mnt, USRQUOTA, flags) && !hasquota(mnt, GRPQUOTA, flags)) {
+                       free((char *)devname);
+                       continue;
+               }
+                       
+               if (!realpath(mnt->mnt_dir, mntpointbuf)) {
+                       errstr(_("Cannot resolve mountpoint path %s: %s\n"), mnt->mnt_dir, strerror(errno));
+                       free((char *)devname);
+                       continue;
+               }
+               
+               if (statfs(mntpointbuf, &fsstat) != 0) {
+                       errstr(_("Cannot statfs() %s: %s\n"), mntpointbuf, strerror(errno));
+                       free((char *)devname);
+                       continue;
+               }
+               /* Do not scan quotas on "magic" automount points */
+               if (fsstat.f_blocks == 0 && fsstat.f_bfree == 0 && fsstat.f_bavail == 0) {
+                       free((char *)devname);
+                       continue;
+               }
+
+               if (!nfs_fstype(mnt->mnt_type)) {
+                       if (stat(devname, &st) < 0) {   /* Can't stat mounted device? */
+                               errstr(_("Cannot stat() mounted device %s: %s\n"), devname, strerror(errno));
+                               free((char *)devname);
+                               continue;
+                       }
+                       if (!S_ISBLK(st.st_mode) && !S_ISCHR(st.st_mode) && !S_ISREG(st.st_mode) && !S_ISDIR(st.st_mode)) {
+                               unsupporteddev:
+                               errstr(_("Device (%s) filesystem is mounted on unsupported device type. Skipping.\n"), devname);
+                               free((char *)devname);
+                               continue;
+                       } else {
+                               char *opt;
+                               
+                               if (hasmntopt(mnt, MNTOPT_BIND)) {
+                                       free((char *)devname);
+                                       continue;       /* We just ignore bind mounts... */
+                               }
+                               else if ((opt = hasmntopt(mnt, MNTOPT_LOOP))) {
+                                       char loopdev[PATH_MAX];
+                                       int i;
+
+                                       if (!(opt = strchr(opt, '='))) {
+                                               errstr(_("Cannot find device of loopback mount in options for %s. Skipping.\n"), devname);
+                                               free((char *)devname);
+                                               continue;
+                                       }
+                                       /* Copy the device name */
+                                       for (opt++, i = 0; *opt && i < sizeof(loopdev)-1 && *opt != ','; opt++, i++)
+                                               loopdev[i] = *opt;
+                                       loopdev[i] = 0;
+                                       if (stat(loopdev, &st) < 0) {   /* Can't stat loopback device? */
+                                               errstr(_("Cannot stat() loopback device %s: %s\n"), opt, strerror(errno));
+                                               free((char *)devname);
+                                               continue;
+                                       }
+                                       if (!S_ISBLK(st.st_mode)) {
+                                               errstr(_("Loopback device %s is not block device!\n"), opt);
+                                               free((char *)devname);
+                                               continue;
+                                       }
+                                       dev = st.st_rdev;
+                                       free((char *)devname);
+                                       devname = sstrdup(loopdev);
+                               } else {
+                                       if (!S_ISBLK(st.st_mode) && !S_ISCHR(st.st_mode))
+                                               goto unsupporteddev;
+                                       dev = st.st_rdev;
+                               }
+                       }
+                       for (i = 0; i < mnt_entries_cnt && mnt_entries[i].me_dev != dev; i++);
+               }
+               /* Cope with network filesystems or new mountpoint */
+               if (nfs_fstype(mnt->mnt_type) || i == mnt_entries_cnt) {
+                       if (stat(mnt->mnt_dir, &st) < 0) {      /* Can't stat mountpoint? We have better ignore it... */
+                               errstr(_("Cannot stat() mountpoint %s: %s\n"), mnt->mnt_dir, strerror(errno));
+                               free((char *)devname);
+                               continue;
+                       }
+                       if (nfs_fstype(mnt->mnt_type)) {
+                               /* For network filesystems we must get device from root */
+                               dev = st.st_dev;
+                               if (!(flags & MS_NFS_ALL)) {
+                                       for (i = 0; i < mnt_entries_cnt && mnt_entries[i].me_dev != dev; i++);
+                               }
+                               else    /* Always behave as if the device was unique */
+                                       i = mnt_entries_cnt;
+                       }
+               }
+               if (i == mnt_entries_cnt) {     /* New mounted device? */
+                       if (allocated == mnt_entries_cnt) {
+                               allocated += ALLOC_ENTRIES_NUM;
+                               mnt_entries = srealloc(mnt_entries, allocated * sizeof(struct mount_entry));
+                       }
+                       mnt_entries[i].me_type = sstrdup(mnt->mnt_type);
+                       mnt_entries[i].me_opts = sstrdup(mnt->mnt_opts);
+                       mnt_entries[i].me_dev = dev;
+                       mnt_entries[i].me_ino = st.st_ino;
+                       mnt_entries[i].me_devname = devname;
+                       mnt_entries[i].me_dir = sstrdup(mntpointbuf);
+                       mnt_entries_cnt++;
+               }
+               else 
+                       free((char *)devname);  /* We don't need it any more */
+       }
+       endmntent(mntf);
+
+       return 0;
+}
+
+/* Find mountpoint of filesystem hosting dir in 'st'; Store it in 'st' */
+static const char *find_dir_mntpoint(struct stat *st)
+{
+       int i;
+
+       for (i = 0; i < mnt_entries_cnt; i++)
+               if (mnt_entries[i].me_dev == st->st_dev) {
+                       st->st_ino = mnt_entries[i].me_ino;
+                       return mnt_entries[i].me_dir;
+               }
+       return NULL;
+}
+
+/* Process and store given paths */
+static int process_dirs(int dcnt, char **dirs, int flags)
+{
+       struct stat st;
+       int i;
+       char mntpointbuf[PATH_MAX];
+
+       check_dirs_cnt = 0;
+       act_checked = -1;
+       if (dcnt) {
+               check_dirs = smalloc(sizeof(struct searched_dir) * dcnt);
+               for (i = 0; i < dcnt; i++) {
+                       if (!strncmp(dirs[i], "UUID=", 5) || !strncmp(dirs[i], "LABEL=", 6)) {
+                               char *devname = (char *)get_device_name(dirs[i]);
+
+                               if (!devname) {
+                                       errstr(_("Cannot find a device with %s.\nSkipping...\n"), dirs[i]);
+                                       continue;
+                               }
+                               if (stat(devname, &st) < 0) {
+                                       errstr(_("Cannot stat() a mountpoint with %s: %s\nSkipping...\n"), dirs[i], strerror(errno));
+                                       free(devname);
+                                       continue;
+                               }
+                               free(devname);
+                       }
+                       else
+                               if (stat(dirs[i], &st) < 0) {
+                                       errstr(_("Cannot stat() given mountpoint %s: %s\nSkipping...\n"), dirs[i], strerror(errno));
+                                       continue;
+                               }
+                       check_dirs[check_dirs_cnt].sd_dir = S_ISDIR(st.st_mode);
+                       if (S_ISDIR(st.st_mode)) {
+                               const char *realmnt = dirs[i];
+
+                               /* Return st of mountpoint of dir in st.. */
+                               if (flags & MS_NO_MNTPOINT && !(realmnt = find_dir_mntpoint(&st))) {
+                                       if (!(flags & MS_QUIET))
+                                               errstr(_("Cannot find a filesystem mountpoint for directory %s\n"), dirs[i]);
+                                       continue;
+                               }
+                               check_dirs[check_dirs_cnt].sd_dev = st.st_dev;
+                               check_dirs[check_dirs_cnt].sd_ino = st.st_ino;
+                               if (!realpath(realmnt, mntpointbuf)) {
+                                       errstr(_("Cannot resolve path %s: %s\n"), realmnt, strerror(errno));
+                                       continue;
+                               }
+                       }
+                       else if (S_ISBLK(st.st_mode) || S_ISCHR(st.st_mode)) {
+                               int mentry;
+
+                               check_dirs[check_dirs_cnt].sd_dev = st.st_rdev;
+                               for (mentry = 0; mentry < mnt_entries_cnt && mnt_entries[mentry].me_dev != st.st_rdev; mentry++);
+                               if (mentry == mnt_entries_cnt) {
+                                       if (!(flags & MS_QUIET))
+                                               errstr(_("Cannot find mountpoint for device %s\n"), dirs[i]);
+                                       continue;
+                               }
+                               sstrncpy(mntpointbuf, mnt_entries[mentry].me_dir, PATH_MAX-1);
+                       }
+                       else {
+                               errstr(_("Specified path %s is not directory nor device.\n"), dirs[i]);
+                               continue;
+                       }
+                       check_dirs[check_dirs_cnt].sd_name = sstrdup(mntpointbuf);
+                       check_dirs_cnt++;
+               }
+               if (!check_dirs_cnt) {
+                       if (!(flags & MS_QUIET))
+                               errstr(_("No correct mountpoint specified.\n"));
+                       free(check_dirs);
+                       return -1;
+               }
+       }
+       return 0;
+}
+
+/*
+ *     Initialize mountpoint scan
+ */ 
+int init_mounts_scan(int dcnt, char **dirs, int flags)
+{
+       if (cache_mnt_table(flags) < 0)
+               return -1;
+       if (process_dirs(dcnt, dirs, flags) < 0) {
+               end_mounts_scan();
+               return -1;
+       }
+       return 0;
+}
+
+/* Find next usable mountpoint when scanning all mountpoints */
+static int find_next_entry_all(int *pos)
+{
+       struct mntent mnt;
+
+       while (++act_checked < mnt_entries_cnt) {
+               mnt.mnt_fsname = (char *)mnt_entries[act_checked].me_devname;
+               mnt.mnt_type = mnt_entries[act_checked].me_type;
+               mnt.mnt_opts = mnt_entries[act_checked].me_opts;
+               mnt.mnt_dir = (char *)mnt_entries[act_checked].me_dir;
+               if (!hasmntopt(&mnt, MNTOPT_NOAUTO))
+                       break;
+       }
+       if (act_checked >= mnt_entries_cnt)
+               return 0;
+       *pos = act_checked;
+       return 1;
+}
+
+/* Find next usable mountpoint when scanning selected mountpoints */
+static int find_next_entry_sel(int *pos)
+{
+       int i;
+       struct searched_dir *sd;
+
+restart:
+       if (++act_checked == check_dirs_cnt)
+               return 0;
+       sd = check_dirs + act_checked;
+       for (i = 0; i < mnt_entries_cnt; i++) {
+               if (sd->sd_dir) {
+                       if (sd->sd_dev == mnt_entries[i].me_dev && sd->sd_ino == mnt_entries[i].me_ino)
+                               break;
+               }
+               else
+                       if (sd->sd_dev == mnt_entries[i].me_dev)
+                               break;
+       }
+       if (i == mnt_entries_cnt) {
+               errstr(_("Mountpoint (or device) %s not found or has no quota enabled.\n"), sd->sd_name);
+               goto restart;
+       }
+       *pos = i;
+       return 1;
+}
+
+/*
+ *     Return next directory from the list
+ */
+struct mntent *get_next_mount(void)
+{
+       static struct mntent mnt;
+       int mntpos;
+
+       if (!check_dirs_cnt) {  /* Scan all mountpoints? */
+               if (!find_next_entry_all(&mntpos))
+                       return NULL;
+               mnt.mnt_dir = (char *)mnt_entries[mntpos].me_dir;
+       }
+       else {
+               if (!find_next_entry_sel(&mntpos))
+                       return NULL;
+               mnt.mnt_dir = (char *)check_dirs[act_checked].sd_name;
+       }
+       mnt.mnt_fsname = (char *)mnt_entries[mntpos].me_devname;
+       mnt.mnt_type = mnt_entries[mntpos].me_type;
+       mnt.mnt_opts = mnt_entries[mntpos].me_opts;
+       return &mnt;
+}
+
+/*
+ *     Free all structures allocated for mountpoint scan
+ */
+void end_mounts_scan(void)
+{
+       int i;
+
+       for (i = 0; i < mnt_entries_cnt; i++) {
+               free(mnt_entries[i].me_type);
+               free(mnt_entries[i].me_opts);
+               free((char *)mnt_entries[i].me_devname);
+               free((char *)mnt_entries[i].me_dir);
+       }
+       free(mnt_entries);
+       mnt_entries = NULL;
+       mnt_entries_cnt = 0;
+       if (check_dirs_cnt) {
+               for (i = 0; i < check_dirs_cnt; i++)
+                       free((char *)check_dirs[i].sd_name);
+               free(check_dirs);
+       }
+       check_dirs = NULL;
+       check_dirs_cnt = 0;
+}
diff --git a/quotasys.h b/quotasys.h
new file mode 100644 (file)
index 0000000..90e5aae
--- /dev/null
@@ -0,0 +1,149 @@
+/*
+ *
+ *     Headerfile of quota interactions with system - filenames, fstab...
+ *
+ */
+
+#ifndef GUARD_QUOTASYS_H
+#define GUARD_QUOTASYS_H
+
+#include <sys/types.h>
+#include "mntopt.h"
+#include "quota.h"
+
+#define MAXNAMELEN 64          /* Maximal length of user/group name */
+#define MAXTIMELEN 40          /* Maximal length of time string */
+#define MAXNUMLEN 32           /* Maximal length of number */
+
+/* Flags for formatting time */
+#define TF_ROUND 0x1           /* Should be printed time rounded? */
+
+/* Flags for IO initialization */
+#define IOI_READONLY   0x1     /* Only readonly access */
+#define IOI_OPENFILE   0x2     /* Open file even if kernel has quotas turned on */
+#define IOI_NFS_MIXED_PATHS    0x4     /* Trim leading / from NFSv4 mountpoints */
+
+#define KERN_KNOWN_QUOTA_VERSION (6*10000 + 5*100 + 1)
+
+/* Interface versions */
+#define IFACE_VFSOLD 1
+#define IFACE_VFSV0 2
+#define IFACE_GENERIC 3
+
+/* Path to export table of NFS daemon */
+#define NFSD_XTAB_PATH "/var/lib/nfs/etab"
+
+/* Supported kernel interface */
+extern int kernel_iface;
+
+/*
+ *     Exported functions
+ */
+/* Check whether type is one of the NFS filesystems */
+int nfs_fstype(char *);
+/* Quota file is treated as metadata? */
+int meta_qf_fstype(char *type);
+
+/* Convert quota type to written form */
+char *type2name(int);
+
+/* Convert username to uid */
+uid_t user2uid(char *, int flag, int *err);
+
+/* Convert groupname to gid */
+gid_t group2gid(char *, int flag, int *err);
+
+/* Convert user/groupname to id */
+int name2id(char *name, int qtype, int flag, int *err);
+
+/* Convert uid to username */
+int uid2user(uid_t, char *);
+
+/* Convert gid to groupname */
+int gid2group(gid_t, char *);
+
+/* Convert id to user/group name */
+int id2name(int id, int qtype, char *buf);
+
+/* Possible default passwd handling */
+#define PASSWD_FILES 0
+#define PASSWD_DB 1
+/* Parse /etc/nsswitch.conf and return type of default passwd handling */
+int passwd_handling(void);
+
+/* Convert quota format name to number */
+int name2fmt(char *str);
+
+/* Convert quota format number to name */
+char *fmt2name(int fmt);
+
+/* Convert utility to kernel format numbers */
+int util2kernfmt(int fmt);
+
+/* Convert time difference between given time and current time to printable form */
+void difftime2str(time_t, char *);
+
+/* Convert time to printable form */
+void time2str(time_t, char *, int);
+
+/* Convert number and units to time in seconds */
+int str2timeunits(time_t, char *, time_t *);
+
+/* Convert number in quota blocks to short printable form */
+void space2str(qsize_t, char *, int);
+
+/* Convert number to short printable form */
+void number2str(unsigned long long, char *, int);
+
+/* Check to see if particular quota is to be enabled */
+/* Recognizes MS_XFS_DISABLED flag */
+int hasquota(struct mntent *mnt, int type, int flags);
+
+/* Flags for get_qf_name() */
+#define NF_EXIST  1    /* Check whether file exists */
+#define NF_FORMAT 2    /* Check whether file is in proper format */
+/* Get quotafile name for given entry */
+int get_qf_name(struct mntent *mnt, int type, int fmt, int flags, char **filename);
+
+/* Detect newest quota format with existing file */
+int detect_quota_files(struct mntent *mnt, int type, int fmt);
+
+/* Create NULL-terminated list of handles for quotafiles for given mountpoints */
+struct quota_handle **create_handle_list(int count, char **mntpoints, int type, int fmt,
+                                        int ioflags, int mntflags);
+/* Dispose given list of handles */
+int dispose_handle_list(struct quota_handle **hlist);
+
+/* Check whether given device name matches quota handle device */
+int devcmp_handle(const char *dev, struct quota_handle *h);
+
+/* Check whether two quota handles have same device */
+int devcmp_handles(struct quota_handle *a, struct quota_handle *b);
+
+/* Check kernel supported quotafile format */
+void init_kernel_interface(void);
+
+/* Check whether is quota turned on on given device for given type */
+int kern_quota_on(const char *dev, int type, int fmt);
+
+/* Return whether kernel is able to handle given format */
+int kern_qfmt_supp(int fmt);
+
+/* Flags for init_mounts_scan() */
+#define MS_NO_MNTPOINT 0x01    /* Specified directory needn't be mountpoint */
+#define MS_NO_AUTOFS 0x02      /* Ignore autofs mountpoints */
+#define MS_QUIET 0x04          /* Be quiet with error reporting */
+#define MS_LOCALONLY 0x08      /* Ignore nfs mountpoints */
+#define MS_XFS_DISABLED 0x10   /* Return also XFS mountpoints with quota disabled */
+#define MS_NFS_ALL 0x20                /* Don't filter NFS mountpoints on the same device */
+
+/* Initialize mountpoints scan */
+int init_mounts_scan(int dcnt, char **dirs, int flags);
+
+/* Return next mountpoint for scan */
+struct mntent *get_next_mount(void);
+
+/* Free all structures associated with mountpoints scan */
+void end_mounts_scan(void);
+
+#endif /* GUARD_QUOTASYS_H */
diff --git a/quotatab b/quotatab
new file mode 100644 (file)
index 0000000..0ba9957
--- /dev/null
+++ b/quotatab
@@ -0,0 +1,9 @@
+#
+#  This is sample quotatab (/etc/quotatab)
+#  Here you can specify description of each device for user
+#
+#  Comments begin with hash in the beginning of the line
+
+# Example of description
+/dev/loop0: This is loopback device
+/dev/hda4: Your home directory
diff --git a/repquota.8 b/repquota.8
new file mode 100644 (file)
index 0000000..7580f64
--- /dev/null
@@ -0,0 +1,151 @@
+.TH REPQUOTA 8
+.UC 4
+.SH NAME
+repquota \- summarize quotas for a filesystem
+.SH SYNOPSIS
+.B /usr/sbin/repquota
+[
+.B \-vspiug
+] [
+.B \-c
+|
+.B \-C
+] [
+.B \-t
+|
+.B \-n
+] [
+.B \-F
+.I format-name
+]
+.IR filesystem .\|.\|.
+.LP
+.B /usr/sbin/repquota
+[
+.B \-avtpsiug
+] [
+.B \-c
+|
+.B \-C
+] [
+.B \-t
+|
+.B \-n
+] [
+.B \-F
+.I format-name
+]
+.SH DESCRIPTION
+.IX  "repquota command"  ""  "\fLrepquota\fP \(em summarize quotas"
+.IX  "user quotas"  "repquota command"  ""  "\fLrepquota\fP \(em summarize quotas"
+.IX  "disk quotas"  "repquota command"  ""  "\fLrepquota\fP \(em summarize quotas"
+.IX  "quotas"  "repquota command"  ""  "\fLrepquota\fP \(em summarize quotas"
+.IX  "filesystem"  "repquota command"  ""  "\fLrepquota\fP \(em summarize quotas"
+.IX  "summarize filesystem quotas repquota"  ""  "summarize filesystem quotas \(em \fLrepquota\fP"
+.IX  "report filesystem quotas repquota"  ""  "report filesystem quotas \(em \fLrepquota\fP"
+.IX  display "filesystem quotas \(em \fLrepquota\fP"
+.LP
+.B repquota
+prints a summary of the disc usage and quotas for the specified file
+systems.  For each user the current number of files and amount of space
+(in kilobytes) is printed, along with any quotas created with
+.BR edquota (8).
+As
+.B repquota
+has to translate ids of all users/groups to names (unless option
+.B -n
+was specified) it may take a while to
+print all the information. To make translating as fast as possible
+.B repquota
+tries to detect (by reading
+.BR /etc/nsswitch.conf )
+whether entries are stored in standard plain text file or in database and either
+translates chunks of 1024 names or each name individually. You can override this
+autodetection by
+.B -c
+or
+.B -C
+options.
+.SH OPTIONS
+.TP
+.B -a, --all
+Report on all filesystems indicated in
+.B /etc/mtab
+to be read-write with quotas.
+.TP
+.B -v, --verbose
+Report all quotas, even if there is no usage. Be also more verbose about quotafile
+information.
+.TP
+.B -c, --batch-translation
+Cache entries to report and translate uids/gids to names in big chunks by scanning
+all users (default). This is good (fast) behaviour when using /etc/passwd file.
+.TP
+.B -C, --no-batch-translation
+Translate individual entries. This is faster when you have users stored in database.
+.TP
+.B -t, --truncate-names
+Truncate user/group names longer than 9 characters. This results in nicer output when
+there are such names.
+.TP
+.B -n, --no-names
+Don't resolve UIDs/GIDs to names. This can speedup printing a lot.
+.TP
+.B -s, --human-readable
+Try to report used space, number of used inodes and limits in more appropriate units
+than the default ones.
+.TP
+.B -p, --raw-grace
+When user is in grace period, report time in seconds since epoch when his grace
+time runs out (or has run out). Field is '0' when no grace time is in effect.
+This is especially useful when parsing output by a script.
+.TP
+.B -i, --no-autofs
+Ignore mountpoints mounted by automounter.
+.TP
+.B \-F, --format=\f2format-name\f1
+Report quota for specified format (ie. don't perform format autodetection).
+Possible format names are:
+.B vfsold
+Original quota format with 16-bit UIDs / GIDs,
+.B vfsv0
+Quota format with 32-bit UIDs / GIDs, 64-bit space usage, 32-bit inode usage and limits,
+.B vfsv1
+Quota format with 64-bit quota limits and usage,
+.B xfs
+(quota on XFS filesystem)
+.TP
+.B -g, --group
+Report quotas for groups.
+.TP
+.B -u, --user
+Report quotas for users. This is the default.
+.LP
+Only the super-user may view quotas which are not their own.
+.SH FILES
+.PD 0
+.TP 20
+.BR aquota.user " or " aquota.group
+quota file at the filesystem root (version 2 quota, non-XFS filesystems)
+.TP
+.BR quota.user " or " quota.group
+quota file at the filesystem root (version 1 quota, non-XFS filesystems)
+.TP
+.B /etc/mtab
+default filesystems
+.TP
+.B /etc/passwd
+default set of users
+.TP
+.B /etc/group
+default set of groups
+.PD
+.SH SEE ALSO
+.BR quota (1),
+.BR quotactl (2),
+.BR edquota (8),
+.BR quotacheck (8),
+.BR quotaon (8),
+.BR quota_nld (8),
+.BR setquota (8),
+.BR warnquota (8)
diff --git a/repquota.c b/repquota.c
new file mode 100644 (file)
index 0000000..7e007ce
--- /dev/null
@@ -0,0 +1,343 @@
+/*
+ *
+ *     Utility for reporting quotas
+ *
+ *     Based on old repquota.
+ *     Jan Kara <jack@suse.cz> - Sponsored by SuSE CZ
+ */
+
+#include "config.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <string.h>
+#include <time.h>
+#include <errno.h>
+#include <pwd.h>
+#include <grp.h>
+#include <getopt.h>
+
+#include "pot.h"
+#include "common.h"
+#include "quotasys.h"
+#include "quotaio.h"
+
+#define PRINTNAMELEN 9 /* Number of characters to be reserved for name on screen */
+#define MAX_CACHE_DQUOTS 1024  /* Number of dquots in cache */
+
+#define FL_USER 1
+#define FL_GROUP 2
+#define FL_VERBOSE 4
+#define FL_ALL 8               /* Dump quota files on all filesystems */
+#define FL_TRUNCNAMES 16       /* Truncate names to fit into the screen */
+#define FL_SHORTNUMS 32        /* Try to print space in appropriate units */
+#define FL_NONAME 64   /* Don't translate ids to names */
+#define FL_NOCACHE 128 /* Don't cache dquots before resolving */
+#define FL_NOAUTOFS 256        /* Ignore autofs mountpoints */
+#define FL_RAWGRACE 512        /* Print grace times in seconds since epoch */
+
+int flags, fmt = -1;
+char **mnt;
+int mntcnt;
+int cached_dquots;
+struct dquot dquot_cache[MAX_CACHE_DQUOTS];
+char *progname;
+
+static void usage(void)
+{
+       errstr(_("Utility for reporting quotas.\nUsage:\n%s [-vugsi] [-c|C] [-t|n] [-F quotaformat] (-a | mntpoint)\n\n\
+-v, --verbose               display also users/groups without any usage\n\
+-u, --user                  display information about users\n\
+-g, --group                 display information about groups\n\
+-s, --human-readable        show numbers in human friendly units (MB, GB, ...)\n\
+-t, --truncate-names        truncate names to 8 characters\n\
+-p, --raw-grace             print grace time in seconds since epoch\n\
+-n, --no-names              do not translate uid/gid to name\n\
+-i, --no-autofs             avoid autofs mountpoints\n\
+-c, --batch-translation     translate big number of ids at once\n\
+-C, --no-batch-translation  translate ids one by one\n\
+-F, --format=formatname     report information for specific format\n\
+-h, --help                  display this help message and exit\n\
+-V, --version               display version information and exit\n\n"), progname);
+       fprintf(stderr, _("Bugs to %s\n"), MY_EMAIL);
+       exit(1);
+}
+
+static void parse_options(int argcnt, char **argstr)
+{
+       int ret;
+       int cache_specified = 0;
+       struct option long_opts[] = {
+               { "version", 0, NULL, 'V' },
+               { "all", 0, NULL, 'a' },
+               { "verbose", 0, NULL, 'v' },
+               { "user", 0, NULL, 'u' },
+               { "group", 0, NULL, 'g' },
+               { "help", 0, NULL, 'h' },
+               { "truncate-names", 0, NULL, 't' },
+               { "raw-grace", 0, NULL, 'p' },
+               { "human-readable", 0, NULL, 's' },
+               { "no-names", 0, NULL, 'n' },
+               { "cache", 0, NULL, 'c' },
+               { "no-cache", 0, NULL, 'C' },
+               { "no-autofs", 0, NULL, 'i' },
+               { "format", 1, NULL, 'F' },
+               { NULL, 0, NULL, 0 }
+       };
+
+       while ((ret = getopt_long(argcnt, argstr, "VavughtspncCiF:", long_opts, NULL)) != -1) {
+               switch (ret) {
+                       case '?':
+                       case 'h':
+                               usage();
+                       case 'V':
+                               version();
+                               exit(0);
+                       case 'u':
+                               flags |= FL_USER;
+                               break;
+                       case 'g':
+                               flags |= FL_GROUP;
+                               break;
+                       case 'v':
+                               flags |= FL_VERBOSE;
+                               break;
+                       case 'a':
+                               flags |= FL_ALL;
+                               break;
+                       case 't':
+                               flags |= FL_TRUNCNAMES;
+                               break;
+                       case 'p':
+                               flags |= FL_RAWGRACE;
+                               break;
+                       case 's':
+                               flags |= FL_SHORTNUMS;
+                               break;
+                       case 'C':
+                               flags |= FL_NOCACHE;
+                               cache_specified = 1;
+                               break;
+                       case 'c':
+                               cache_specified = 1;
+                               break;
+                       case 'i':
+                               flags |= FL_NOAUTOFS;
+                               break;
+                       case 'F':
+                               if ((fmt = name2fmt(optarg)) == QF_ERROR)
+                                       exit(1);
+                               break;
+                       case 'n':
+                               flags |= FL_NONAME;
+                               break;
+
+               }
+       }
+
+       if ((flags & FL_ALL && optind != argcnt) || (!(flags & FL_ALL) && optind == argcnt)) {
+               fputs(_("Bad number of arguments.\n"), stderr);
+               usage();
+       }
+       if (fmt == QF_RPC) {
+               fputs(_("Repquota cannot report through RPC calls.\n"), stderr);
+               exit(1);
+       }
+       if (flags & FL_NONAME && flags & FL_TRUNCNAMES) {
+               fputs(_("Specified both -n and -t but only one of them can be used.\n"), stderr);
+               exit(1);
+       }
+       if (!(flags & (FL_USER | FL_GROUP)))
+               flags |= FL_USER;
+       if (!(flags & FL_ALL)) {
+               mnt = argstr + optind;
+               mntcnt = argcnt - optind;
+       }
+       if (!cache_specified && !(flags & FL_NONAME) && passwd_handling() == PASSWD_DB)
+               flags |= FL_NOCACHE;
+}
+
+/* Are we over soft or hard limit? */
+static char overlim(qsize_t usage, qsize_t softlim, qsize_t hardlim)
+{
+       if ((usage > softlim && softlim) || (usage > hardlim && hardlim))
+               return '+';
+       return '-';
+}
+
+/* Print one quota entry */
+static void print(struct dquot *dquot, char *name)
+{
+       char pname[MAXNAMELEN];
+       char time[MAXTIMELEN];
+       char numbuf[3][MAXNUMLEN];
+       
+       struct util_dqblk *entry = &dquot->dq_dqb;
+
+       if (!entry->dqb_curspace && !entry->dqb_curinodes && !(flags & FL_VERBOSE))
+               return;
+       sstrncpy(pname, name, sizeof(pname));
+       if (flags & FL_TRUNCNAMES)
+               pname[PRINTNAMELEN] = 0;
+       if (entry->dqb_bsoftlimit && toqb(entry->dqb_curspace) >= entry->dqb_bsoftlimit)
+               if (flags & FL_RAWGRACE)
+                       sprintf(time, "%llu", (unsigned long long)entry->dqb_btime);
+               else
+                       difftime2str(entry->dqb_btime, time);
+       else
+               if (flags & FL_RAWGRACE)
+                       strcpy(time, "0");
+               else
+                       time[0] = 0;
+       space2str(toqb(entry->dqb_curspace), numbuf[0], flags & FL_SHORTNUMS);
+       space2str(entry->dqb_bsoftlimit, numbuf[1], flags & FL_SHORTNUMS);
+       space2str(entry->dqb_bhardlimit, numbuf[2], flags & FL_SHORTNUMS);
+       printf("%-*s %c%c %7s %7s %7s %6s", PRINTNAMELEN, pname,
+              overlim(qb2kb(toqb(entry->dqb_curspace)), qb2kb(entry->dqb_bsoftlimit), qb2kb(entry->dqb_bhardlimit)),
+              overlim(entry->dqb_curinodes, entry->dqb_isoftlimit, entry->dqb_ihardlimit),
+              numbuf[0], numbuf[1], numbuf[2], time);
+       if (entry->dqb_isoftlimit && entry->dqb_curinodes >= entry->dqb_isoftlimit)
+               if (flags & FL_RAWGRACE)
+                       sprintf(time, "%llu", (unsigned long long)entry->dqb_itime);
+               else
+                       difftime2str(entry->dqb_itime, time);
+       else
+               if (flags & FL_RAWGRACE)
+                       strcpy(time, "0");
+               else
+                       time[0] = 0;
+       number2str(entry->dqb_curinodes, numbuf[0], flags & FL_SHORTNUMS);
+       number2str(entry->dqb_isoftlimit, numbuf[1], flags & FL_SHORTNUMS);
+       number2str(entry->dqb_ihardlimit, numbuf[2], flags & FL_SHORTNUMS);
+       printf(" %7s %5s %5s %6s\n", numbuf[0], numbuf[1], numbuf[2], time);
+}
+
+/* Print all dquots in the cache */
+static void dump_cached_dquots(int type)
+{
+       int i;
+       char namebuf[MAXNAMELEN];
+
+       if (!cached_dquots)
+               return;
+       if (type == USRQUOTA) {
+               struct passwd *pwent;
+
+               setpwent();
+               while ((pwent = getpwent())) {
+                       for (i = 0; i < cached_dquots && pwent->pw_uid != dquot_cache[i].dq_id; i++);
+                       if (i < cached_dquots && !(dquot_cache[i].dq_flags & DQ_PRINTED)) {
+                               print(dquot_cache+i, pwent->pw_name);
+                               dquot_cache[i].dq_flags |= DQ_PRINTED;
+                       }
+               }
+               endpwent();
+       }
+       else {
+               struct group *grent;
+
+               setgrent();
+               while ((grent = getgrent())) {
+                       for (i = 0; i < cached_dquots && grent->gr_gid != dquot_cache[i].dq_id; i++);
+                       if (i < cached_dquots && !(dquot_cache[i].dq_flags & DQ_PRINTED)) {
+                               print(dquot_cache+i, grent->gr_name);
+                               dquot_cache[i].dq_flags |= DQ_PRINTED;
+                       }
+               }
+               endgrent();
+       }
+       for (i = 0; i < cached_dquots; i++)
+               if (!(dquot_cache[i].dq_flags & DQ_PRINTED)) {
+                       sprintf(namebuf, "#%u", dquot_cache[i].dq_id);
+                       print(dquot_cache+i, namebuf);
+               }
+       cached_dquots = 0;
+}
+
+/* Callback routine called by scan_dquots on each dquot */
+static int output(struct dquot *dquot, char *name)
+{
+       if (flags & FL_NONAME) {        /* We should translate names? */
+               char namebuf[MAXNAMELEN];
+
+               sprintf(namebuf, "#%u", dquot->dq_id);
+               print(dquot, namebuf);
+       }
+       else if (name || flags & FL_NOCACHE) {  /* We shouldn't do batched id->name translations? */
+               char namebuf[MAXNAMELEN];
+
+               if (!name) {
+                       id2name(dquot->dq_id, dquot->dq_h->qh_type, namebuf);
+                       name = namebuf;
+               }
+               print(dquot, name);
+       }
+       else {  /* Lets cache the dquot for later printing */
+               memcpy(dquot_cache+cached_dquots++, dquot, sizeof(struct dquot));
+               if (cached_dquots >= MAX_CACHE_DQUOTS)
+                       dump_cached_dquots(dquot->dq_h->qh_type);
+       }
+       return 0;
+}
+
+/* Dump information stored in one quota file */
+static void report_it(struct quota_handle *h, int type)
+{
+       char bgbuf[MAXTIMELEN], igbuf[MAXTIMELEN];
+       char *spacehdr;
+
+       if (flags & FL_SHORTNUMS)
+               spacehdr = _("Space");
+       else
+               spacehdr = _("Block");
+
+       printf(_("*** Report for %s quotas on device %s\n"), type2name(type), h->qh_quotadev);
+       time2str(h->qh_info.dqi_bgrace, bgbuf, TF_ROUND);
+       time2str(h->qh_info.dqi_igrace, igbuf, TF_ROUND);
+       printf(_("Block grace time: %s; Inode grace time: %s\n"), bgbuf, igbuf);
+       printf(_("                        %s limits                File limits\n"), spacehdr);
+       printf(_("%-9s       used    soft    hard  grace    used  soft  hard  grace\n"), (type == USRQUOTA)?_("User"):_("Group"));
+       printf("----------------------------------------------------------------------\n");
+
+       if (h->qh_ops->scan_dquots(h, output) < 0)
+               return;
+       dump_cached_dquots(type);
+       if (h->qh_ops->report) {
+               putchar('\n');
+               h->qh_ops->report(h, flags & FL_VERBOSE);
+               putchar('\n');
+       }
+}
+
+static void report(int type)
+{
+       struct quota_handle **handles;
+       int i;
+
+       if (flags & FL_ALL)
+               handles = create_handle_list(0, NULL, type, fmt, IOI_READONLY | IOI_OPENFILE, MS_LOCALONLY | (flags & FL_NOAUTOFS ? MS_NO_AUTOFS : 0));
+       else
+               handles = create_handle_list(mntcnt, mnt, type, fmt, IOI_READONLY | IOI_OPENFILE, MS_LOCALONLY | (flags & FL_NOAUTOFS ? MS_NO_AUTOFS : 0));
+       for (i = 0; handles[i]; i++)
+               report_it(handles[i], type);
+       dispose_handle_list(handles);
+}
+
+int main(int argc, char **argv)
+{
+       gettexton();
+       progname = basename(argv[0]);
+
+       parse_options(argc, argv);
+       init_kernel_interface();
+
+       if (flags & FL_USER)
+               report(USRQUOTA);
+
+       if (flags & FL_GROUP)
+               report(GRPQUOTA);
+
+       return 0;
+}
diff --git a/rquota.3 b/rquota.3
new file mode 100644 (file)
index 0000000..8eee71e
--- /dev/null
+++ b/rquota.3
@@ -0,0 +1,34 @@
+.\"@(#)rquota.3;
+.TH RQUOTA 3
+.SH NAME
+rquota \- implement quotas on remote machines
+.SH PROTOCOL
+.B /usr/include/rpcsvc/rquota.x
+.SH DESCRIPTION
+.IX "rquota()" "" "\fLrquota()\fP \(em implement quotas on remote machines"
+.LP
+The
+.B rquota(\|)
+protocol inquires about quotas on remote machines.
+It is used in conjunction with
+.SM NFS\s0,
+since
+.SM NFS
+itself does not implement quotas.
+.SH PROGRAMMING
+.LP
+.B #include <rpcsvc/rquota.h>
+.LP
+The following
+.SM XDR
+routines are available in
+.BR librpcsvc :
+.nf
+.B xdr_getquota_arg
+.B xdr_getquota_rslt
+.B xdr_rquota
+.fi
+.SH SEE ALSO
+.BR quota (1),
+.BR quotactl (2)
+
diff --git a/rquota.x b/rquota.x
new file mode 100644 (file)
index 0000000..3cd5c10
--- /dev/null
+++ b/rquota.x
@@ -0,0 +1,139 @@
+/* @(#)rquota.x        2.1 88/08/01 4.0 RPCSRC */
+/* @(#)rquota.x 1.2 87/09/20 Copyr 1987 Sun Micro */
+
+/*
+ * Remote quota protocol
+ * Requires unix authentication
+ */
+
+const RQ_PATHLEN = 1024;
+
+struct sq_dqblk {
+       unsigned int rq_bhardlimit;     /* absolute limit on disk blks alloc */
+       unsigned int rq_bsoftlimit;     /* preferred limit on disk blks */
+       unsigned int rq_curblocks;      /* current block count */
+       unsigned int rq_fhardlimit;     /* absolute limit on allocated files */
+       unsigned int rq_fsoftlimit;     /* preferred file limit */
+       unsigned int rq_curfiles;       /* current # allocated files */
+       unsigned int rq_btimeleft;      /* time left for excessive disk use */
+       unsigned int rq_ftimeleft;      /* time left for excessive files */
+};
+
+struct getquota_args {
+       string gqa_pathp<RQ_PATHLEN>;   /* path to filesystem of interest */
+       int gqa_uid;                    /* Inquire about quota for uid */
+};
+
+struct setquota_args {
+       int sqa_qcmd;
+       string sqa_pathp<RQ_PATHLEN>;   /* path to filesystem of interest */
+       int sqa_id;                     /* Set quota for uid */
+       sq_dqblk sqa_dqblk;
+};
+
+struct ext_getquota_args {
+       string gqa_pathp<RQ_PATHLEN>;   /* path to filesystem of interest */
+       int gqa_type;                   /* Type of quota info is needed about */
+       int gqa_id;                     /* Inquire about quota for id */
+};
+
+struct ext_setquota_args {
+       int sqa_qcmd;
+       string sqa_pathp<RQ_PATHLEN>;   /* path to filesystem of interest */
+       int sqa_id;                     /* Set quota for id */
+       int sqa_type;                   /* Type of quota to set */
+       sq_dqblk sqa_dqblk;
+};
+
+/*
+ * remote quota structure
+ */
+struct rquota {
+       int rq_bsize;                   /* block size for block counts */
+       bool rq_active;                 /* indicates whether quota is active */
+       unsigned int rq_bhardlimit;     /* absolute limit on disk blks alloc */
+       unsigned int rq_bsoftlimit;     /* preferred limit on disk blks */
+       unsigned int rq_curblocks;      /* current block count */
+       unsigned int rq_fhardlimit;     /* absolute limit on allocated files */
+       unsigned int rq_fsoftlimit;     /* preferred file limit */
+       unsigned int rq_curfiles;       /* current # allocated files */
+       unsigned int rq_btimeleft;      /* time left for excessive disk use */
+       unsigned int rq_ftimeleft;      /* time left for excessive files */
+};     
+
+enum qr_status {
+       Q_OK = 1,       /* quota returned */
+       Q_NOQUOTA = 2,  /* noquota for uid */
+       Q_EPERM = 3     /* no permission to access quota */
+};
+
+union getquota_rslt switch (qr_status status) {
+case Q_OK:
+       rquota gqr_rquota;      /* valid if status == Q_OK */
+case Q_NOQUOTA:
+       void;
+case Q_EPERM:
+       void;
+};
+
+union setquota_rslt switch (qr_status status) {
+case Q_OK:
+       rquota sqr_rquota;      /* valid if status == Q_OK */
+case Q_NOQUOTA:
+       void;
+case Q_EPERM:
+       void;
+};
+
+program RQUOTAPROG {
+       version RQUOTAVERS {
+               /*
+                * Get all quotas
+                */
+               getquota_rslt
+               RQUOTAPROC_GETQUOTA(getquota_args) = 1;
+
+               /*
+                * Get active quotas only
+                */
+               getquota_rslt
+               RQUOTAPROC_GETACTIVEQUOTA(getquota_args) = 2;
+
+               /*
+                * Set all quotas
+                */
+               setquota_rslt
+               RQUOTAPROC_SETQUOTA(setquota_args) = 3;
+
+               /*
+                * Get active quotas only
+                */
+               setquota_rslt
+               RQUOTAPROC_SETACTIVEQUOTA(setquota_args) = 4;
+       } = 1;
+       version EXT_RQUOTAVERS {
+               /*
+                * Get all quotas
+                */
+               getquota_rslt
+               RQUOTAPROC_GETQUOTA(ext_getquota_args) = 1;
+
+               /*
+                * Get active quotas only
+                */
+               getquota_rslt
+               RQUOTAPROC_GETACTIVEQUOTA(ext_getquota_args) = 2;
+
+               /*
+                * Set all quotas
+                */
+               setquota_rslt
+               RQUOTAPROC_SETQUOTA(ext_setquota_args) = 3;
+
+               /*
+                * Set active quotas only
+                */
+               setquota_rslt
+               RQUOTAPROC_SETACTIVEQUOTA(ext_setquota_args) = 4;
+       } = 2;
+} = 100011;
diff --git a/rquota_client.c b/rquota_client.c
new file mode 100644 (file)
index 0000000..d4c68b7
--- /dev/null
@@ -0,0 +1,351 @@
+/*
+ * QUOTA    An implementation of the diskquota system for the LINUX
+ *          operating system. QUOTA is implemented using the BSD systemcall
+ *          interface as the means of communication with the user level.
+ *          Should work for all filesystems because of integration into the
+ *          VFS layer of the operating system.
+ *          This is based on the Melbourne quota system wich uses both user and
+ *          group quota files.
+ *
+ *          This part does the rpc-communication with the rquotad.
+ *
+ * Version: $Id: rquota_client.c,v 1.13 2010/01/05 16:04:57 jkar8572 Exp $
+ *
+ * Author:  Marco van Wieringen <mvw@planets.elm.net>
+ *
+ *          This program is free software; you can redistribute it and/or
+ *          modify it under the terms of the GNU General Public License
+ *          as published by the Free Software Foundation; either version
+ *          2 of the License, or (at your option) any later version.
+ */
+
+#include "config.h"
+
+#include <rpc/rpc.h>
+#include <sys/types.h>
+#include <sys/param.h>
+#include <sys/stat.h>
+#include <sys/file.h>
+#include <errno.h>
+#include <pwd.h>
+#include <grp.h>
+#include <ctype.h>
+#include <stdio.h>
+#include <string.h>
+#include <signal.h>
+#include <time.h>
+
+#include "mntopt.h"
+#include "rquota.h"
+#include "common.h"
+#include "quotaio.h"
+
+#if defined(RPC)
+
+/* Convert network format of quotas to utils one */
+static inline void clinet2utildqblk(struct util_dqblk *u, struct rquota *n)
+{
+       time_t now;
+       
+       /* Copy the quota */
+       u->dqb_bhardlimit = toqb(((qsize_t)n->rq_bhardlimit) * n->rq_bsize);
+       u->dqb_bsoftlimit = toqb(((qsize_t)n->rq_bsoftlimit) * n->rq_bsize);
+       u->dqb_ihardlimit = n->rq_fhardlimit;
+       u->dqb_isoftlimit = n->rq_fsoftlimit;
+       u->dqb_curinodes = n->rq_curfiles;
+       u->dqb_curspace = ((qsize_t)n->rq_curblocks) * n->rq_bsize;
+       time(&now);
+       if (n->rq_btimeleft)
+               u->dqb_btime = n->rq_btimeleft + now;
+       else
+               u->dqb_btime = 0;
+       if (n->rq_ftimeleft)
+               u->dqb_itime = n->rq_ftimeleft + now;
+       else
+               u->dqb_itime = 0;
+}
+
+/* Convert utils format of quotas to network one */
+static inline void cliutil2netdqblk(struct sq_dqblk *n, struct util_dqblk *u)
+{
+       time_t now;
+
+       time(&now);
+       n->rq_bhardlimit = u->dqb_bhardlimit;
+       n->rq_bsoftlimit = u->dqb_bsoftlimit;
+       n->rq_fhardlimit = u->dqb_ihardlimit;
+       n->rq_fsoftlimit = u->dqb_isoftlimit;
+       n->rq_curblocks = toqb(u->dqb_curspace);
+       n->rq_curfiles = u->dqb_curinodes;
+       if (u->dqb_btime)
+               n->rq_btimeleft = u->dqb_btime - now;
+       else
+               n->rq_btimeleft = 0;
+       if (u->dqb_itime)
+               n->rq_ftimeleft = u->dqb_itime - now;
+       else
+               n->rq_ftimeleft = 0;
+}
+
+/* Write appropriate error message */
+int rquota_err(int stat)
+{
+       switch (stat) {
+               case -1:
+                       return -ECONNREFUSED;
+               case 0:
+                       return -ENOSYS;
+               case Q_NOQUOTA:
+                       return -ENOENT;
+               case Q_OK:
+                       return 0;
+               case Q_EPERM:
+                       return -EPERM;
+               default:
+                       return -EINVAL;
+       }
+}
+
+/*
+ * Collect the requested quota information from a remote host.
+ */
+int rpc_rquota_get(struct dquot *dquot)
+{
+       CLIENT *clnt;
+       getquota_rslt *result;
+       union {
+               getquota_args arg;
+               ext_getquota_args ext_arg;
+       } args;
+       char *fsname_tmp, *host, *pathname;
+       struct timeval timeout = { 2, 0 };
+
+       /*
+        * Initialize with NULL.
+        */
+       memset(&dquot->dq_dqb, 0, sizeof(dquot->dq_dqb));
+
+       /*
+        * Convert host:pathname to seperate host and pathname.
+        */
+       fsname_tmp = (char *)smalloc(strlen(dquot->dq_h->qh_quotadev) + 1);
+       strcpy(fsname_tmp, dquot->dq_h->qh_quotadev);
+       host = fsname_tmp;
+
+       /*
+        * Strip off pathname on nfs mounted dir. Ignore entries of any
+        * automounter.
+        */
+       if ((pathname = strchr(fsname_tmp, ':')) == (char *)0 || *(pathname + 1) == '(') {
+               free(fsname_tmp);
+               return -ENOENT;
+       }
+
+       *pathname++ = '\0';
+       /* For NFSv4, we send the filesystem path without initial /. Server prepends proper
+        * NFS pseudoroot automatically and uses this for detection of NFSv4 mounts. */
+       if ((dquot->dq_h->qh_io_flags & IOFL_NFS_MIXED_PATHS) &&
+           !strcmp(dquot->dq_h->qh_fstype, MNTTYPE_NFS4)) {
+               while (*pathname == '/')
+                       pathname++;
+       }
+
+       /*
+        * First try EXT_RQUOTAPROG (Extended (LINUX) RPC quota program)
+        */
+       args.ext_arg.gqa_pathp = pathname;
+       args.ext_arg.gqa_id = dquot->dq_id;
+       args.ext_arg.gqa_type = dquot->dq_h->qh_type;
+
+       /*
+        * Create a RPC client.
+        */
+       if ((clnt = clnt_create(host, RQUOTAPROG, EXT_RQUOTAVERS, "udp")) != NULL) {
+               /*
+                * Initialize unix authentication
+                */
+               clnt->cl_auth = authunix_create_default();
+
+               /*
+                * Setup protocol timeout.
+                */
+               clnt_control(clnt, CLSET_TIMEOUT, (caddr_t) & timeout);
+
+               /*
+                * Do RPC call and check result.
+                */
+               result = rquotaproc_getquota_2(&args.ext_arg, clnt);
+               if (result != NULL && result->status == Q_OK)
+                       clinet2utildqblk(&dquot->dq_dqb, &result->getquota_rslt_u.gqr_rquota);
+
+               /*
+                * Destroy unix authentication and RPC client structure.
+                */
+               auth_destroy(clnt->cl_auth);
+               clnt_destroy(clnt);
+       }
+       else
+               result = NULL;
+
+       if (result == NULL || !result->status) {
+               if (dquot->dq_h->qh_type == USRQUOTA) {
+                       /*
+                        * Try RQUOTAPROG because server doesn't seem to understand EXT_RQUOTAPROG. (NON-LINUX servers.)
+                        */
+                       args.arg.gqa_pathp = pathname;
+                       args.arg.gqa_uid = dquot->dq_id;
+
+                       /*
+                        * Create a RPC client.
+                        */
+                       if ((clnt = clnt_create(host, RQUOTAPROG, RQUOTAVERS, "udp")) != NULL) {
+                               /*
+                                * Initialize unix authentication
+                                */
+                               clnt->cl_auth = authunix_create_default();
+
+                               /*
+                                * Setup protocol timeout.
+                                */
+                               clnt_control(clnt, CLSET_TIMEOUT, (caddr_t) & timeout);
+
+                               /*
+                                * Do RPC call and check result.
+                                */
+                               result = rquotaproc_getquota_1(&args.arg, clnt);
+                               if (result != NULL && result->status == Q_OK)
+                                       clinet2utildqblk(&dquot->dq_dqb,
+                                                        &result->getquota_rslt_u.gqr_rquota);
+
+                               /*
+                                * Destroy unix authentication and RPC client structure.
+                                */
+                               auth_destroy(clnt->cl_auth);
+                               clnt_destroy(clnt);
+                       }
+               }
+       }
+       free(fsname_tmp);
+       return rquota_err(result?result->status:-1);
+}
+
+/*
+ * Set the requested quota information on a remote host.
+ */
+int rpc_rquota_set(int qcmd, struct dquot *dquot)
+{
+#if defined(RPC_SETQUOTA)
+       CLIENT *clnt;
+       setquota_rslt *result;
+       union {
+               setquota_args arg;
+               ext_setquota_args ext_arg;
+       } args;
+       char *fsname_tmp, *host, *pathname;
+       struct timeval timeout = { 2, 0 };
+
+       /*
+        * Convert host:pathname to seperate host and pathname.
+        */
+       fsname_tmp = (char *)smalloc(strlen(dquot->dq_h->qh_quotadev) + 1);
+       strcpy(fsname_tmp, dquot->dq_h->qh_quotadev);
+       host = fsname_tmp;
+
+       /*
+        * Strip off pathname on nfs mounted dir. Ignore entries of any
+        * automounter.
+        */
+       if ((pathname = strchr(fsname_tmp, ':')) == (char *)0 || *(pathname + 1) == '(')
+               return -ENOENT;
+
+       *pathname++ = '\0';
+       /* For NFSv4, we send the filesystem path without initial /. Server prepends proper
+        * NFS pseudoroot automatically and uses this for detection of NFSv4 mounts. */
+       if ((dquot->dq_h->qh_io_flags & IOFL_NFS_MIXED_PATHS) &&
+           !strcmp(dquot->dq_h->qh_fstype, MNTTYPE_NFS4)) {
+               while (*pathname == '/')
+                       pathname++;
+       }
+
+       /*
+        * First try EXT_RQUOTAPROG (Extended (LINUX) RPC quota program)
+        */
+       args.ext_arg.sqa_qcmd = qcmd;
+       args.ext_arg.sqa_pathp = pathname;
+       args.ext_arg.sqa_id = dquot->dq_id;
+       args.ext_arg.sqa_type = dquot->dq_h->qh_type;
+       cliutil2netdqblk(&args.ext_arg.sqa_dqblk, &dquot->dq_dqb);
+
+       if ((clnt = clnt_create(host, RQUOTAPROG, EXT_RQUOTAVERS, "udp")) != NULL) {
+               /*
+                * Initialize unix authentication
+                */
+               clnt->cl_auth = authunix_create_default();
+
+               /*
+                * Setup protocol timeout.
+                */
+               clnt_control(clnt, CLSET_TIMEOUT, (caddr_t) & timeout);
+
+               /*
+                * Do RPC call and check result.
+                */
+               result = rquotaproc_setquota_2(&args.ext_arg, clnt);
+               if (result != NULL && result->status == Q_OK)
+                       clinet2utildqblk(&dquot->dq_dqb, &result->setquota_rslt_u.sqr_rquota);
+
+               /*
+                * Destroy unix authentication and RPC client structure.
+                */
+               auth_destroy(clnt->cl_auth);
+               clnt_destroy(clnt);
+       }
+       else
+               result = NULL;
+
+       if (result == NULL || !result->status) {
+               if (dquot->dq_h->qh_type == USRQUOTA) {
+                       /*
+                        * Try RQUOTAPROG because server doesn't seem to understand EXT_RQUOTAPROG. (NON-LINUX servers.)
+                        */
+                       args.arg.sqa_qcmd = qcmd;
+                       args.arg.sqa_pathp = pathname;
+                       args.arg.sqa_id = dquot->dq_id;
+                       cliutil2netdqblk(&args.arg.sqa_dqblk, &dquot->dq_dqb);
+
+                       /*
+                        * Create a RPC client.
+                        */
+                       if ((clnt = clnt_create(host, RQUOTAPROG, RQUOTAVERS, "udp")) != NULL) {
+                               /*
+                                * Initialize unix authentication
+                                */
+                               clnt->cl_auth = authunix_create_default();
+
+                               /*
+                                * Setup protocol timeout.
+                                */
+                               clnt_control(clnt, CLSET_TIMEOUT, (caddr_t) & timeout);
+
+                               /*
+                                * Do RPC call and check result.
+                                */
+                               result = rquotaproc_setquota_1(&args.arg, clnt);
+                               if (result != NULL && result->status == Q_OK)
+                                       clinet2utildqblk(&dquot->dq_dqb,
+                                                        &result->setquota_rslt_u.sqr_rquota);
+
+                               /*
+                                * Destroy unix authentication and RPC client structure.
+                                */
+                               auth_destroy(clnt->cl_auth);
+                               clnt_destroy(clnt);
+                       }
+               }
+       }
+       free(fsname_tmp);
+       return rquota_err(result?result->status:-1);
+#endif
+       return -1;
+}
+#endif
diff --git a/rquota_client.h b/rquota_client.h
new file mode 100644 (file)
index 0000000..3730a8d
--- /dev/null
@@ -0,0 +1,18 @@
+/*
+ *
+ *     Header file for rquota functions
+ *
+ */
+
+#ifndef GUARD_RQUOTA_CLIENT_H
+#define GUARD_RQUOTA_CLIENT_H
+
+#include "quotaio.h"
+
+/* Collect the requested quota information from a remote host. */
+int rpc_rquota_get(struct dquot *dquot);
+
+/* Set the requested quota information on a remote host. */
+int rpc_rquota_set(int qcmd, struct dquot *dquot);
+
+#endif
diff --git a/rquota_server.c b/rquota_server.c
new file mode 100644 (file)
index 0000000..cb3c44d
--- /dev/null
@@ -0,0 +1,331 @@
+/*
+ * QUOTA    An implementation of the diskquota system for the LINUX
+ *          operating system. QUOTA is implemented using the BSD systemcall
+ *          interface as the means of communication with the user level.
+ *          Should work for all filesystems because of integration into the
+ *          VFS layer of the operating system.
+ *          This is based on the Melbourne quota system wich uses both user and
+ *          group quota files.
+ *
+ *          This part does the lookup of the info.
+ *
+ * Version: $Id: rquota_server.c,v 1.22 2010/01/05 16:04:57 jkar8572 Exp $
+ *
+ * Author:  Marco van Wieringen <mvw@planets.elm.net>
+ *
+ *          This program is free software; you can redistribute it and/or
+ *          modify it under the terms of the GNU General Public License
+ *          as published by the Free Software Foundation; either version
+ *          2 of the License, or (at your option) any later version.
+ */
+
+#include "config.h"
+
+#include <rpc/rpc.h>
+#include <arpa/inet.h>
+#include <paths.h>
+#include <stdio.h>
+#include <syslog.h>
+#include <time.h>
+
+#include "mntopt.h"
+#include "quotaops.h"
+#include "bylabel.h"
+#include "rquota.h"
+#include "quotaio.h"
+#include "quotasys.h"
+#include "dqblk_rpc.h"
+#include "common.h"
+
+#define STDIN_FILENO   0
+
+#define TYPE_EXTENDED  0x01
+#define ACTIVE         0x02
+
+#define FACILITY       LOG_LOCAL7
+
+#ifndef MAXPATHNAMELEN
+#define MAXPATHNAMELEN BUFSIZ
+#endif
+
+#define NETTYPE AF_INET
+
+/* Options from rquota_svc.c */
+#define FL_AUTOFS 4
+extern int flags;
+
+extern char nfs_pseudoroot[PATH_MAX];
+
+/*
+ * Global unix authentication credentials.
+ */
+extern struct authunix_parms *unix_cred;
+
+int in_group(gid_t * gids, u_int len, gid_t gid)
+{
+       gid_t *gidsp = gids + len;
+
+       while (gidsp > gids)
+               if (*(--gids) == gid)
+                       return 1;
+
+       return 0;
+}
+
+static inline void servnet2utildqblk(struct util_dqblk *u, sq_dqblk * n)
+{
+       time_t now;
+
+       time(&now);
+       u->dqb_bhardlimit = n->rq_bhardlimit;
+       u->dqb_bsoftlimit = n->rq_bsoftlimit;
+       u->dqb_ihardlimit = n->rq_fhardlimit;
+       u->dqb_isoftlimit = n->rq_fsoftlimit;
+       u->dqb_curspace = ((qsize_t)n->rq_curblocks) << RPC_DQBLK_SIZE_BITS;
+       u->dqb_curinodes = n->rq_curfiles;
+       if (n->rq_btimeleft)
+               u->dqb_btime = n->rq_btimeleft + now;
+       else
+               u->dqb_btime = 0;
+       if (n->rq_ftimeleft)
+               u->dqb_itime = n->rq_ftimeleft + now;
+       else
+               u->dqb_itime = 0;
+}
+
+static inline void servutil2netdqblk(struct rquota *n, struct util_dqblk *u)
+{
+       time_t now;
+
+       time(&now);
+       n->rq_bhardlimit = (u->dqb_bhardlimit << QUOTABLOCK_BITS) >> RPC_DQBLK_SIZE_BITS;
+       n->rq_bsoftlimit = (u->dqb_bsoftlimit << QUOTABLOCK_BITS) >> RPC_DQBLK_SIZE_BITS;
+       n->rq_fhardlimit = u->dqb_ihardlimit;
+       n->rq_fsoftlimit = u->dqb_isoftlimit;
+       n->rq_curblocks = (u->dqb_curspace + RPC_DQBLK_SIZE - 1) >> RPC_DQBLK_SIZE_BITS;
+       n->rq_curfiles = u->dqb_curinodes;
+       if (u->dqb_btime)
+               n->rq_btimeleft = u->dqb_btime - now;
+       else
+               n->rq_btimeleft = 0;
+       if (u->dqb_itime)
+               n->rq_ftimeleft = u->dqb_itime - now;
+       else
+               n->rq_ftimeleft = 0;
+}
+
+setquota_rslt *setquotainfo(int lflags, caddr_t * argp, struct svc_req *rqstp)
+{
+       static setquota_rslt result;
+
+#if defined(RPC_SETQUOTA)
+       union {
+               setquota_args *args;
+               ext_setquota_args *ext_args;
+       } arguments;
+       struct util_dqblk dqblk;
+       struct dquot *dquot;
+       struct mntent *mnt;
+       char pathname[PATH_MAX] = {0};
+       char *pathp = pathname;
+       int id, qcmd, type;
+       struct quota_handle *handles[2] = { NULL, NULL };
+
+       /*
+        * First check authentication.
+        */
+       if (lflags & TYPE_EXTENDED) {
+               arguments.ext_args = (ext_setquota_args *) argp;
+
+               id = arguments.ext_args->sqa_id;
+               if (unix_cred->aup_uid != 0) {
+                       result.status = Q_EPERM;
+                       return (&result);
+               }
+
+               qcmd = arguments.ext_args->sqa_qcmd;
+               type = arguments.ext_args->sqa_type;
+               if (arguments.ext_args->sqa_pathp[0] != '/')
+                       sstrncpy(pathname, nfs_pseudoroot, PATH_MAX);
+               sstrncat(pathname, arguments.ext_args->sqa_pathp, PATH_MAX);
+               servnet2utildqblk(&dqblk, &arguments.ext_args->sqa_dqblk);
+       }
+       else {
+               arguments.args = (setquota_args *) argp;
+
+               id = arguments.args->sqa_id;
+               if (unix_cred->aup_uid != 0) {
+                       result.status = Q_EPERM;
+                       return (&result);
+               }
+
+               qcmd = arguments.args->sqa_qcmd;
+               type = USRQUOTA;
+               if (arguments.args->sqa_pathp[0] != '/')
+                       sstrncpy(pathname, nfs_pseudoroot, PATH_MAX);
+               sstrncat(pathname, arguments.args->sqa_pathp, PATH_MAX);
+               servnet2utildqblk(&dqblk, &arguments.args->sqa_dqblk);
+       }
+
+       result.status = Q_NOQUOTA;
+       result.setquota_rslt_u.sqr_rquota.rq_bsize = RPC_DQBLK_SIZE;
+
+       if (init_mounts_scan(1, &pathp, MS_QUIET | MS_NO_MNTPOINT | MS_NFS_ALL | ((flags & FL_AUTOFS) ? 0 : MS_NO_AUTOFS)) < 0)
+               goto out;
+       if (!(mnt = get_next_mount())) {
+               end_mounts_scan();
+               goto out;
+       }
+       if (!(handles[0] = init_io(mnt, type, -1, 0))) {
+               end_mounts_scan();
+               goto out;
+       }
+       end_mounts_scan();
+       if (!(dquot = handles[0]->qh_ops->read_dquot(handles[0], id)))
+               goto out;
+       if (qcmd == QCMD(Q_RPC_SETQLIM, type) || qcmd == QCMD(Q_RPC_SETQUOTA, type)) {
+               dquot->dq_dqb.dqb_bsoftlimit = dqblk.dqb_bsoftlimit;
+               dquot->dq_dqb.dqb_bhardlimit = dqblk.dqb_bhardlimit;
+               dquot->dq_dqb.dqb_isoftlimit = dqblk.dqb_isoftlimit;
+               dquot->dq_dqb.dqb_ihardlimit = dqblk.dqb_ihardlimit;
+               dquot->dq_dqb.dqb_btime = dqblk.dqb_btime;
+               dquot->dq_dqb.dqb_itime = dqblk.dqb_itime;
+       }
+       if (qcmd == QCMD(Q_RPC_SETUSE, type) || qcmd == QCMD(Q_RPC_SETQUOTA, type)) {
+               dquot->dq_dqb.dqb_curspace = dqblk.dqb_curspace;
+               dquot->dq_dqb.dqb_curinodes = dqblk.dqb_curinodes;
+       }
+       if (handles[0]->qh_ops->commit_dquot(dquot, COMMIT_LIMITS) == -1) {
+               free(dquot);
+               goto out;
+       }
+       free(dquot);
+       result.status = Q_OK;
+out:
+       dispose_handle_list(handles);
+#else
+       result.status = Q_EPERM;
+#endif
+       return (&result);
+}
+
+getquota_rslt *getquotainfo(int lflags, caddr_t * argp, struct svc_req * rqstp)
+{
+       static getquota_rslt result;
+       union {
+               getquota_args *args;
+               ext_getquota_args *ext_args;
+       } arguments;
+       struct dquot *dquot = NULL;
+       struct mntent *mnt;
+       char pathname[PATH_MAX] = {0};
+       char *pathp = pathname;
+       int id, type;
+       struct quota_handle *handles[2] = { NULL, NULL };
+
+       /*
+        * First check authentication.
+        */
+       if (lflags & TYPE_EXTENDED) {
+               arguments.ext_args = (ext_getquota_args *) argp;
+               id = arguments.ext_args->gqa_id;
+               type = arguments.ext_args->gqa_type;
+               if (arguments.ext_args->gqa_pathp[0] != '/')
+                       sstrncpy(pathname, nfs_pseudoroot, PATH_MAX);
+               sstrncat(pathname, arguments.ext_args->gqa_pathp, PATH_MAX);
+
+               if (type == USRQUOTA && unix_cred->aup_uid && unix_cred->aup_uid != id) {
+                       result.status = Q_EPERM;
+                       return (&result);
+               }
+
+               if (type == GRPQUOTA && unix_cred->aup_uid && unix_cred->aup_gid != id &&
+                   !in_group((gid_t *) unix_cred->aup_gids, unix_cred->aup_len, id)) {
+                       result.status = Q_EPERM;
+                       return (&result);
+               }
+       }
+       else {
+               arguments.args = (getquota_args *) argp;
+               id = arguments.args->gqa_uid;
+               type = USRQUOTA;
+               if (arguments.ext_args->gqa_pathp[0] != '/')
+                       sstrncpy(pathname, nfs_pseudoroot, PATH_MAX);
+               sstrncat(pathname, arguments.args->gqa_pathp, PATH_MAX);
+
+               if (unix_cred->aup_uid && unix_cred->aup_uid != id) {
+                       result.status = Q_EPERM;
+                       return (&result);
+               }
+       }
+
+       result.status = Q_NOQUOTA;
+       result.getquota_rslt_u.gqr_rquota.rq_bsize = RPC_DQBLK_SIZE;
+
+       if (init_mounts_scan(1, &pathp, MS_QUIET | MS_NO_MNTPOINT | MS_NFS_ALL | ((flags & FL_AUTOFS) ? 0 : MS_NO_AUTOFS)) < 0)
+               goto out;
+       if (!(mnt = get_next_mount())) {
+               end_mounts_scan();
+               goto out;
+       }
+       if (!(handles[0] = init_io(mnt, type, -1, IOI_READONLY))) {
+               end_mounts_scan();
+               goto out;
+       }
+       end_mounts_scan();
+       if (!(lflags & ACTIVE) || QIO_ENABLED(handles[0]))
+               dquot = handles[0]->qh_ops->read_dquot(handles[0], id);
+       if (dquot) {
+               result.status = Q_OK;
+               result.getquota_rslt_u.gqr_rquota.rq_active =
+                       QIO_ENABLED(handles[0]) ? TRUE : FALSE;
+               servutil2netdqblk(&result.getquota_rslt_u.gqr_rquota, &dquot->dq_dqb);
+               free(dquot);
+       }
+out:
+       dispose_handle_list(handles);
+       return (&result);
+}
+
+/*
+ * Map RPC-entrypoints to local function names.
+ */
+getquota_rslt *rquotaproc_getquota_1_svc(getquota_args * argp, struct svc_req * rqstp)
+{
+       return (getquotainfo(0, (caddr_t *) argp, rqstp));
+}
+
+getquota_rslt *rquotaproc_getactivequota_1_svc(getquota_args * argp, struct svc_req * rqstp)
+{
+       return (getquotainfo(ACTIVE, (caddr_t *) argp, rqstp));
+}
+
+getquota_rslt *rquotaproc_getquota_2_svc(ext_getquota_args * argp, struct svc_req * rqstp)
+{
+       return (getquotainfo(TYPE_EXTENDED, (caddr_t *) argp, rqstp));
+}
+
+getquota_rslt *rquotaproc_getactivequota_2_svc(ext_getquota_args * argp, struct svc_req * rqstp)
+{
+       return (getquotainfo(TYPE_EXTENDED | ACTIVE, (caddr_t *) argp, rqstp));
+}
+
+setquota_rslt *rquotaproc_setquota_1_svc(setquota_args * argp, struct svc_req * rqstp)
+{
+       return (setquotainfo(0, (caddr_t *) argp, rqstp));
+}
+
+setquota_rslt *rquotaproc_setactivequota_1_svc(setquota_args * argp, struct svc_req * rqstp)
+{
+       return (setquotainfo(ACTIVE, (caddr_t *) argp, rqstp));
+}
+
+setquota_rslt *rquotaproc_setquota_2_svc(ext_setquota_args * argp, struct svc_req * rqstp)
+{
+       return (setquotainfo(TYPE_EXTENDED, (caddr_t *) argp, rqstp));
+}
+
+setquota_rslt *rquotaproc_setactivequota_2_svc(ext_setquota_args * argp, struct svc_req * rqstp)
+{
+       return (setquotainfo(TYPE_EXTENDED | ACTIVE, (caddr_t *) argp, rqstp));
+}
diff --git a/rquota_svc.c b/rquota_svc.c
new file mode 100644 (file)
index 0000000..c0f7efe
--- /dev/null
@@ -0,0 +1,491 @@
+/*
+ * QUOTA    An implementation of the diskquota system for the LINUX operating
+ *          system. QUOTA is implemented using the BSD systemcall interface
+ *          as the means of communication with the user level. Should work for
+ *          all filesystems because of integration into the VFS layer of the
+ *          operating system. This is based on the Melbourne quota system wich
+ *          uses both user and group quota files.
+ *
+ *          Rquota service handlers.
+ *
+ * Author:  Marco van Wieringen <mvw@planets.elm.net>
+ *          changes for new utilities by Jan Kara <jack@suse.cz>
+ *          patches by Jani Jaakkola <jjaakkol@cs.helsinki.fi>
+ *
+ * Version: $Id: rquota_svc.c,v 1.22 2010/01/05 16:04:57 jkar8572 Exp $
+ *
+ *          This program is free software; you can redistribute it and/or
+ *          modify it under the terms of the GNU General Public License as
+ *          published by the Free Software Foundation; either version 2 of
+ *          the License, or (at your option) any later version.
+ */
+                                                                                                          
+#include "config.h"
+
+#include <rpc/rpc.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <rpc/pmap_clnt.h>     /* for pmap_unset */
+#include <stdio.h>
+#include <stdlib.h>            /* getenv, exit */
+#include <string.h>            /* strcmp */
+#include <memory.h>
+#include <unistd.h>
+#include <getopt.h>
+#include <signal.h>
+#include <errno.h>
+#ifdef HOSTS_ACCESS
+#include <tcpd.h>
+#include <netdb.h>
+
+int deny_severity, allow_severity;     /* Needed by some versions of libwrap */
+#endif
+
+#ifdef __STDC__
+#define SIG_PF void(*)(int)
+#endif
+
+extern int svctcp_socket (u_long __number, int __port, int __reuse);
+extern int svcudp_socket (u_long __number, int __port, int __reuse);
+
+#include "pot.h"
+#include "common.h"
+#include "rquota.h"
+#include "quotasys.h"
+
+char *progname;
+
+/*
+ * Global authentication credentials.
+ */
+struct authunix_parms *unix_cred;
+
+#define FL_SETQUOTA 1  /* Enable setquota rpc */
+#define FL_NODAEMON 2  /* Disable daemon() call */
+#define FL_AUTOFS   4  /* Don't ignore autofs mountpoints */
+
+int flags;                             /* Options specified on command line */ 
+static int port;                       /* Port to use (0 for default one) */
+static char xtab_path[PATH_MAX];       /* Path to NFSD export table */
+char nfs_pseudoroot[PATH_MAX];         /* Root of the virtual NFS filesystem ('/' for NFSv3) */
+
+static struct option options[]= {
+       { "version", 0, NULL, 'V' },
+       { "help", 0, NULL, 'h' },
+       { "foreground", 0 , NULL, 'F' },
+#ifdef RPC_SETQUOTA
+       { "no-setquota", 0 , NULL, 's' },
+       { "setquota", 0, NULL, 'S' },
+#endif
+       { "autofs", 0, NULL, 'I'},
+       { "port", 1, NULL, 'p' },
+       { "xtab", 1, NULL, 'x' },
+       { NULL, 0, NULL , 0 }
+};
+
+static void show_help(void)
+{
+#ifdef RPC_SETQUOTA
+       errstr(_("Usage: %s [options]\nOptions are:\n\
+ -h --help             shows this text\n\
+ -V --version          shows version information\n\
+ -F --foreground       starts the quota service in foreground\n\
+ -I --autofs           do not ignore mountpoints mounted by automounter\n\
+ -p --port <port>      listen on given port\n\
+ -s --no-setquota      disables remote calls to setquota (default)\n\
+ -S --setquota         enables remote calls to setquota\n\
+ -x --xtab <path>      set an alternative file with NFSD export table\n"), progname);
+
+#else
+       errstr(_("Usage: %s [options]\nOptions are:\n\
+ -h --help             shows this text\n\
+ -V --version          shows version information\n\
+ -F --foreground       starts the quota service in foreground\n\
+ -I --autofs           do not ignore mountpoints mounted by automounter\n\
+ -p --port <port>      listen on given port\n\
+ -x --xtab <path>      set an alternative file with NFSD export table\n"), progname);
+#endif
+}
+
+static void parse_options(int argc, char **argv)
+{
+       char ostr[128]="", *endptr;
+       int i,opt;
+       int j=0;
+
+       sstrncpy(xtab_path, NFSD_XTAB_PATH, PATH_MAX);
+       for(i=0; options[i].name; i++) {
+               ostr[j++] = options[i].val;
+               if (options[i].has_arg)
+                       ostr[j++] = ':';
+       }
+       while ((opt=getopt_long(argc, argv, ostr, options, NULL))>=0) {
+               switch(opt) {
+                       case 'V': 
+                               version();
+                               exit(0);
+                       case 'h':
+                               show_help();
+                               exit(0);
+                       case 'F':
+                               flags |= FL_NODAEMON;
+                               break;
+#ifdef RPC_SETQUOTA
+                       case 's':
+                               flags &= ~FL_SETQUOTA;
+                               break;
+                       case 'S':       
+                               flags |= FL_SETQUOTA;
+                               break;
+#endif
+                       case 'I':
+                               flags |= FL_AUTOFS;
+                               break;
+                       case 'p': 
+                               port = strtol(optarg, &endptr, 0);
+                               if (*endptr || port <= 0) {
+                                       errstr(_("Illegal port number: %s\n"), optarg);
+                                       show_help();
+                                       exit(1);
+                               }
+                               break;
+                       case 'x':
+                               if (access(optarg, R_OK) < 0) {
+                                       errstr(_("Cannot access the specified xtab file %s: %s\n"), optarg, strerror(errno));
+                                       show_help();
+                                       exit(1);
+                               }
+                               sstrncpy(xtab_path, optarg, PATH_MAX);
+                               break;
+                       default:
+                               errstr(_("Unknown option '%c'.\n"), opt);
+                               show_help();
+                               exit(1);
+               }
+       }
+}
+
+
+/*
+ * good_client checks if an quota client should be allowed to
+ * execute the requested rpc call.
+ */
+int good_client(struct sockaddr_in *addr, ulong rq_proc)
+{
+#ifdef HOSTS_ACCESS
+       struct request_info req;
+#endif
+       char *remote = inet_ntoa(addr->sin_addr);
+
+       if (rq_proc==RQUOTAPROC_SETQUOTA ||
+            rq_proc==RQUOTAPROC_SETACTIVEQUOTA) {
+               /* If setquota is disabled, fail always */
+               if (!(flags & FL_SETQUOTA)) {
+                       errstr(_("host %s attempted to call setquota when disabled\n"),
+                              remote);
+
+                       return 0;
+               }
+               /* Require that SETQUOTA calls originate from port < 1024 */
+               if (ntohs(addr->sin_port)>=1024) {
+                       errstr(_("host %s attempted to call setquota from port >= 1024\n"),
+                              remote);
+                       return 0;
+               }
+               /* Setquota OK */
+       }
+
+#ifdef HOSTS_ACCESS
+       /* NOTE: we could use different servicename for setquota calls to
+        * allow only some hosts to call setquota. */
+
+       request_init(&req, RQ_DAEMON, "rquotad", RQ_CLIENT_SIN, addr, 0);
+       sock_methods(&req);
+       if (hosts_access(&req))
+               return 1;
+       errstr(_("Denied access to host %s\n"), remote);
+       return 0;
+#else
+       /* If no access checking is available, OK always */
+       return 1;
+#endif
+}
+
+static void rquotaprog_1(struct svc_req *rqstp, register SVCXPRT * transp)
+{
+       union {
+               getquota_args rquotaproc_getquota_1_arg;
+               setquota_args rquotaproc_setquota_1_arg;
+               getquota_args rquotaproc_getactivequota_1_arg;
+               setquota_args rquotaproc_setactivequota_1_arg;
+       } argument;
+       char *result;
+       xdrproc_t xdr_argument, xdr_result;
+       char *(*local) (char *, struct svc_req *);
+
+       /*
+        *  Authenticate host
+        */
+       if (!good_client(svc_getcaller(rqstp->rq_xprt),rqstp->rq_proc)) {
+               svcerr_auth (transp, AUTH_FAILED);
+               return;
+       }
+
+       /*
+        * Don't bother authentication for NULLPROC.
+        */
+       if (rqstp->rq_proc == NULLPROC) {
+               (void)svc_sendreply(transp, (xdrproc_t) xdr_void, (char *)NULL);
+               return;
+       }
+
+       /*
+        * Get authentication.
+        */
+       switch (rqstp->rq_cred.oa_flavor) {
+         case AUTH_UNIX:
+                 unix_cred = (struct authunix_parms *)rqstp->rq_clntcred;
+                 break;
+         case AUTH_NULL:
+         default:
+                 svcerr_weakauth(transp);
+                 return;
+       }
+
+       switch (rqstp->rq_proc) {
+         case RQUOTAPROC_GETQUOTA:
+                 xdr_argument = (xdrproc_t) xdr_getquota_args;
+                 xdr_result = (xdrproc_t) xdr_getquota_rslt;
+                 local = (char *(*)(char *, struct svc_req *))rquotaproc_getquota_1_svc;
+                 break;
+
+         case RQUOTAPROC_SETQUOTA:
+                 xdr_argument = (xdrproc_t) xdr_setquota_args;
+                 xdr_result = (xdrproc_t) xdr_setquota_rslt;
+                 local = (char *(*)(char *, struct svc_req *))rquotaproc_setquota_1_svc;
+                 break;
+
+         case RQUOTAPROC_GETACTIVEQUOTA:
+                 xdr_argument = (xdrproc_t) xdr_getquota_args;
+                 xdr_result = (xdrproc_t) xdr_getquota_rslt;
+                 local = (char *(*)(char *, struct svc_req *))rquotaproc_getactivequota_1_svc;
+                 break;
+
+         case RQUOTAPROC_SETACTIVEQUOTA:
+                 xdr_argument = (xdrproc_t) xdr_setquota_args;
+                 xdr_result = (xdrproc_t) xdr_setquota_rslt;
+                 local = (char *(*)(char *, struct svc_req *))rquotaproc_setactivequota_1_svc;
+                 break;
+
+         default:
+                 svcerr_noproc(transp);
+                 return;
+       }
+       memset(&argument, 0, sizeof(argument));
+       if (!svc_getargs(transp, xdr_argument, (caddr_t) & argument)) {
+               svcerr_decode(transp);
+               return;
+       }
+       result = (*local) ((char *)&argument, rqstp);
+       if (result != NULL && !svc_sendreply(transp, xdr_result, result)) {
+               svcerr_systemerr(transp);
+       }
+       if (!svc_freeargs(transp, xdr_argument, (caddr_t) & argument)) {
+               errstr(_("unable to free arguments\n"));
+               exit(1);
+       }
+       return;
+}
+
+static void rquotaprog_2(struct svc_req *rqstp, register SVCXPRT * transp)
+{
+       union {
+               ext_getquota_args rquotaproc_getquota_2_arg;
+               ext_setquota_args rquotaproc_setquota_2_arg;
+               ext_getquota_args rquotaproc_getactivequota_2_arg;
+               ext_setquota_args rquotaproc_setactivequota_2_arg;
+       } argument;
+       char *result;
+       xdrproc_t xdr_argument, xdr_result;
+       char *(*local) (char *, struct svc_req *);
+
+       /*
+        *  Authenticate host
+        */
+       if (!good_client(svc_getcaller(rqstp->rq_xprt),rqstp->rq_proc)) {
+               svcerr_auth (transp, AUTH_FAILED);
+               return;
+       }
+
+       /*
+        * Don't bother authentication for NULLPROC.
+        */
+       if (rqstp->rq_proc == NULLPROC) {
+               (void)svc_sendreply(transp, (xdrproc_t) xdr_void, (char *)NULL);
+               return;
+       }
+
+       /*
+        * Get authentication.
+        */
+       switch (rqstp->rq_cred.oa_flavor) {
+         case AUTH_UNIX:
+                 unix_cred = (struct authunix_parms *)rqstp->rq_clntcred;
+                 break;
+         case AUTH_NULL:
+         default:
+                 svcerr_weakauth(transp);
+                 return;
+       }
+
+       switch (rqstp->rq_proc) {
+         case RQUOTAPROC_GETQUOTA:
+                 xdr_argument = (xdrproc_t) xdr_ext_getquota_args;
+                 xdr_result = (xdrproc_t) xdr_getquota_rslt;
+                 local = (char *(*)(char *, struct svc_req *))rquotaproc_getquota_2_svc;
+                 break;
+
+         case RQUOTAPROC_SETQUOTA:
+                 xdr_argument = (xdrproc_t) xdr_ext_setquota_args;
+                 xdr_result = (xdrproc_t) xdr_setquota_rslt;
+                 local = (char *(*)(char *, struct svc_req *))rquotaproc_setquota_2_svc;
+                 break;
+
+         case RQUOTAPROC_GETACTIVEQUOTA:
+                 xdr_argument = (xdrproc_t) xdr_ext_getquota_args;
+                 xdr_result = (xdrproc_t) xdr_getquota_rslt;
+                 local = (char *(*)(char *, struct svc_req *))rquotaproc_getactivequota_2_svc;
+                 break;
+
+         case RQUOTAPROC_SETACTIVEQUOTA:
+                 xdr_argument = (xdrproc_t) xdr_ext_setquota_args;
+                 xdr_result = (xdrproc_t) xdr_setquota_rslt;
+                 local = (char *(*)(char *, struct svc_req *))rquotaproc_setactivequota_2_svc;
+                 break;
+
+         default:
+                 svcerr_noproc(transp);
+                 return;
+       }
+       memset(&argument, 0, sizeof(argument));
+       if (!svc_getargs(transp, xdr_argument, (caddr_t) & argument)) {
+               svcerr_decode(transp);
+               return;
+       }
+       result = (*local) ((char *)&argument, rqstp);
+       if (result != NULL && !svc_sendreply(transp, xdr_result, result)) {
+               svcerr_systemerr(transp);
+       }
+       if (!svc_freeargs(transp, xdr_argument, (caddr_t) & argument)) {
+               errstr(_("unable to free arguments\n"));
+               exit(1);
+       }
+       return;
+}
+
+static void
+unregister (int sig)
+{
+       pmap_unset(RQUOTAPROG, RQUOTAVERS);
+       pmap_unset(RQUOTAPROG, EXT_RQUOTAVERS);
+       exit(0);
+}
+
+/* Parse NFSD export table and find a filesystem pseudoroot if it is there */
+static void get_pseudoroot(void)
+{
+       FILE *f;
+       char exp_line[1024];
+       char *c;
+
+       strcpy(nfs_pseudoroot, "/");
+       if (!(f = fopen(xtab_path, "r"))) {
+               errstr(_("Warning: Cannot open export table %s: %s\nUsing '/' as a pseudofilesystem root.\n"), xtab_path, strerror(errno));
+               return;
+       }
+       while (fgets(exp_line, sizeof(exp_line), f)) {
+               if (exp_line[0] == '#' || exp_line[0] == '\n')  /* Comment, empty line? */
+                       continue;
+               c = strchr(exp_line, '\t');
+               if (!c) /* Huh, line we don't understand... */
+                       continue;
+               *c = 0;
+               /* Find the beginning of export options */
+               c = strchr(c+1, '(');
+               if (!c)
+                       continue;
+               c = strstr(c, "fsid=0");
+               if (c) {
+                       sstrncpy(nfs_pseudoroot, exp_line, PATH_MAX);
+                       sstrncat(nfs_pseudoroot, "/", PATH_MAX);
+                       break;
+               }
+       }
+       fclose(f);
+}
+
+int main(int argc, char **argv)
+{
+       register SVCXPRT *transp;
+       struct sigaction sa;
+       int sock;
+
+       gettexton();
+       progname = basename(argv[0]);
+       parse_options(argc, argv);
+
+       init_kernel_interface();
+       get_pseudoroot();
+       pmap_unset(RQUOTAPROG, RQUOTAVERS);
+       pmap_unset(RQUOTAPROG, EXT_RQUOTAVERS);
+
+       sa.sa_handler = SIG_IGN;
+       sa.sa_flags = 0;
+       sigemptyset(&sa.sa_mask);
+       sigaction(SIGCHLD, &sa, NULL);
+
+       sa.sa_handler = unregister;
+       sigaction(SIGHUP, &sa, NULL);
+       sigaction(SIGINT, &sa, NULL);
+       sigaction(SIGTERM, &sa, NULL);
+
+       sock = svcudp_socket(RQUOTAPROG, port, 1);
+       transp = svcudp_create(sock == -1 ? RPC_ANYSOCK : sock);
+       if (transp == NULL) {
+               errstr(_("cannot create udp service.\n"));
+               exit(1);
+       }
+       if (!svc_register(transp, RQUOTAPROG, RQUOTAVERS, rquotaprog_1, IPPROTO_UDP)) {
+               errstr(_("unable to register (RQUOTAPROG, RQUOTAVERS, udp).\n"));
+               exit(1);
+       }
+       if (!svc_register(transp, RQUOTAPROG, EXT_RQUOTAVERS, rquotaprog_2, IPPROTO_UDP)) {
+               errstr(_("unable to register (RQUOTAPROG, EXT_RQUOTAVERS, udp).\n"));
+               exit(1);
+       }
+
+       sock = svctcp_socket(RQUOTAPROG, port, 1);
+       transp = svctcp_create(sock == -1 ? RPC_ANYSOCK : sock, 0, 0);
+       if (transp == NULL) {
+               errstr(_("cannot create tcp service.\n"));
+               exit(1);
+       }
+       if (!svc_register(transp, RQUOTAPROG, RQUOTAVERS, rquotaprog_1, IPPROTO_TCP)) {
+               errstr(_("unable to register (RQUOTAPROG, RQUOTAVERS, tcp).\n"));
+               exit(1);
+       }
+       if (!svc_register(transp, RQUOTAPROG, EXT_RQUOTAVERS, rquotaprog_2, IPPROTO_TCP)) {
+               errstr(_("unable to register (RQUOTAPROG, EXT_RQUOTAVERS, tcp).\n"));
+               exit(1);
+       }
+
+       if (!(flags & FL_NODAEMON)) {
+               use_syslog();
+               daemon(0, 0);
+       }
+       svc_run();
+       errstr(_("svc_run returned\n"));
+       exit(1);
+       /* NOTREACHED */
+}
diff --git a/rquotad.8 b/rquotad.8
new file mode 100644 (file)
index 0000000..f18bdcc
--- /dev/null
+++ b/rquotad.8
@@ -0,0 +1,95 @@
+.TH RQUOTAD 8
+.SH NAME
+rquotad, rpc.rquotad \- remote quota server
+.SH SYNOPSIS
+.B rpc.rquotad
+[
+.B \-sSFI
+] [
+.B \-p \f2port\f1
+]
+.SH DESCRIPTION
+.LP
+.IX  "rquotad daemon"  ""  "\fLrquotad\fP \(em remote quota server"
+.IX  daemons  "rquotad daemon"  ""  "\fLrquotad\fP \(em remote quota server"
+.IX  "user quotas"  "rquotad daemon"  ""  "\fLrquotad\fP \(em remote quota server"
+.IX  "disk quotas"  "rquotad daemon"  ""  "\fLrquotad\fP \(em remote quota server"
+.IX  "quotas"  "rquotad daemon"  ""  "\fLrquotad\fP \(em remote quota server"
+.IX  "filesystem"  "rquotad daemon"  ""  "\fLrquotad\fP \(em remote quota server"
+.IX  "remote procedure call services"  "rquotad"  ""  "\fLrquotad\fP \(em remote quota server"
+.B rquotad
+is an
+.BR rpc (3)
+server which returns quotas for a user of a local filesystem
+which is mounted by a remote machine over the
+.SM NFS\s0.
+It also allows setting of quotas on
+.SM NFS
+mounted filesystem (if configured during compilation and allowed by a command line option
+.BR \-S ).
+The results are used by
+.BR quota (1)
+to display user quotas for remote filesystems and by
+.BR edquota (8)
+to set quotas on remote filesystems.
+.B rquotad
+daemon uses tcp-wrappers library (under service name
+.IR rquotad )
+which allows you to specify hosts allowed/disallowed to use
+the daemon (see
+.BR hosts.allow (5)
+manpage for more information). The
+.B rquotad
+daemon is normally started at boot time from the
+system startup scripts.
+.SH OPTIONS
+.TP
+.B \-V, \-\-version
+Shows version of quota tools.
+.TP
+.B \-s, \-\-no-setquota
+Don't allow setting of quotas (default). This option is available only
+if utilities were compiled with the
+.I rpcsetquota
+option.
+.TP
+.B \-S, \-\-setquota
+Allow setting of quotas. This option is available only
+if utilities were compiled with the
+.I rpcsetquota
+option.
+.TP
+.B \-F, \-\-foreground
+Run daemon in foreground (may be useful for debugging purposes).
+.TP
+.B \-I, \-\-autofs
+Do not ignore autofs mountpoints.
+.TP
+.B \-p \f2port\f3, \-\-port \f2port\f1
+Listen on alternate port
+.IR port.
+.TP
+.B \-x \f2path\f3, \-\-xtab \f2path\f1
+Set an alternative file with NFSD export table. This file is used to
+determine pseudoroot of NFSv4 exports. The pseudoroot is then prepended
+to each relative path (i.e. a path not beginning by '/') received in a
+quota RPC request.
+
+.SH FILES
+.PD 0
+.TP 20
+.B aquota.user or aquota.group
+quota file at the filesystem root (version 2 quota, non-XFS filesystems)
+.TP
+.B quota.user or quota.group
+quota file at the filesystem root (version 1 quota, non-XFS filesystems)
+.TP
+.B /etc/mtab
+default filesystems
+.PD
+.SH "SEE ALSO"
+.BR quota (1),
+.BR rpc (3),
+.BR nfs (5),
+.BR services (5),
+.BR inetd (8)
diff --git a/set_limits_example.c b/set_limits_example.c
new file mode 100644 (file)
index 0000000..755fb2f
--- /dev/null
@@ -0,0 +1,60 @@
+#include "config.h"
+
+#include <sys/types.h>
+#include <sys/quota.h>
+#include <errno.h>
+#include <stdio.h>
+
+#include "pot.h"
+
+int copy_user_quota_limits(const char *block_device, uid_t from, uid_t to)
+{
+       struct dqblk dq;
+
+       if (quotactl(QCMD(Q_GETQUOTA, USRQUOTA), block_device, from, (caddr_t) & dq) == 0) {
+               if (quotactl(QCMD(Q_SETQLIM, USRQUOTA), block_device, to, (caddr_t) & dq) == 0) {
+                       return (0);
+               }
+               else {
+                       errstr(
+                               _("copy_user_quota_limits: Failed to set userquota for uid %ld : %s\n"),
+                               to, strerror(errno));
+                       return (1);
+               }
+       }
+       else {
+               errstr(
+                       _("copy_user_quota_limits: Failed to get userquota for uid %ld : %s\n"),
+                       from, strerror(errno));
+               return (1);
+       }
+}
+
+int copy_group_quota_limits(const char *block_device, gid_t from, gid_t to)
+{
+       struct dqblk dq;
+
+       if (quotactl(QCMD(Q_GETQUOTA, GRPQUOTA), block_device, from, (caddr_t) & dq) == 0) {
+               if (quotactl(QCMD(Q_SETQLIM, GRPQUOTA), block_device, to, (caddr_t) & dq) == 0) {
+                       return (0);
+               }
+               else {
+                       errstr(
+                               _("copy_group_quota_limits: Failed to set groupquota for uid %ld : %s\n"),
+                               to, strerror(errno));
+                       return (1);
+               }
+       }
+       else {
+               errstr(
+                       _("copy_group_quota_limits: Failed to get groupquota for uid %ld : %s\n"),
+                       from, strerror(errno));
+               return (1);
+       }
+}
+
+main(int argc, char **argv)
+{
+       gettexton();
+       copy_user_quota_limits("/dev/hda8", 152, 151);
+}
diff --git a/setquota.8 b/setquota.8
new file mode 100644 (file)
index 0000000..624deec
--- /dev/null
@@ -0,0 +1,207 @@
+.TH SETQUOTA 8
+.SH NAME
+setquota \- set disk quotas
+.SH SYNOPSIS
+.B setquota
+[
+.B \-rm
+]
+[
+.B \-u
+|
+.B \-g
+]
+[
+.B \-F
+.I quotaformat
+]
+.I name
+.I block-softlimit
+.I block-hardlimit
+.I inode-softlimit
+.I inode-hardlimit
+.B \-a
+|
+.I filesystem...
+.LP
+.B setquota
+[
+.B \-rm
+]
+[
+.B \-u
+|
+.B \-g
+]
+[
+.B \-F
+.I quotaformat
+]
+[
+.B \-p
+.I protoname 
+]
+.I name
+.B \-a
+|
+.I filesystem...
+.LP
+.B setquota
+.B \-b
+[
+.B \-rm
+]
+[
+.B \-u
+|
+.B \-g
+]
+[
+.B \-F
+.I quotaformat
+]
+.B \-a
+|
+.I filesystem...
+.LP
+.B setquota
+.B \-t
+[
+.B \-m
+] [
+.B \-u
+|
+.B \-g
+]
+[
+.B \-F
+.I quotaformat
+]
+.I block-grace
+.I inode-grace
+.B \-a
+|
+.I filesystem...
+.LP
+.B setquota
+.B \-T
+[
+.B \-m
+] [
+.B \-u
+|
+.B \-g
+]
+[
+.B \-F
+.I quotaformat
+]
+.I name
+.I block-grace
+.I inode-grace
+.B \-a
+|
+.I filesystem...
+.SH DESCRIPTION
+.IX  "setquota command"  ""  "\fLsetquota\fP \(em set disk quotas"
+.IX  set "disk quotas \(em \fLsetquota\fP"
+.IX  "disk quotas"  "setquota command"  ""  "\fLsetquota\fP \(em set disk quotas"
+.IX  "disk quotas"  "setquota command"  ""  "\fLsetquota\fP \(em set disk quotas"
+.IX  "quotas"  "setquota command"  ""  "\fLsetquota\fP \(em set disk quotas"
+.IX  "filesystem"  "setquota command"  ""  "\fLsetquota\fP \(em set disk quotas"
+.B setquota
+is a command line quota editor.
+The filesystem, user/group name and new quotas for this
+filesystem can be specified on the command line. Note that if a number is
+given in the place of a user/group name it is treated as an UID/GID.
+.TP
+.B -r, --remote
+Edit also remote quota use rpc.rquotad on remote server to set quota. This
+option is available only if quota tools were compiled with enabled support
+for setting quotas over RPC.
+.TP
+.B -m, --no-mixed-pathnames
+Currently, pathnames of NFSv4 mountpoints are sent without leading slash in the path.
+.BR rpc.rquotad
+uses this to recognize NFSv4 mounts and properly prepend pseudoroot of NFS filesystem
+to the path. If you specify this option,
+.BR setquota
+will always send paths with a trailing slash. This can be useful for legacy reasons but
+be aware that quota over RPC will stop working if you are using new
+.BR rpc.rquotad .
+.TP
+.B -F, --format=\f2quotaformat\f1
+Perform setting for specified format (ie. don't perform format autodetection).
+Possible format names are:
+.B vfsold
+Original quota format with 16-bit UIDs / GIDs,
+.B vfsv0
+Quota format with 32-bit UIDs / GIDs, 64-bit space usage, 32-bit inode usage and limits,
+.B vfsv1
+Quota format with 64-bit quota limits and usage,
+.B rpc
+(quota over NFS),
+.B xfs
+(quota on XFS filesystem)
+.TP
+.B -u, --user
+Set user quotas for named user. This is the default.
+.TP
+.B -g, --group
+Set group quotas for named group.
+.TP
+.B -p, --prototype=\f2protoname\f1
+Use quota settings of user or group
+.I protoname
+to set the quota for the named user or group.
+.TP
+.B -b, --batch
+Read information to set from stdin (input format is
+.I name block-softlimit block-hardlimit inode-softlimit inode-hardlimit
+). Empty lines and lines starting with # are ignored.
+.TP
+.B -c, --continue-batch
+If parsing of an input line in batch mode fails, continue with processing the next line.
+.TP
+.B -t, --edit-period
+Set grace times for users/groups. Times
+.B block-grace
+and
+.B inode-grace
+are specified in seconds.
+.TP
+.B -T, --edit-times
+Alter times for individual user/group when softlimit is enforced. Times
+.B block-grace
+and
+.B inode-grace
+are specified in seconds or can be string 'unset'.
+.TP
+.B -a, --all
+Go through all filesystems with quota in
+.B /etc/mtab
+and perform setting.
+.PP
+To disable a quota, set the coresponding parameter to 0. To change quotas
+for several filesystems, invoke once for each filesystem.
+.PP
+Only the super-user may edit quotas.
+.SH FILES
+.PD 0
+.TP 20
+.B aquota.user or aquota.group
+quota file at the filesystem root (version 2 quota, non-XFS filesystems)
+.TP
+.B quota.user or quota.group
+quota file at the filesystem root (version 1 quota, non-XFS filesystems)
+.TP
+.B /etc/mtab
+mounted filesystem table
+.PD
+.SH SEE ALSO
+.BR edquota (8),
+.BR quota (1),
+.BR quotactl (2),
+.BR quotacheck (8),
+.BR quotaon (8),
+.BR repquota (8)
diff --git a/setquota.c b/setquota.c
new file mode 100644 (file)
index 0000000..1020d8f
--- /dev/null
@@ -0,0 +1,443 @@
+/*
+ *
+ *     Set disk quota from command line 
+ *
+ *     Jan Kara <jack@suse.cz> - sponsored by SuSE CR
+ */
+
+#include "config.h"
+
+#include <rpc/rpc.h>
+#include <sys/types.h>
+#include <errno.h>
+#include <stdio.h>
+#include <string.h>
+#include <getopt.h>
+#include <time.h>
+#include <ctype.h>
+
+#if defined(RPC)
+#include "rquota.h"
+#include "rquota_client.h"
+#endif
+#include "pot.h"
+#include "quotaops.h"
+#include "common.h"
+#include "quotasys.h"
+
+#define FL_USER 1
+#define FL_GROUP 2
+#define FL_RPC 4
+#define FL_ALL 8
+#define FL_PROTO 16
+#define FL_GRACE 32
+#define FL_INDIVIDUAL_GRACE 64
+#define FL_BATCH 128
+#define FL_NUMNAMES 256
+#define FL_NO_MIXED_PATHS 512
+#define FL_CONTINUE_BATCH 1024
+
+int flags, fmt = -1;
+char **mnt;
+char *progname;
+int mntcnt;
+qid_t protoid, id;
+struct util_dqblk toset;
+
+/* Print usage information */
+static void usage(void)
+{
+#if defined(RPC_SETQUOTA)
+       char *ropt = "[-rm] ";
+#else
+       char *ropt = "";
+#endif
+       errstr(_("Usage:\n\
+  setquota [-u|-g] %1$s[-F quotaformat] <user|group>\n\
+\t<block-softlimit> <block-hardlimit> <inode-softlimit> <inode-hardlimit> -a|<filesystem>...\n\
+  setquota [-u|-g] %1$s[-F quotaformat] <-p protouser|protogroup> <user|group> -a|<filesystem>...\n\
+  setquota [-u|-g] %1$s[-F quotaformat] -b [-c] -a|<filesystem>...\n\
+  setquota [-u|-g] [-F quotaformat] -t <blockgrace> <inodegrace> -a|<filesystem>...\n\
+  setquota [-u|-g] [-F quotaformat] <user|group> -T <blockgrace> <inodegrace> -a|<filesystem>...\n\n\
+-u, --user                 set limits for user\n\
+-g, --group                set limits for group\n\
+-a, --all                  set limits for all filesystems\n\
+    --always-resolve       always try to resolve name, even if is\n\
+                           composed only of digits\n\
+-F, --format=formatname    operate on specific quota format\n\
+-p, --prototype=protoname  copy limits from user/group\n\
+-b, --batch                read limits from standard input\n\
+-c, --continue-batch       continue in input processing in case of an error\n"), ropt);
+#if defined(RPC_SETQUOTA)
+       fputs(_("-r, --remote               set remote quota (via RPC)\n\
+-m, --no-mixed-pathnames      trim leading slashes from NFSv4 mountpoints\n"), stderr);
+#endif
+       fputs(_("-t, --edit-period          edit grace period\n\
+-T, --edit-times           edit grace times for user/group\n\
+-h, --help                 display this help text and exit\n\
+-V, --version              display version information and exit\n\n"), stderr);
+       fprintf(stderr, _("Bugs to: %s\n"), MY_EMAIL);
+       exit(1);
+}
+
+/* Convert string to number - print errstr message in case of failure */
+static qsize_t parse_unum(char *str, char *msg)
+{
+       char *errch;
+       qsize_t ret = strtoull(str, &errch, 0);
+
+       if (*errch) {
+               errstr(_("Bad %s: %s\n"), msg, str);
+               usage();
+       }
+       return ret;
+}
+
+/* Convert our flags to quota type */
+static inline int flag2type(int flags)
+{
+       if (flags & FL_USER)
+               return USRQUOTA;
+       if (flags & FL_GROUP)
+               return GRPQUOTA;
+       return -1;
+}
+
+/* Parse options of setquota */
+static void parse_options(int argcnt, char **argstr)
+{
+       int ret, otherargs;
+       char *protoname = NULL;
+
+#ifdef RPC_SETQUOTA
+       char *opts = "gp:urmVF:taTbc";
+#else
+       char *opts = "gp:uVF:taTbc";
+#endif
+       struct option long_opts[] = {
+               { "user", 0, NULL, 'u' },
+               { "group", 0, NULL, 'g' },
+               { "prototype", 1, NULL, 'p' },
+#ifdef RPC_SETQUOTA
+               { "remote", 0, NULL, 'r' },
+               { "no-mixed-pathnames", 0, NULL, 'm' },
+#endif
+               { "all", 0, NULL, 'a' },
+               { "always-resolve", 0, NULL, 256},
+               { "edit-period", 0, NULL, 't' },
+               { "edit-times", 0, NULL, 'T' },
+               { "batch", 0, NULL, 'b' },
+               { "continue", 0, NULL, 'c' },
+               { "format", 1, NULL, 'F' },
+               { "version", 0, NULL, 'V' },
+               { "help", 0, NULL, 'h' },
+               { NULL, 0, NULL, 0 }
+       };
+
+       while ((ret = getopt_long(argcnt, argstr, opts, long_opts, NULL)) != -1) {
+               switch (ret) {
+                 case '?':
+                 case 'h':
+                         usage();
+                 case 'g':
+                         flags |= FL_GROUP;
+                         break;
+                 case 'u':
+                         flags |= FL_USER;
+                         break;
+                 case 'p':
+                         flags |= FL_PROTO;
+                         protoname = optarg;
+                         break;
+                 case 'r':
+                         flags |= FL_RPC;
+                         break;
+                 case 'm':
+                         flags |= FL_NO_MIXED_PATHS;
+                         break;
+                 case 'a':
+                         flags |= FL_ALL;
+                         break;
+                 case 256:
+                         flags |= FL_NUMNAMES;
+                         break;
+                 case 't':
+                         flags |= FL_GRACE;
+                         break;
+                 case 'b':
+                         flags |= FL_BATCH;
+                         break;
+                 case 'c':
+                         flags |= FL_CONTINUE_BATCH;
+                         break;
+                 case 'T':
+                         flags |= FL_INDIVIDUAL_GRACE;
+                         break;
+                 case 'F':
+                         if ((fmt = name2fmt(optarg)) == QF_ERROR)
+                                 exit(1);
+                         break;
+                 case 'V':
+                         version();
+                         exit(0);
+               }
+       }
+       if (flags & FL_USER && flags & FL_GROUP) {
+               errstr(_("Group and user quotas cannot be used together.\n"));
+               usage();
+       }
+       if (flags & FL_PROTO && flags & FL_GRACE) {
+               errstr(_("Prototype user has no sense when editing grace times.\n"));
+               usage();
+       }
+       if (flags & FL_INDIVIDUAL_GRACE && flags & FL_GRACE) {
+               errstr(_("Cannot set both individual and global grace time.\n"));
+               usage();
+       }
+       if (flags & FL_BATCH && flags & (FL_GRACE | FL_INDIVIDUAL_GRACE)) {
+               errstr(_("Batch mode cannot be used for setting grace times.\n"));
+               usage();
+       }
+       if (flags & FL_BATCH && flags & FL_PROTO) {
+               errstr(_("Batch mode and prototype user cannot be used together.\n"));
+               usage();
+       }
+       if (flags & FL_GRACE)
+               otherargs = 2;
+       else if (flags & FL_INDIVIDUAL_GRACE)
+               otherargs = 3;
+       else if (flags & FL_BATCH)
+               otherargs = 0;
+       else {
+               otherargs = 1;
+               if (!(flags & FL_PROTO))
+                       otherargs += 4;
+       }
+       if (optind + otherargs > argcnt) {
+               errstr(_("Bad number of arguments.\n"));
+               usage();
+       }
+       if (!(flags & (FL_USER | FL_GROUP)))
+               flags |= FL_USER;
+       if (!(flags & (FL_GRACE | FL_BATCH))) {
+               id = name2id(argstr[optind++], flag2type(flags), !!(flags & FL_NUMNAMES), NULL);
+               if (!(flags & (FL_GRACE | FL_INDIVIDUAL_GRACE | FL_PROTO))) {
+                       toset.dqb_bsoftlimit = parse_unum(argstr[optind++], _("block softlimit"));
+                       toset.dqb_bhardlimit = parse_unum(argstr[optind++], _("block hardlimit"));
+                       toset.dqb_isoftlimit = parse_unum(argstr[optind++], _("inode softlimit"));
+                       toset.dqb_ihardlimit = parse_unum(argstr[optind++], _("inode hardlimit"));
+               }
+               else if (flags & FL_PROTO)
+                       protoid = name2id(protoname, flag2type(flags), !!(flags & FL_NUMNAMES), NULL);
+       }
+       if (flags & FL_GRACE) {
+               toset.dqb_btime = parse_unum(argstr[optind++], _("block grace time"));
+               toset.dqb_itime = parse_unum(argstr[optind++], _("inode grace time"));
+       }
+       else if (flags & FL_INDIVIDUAL_GRACE) {
+               time_t now;
+
+               time(&now);
+               if (!strcmp(argstr[optind], _("unset"))) {
+                       toset.dqb_btime = 0;
+                       optind++;
+               }
+               else
+                       toset.dqb_btime = now + parse_unum(argstr[optind++], _("block grace time"));
+               if (!strcmp(argstr[optind], _("unset"))) {
+                       toset.dqb_itime = 0;
+                       optind++;
+               }
+               else
+                       toset.dqb_itime = now + parse_unum(argstr[optind++], _("inode grace time"));
+       }
+       if (!(flags & FL_ALL)) {
+               mntcnt = argcnt - optind;
+               mnt = argstr + optind;
+               if (!mntcnt) {
+                       errstr(_("Mountpoint not specified.\n"));
+                       usage();
+               }
+       }
+}
+
+/* Set user limits */
+static int setlimits(struct quota_handle **handles)
+{
+       struct dquot *q, *protoq, *protoprivs = NULL, *curprivs;
+       int ret = 0;
+
+       curprivs = getprivs(id, handles, 0);
+       if (flags & FL_PROTO) {
+               protoprivs = getprivs(protoid, handles, 0);
+               for (q = curprivs, protoq = protoprivs; q && protoq; q = q->dq_next, protoq = protoq->dq_next) {
+                       q->dq_dqb.dqb_bsoftlimit = protoq->dq_dqb.dqb_bsoftlimit;
+                       q->dq_dqb.dqb_bhardlimit = protoq->dq_dqb.dqb_bhardlimit;
+                       q->dq_dqb.dqb_isoftlimit = protoq->dq_dqb.dqb_isoftlimit;
+                       q->dq_dqb.dqb_ihardlimit = protoq->dq_dqb.dqb_ihardlimit;
+                       update_grace_times(q);
+               }
+               freeprivs(protoprivs);
+       }
+       else {
+               for (q = curprivs; q; q = q->dq_next) {
+                       q->dq_dqb.dqb_bsoftlimit = toset.dqb_bsoftlimit;
+                       q->dq_dqb.dqb_bhardlimit = toset.dqb_bhardlimit;
+                       q->dq_dqb.dqb_isoftlimit = toset.dqb_isoftlimit;
+                       q->dq_dqb.dqb_ihardlimit = toset.dqb_ihardlimit;
+                       update_grace_times(q);
+               }
+       }
+       if (putprivs(curprivs, COMMIT_LIMITS) == -1)
+               ret = -1;
+       freeprivs(curprivs);
+       return ret;
+}
+
+#define MAXLINELEN 65536
+
+/* Read & parse one batch entry */
+static int read_entry(qid_t *id, qsize_t *isoftlimit, qsize_t *ihardlimit, qsize_t *bsoftlimit, qsize_t *bhardlimit)
+{
+       static int line = 0;
+       char name[MAXNAMELEN+1];
+       char linebuf[MAXLINELEN], *chptr;
+       unsigned long is, ih, bs, bh;
+       int ret;
+
+       while (1) {
+               line++;
+               if (!fgets(linebuf, sizeof(linebuf), stdin))
+                       return -1;
+               if (linebuf[strlen(linebuf)-1] != '\n')
+                       die(1, _("Line %d too long.\n"), line);
+               /* Comment? */
+               if (linebuf[0] == '#')
+                       continue;
+               /* Blank line? */
+               chptr = linebuf;
+               while (isblank(*chptr))
+                       chptr++;
+               if (*chptr == '\n')
+                       continue;
+               ret = sscanf(chptr, "%s %lu %lu %lu %lu", name, &bs, &bh, &is, &ih);
+               if (ret != 5) {
+                       errstr(_("Cannot parse input line %d.\n"), line);
+                       if (!(flags & FL_CONTINUE_BATCH))
+                               die(1, _("Exitting.\n"));
+                       errstr(_("Skipping line.\n"));
+                       continue;
+               }
+               *id = name2id(name, flag2type(flags), !!(flags & FL_NUMNAMES), &ret);
+               if (ret) {
+                       errstr(_("Unable to resolve name '%s' on line %d.\n"), name, line);
+                       if (!(flags & FL_CONTINUE_BATCH))
+                               die(1, _("Exitting.\n"));
+                       errstr(_("Skipping line.\n"));
+                       continue;
+               }
+               break;
+       }
+       *isoftlimit = is;
+       *ihardlimit = ih;
+       *bsoftlimit = bs;
+       *bhardlimit = bh;
+       return 0;
+}
+
+/* Set user limits in batch mode */
+static int batch_setlimits(struct quota_handle **handles)
+{
+       struct dquot *curprivs, *q;
+       qsize_t bhardlimit, bsoftlimit, ihardlimit, isoftlimit;
+       qid_t id;
+       int ret = 0;
+
+       while (!read_entry(&id, &isoftlimit, &ihardlimit, &bsoftlimit, &bhardlimit)) {
+               curprivs = getprivs(id, handles, 0);
+               for (q = curprivs; q; q = q->dq_next) {
+                       q->dq_dqb.dqb_bsoftlimit = bsoftlimit;
+                       q->dq_dqb.dqb_bhardlimit = bhardlimit;
+                       q->dq_dqb.dqb_isoftlimit = isoftlimit;
+                       q->dq_dqb.dqb_ihardlimit = ihardlimit;
+                       update_grace_times(q);
+               }
+               if (putprivs(curprivs, COMMIT_LIMITS) == -1)
+                       ret = -1;
+               freeprivs(curprivs);
+       }
+       return ret;
+}
+
+/* Set grace times */
+static int setgraces(struct quota_handle **handles)
+{
+       int i;
+
+       for (i = 0; handles[i]; i++) {
+               handles[i]->qh_info.dqi_bgrace = toset.dqb_btime;
+               handles[i]->qh_info.dqi_igrace = toset.dqb_itime;
+               mark_quotafile_info_dirty(handles[i]);
+       }
+       return 0;
+}
+
+/* Set grace times for individual user */
+static int setindivgraces(struct quota_handle **handles)
+{
+       int ret = 0;
+       struct dquot *q, *curprivs;
+
+       curprivs = getprivs(id, handles, 0);
+       for (q = curprivs; q; q = q->dq_next) {
+               if (q->dq_dqb.dqb_bsoftlimit && toqb(q->dq_dqb.dqb_curspace) > q->dq_dqb.dqb_bsoftlimit)
+                       q->dq_dqb.dqb_btime = toset.dqb_btime;
+               else
+                       errstr(_("Not setting block grace time on %s because softlimit is not exceeded.\n"), q->dq_h->qh_quotadev);
+               if (q->dq_dqb.dqb_isoftlimit && q->dq_dqb.dqb_curinodes > q->dq_dqb.dqb_isoftlimit)
+                       q->dq_dqb.dqb_itime = toset.dqb_itime;
+               else
+                       errstr(_("Not setting inode grace time on %s because softlimit is not exceeded.\n"), q->dq_h->qh_quotadev);
+       }
+       if (putprivs(curprivs, COMMIT_TIMES) == -1) {
+               errstr(_("cannot write times for %s. Maybe kernel does not support such operation?\n"), type2name(flags & FL_USER ? USRQUOTA : GRPQUOTA));
+               ret = -1;
+       }
+       freeprivs(curprivs);
+       return ret;
+}
+
+int main(int argc, char **argv)
+{
+       struct quota_handle **handles;
+       int ret;
+
+       gettexton();
+       progname = basename(argv[0]);
+
+       parse_options(argc, argv);
+       init_kernel_interface();
+
+       if (flags & FL_ALL)
+               handles = create_handle_list(0, NULL, flag2type(flags), fmt,
+                       (flags & FL_NO_MIXED_PATHS) ? 0 : IOI_NFS_MIXED_PATHS,
+                       (flags & FL_RPC) ? 0 : MS_LOCALONLY);
+       else
+               handles = create_handle_list(mntcnt, mnt, flag2type(flags), fmt,
+                       (flags & FL_NO_MIXED_PATHS) ? 0 : IOI_NFS_MIXED_PATHS,
+                       (flags & FL_RPC) ? 0 : MS_LOCALONLY);
+
+       if (flags & FL_GRACE)
+               ret = setgraces(handles);
+       else if (flags & FL_INDIVIDUAL_GRACE)
+               ret = setindivgraces(handles);
+       else if (flags & FL_BATCH)
+               ret = batch_setlimits(handles);
+       else
+               ret = setlimits(handles);
+
+       if (dispose_handle_list(handles) == -1)
+               ret = -1;
+
+       return ret ? 1 : 0;
+}
diff --git a/setup_quota_group b/setup_quota_group
new file mode 100755 (executable)
index 0000000..7343fea
--- /dev/null
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+if [ $# -lt 2 ]; then
+   echo "Usage: $0 proto_type_user group"
+   exit 1
+fi
+
+gid=`cat /etc/group | grep "^$2" | cut -d: -f3`
+for user in `cat /etc/passwd | grep ".*:.*:$gid:" | cut -d: -f1`
+do
+   edquota -p $1 $user
+done
diff --git a/svc_socket.c b/svc_socket.c
new file mode 100644 (file)
index 0000000..927b2ea
--- /dev/null
@@ -0,0 +1,112 @@
+/* Copyright (C) 2002 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#include "config.h"
+
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+#include <netdb.h>
+#include <errno.h>
+#include <rpc/rpc.h>
+#include <sys/socket.h>
+
+#include "common.h"
+#include "pot.h"
+
+static int svc_socket (u_long number, int type, int protocol, int port, int reuse)
+{
+       struct sockaddr_in addr;
+       char rpcdata [1024], servdata [1024];
+       struct rpcent rpcbuf, *rpcp = NULL;
+       struct servent servbuf, *servp = NULL;
+       int sock, ret;
+       const char *proto = protocol == IPPROTO_TCP ? "tcp" : "udp";
+
+       if ((sock = socket (AF_INET, type, protocol)) < 0) {
+               errstr(_("Cannot create socket: %s\n"), strerror(errno));
+               return -1;
+       }
+
+       if (reuse) {
+               ret = 1;
+               if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &ret, sizeof(ret)) < 0) {
+                       errstr(_("Cannot set socket options: %s\n"), strerror(errno));
+                       return -1;
+               }
+       }
+
+       memset(&addr, 0, sizeof(addr));
+       addr.sin_family = AF_INET;
+
+       if (!port) {
+               ret = getrpcbynumber_r(number, &rpcbuf, rpcdata, sizeof(rpcdata), &rpcp);
+               if (ret == 0 && rpcp != NULL) {
+                       /* First try name */
+                       ret = getservbyname_r(rpcp->r_name, proto, &servbuf, servdata,
+                                              sizeof servdata, &servp);
+                       if ((ret != 0 || servp == NULL) && rpcp->r_aliases) {
+                               const char **a;
+
+                               /* Then we try aliases. */
+                               for (a = (const char **) rpcp->r_aliases; *a != NULL; a++) {
+                                       ret = getservbyname_r(*a, proto, &servbuf, servdata,
+                                                        sizeof servdata, &servp);
+                                       if (ret == 0 && servp != NULL)
+                                               break;
+                               }
+                       }
+                       if (ret == 0 && servp != NULL)
+                               port = servp->s_port;
+               }
+       }
+       else
+               port = htons(port);
+
+       if (port) {
+               addr.sin_port = port;
+               if (bind(sock, (struct sockaddr *) &addr, sizeof(struct sockaddr_in)) < 0) {
+                       errstr(_("Cannot bind to given address: %s\n"), strerror(errno));
+                       close (sock);
+                       return -1;
+               }
+       }
+       else {
+               /* Service not found? */
+               close(sock);
+               return -1;
+       }
+
+       return sock;
+}
+
+/*
+ * Create and bind a TCP socket based on program number
+ */
+int svctcp_socket(u_long number, int port, int reuse)
+{
+       return svc_socket(number, SOCK_STREAM, IPPROTO_TCP, port, reuse);
+}
+
+/*
+ * Create and bind a UDP socket based on program number
+ */
+int svcudp_socket(u_long number, int port, int reuse)
+{
+       return svc_socket(number, SOCK_DGRAM, IPPROTO_UDP, port, reuse);
+}
diff --git a/warnquota.8 b/warnquota.8
new file mode 100644 (file)
index 0000000..89844ec
--- /dev/null
@@ -0,0 +1,110 @@
+.TH WARNQUOTA 8
+.SH NAME
+warnquota \- send mail to users over quota
+.SH SYNOPSIS
+.B warnquota
+[
+.B \-ugsid
+] [
+.B \-F
+.I quotaformat
+] [
+.B \-q
+.I quotatab
+] [
+.B \-c
+.I configfile
+] [
+.B \-a
+.I adminsfile
+]
+.SH DESCRIPTION
+.B warnquota
+checks the disk quota for each local filesystem and mails a warning
+message to those users who have reached their softlimit.
+It is typically run via
+.BR cron (8).
+.TP
+.B -F, --format=\f2quotaformat\f1
+Perform setting for specified format (ie. don't perform format autodetection).
+Possible format names are:
+.B vfsold
+Original quota format with 16-bit UIDs / GIDs,
+.B vfsv0
+Quota format with 32-bit UIDs / GIDs, 64-bit space usage, 32-bit inode usage and limits,
+.B vfsv1
+Quota format with 64-bit quota limits and usage,
+.B rpc
+(quota over NFS),
+.B xfs
+(quota on XFS filesystem)
+.TP
+.B -q, --quota-tab=\f2quotatab\f1
+Use
+.I quotatab
+instead of
+.I /etc/quotatab
+as file with device description strings (see example file for syntax).
+.TP
+.B -c, --config=\f2configfile\f1
+Use
+.I configfile
+instead of
+.I /etc/warnquota.conf
+as configuration file (see example file for syntax).
+.TP
+.B -a, --admins-file=\f2adminsfile\f1
+Use
+.I adminsfile
+instead of
+.I /etc/quotagrpadmins
+as a file with administrators of the groups.
+.TP
+.B -u, --user
+check whether users are not exceeding quotas (default).
+.TP
+.B -g, --group
+check whether groups are not exceeding quotas. If group is exceeding quota
+a mail is sent to the user specified in /etc/quotagrpadmins.
+.TP
+.B -s, --human-readable
+Try to report used space, number of used inodes and limits in more appropriate units
+than the default ones.
+.TP
+.B -i, --no-autofs
+ignore mountpoints mounted by automounter.
+.TP
+.B -d, --no-details
+do not attach quota report in email.
+.SH FILES
+.PD 0
+.TP 20
+.B aquota.user
+quota file at the filesystem root (version 2 quota, non-XFS filesystems)
+.TP
+.B quota.user
+quota file at the filesystem root (version 1 quota, non-XFS filesystems)
+.TP
+.B /etc/warnquota.conf
+configuration file
+.TP
+.B /etc/quotatab
+device description
+.TP
+.B /etc/quotagrpadmins
+administrators of the groups
+.TP
+.B /etc/mtab
+default filesystems
+.TP
+.B /etc/passwd
+default set of users
+.PD
+.SH "SEE ALSO"
+.BR quota (1),
+.BR cron (8),
+.BR edquota (8).
+.SH AUTHORS
+.BR warnquota (8)
+was written by Marco van Wieringen <mvw@planets.elm.net>, modifications by Jan Kara <jack@suse.cz>.
+This reference page written by Heiko Schlittermann <heiko@lotte.sax.de>, modifications by Jan Kara
diff --git a/warnquota.c b/warnquota.c
new file mode 100644 (file)
index 0000000..e46b601
--- /dev/null
@@ -0,0 +1,1082 @@
+/*
+ * QUOTA    An implementation of the diskquota system for the LINUX operating
+ *          system. QUOTA is implemented using the BSD systemcall interface
+ *          as the means of communication with the user level. Should work for
+ *          all filesystems because of integration into the VFS layer of the
+ *          operating system. This is based on the Melbourne quota system wich
+ *          uses both user and group quota files.
+ * 
+ *          Program to mail to users that they are over there quota.
+ * 
+ * Author:  Marco van Wieringen <mvw@planets.elm.net>
+ *
+ * Version: $Id: warnquota.c,v 1.33 2010/01/05 16:04:57 jkar8572 Exp $
+ *
+ *          This program is free software; you can redistribute it and/or
+ *          modify it under the terms of the GNU General Public License as
+ *          published by the Free Software Foundation; either version 2 of
+ *          the License, or (at your option) any later version.
+ */
+
+#include "config.h"
+
+#include <stdio.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <ctype.h>
+#include <signal.h>
+#include <grp.h>
+#include <time.h>
+#include <getopt.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <sys/utsname.h>
+#ifdef USE_LDAP_MAIL_LOOKUP
+#include <ldap.h>
+#endif
+
+#include "mntopt.h"
+#include "pot.h"
+#include "bylabel.h"
+#include "common.h"
+#include "quotasys.h"
+#include "quotaio.h"
+
+/* these are just defaults, overridden in the WARNQUOTA_CONF file */
+#define MAIL_CMD "/usr/lib/sendmail -t"
+#define FROM     "support@localhost"
+#define SUBJECT  "Disk Quota usage on system"
+#define CC_TO    "root"
+#define SUPPORT  "support@localhost"
+#define PHONE    "(xxx) xxx-xxxx or (yyy) yyy-yyyy"
+
+#define DEF_USER_MESSAGE       _("Hi,\n\nWe noticed that you are in violation with the quotasystem\n" \
+                          "used on this system. We have found the following violations:\n\n")
+#define DEF_USER_SIGNATURE     _("\nWe hope that you will cleanup before your grace period expires.\n" \
+                         "\nBasically, this means that the system thinks you are using more disk space\n" \
+                         "on the above partition(s) than you are allowed.  If you do not delete files\n" \
+                         "and get below your quota before the grace period expires, the system will\n" \
+                         "prevent you from creating new files.\n\n" \
+                          "For additional assistance, please contact us at %s\nor via " \
+                          "phone at %s.\n")
+#define DEF_GROUP_MESSAGE      _("Hi,\n\nWe noticed that the group %s you are member of violates the quotasystem\n" \
+                          "used on this system. We have found the following violations:\n\n")
+#define DEF_GROUP_SIGNATURE    _("\nPlease cleanup the group data before the grace period expires.\n" \
+                         "\nBasically, this means that the system thinks group is using more disk space\n" \
+                         "on the above partition(s) than it is allowed.  If you do not delete files\n" \
+                         "and get below group quota before the grace period expires, the system will\n" \
+                         "prevent you and other members of the group from creating new files owned by\n" \
+                         "the group.\n\n" \
+                          "For additional assistance, please contact us at %s\nor via " \
+                          "phone at %s.\n")
+
+#define SHELL "/bin/sh"
+#define QUOTATAB "/etc/quotatab"
+#define CNF_BUFFER 2048
+#define IOBUF_SIZE 16384               /* Size of buffer for line in config files */
+#define ADMIN_TAB_ALLOC 256            /* How many entries to admins table should we allocate at once? */
+#define WARNQUOTA_CONF "/etc/warnquota.conf"
+#define ADMINSFILE "/etc/quotagrpadmins"
+
+#define FL_USER 1
+#define FL_GROUP 2
+#define FL_NOAUTOFS 4
+#define FL_SHORTNUMS 8
+#define FL_NODETAILS 16
+
+struct usage {
+       char *devicename;
+       struct util_dqblk dq_dqb;
+       struct usage *next;
+};
+
+#ifdef USE_LDAP_MAIL_LOOKUP
+static LDAP *ldapconn = NULL;
+#endif
+
+struct configparams {
+       char mail_cmd[CNF_BUFFER];
+       char from[CNF_BUFFER];
+       char subject[CNF_BUFFER];
+       char cc_to[CNF_BUFFER];
+       char support[CNF_BUFFER];
+       char phone[CNF_BUFFER];
+       char charset[CNF_BUFFER];
+       char *user_message;
+       char *user_signature;
+       char *group_message;
+       char *group_signature;
+       int use_ldap_mail; /* 0 */
+       time_t cc_before;
+#ifdef USE_LDAP_MAIL_LOOKUP
+       int ldap_is_setup; /* 0 */
+       char ldap_host[CNF_BUFFER];
+       int ldap_port;
+       char ldap_uri[CNF_BUFFER];
+       char ldap_binddn[CNF_BUFFER];
+       char ldap_bindpw[CNF_BUFFER];
+       char ldap_basedn[CNF_BUFFER];
+       char ldap_search_attr[CNF_BUFFER];
+       char ldap_mail_attr[CNF_BUFFER];
+       char default_domain[CNF_BUFFER];
+#endif /* USE_LDAP_MAIL_LOOKUP */
+};
+
+struct offenderlist {
+       int offender_type;
+       int offender_id;
+       char *offender_name;
+       struct usage *usage;
+       struct offenderlist *next;
+};
+
+typedef struct quotatable {
+       char *devname;
+       char *devdesc;
+} quotatable_t;
+
+struct adminstable {
+       char *grpname;
+       char *adminname;
+};
+
+static int qtab_i = 0, fmt = -1, flags;
+static char maildev[CNF_BUFFER];
+static struct quota_handle *maildev_handle;
+static char *configfile = WARNQUOTA_CONF, *quotatabfile = QUOTATAB, *adminsfile = ADMINSFILE;
+char *progname;
+static char *hostname, *domainname;
+static quotatable_t *quotatable;
+static int adminscnt, adminsalloc;
+static struct adminstable *adminstable;
+
+/*
+ * Global pointers to list.
+ */
+static struct offenderlist *offenders = (struct offenderlist *)0;
+
+/*
+ * add any cleanup functions here
+ */
+static void wc_exit(int ex_stat)
+{
+#ifdef USE_LDAP_MAIL_LOOKUP
+       if(ldapconn != NULL)
+#ifdef USE_LDAP_23
+               ldap_unbind_ext(ldapconn, NULL, NULL);
+#else
+               ldap_unbind(ldapconn);
+#endif
+#endif
+       exit(ex_stat);
+}
+
+#ifdef USE_LDAP_MAIL_LOOKUP
+#ifdef NEED_LDAP_PERROR
+static void ldap_perror(LDAP *ld, LDAP_CONST char *s)
+{
+       int err;
+
+       ldap_get_option(ld, LDAP_OPT_RESULT_CODE, &err);
+       errstr(_("%s: %s\n"), s, ldap_err2string(err));
+}
+#endif
+
+static int setup_ldap(struct configparams *config)
+{
+       int ret;
+#ifdef USE_LDAP_23
+       struct berval cred = { .bv_val = config->ldap_bindpw,
+                              .bv_len = strlen(config->ldap_bindpw) };
+#endif
+
+#ifdef USE_LDAP_23
+       ldap_initialize(&ldapconn, config->ldap_uri);
+#else
+       ldapconn = ldap_init(config->ldap_host, config->ldap_port);
+#endif
+
+       if(ldapconn == NULL) {
+               ldap_perror(ldapconn, "ldap_init");
+               return -1;
+       }
+
+#ifdef USE_LDAP_23
+       ret = ldap_sasl_bind_s(ldapconn, config->ldap_binddn, LDAP_SASL_SIMPLE, &cred, NULL, NULL, NULL);
+#else
+       ret = ldap_bind_s(ldapconn, config->ldap_binddn, config->ldap_bindpw, LDAP_AUTH_SIMPLE);
+#endif
+       if(ret < 0) {
+               ldap_perror(ldapconn, "ldap_bind");
+               return -1;
+       }
+       return 0;
+}
+               
+#endif
+
+static struct offenderlist *add_offender(int type, int id, char *name)
+{
+       struct offenderlist *offender;
+       char namebuf[MAXNAMELEN];
+       
+       if (!name) {
+               if (id2name(id, type, namebuf)) {
+                       errstr(_("Cannot get name for uid/gid %u.\n"), id);
+                       return NULL;
+               }
+               name = namebuf;
+       }
+       offender = (struct offenderlist *)smalloc(sizeof(struct offenderlist));
+       offender->offender_type = type;
+       offender->offender_id = id;
+       offender->offender_name = sstrdup(name);
+       offender->usage = (struct usage *)NULL;
+       offender->next = offenders;
+       offenders = offender;
+       return offender;
+}
+
+static void add_offence(struct dquot *dquot, char *name)
+{
+       struct offenderlist *lptr;
+       struct usage *usage;
+
+       for (lptr = offenders; lptr; lptr = lptr->next)
+               if (dquot->dq_h->qh_type == lptr->offender_type && lptr->offender_id == dquot->dq_id)
+                       break;
+
+       if (!lptr)
+               if (!(lptr = add_offender(dquot->dq_h->qh_type, dquot->dq_id, name)))
+                       return;
+
+       usage = (struct usage *)smalloc(sizeof(struct usage));
+       memcpy(&usage->dq_dqb, &dquot->dq_dqb, sizeof(struct util_dqblk));
+
+       usage->devicename = sstrdup(dquot->dq_h->qh_quotadev);
+       /*
+        * Stuff it in front
+        */
+       usage->next = lptr->usage;
+       lptr->usage = usage;
+}
+
+static int deliverable(struct dquot *dquot)
+{
+       time_t now;
+       struct dquot *mdquot;
+       
+       if (!maildev[0])
+               return 1;
+
+       time(&now);
+       
+       if (!strcasecmp(maildev, "any") && 
+          ((dquot->dq_dqb.dqb_bhardlimit && toqb(dquot->dq_dqb.dqb_curspace) >= dquot->dq_dqb.dqb_bhardlimit)
+          || ((dquot->dq_dqb.dqb_bsoftlimit && toqb(dquot->dq_dqb.dqb_curspace) >= dquot->dq_dqb.dqb_bsoftlimit)
+          && (dquot->dq_dqb.dqb_btime && dquot->dq_dqb.dqb_btime <= now))))
+               return 0;
+       if (!maildev_handle)
+               return 1;
+       mdquot = maildev_handle->qh_ops->read_dquot(maildev_handle, dquot->dq_id);
+       if (mdquot &&
+          ((mdquot->dq_dqb.dqb_bhardlimit && toqb(mdquot->dq_dqb.dqb_curspace) >= mdquot->dq_dqb.dqb_bhardlimit)
+          || ((mdquot->dq_dqb.dqb_bsoftlimit && toqb(mdquot->dq_dqb.dqb_curspace) >= mdquot->dq_dqb.dqb_bsoftlimit)
+          && (mdquot->dq_dqb.dqb_btime && mdquot->dq_dqb.dqb_btime <= now)))) {
+               free(mdquot);
+               return 0;
+       }
+       free(mdquot);
+       return 1;
+}
+
+static int check_offence(struct dquot *dquot, char *name)
+{
+       if ((dquot->dq_dqb.dqb_bsoftlimit && toqb(dquot->dq_dqb.dqb_curspace) >= dquot->dq_dqb.dqb_bsoftlimit)
+           || (dquot->dq_dqb.dqb_isoftlimit && dquot->dq_dqb.dqb_curinodes >= dquot->dq_dqb.dqb_isoftlimit)) {
+               if(deliverable(dquot))
+                       add_offence(dquot, name);
+       }
+       return 0;
+}
+
+static FILE *run_mailer(char *command)
+{
+       int pipefd[2];
+       FILE *f;
+
+       if (pipe(pipefd) < 0) {
+               errstr(_("Cannot create pipe: %s\n"), strerror(errno));
+               return NULL;
+       }
+       signal(SIGPIPE, SIG_IGN);
+       switch(fork()) {
+               case -1:
+                       errstr(_("Cannot fork: %s\n"), strerror(errno));
+                       return NULL;
+               case 0:
+                       close(pipefd[1]);
+                       if (dup2(pipefd[0], 0) < 0) {
+                               errstr(_("Cannot duplicate descriptor: %s\n"), strerror(errno));
+                               wc_exit(1);
+                       }                       
+                       execl(SHELL, SHELL, "-c", command, NULL);
+                       errstr(_("Cannot execute '%s': %s\n"), command, strerror(errno));
+                       wc_exit(1);
+               default:
+                       close(pipefd[0]);
+                       if (!(f = fdopen(pipefd[1], "w")))
+                               errstr(_("Cannot open pine: %s\n"), strerror(errno));
+                       return f;
+       }
+}
+
+static int admin_name_cmp(const void *key, const void *mem)
+{
+       return strcmp(key, ((struct adminstable *)mem)->grpname);
+}
+
+static int should_cc(struct offenderlist *offender, struct configparams *config)
+{
+       struct usage *lptr;
+       struct util_dqblk *dqb;
+       time_t atime;
+
+       if (config->cc_before == -1)
+               return 1;
+       time(&atime);
+       for (lptr = offender->usage; lptr; lptr = lptr->next) {
+               dqb = &lptr->dq_dqb;
+               if (dqb->dqb_bsoftlimit && dqb->dqb_bsoftlimit <= toqb(dqb->dqb_curspace) && dqb->dqb_btime-config->cc_before <= atime)
+                       return 1;
+               if (dqb->dqb_isoftlimit && dqb->dqb_isoftlimit <= dqb->dqb_curinodes && dqb->dqb_itime-config->cc_before <= atime)
+                       return 1;
+       }
+       return 0;
+}
+
+/* Substitute %s and %i for 'name' and %h for hostname */
+static void format_print(FILE *fp, char *fmt, char *name)
+{
+       char *ch, *lastch = fmt;
+
+       for (ch = strchr(fmt, '%'); ch; lastch = ch+2, ch = strchr(ch+2, '%')) {
+               *ch = 0;
+               fputs(lastch, fp);
+               *ch = '%';
+               switch (*(ch+1)) {
+                       case 's':
+                       case 'i':
+                               fputs(name, fp);
+                               break;
+                       case 'h':
+                               fputs(hostname, fp);
+                               break;
+                       case 'd':
+                               fputs(domainname, fp);
+                               break;
+                       case '%':
+                               fputc('%', fp);
+                               break;
+               }
+       }
+       fputs(lastch, fp);
+}
+
+static int mail_user(struct offenderlist *offender, struct configparams *config)
+{
+       struct usage *lptr;
+       FILE *fp;
+       int cnt, status;
+       char timebuf[MAXTIMELEN];
+       char numbuf[3][MAXNUMLEN];
+       struct util_dqblk *dqb;
+       char *to = NULL;
+#ifdef USE_LDAP_MAIL_LOOKUP
+               char searchbuf[256];
+       LDAPMessage *result, *entry;
+       BerElement     *ber = NULL;
+       struct berval  **bvals = NULL;
+       int ret;
+       char *a;
+#endif
+
+       if (offender->offender_type == USRQUOTA) {
+#ifdef USE_LDAP_MAIL_LOOKUP
+               if(config->use_ldap_mail != 0) {
+                       if((ldapconn == NULL) && (config->ldap_is_setup == 0)) {
+                               /* need init */
+                               if(setup_ldap(config)) {
+                                       errstr(_("Could not setup ldap connection, returning.\n"));
+                                       return -1;
+                               }
+                               config->ldap_is_setup = 1;
+                       }
+
+                       if(ldapconn == NULL) {
+                               /* ldap was never setup correctly so just use the offender_name */
+                               to = sstrdup(offender->offender_name);
+                       } else {
+                               /* search for the offender_name in ldap */
+                               snprintf(searchbuf, 256, "(%s=%s)", config->ldap_search_attr, 
+                                       offender->offender_name);
+#ifdef USE_LDAP_23
+                               ret = ldap_search_ext_s(ldapconn, config->ldap_basedn, 
+                                       LDAP_SCOPE_SUBTREE, searchbuf,
+                                       NULL, 0, NULL, NULL, NULL, 0, &result);
+#else
+                               ret = ldap_search_s(ldapconn, config->ldap_basedn, 
+                                       LDAP_SCOPE_SUBTREE, searchbuf,
+                                       NULL, 0, &result);
+#endif
+                               if(ret < 0) {
+                                       errstr(_("Error with %s.\n"), offender->offender_name);
+                                       ldap_perror(ldapconn, "ldap_search");
+                                       return 0;
+                               }
+                                       
+                               cnt = ldap_count_entries(ldapconn, result);
+
+                               if(cnt > 1) {
+                                       errstr(_("Multiple entries found for client %s, %d not sending mail.\n"), 
+                                               offender->offender_name, cnt);
+                                       return 0;
+                               } else if(cnt == 0) {
+                                       errstr(_("Entry not found for client %s, %d not sending mail.\n"), 
+                                               offender->offender_name, cnt);
+                                       return 0;
+                               } else {
+                                       /* get the attr */
+                                       entry = ldap_first_entry(ldapconn, result);
+                                       for(a = ldap_first_attribute(ldapconn, entry, &ber); a != NULL;
+                                               a = ldap_next_attribute( ldapconn, entry, ber)) {
+                                               if(strcasecmp(a, config->ldap_mail_attr) == 0) {
+                                                       bvals = ldap_get_values_len(ldapconn, entry, a);
+                                                       if(bvals == NULL) {
+                                                               errstr(_("Could not get values for %s.\n"), 
+                                                                       offender->offender_name);
+                                                               return 0;
+                                                       }
+                                                       to = sstrdup(bvals[0]->bv_val);
+                                                       break;
+                                               } 
+                                       } 
+
+                                       ber_bvecfree(bvals);
+                                       if(to == NULL) {
+                                               /* 
+                                                * use just the name and default domain as we didn't find the
+                                                * attribute we wanted in this entry
+                                                */
+                                               to = malloc(strlen(offender->offender_name)+
+                                                       strlen(config->default_domain)+1);
+                                               sprintf(to, "%s@%s", offender->offender_name,
+                                                       config->default_domain);
+                                       }
+                               }
+                       }
+               } else {
+                       to = sstrdup(offender->offender_name);
+               }
+#else
+               to = sstrdup(offender->offender_name);
+#endif
+       } else {
+               struct adminstable *admin;
+
+               if (!(admin = bsearch(offender->offender_name, adminstable, adminscnt, sizeof(struct adminstable), admin_name_cmp))) {
+                       errstr(_("Administrator for a group %s not found. Cancelling mail.\n"), offender->offender_name);
+                       return -1;
+               }
+               to = sstrdup(admin->adminname);
+       }
+       if (!(fp = run_mailer(config->mail_cmd))) {
+               if(to)
+                       free(to);
+               return -1;
+       }
+       fprintf(fp, "From: %s\n", config->from);
+       fprintf(fp, "Reply-To: %s\n", config->support);
+       fprintf(fp, "Subject: %s\n", config->subject);
+       fprintf(fp, "To: %s\n", to);
+       if (should_cc(offender, config))
+               fprintf(fp, "Cc: %s\n", config->cc_to);
+       if ((config->charset)[0] != '\0') { /* are we supposed to set the encoding */
+               fprintf(fp, "Content-Type: text/plain; charset=%s\n", config->charset);
+               fprintf(fp, "Content-Disposition: inline\n");
+               fprintf(fp, "Content-Transfer-Encoding: 8bit\n");
+       }
+       fprintf(fp, "\n");
+       free(to);
+
+       if (offender->offender_type == USRQUOTA)
+               if (config->user_message)
+                       format_print(fp, config->user_message, offender->offender_name);
+               else
+                       fputs(DEF_USER_MESSAGE, fp);
+       else
+               if (config->group_message)
+                       format_print(fp, config->group_message, offender->offender_name);
+               else
+                       fprintf(fp, DEF_GROUP_MESSAGE, offender->offender_name);
+
+       if (!(flags & FL_NODETAILS)) {
+               for (lptr = offender->usage; lptr; lptr = lptr->next) {
+                       dqb = &lptr->dq_dqb;
+                       for (cnt = 0; cnt < qtab_i; cnt++)
+                               if (!strcmp(quotatable[cnt].devname, lptr->devicename)) {
+                                       fprintf(fp, "\n%s (%s)\n", quotatable[cnt].devdesc, quotatable[cnt].devname);
+                                       break;
+                               }
+                       if (cnt == qtab_i)      /* Description not found? */
+                               fprintf(fp, "\n%s\n", lptr->devicename);
+                       fprintf(fp, _("\n                        Block limits               File limits\n"));
+                       fprintf(fp, _("Filesystem           used    soft    hard  grace    used  soft  hard  grace\n"));
+                       if (strlen(lptr->devicename) > 15)
+                               fprintf(fp, "%s\n%15s", lptr->devicename, "");
+                       else
+                               fprintf(fp, "%-15s", lptr->devicename);
+                       if (dqb->dqb_bsoftlimit && dqb->dqb_bsoftlimit <= toqb(dqb->dqb_curspace))
+                               difftime2str(dqb->dqb_btime, timebuf);
+                       else
+                               timebuf[0] = '\0';
+                       space2str(toqb(dqb->dqb_curspace), numbuf[0], flags & FL_SHORTNUMS);
+                       space2str(dqb->dqb_bsoftlimit, numbuf[1], flags & FL_SHORTNUMS);
+                       space2str(dqb->dqb_bhardlimit, numbuf[2], flags & FL_SHORTNUMS);
+                       fprintf(fp, "%c%c %7s %7s %7s %6s",
+                               dqb->dqb_bsoftlimit && toqb(dqb->dqb_curspace) >= dqb->dqb_bsoftlimit ? '+' : '-',
+                               dqb->dqb_isoftlimit && dqb->dqb_curinodes >= dqb->dqb_isoftlimit ? '+' : '-',
+                               numbuf[0], numbuf[1], numbuf[2], timebuf);
+                       if (dqb->dqb_isoftlimit && dqb->dqb_isoftlimit <= dqb->dqb_curinodes)
+                               difftime2str(dqb->dqb_itime, timebuf);
+                       else
+                               timebuf[0] = '\0';
+                       number2str(dqb->dqb_curinodes, numbuf[0], flags & FL_SHORTNUMS);
+                       number2str(dqb->dqb_isoftlimit, numbuf[1], flags & FL_SHORTNUMS);
+                       number2str(dqb->dqb_ihardlimit, numbuf[2], flags & FL_SHORTNUMS);
+                       fprintf(fp, " %7s %5s %5s %6s\n\n", numbuf[0], numbuf[1], numbuf[2], timebuf);
+               }
+       }
+
+
+       if (offender->offender_type == USRQUOTA)
+               if (config->user_signature)
+                       format_print(fp, config->user_signature, offender->offender_name);
+               else
+                       fprintf(fp, DEF_USER_SIGNATURE, config->support, config->phone);
+       else
+               if (config->group_signature)
+                       format_print(fp, config->group_signature, offender->offender_name);
+               else
+                       fprintf(fp, DEF_GROUP_SIGNATURE, config->support, config->phone);
+       fclose(fp);
+       if (wait(&status) < 0)  /* Wait for mailer */
+               errstr(_("Cannot wait for mailer: %s\n"), strerror(errno));
+       else if (!WIFEXITED(status) || WEXITSTATUS(status) != 0)
+               errstr(_("Warning: Mailer exitted abnormally.\n"));
+
+       return 0;
+}
+
+static int mail_to_offenders(struct configparams *config)
+{
+       struct offenderlist *lptr;
+       int ret = 0;
+
+       /*
+        * Dump offenderlist.
+        */
+       for (lptr = offenders; lptr; lptr = lptr->next)
+               ret |= mail_user(lptr, config);
+       return ret;
+}
+
+/*
+ * Wipe spaces, tabs, quotes and newlines from beginning and end of string
+ */
+static void stripstring(char **buff)
+{
+       int i;
+
+       /* first put a \0 at the tight place to end the string */
+       for (i = strlen(*buff) - 1; i >= 0 && (isspace((*buff)[i]) || (*buff)[i] == '"'
+            || (*buff)[i] == '\''); i--);
+       (*buff)[i+1] = 0;
+
+       /* then determine the position to start */
+       for (i = 0; (*buff)[i] && (isspace((*buff)[i]) || (*buff)[i] == '"' || (*buff)[i] == '\''); i++);
+       *buff += i;
+}
+
+/*
+ * Substitute '|' with end of lines
+ */
+static void create_eoln(char *buf)
+{
+       char *colpos = buf;
+
+       while ((colpos = strchr(colpos, '|')))
+               *colpos = '\n';
+}
+
+/*
+ * Read /etc/quotatab (description of devices for users)
+ */
+static int get_quotatable(void)
+{
+       FILE *fp;
+       char buffer[IOBUF_SIZE], *colpos, *devname, *devdesc;
+       int line;
+       struct stat st;
+
+       if (!(fp = fopen(quotatabfile, "r"))) {
+               errstr(_("Cannot open %s: %s\nWill use device names.\n"), quotatabfile, strerror(errno));
+               qtab_i = 0;
+               return 0;
+       }
+
+       line = 0;
+       for (qtab_i = 0; quotatable = srealloc(quotatable, sizeof(quotatable_t) * (qtab_i + 1)),
+            fgets(buffer, sizeof(buffer), fp); qtab_i++) {
+               line++;
+               quotatable[qtab_i].devname = NULL;
+               quotatable[qtab_i].devdesc = NULL;
+               if (buffer[0] == '#' || buffer[0] == ';') {     /* Comment? */
+                       qtab_i--;
+                       continue;
+               }
+               /* Empty line? */
+               for (colpos = buffer; isspace(*colpos); colpos++);
+               if (!*colpos) {
+                       qtab_i--;
+                       continue;
+               }
+               /* Parse line */
+               if (!(colpos = strchr(buffer, ':'))) {
+                       errstr(_("Cannot parse line %d in quotatab (missing ':')\n"), line);
+                       qtab_i--;
+                       continue;
+               }
+               *colpos = 0;
+               devname = buffer;
+               devdesc = colpos+1;
+               stripstring(&devname);
+               stripstring(&devdesc);
+               quotatable[qtab_i].devname = sstrdup(devname);
+               quotatable[qtab_i].devdesc = sstrdup(devdesc);
+               create_eoln(quotatable[qtab_i].devdesc);
+
+               if (stat(quotatable[qtab_i].devname, &st) < 0)
+                       errstr(_("Cannot stat device %s (maybe typo in quotatab)\n"), quotatable[qtab_i].devname);
+       }
+       fclose(fp);
+       return 0;
+}
+
+/* Check correctness of the given format */
+static void verify_format(char *fmt, char *varname)
+{
+       char *ch;
+
+       for (ch = strchr(fmt, '%'); ch; ch = strchr(ch+2, '%')) {
+               switch (*(ch+1)) {
+                       case 's':
+                       case 'i':
+                       case 'h':
+                       case 'd':
+                       case '%':
+                               continue;
+                       default:
+                               die(1, _("Incorrect format string for variable %s.\n\
+Unrecognized expression %%%c.\n"), varname, *(ch+1));
+               }
+       }
+}
+
+/*
+ * Reads config parameters from configfile
+ * uses default values if errstr occurs
+ */
+static int readconfigfile(const char *filename, struct configparams *config)
+{
+       FILE *fp;
+       char buff[IOBUF_SIZE];
+       char *var;
+       char *value;
+       char *pos;
+       int line, len, bufpos;
+
+       /* set default values */
+       sstrncpy(config->mail_cmd, MAIL_CMD, CNF_BUFFER);
+       sstrncpy(config->from, FROM, CNF_BUFFER);
+       sstrncpy(config->subject, SUBJECT, CNF_BUFFER);
+       sstrncpy(config->cc_to, CC_TO, CNF_BUFFER);
+       sstrncpy(config->support, SUPPORT, CNF_BUFFER);
+       sstrncpy(config->phone, PHONE, CNF_BUFFER);
+       (config->charset)[0] = '\0';
+       maildev[0] = 0;
+       config->user_signature = config->user_message = config->group_signature = config->group_message = NULL;
+       config->use_ldap_mail = 0;
+       config->cc_before = -1;
+
+#ifdef USE_LDAP_MAIL_LOOKUP
+       config->ldap_port = config->ldap_is_setup = 0;
+       config->ldap_host[0] = 0;
+       config->ldap_uri[0] = 0;
+#endif
+
+       if (!(fp = fopen(filename, "r"))) {
+               errstr(_("Cannot open %s: %s\n"), filename, strerror(errno));
+               return -1;
+       }
+
+       line = 0;
+       bufpos = 0;
+       while (fgets(buff + bufpos, sizeof(buff) - bufpos, fp)) {       /* start reading lines */
+               line++;
+
+               if (!bufpos) {
+                       /* check for comments or empty lines */
+                       if (buff[0] == '#' || buff[0] == ';')
+                               continue;
+                       /* Is line empty? */
+                       for (pos = buff; isspace(*pos); pos++);
+                       if (!*pos)                      /* Nothing else was on the line */
+                               continue;
+               }
+               len = bufpos + strlen(buff+bufpos);
+               if (buff[len-1] != '\n')
+                       errstr(_("Line %d too long. Truncating.\n"), line);
+               else {
+                       len--;
+                       if (buff[len-1] == '\\') {      /* Should join with next line? */
+                               bufpos = len-1;
+                               continue;
+                       }
+               }
+               buff[len] = 0;
+               bufpos = 0;
+               
+               /* check for a '=' char */
+               if ((pos = strchr(buff, '='))) {
+                       *pos = 0;       /* split buff in two parts: var and value */
+                       var = buff;
+                       value = pos + 1;
+
+                       stripstring(&var);
+                       stripstring(&value);
+
+                       /* check if var matches anything */
+                       if (!strcmp(var, "MAIL_CMD"))
+                               sstrncpy(config->mail_cmd, value, CNF_BUFFER);
+                       else if (!strcmp(var, "FROM"))
+                               sstrncpy(config->from, value, CNF_BUFFER);
+                       else if (!strcmp(var, "SUBJECT"))
+                               sstrncpy(config->subject, value, CNF_BUFFER);
+                       else if (!strcmp(var, "CC_TO"))
+                               sstrncpy(config->cc_to, value, CNF_BUFFER);
+                       else if (!strcmp(var, "SUPPORT"))
+                               sstrncpy(config->support, value, CNF_BUFFER);
+                       else if (!strcmp(var, "PHONE"))
+                               sstrncpy(config->phone, value, CNF_BUFFER);
+                       else if (!strcmp(var, "CHARSET"))
+                               sstrncpy(config->charset, value, CNF_BUFFER);
+                       else if (!strcmp(var, "MAILDEV"))
+                               /* set the global */
+                               sstrncpy(maildev, value, CNF_BUFFER);
+                       else if (!strcmp(var, "MESSAGE")) {
+                               config->user_message = sstrdup(value);
+                               create_eoln(config->user_message);
+                               verify_format(config->user_message, "MESSAGE");
+                       }
+                       else if (!strcmp(var, "SIGNATURE")) {
+                               config->user_signature = sstrdup(value);
+                               create_eoln(config->user_signature);
+                               verify_format(config->user_signature, "SIGNATURE");
+                       }
+                       else if (!strcmp(var, "GROUP_MESSAGE")) {
+                               config->group_message = sstrdup(value);
+                               create_eoln(config->group_message);
+                               verify_format(config->group_message, "GROUP_MESSAGE");
+                       }
+                       else if (!strcmp(var, "GROUP_SIGNATURE")) {
+                               config->group_signature = sstrdup(value);
+                               create_eoln(config->group_signature);
+                               verify_format(config->group_signature, "GROUP_SIGNATURE");
+                       }
+                       else if (!strcmp(var, "LDAP_MAIL")) {
+                               if(strcasecmp(value, "true") == 0) 
+                                       config->use_ldap_mail = 1;
+                               else
+                                       config->use_ldap_mail = 0;
+                       }
+                       else if (!strcmp(var, "CC_BEFORE")) {
+                               int num;
+                               char unit[10];
+
+                               if (sscanf(value, "%d%s", &num, unit) != 2)
+                                       goto cc_parse_err;
+                               if (str2timeunits(num, unit, &config->cc_before) < 0) {
+cc_parse_err:
+                                       die(1, _("Cannot parse time at CC_BEFORE variable (line %d).\n"), line);
+                               }
+                       }
+#ifdef USE_LDAP_MAIL_LOOKUP
+                       else if (!strcmp(var, "LDAP_HOST"))
+                               sstrncpy(config->ldap_host, value, CNF_BUFFER);
+                       else if (!strcmp(var, "LDAP_PORT"))
+                               config->ldap_port = (int)strtol(value, NULL, 10);
+                       else if (!strcmp(var, "LDAP_URI"))
+                               sstrncpy(config->ldap_uri, value, CNF_BUFFER);
+                       else if(!strcmp(var, "LDAP_BINDDN"))
+                               sstrncpy(config->ldap_binddn, value, CNF_BUFFER);
+                       else if(!strcmp(var, "LDAP_BINDPW"))
+                               sstrncpy(config->ldap_bindpw, value, CNF_BUFFER);
+                       else if(!strcmp(var, "LDAP_BASEDN"))
+                               sstrncpy(config->ldap_basedn, value, CNF_BUFFER);
+                       else if(!strcmp(var, "LDAP_SEARCH_ATTRIBUTE"))
+                               sstrncpy(config->ldap_search_attr, value, CNF_BUFFER);
+                       else if(!strcmp(var, "LDAP_MAIL_ATTRIBUTE"))
+                               sstrncpy(config->ldap_mail_attr, value, CNF_BUFFER);
+                       else if(!strcmp(var, "LDAP_DEFAULT_MAIL_DOMAIN"))
+                               sstrncpy(config->default_domain, value, CNF_BUFFER);
+#endif
+                       else    /* not matched at all */
+                               errstr(_("Error in config file (line %d), ignoring\n"), line);
+               }
+               else            /* no '=' char in this line */
+                       errstr(_("Possible error in config file (line %d), ignoring\n"), line);
+       }
+       if (bufpos)
+               errstr(_("Unterminated last line, ignoring\n"));
+#ifdef USE_LDAP_MAIL_LOOKUP
+       if (config->use_ldap_mail)
+       {
+#ifdef USE_LDAP_23
+               if (!config->ldap_uri[0]) {
+                       snprintf(config->ldap_uri, CNF_BUFFER, "ldap://%s:%d", config->ldap_host, config->ldap_port);
+                       errstr(_("LDAP library version >= 2.3 detected. Please use LDAP_URI instead of hostname and port.\nGenerated URI %s\n"), config->ldap_uri);
+               }
+#else
+               if (config->ldap_uri[0])
+                       die(1, _("LDAP library does not support ldap_initialize() but URI is specified."));
+#endif
+       }
+#endif
+       fclose(fp);
+
+       return 0;
+}
+
+static int admin_cmp(const void *a1, const void *a2)
+{
+       return strcmp(((struct adminstable *)a1)->grpname, ((struct adminstable *)a2)->grpname);
+}
+
+/* Get administrators of the groups */
+static int get_groupadmins(void)
+{
+       FILE *f;
+       int line = 0;
+       char buffer[IOBUF_SIZE], *colpos, *grouppos, *endname, *adminpos;
+
+       if (!(f = fopen(adminsfile, "r"))) {
+               errstr(_("Cannot open file with group administrators: %s\n"), strerror(errno));
+               return -1;
+       }
+       
+       while (fgets(buffer, IOBUF_SIZE, f)) {
+               line++;
+               if (buffer[0] == ';' || buffer[0] == '#')
+                       continue;
+               /* Skip initial spaces */
+               for (colpos = buffer; isspace(*colpos); colpos++);
+               if (!*colpos)   /* Empty line? */
+                       continue;
+               /* Find splitting colon */
+               for (grouppos = colpos; *colpos && *colpos != ':'; colpos++);
+               if (!*colpos || grouppos == colpos) {
+                       errstr(_("Parse error at line %d. Cannot find end of group name.\n"), line);
+                       continue;
+               }
+               /* Cut trailing spaces */
+               for (endname = colpos-1; isspace(*endname); endname--);
+               *(++endname) = 0;
+               /* Skip initial spaces at admins name */
+               for (colpos++; isspace(*colpos); colpos++);
+               if (!*colpos) {
+                       errstr(_("Parse error at line %d. Cannot find administrators name.\n"), line);
+                       continue;
+               }
+               /* Go through admins name */
+               for (adminpos = colpos; !isspace(*colpos); colpos++);
+               if (*colpos) {  /* Some characters after name? */
+                       *colpos = 0;
+                       /* Skip trailing spaces */
+                       for (colpos++; isspace(*colpos); colpos++);
+                       if (*colpos) {
+                               errstr(_("Parse error at line %d. Trailing characters after administrators name.\n"), line);
+                               continue;
+                       }
+               }
+               if (adminscnt >= adminsalloc)
+                       adminstable = srealloc(adminstable, sizeof(struct adminstable)*(adminsalloc+=ADMIN_TAB_ALLOC));
+               adminstable[adminscnt].grpname = sstrdup(grouppos);
+               adminstable[adminscnt++].adminname = sstrdup(adminpos);
+       }
+
+       fclose(f);
+       qsort(adminstable, adminscnt, sizeof(struct adminstable), admin_cmp);
+       return 0;
+}
+
+static struct quota_handle *find_handle_dev(char *dev, struct quota_handle **handles)
+{
+       int i;
+
+       for (i = 0; handles[i] && strcmp(dev, handles[i]->qh_quotadev); i++);
+       return handles[i];
+}
+
+static void warn_quota(void)
+{
+       struct quota_handle **handles;
+       struct configparams config;
+       int i;
+
+       if (readconfigfile(configfile, &config) < 0)
+               wc_exit(1);
+       if (get_quotatable() < 0)
+               wc_exit(1);
+
+       if (flags & FL_USER) {
+               handles = create_handle_list(0, NULL, USRQUOTA, -1, IOI_READONLY | IOI_OPENFILE, MS_LOCALONLY | (flags & FL_NOAUTOFS ? MS_NO_AUTOFS : 0));
+               if (!maildev[0] || !strcasecmp(maildev, "any"))
+                       maildev_handle = NULL;
+               else
+                       maildev_handle = find_handle_dev(maildev, handles);
+               for (i = 0; handles[i]; i++)
+                       handles[i]->qh_ops->scan_dquots(handles[i], check_offence);
+               dispose_handle_list(handles);
+       }
+       if (flags & FL_GROUP) {
+               if (get_groupadmins() < 0)
+                       wc_exit(1);
+               handles = create_handle_list(0, NULL, GRPQUOTA, -1, IOI_READONLY | IOI_OPENFILE, MS_LOCALONLY | (flags & FL_NOAUTOFS ? MS_NO_AUTOFS : 0));
+               if (!maildev[0] || !strcasecmp(maildev, "any"))
+                       maildev_handle = NULL;
+               else
+                       maildev_handle = find_handle_dev(maildev, handles);
+               for (i = 0; handles[i]; i++)
+                       handles[i]->qh_ops->scan_dquots(handles[i], check_offence);
+               dispose_handle_list(handles);
+       }
+       if (mail_to_offenders(&config) < 0)
+               wc_exit(1);
+}
+
+/* Print usage information */
+static void usage(void)
+{
+       errstr(_("Usage:\n  warnquota [-ugsid] [-F quotaformat] [-c configfile] [-q quotatabfile] [-a adminsfile]\n\n\
+-u, --user                      warn users\n\
+-g, --group                     warn groups\n\
+-s, --human-readable            send information in more human friendly units\n\
+-i, --no-autofs                 avoid autofs mountpoints\n\
+-d, --no-details                do not send quota information itself\n\
+-F, --format=formatname         use quotafiles of specific format\n\
+-c, --config=config-file        non-default config file\n\
+-q, --quota-tab=quotatab-file   non-default quotatab\n\
+-a, --admins-file=admins-file   non-default admins file\n\
+-h, --help                      display this help message and exit\n\
+-v, --version                   display version information and exit\n\n"));
+       fprintf(stderr, _("Bugs to %s\n"), MY_EMAIL);
+       wc_exit(1);
+}
+static void parse_options(int argcnt, char **argstr)
+{
+       int ret;
+       struct option long_opts[] = {
+               { "user", 0, NULL, 'u' },
+               { "group", 0, NULL, 'g' },
+               { "version", 0, NULL, 'V' },
+               { "help", 0, NULL, 'h' },
+               { "format", 1, NULL, 'F' },
+               { "config", 1, NULL, 'c' },
+               { "quota-tab", 1, NULL, 'q' },
+               { "admins-file", 1, NULL, 'a' },
+               { "no-autofs", 0, NULL, 'i' },
+               { "human-readable", 0, NULL, 's' },
+               { "no-details", 0, NULL, 'd' },
+               { NULL, 0, NULL, 0 }
+       };
+       while ((ret = getopt_long(argcnt, argstr, "ugVF:hc:q:a:isd", long_opts, NULL)) != -1) {
+               switch (ret) {
+                 case '?':
+                 case 'h':
+                       usage();
+                 case 'V':
+                       version();
+                       exit(0);
+                 case 'F':
+                       if ((fmt = name2fmt(optarg)) == QF_ERROR)
+                               wc_exit(1);
+                       break;
+                 case 'c':
+                       configfile = optarg;
+                       break;
+                 case 'q':
+                       quotatabfile = optarg;
+                       break;
+                 case 'a':
+                       adminsfile = optarg;
+                       break;
+                 case 'u':
+                       flags |= FL_USER;
+                       break;
+                 case 'g':
+                       flags |= FL_GROUP;
+                       break;
+                 case 'i':
+                       flags |= FL_NOAUTOFS;
+                       break;
+                 case 's':
+                       flags |= FL_SHORTNUMS;
+                       break;
+                 case 'd':
+                       flags |= FL_NODETAILS;
+                       break;
+               }
+       }
+       if (!(flags & FL_USER) && !(flags & FL_GROUP))
+               flags |= FL_USER;
+}
+static void get_host_name(void)
+{
+       struct utsname uts;
+
+       if (uname(&uts))
+               die(1, _("Cannot get host name: %s\n"), strerror(errno));
+       hostname = sstrdup(uts.nodename);
+       domainname = sstrdup(uts.domainname);
+}
+
+int main(int argc, char **argv)
+{
+       gettexton();
+       progname = basename(argv[0]);
+       get_host_name();
+
+       parse_options(argc, argv);
+       init_kernel_interface();
+       warn_quota();
+
+       wc_exit(0);
+       return 0;
+}
diff --git a/warnquota.conf b/warnquota.conf
new file mode 100644 (file)
index 0000000..929998c
--- /dev/null
@@ -0,0 +1,69 @@
+# this is an example warnquota.conf
+#
+; ; and # type comments are allowed
+# and even blank lines
+
+# values can be quoted:
+MAIL_CMD       = "/usr/my/sendmail/instead/sendmail -t"
+FROM           = "bas@localhost"
+# but they don't have to be:
+SUBJECT        = Hey, user, clean up your account!
+CC_TO          = "sysadm@localhost"
+# If you set this variable CC will be used only when user has less than
+# specified grace time left (examples of possible times: 5 seconds, 1 minute,
+# 12 hours, 5 days)
+# CC_BEFORE = 2 days
+SUPPORT        = "support@myhost.com"
+PHONE          = "(123) 456-1111 or (222) 333-4444"
+# Text in the beginning of the mail (if not specified, default text is used)
+# This way text can be split to more lines
+# Line breaks are done by '|' character
+# The expressions %i, %h, %d, and %% are substituted for user/group name,
+# host name, domain name, and '%' respectively. For backward compatibility
+# %s behaves as %i but is deprecated.
+MESSAGE         = Hello user %i, I've noticed you use too much space\
+ on my disk in %h.%d.|Delete your files on the following filesystems:|
+# Text in the end of the mail (if not specified, default text using SUPPORT and PHONE
+# is created)
+SIGNATURE      = See you!|                     Your admin of %h|
+# Following text is used for mails about group exceeding quotas
+GROUP_MESSAGE  = Hello, a group '%i' you're member of use too much space at %h.|\
+I chose you to do the cleanup.|Delete group files on the following filesystems:|
+# Text in the end of the mail to the group (if not specified, default text using SUPPORT
+# and PHONE is created).
+GROUP_SIGNATURE        = See you!|                     Your admin|
+#
+#If you are running warnquota on a mail server, and don't want bounces
+#because clients cannot receive mail setting this to "any" will cause
+#warnquota to not send them mail for all devices.  If you set this to the
+#device name (for example /dev/hdb1) then they will not be sent mail if they
+#are overquota on that device only, and will be sent mail for all other
+#devices.
+#MAILDEV        =
+#
+#Here you can set a charset for emails sent by warnquota (e.g. UTF-8)
+#CHARSET       = 
+# If you are using LDAP mail lookups.
+# host, port, tls, binddn, and bindpw are straight forward.
+# LDAP_BASEDN is your search base dn
+# LDAP_SEARCH_ATTRIBUTE is the attr for the value you are looking for
+# LDAP_MAIL_ATTRIBUTE is the attribute you want used for the mail address
+# LDAP_DEFAULT_MAIL_DOMAIN is the default domain
+#    if the attribute isn't found
+# if binddn and bindpw are blank or left out, an anonymous bind is used
+# 
+# LDAP_MAIL = false # or false if you don't want to use it
+# If you have at least LDAP 2.3 installed, you can use LDAP_URI
+# LDAP_URI = ldaps://my.server:389
+# Otherwise you can specify LDAP_HOST and LDAP_PORT
+# LDAP_HOST = ldap
+# LDAP_PORT = 389
+# LDAP_BINDDN = uid=ReadOnlyUser,o=YourOrg
+# LDAP_BINDPW = YourReadOnlyUserPassword
+# LDAP_BASEDN = YourSearchBase
+# LDAP_SEARCH_ATTRIBUTE = uid
+# LDAP_MAIL_ATTRIBUTE = mailLocalAddress
+# LDAP_DEFAULT_MAIL_DOMAIN = YourDefaultMailDomain.com
+#
+# end of example warnquota.conf file
+#
diff --git a/xqmstats.8 b/xqmstats.8
new file mode 100644 (file)
index 0000000..a36a138
--- /dev/null
@@ -0,0 +1,38 @@
+.\" 2004, Max Vozeler <max@hinterhof.net>
+.\" Released under the Gnu GPL
+.TH XQMSTATS 8 "April 2, 2004" "" "quota"
+.SH NAME
+.B xqmstats
+\- Display XFS quota manager statistics from /proc
+.SH SYNOPSIS
+.I /usr/sbin/xqmstats
+.SH DESCRIPTION
+.B xqmstat
+queries the kernel for the XFS Quota Manager dquot statistics.
+It displays:
+.P
+.PD 0
+.RS 4
+.IP \[bu]
+Reclaims
+.IP \[bu]
+Missed reclaims
+.IP \[bu]
+Dquot dups
+.IP \[bu]
+Cache misses
+.IP \[bu]
+Cache hits
+.IP \[bu]
+Dquot wants
+.IP \[bu]
+Shake reclaims
+.IP \[bu]
+Inact reclaims
+.RE
+.PD
+.SH OPTIONS
+None.
+.SH SEE ALSO
+.BR quotastats (1),
+.BR quota (1).
diff --git a/xqmstats.c b/xqmstats.c
new file mode 100644 (file)
index 0000000..cdac4a6
--- /dev/null
@@ -0,0 +1,67 @@
+/*
+ *     Display XFS quota manager statistics from /proc.
+ *      Copyright (c) 2001-2003 Silicon Graphics, Inc.
+ */
+
+#include "config.h"
+
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+#include "common.h"
+#include "pot.h"
+
+#define XQMFILE                "/proc/fs/xfs/xqm"
+#define STATFILE       "/proc/fs/xfs/stat"
+#define XQMSTATS       "/proc/fs/xfs/xqmstat"
+
+char *progname;
+
+int main(int argc, char **argv)
+{
+       FILE *stats, *xqm;
+       char buffer[256];
+       unsigned values[8];
+
+       gettexton();
+       progname = basename(argv[0]);
+
+       memset(values, 0, sizeof(unsigned) * 8);
+
+       if ((xqm = fopen(XQMFILE, "r")) == NULL) {
+               errstr(_("The running kernel does not support XFS\n"));
+               return 1;
+       }
+       if ((stats = fopen(XQMSTATS, "r")) == NULL) {
+               if ((stats = fopen(STATFILE, "r")) == NULL) {
+                       errstr(_("The running kernel does not support XFS\n"));
+                       return 1;
+               }
+       }
+       while (!feof(stats)) {
+               fgets(buffer, 256, stats);
+               if (sscanf(buffer, "qm %u %u %u %u %u %u %u %u\n",
+                          &values[0], &values[1], &values[2], &values[3],
+                          &values[4], &values[5], &values[6], &values[7]) == 8)
+                       break;
+       }
+       if (!feof(stats)) {
+               printf(_("XFS Quota Manager dquot statistics\n"));
+               printf(_("  reclaims:        %u\n"), values[0]);
+               printf(_("  missed reclaims: %u\n"), values[1]);
+               printf(_("  dquot dups:      %u\n"), values[2]);
+               printf(_("  cache misses:    %u\n"), values[3]);
+               printf(_("  cache hits:      %u\n"), values[4]);
+               printf(_("  dquot wants:     %u\n"), values[5]);
+               printf(_("  shake reclaims:  %u\n"), values[6]);
+               printf(_("  inact reclaims:  %u\n"), values[7]);
+       }
+       if (fscanf(xqm, "%u %u %u %u\n",
+                       &values[0], &values[1], &values[2], &values[3]) == 4)
+               printf(
+               _("Maximum %u dquots (currently %u incore, %u on freelist)\n"),
+                       values[0], values[1], values[3]);
+       fclose(stats);
+       fclose(xqm);
+       return 0;
+}