From 8c82de96cd23e4823a2d29eb2de2295c0866b0c9 Mon Sep 17 00:00:00 2001 From: Yang Lin Date: Wed, 30 May 2012 19:43:21 +0800 Subject: [PATCH] Initial commit to Gerrit --- CVS/Entries | 84 + CVS/Repository | 1 + CVS/Root | 1 + Changelog | 850 +++++ Makefile.in | 152 + README.gettext | 21 + README.ldap-support | 42 + README.mailserver | 14 + aclocal.m4 | 171 + autom4te.cache/output.0 | 5682 +++++++++++++++++++++++++++++++++ autom4te.cache/output.1 | 5924 ++++++++++++++++++++++++++++++++++ autom4te.cache/output.2 | 6360 +++++++++++++++++++++++++++++++++++++ autom4te.cache/requests | 218 ++ autom4te.cache/traces.0 | 367 +++ autom4te.cache/traces.1 | 184 ++ autom4te.cache/traces.2 | 355 +++ bylabel.c | 275 ++ bylabel.h | 4 + common.c | 127 + common.h | 49 + config.h.in | 100 + configure | 6360 +++++++++++++++++++++++++++++++++++++ configure.in | 249 ++ convertquota.8 | 73 + convertquota.c | 409 +++ doc/CVS/Entries | 5 + doc/CVS/Repository | 1 + doc/CVS/Root | 1 + doc/quotadoc.sgml | 221 ++ doc/quotas-1.eps | 3716 ++++++++++++++++++++++ doc/quotas.ms | 318 ++ doc/quotas.preformated | 330 ++ dqblk_rpc.h | 20 + dqblk_v1.h | 21 + dqblk_v2.h | 40 + dqblk_xfs.h | 25 + edquota.8 | 170 + edquota.c | 351 ++ install-sh | 251 ++ ldap-scripts/CVS/Entries | 6 + ldap-scripts/CVS/Repository | 1 + ldap-scripts/CVS/Root | 1 + ldap-scripts/applySystemQuotas.pl | 104 + ldap-scripts/edquota_editor | 32 + ldap-scripts/quota.schema | 18 + ldap-scripts/setSystemQuotas.pl | 140 + ldap-scripts/setquota-ldap.pl | 148 + mntopt.h | 34 + packaging/quota-4.0.pre1.tar | 0 packaging/quota-4.0.pre1.tar.bz2 | Bin 0 -> 269469 bytes packaging/quota.changes | 11 + packaging/quota.spec | 62 + po/CVS/Entries | 3 + po/CVS/Repository | 1 + po/CVS/Root | 1 + po/fr.po | 2146 +++++++++++++ po/pl.po | 2696 ++++++++++++++++ po/pl.po.orig | 2696 ++++++++++++++++ po/pl.po.rej | 51 + pot.c | 16 + pot.h | 18 + quot.8 | 64 + quot.c | 388 +++ quot.h | 113 + quota.1 | 190 ++ quota.c | 377 +++ quota.h | 164 + quota_nld.8 | 61 + quota_nld.c | 389 +++ quota_tree.h | 51 + quotacheck.8 | 197 ++ quotacheck.c | 1130 +++++++ quotacheck.h | 47 + quotacheck_v1.c | 92 + quotacheck_v2.c | 425 +++ quotactl.2 | 317 ++ quotadebug | Bin 0 -> 21774 bytes quotadebug.c | 282 ++ quotagrpadmins | 8 + quotaio.c | 276 ++ quotaio.h | 173 + quotaio_generic.c | 100 + quotaio_generic.h | 24 + quotaio_meta.c | 61 + quotaio_rpc.c | 71 + quotaio_tree.c | 521 +++ quotaio_v1.c | 389 +++ quotaio_v1.h | 49 + quotaio_v2.c | 506 +++ quotaio_v2.h | 95 + quotaio_xfs.c | 293 ++ quotaio_xfs.h | 150 + quotaon.8 | 207 ++ quotaon.c | 396 +++ quotaon.h | 19 + quotaon_xfs.c | 237 ++ quotaops.c | 674 ++++ quotaops.h | 18 + quotastats.8 | 41 + quotastats.c | 129 + quotasys.c | 1279 ++++++++ quotasys.h | 149 + quotatab | 9 + repquota.8 | 151 + repquota.c | 343 ++ rquota.3 | 34 + rquota.x | 139 + rquota_client.c | 351 ++ rquota_client.h | 18 + rquota_server.c | 331 ++ rquota_svc.c | 491 +++ rquotad.8 | 95 + set_limits_example.c | 60 + setquota.8 | 207 ++ setquota.c | 443 +++ setup_quota_group | 12 + svc_socket.c | 112 + warnquota.8 | 110 + warnquota.c | 1082 +++++++ warnquota.conf | 69 + xqmstats.8 | 38 + xqmstats.c | 67 + 122 files changed, 56041 insertions(+) create mode 100644 CVS/Entries create mode 100644 CVS/Repository create mode 100644 CVS/Root create mode 100644 Changelog create mode 100644 Makefile.in create mode 100644 README.gettext create mode 100644 README.ldap-support create mode 100644 README.mailserver create mode 100644 aclocal.m4 create mode 100644 autom4te.cache/output.0 create mode 100644 autom4te.cache/output.1 create mode 100644 autom4te.cache/output.2 create mode 100644 autom4te.cache/requests create mode 100644 autom4te.cache/traces.0 create mode 100644 autom4te.cache/traces.1 create mode 100644 autom4te.cache/traces.2 create mode 100644 bylabel.c create mode 100644 bylabel.h create mode 100644 common.c create mode 100644 common.h create mode 100644 config.h.in create mode 100755 configure create mode 100644 configure.in create mode 100644 convertquota.8 create mode 100644 convertquota.c create mode 100644 doc/CVS/Entries create mode 100644 doc/CVS/Repository create mode 100644 doc/CVS/Root create mode 100644 doc/quotadoc.sgml create mode 100644 doc/quotas-1.eps create mode 100644 doc/quotas.ms create mode 100644 doc/quotas.preformated create mode 100644 dqblk_rpc.h create mode 100644 dqblk_v1.h create mode 100644 dqblk_v2.h create mode 100644 dqblk_xfs.h create mode 100644 edquota.8 create mode 100644 edquota.c create mode 100755 install-sh create mode 100644 ldap-scripts/CVS/Entries create mode 100644 ldap-scripts/CVS/Repository create mode 100644 ldap-scripts/CVS/Root create mode 100755 ldap-scripts/applySystemQuotas.pl create mode 100755 ldap-scripts/edquota_editor create mode 100644 ldap-scripts/quota.schema create mode 100755 ldap-scripts/setSystemQuotas.pl create mode 100644 ldap-scripts/setquota-ldap.pl create mode 100644 mntopt.h create mode 100644 packaging/quota-4.0.pre1.tar create mode 100644 packaging/quota-4.0.pre1.tar.bz2 create mode 100644 packaging/quota.changes create mode 100644 packaging/quota.spec create mode 100644 po/CVS/Entries create mode 100644 po/CVS/Repository create mode 100644 po/CVS/Root create mode 100644 po/fr.po create mode 100644 po/pl.po create mode 100644 po/pl.po.orig create mode 100644 po/pl.po.rej create mode 100644 pot.c create mode 100644 pot.h create mode 100644 quot.8 create mode 100644 quot.c create mode 100644 quot.h create mode 100644 quota.1 create mode 100644 quota.c create mode 100644 quota.h create mode 100644 quota_nld.8 create mode 100644 quota_nld.c create mode 100644 quota_tree.h create mode 100644 quotacheck.8 create mode 100644 quotacheck.c create mode 100644 quotacheck.h create mode 100644 quotacheck_v1.c create mode 100644 quotacheck_v2.c create mode 100644 quotactl.2 create mode 100755 quotadebug create mode 100644 quotadebug.c create mode 100644 quotagrpadmins create mode 100644 quotaio.c create mode 100644 quotaio.h create mode 100644 quotaio_generic.c create mode 100644 quotaio_generic.h create mode 100644 quotaio_meta.c create mode 100644 quotaio_rpc.c create mode 100644 quotaio_tree.c create mode 100644 quotaio_v1.c create mode 100644 quotaio_v1.h create mode 100644 quotaio_v2.c create mode 100644 quotaio_v2.h create mode 100644 quotaio_xfs.c create mode 100644 quotaio_xfs.h create mode 100644 quotaon.8 create mode 100644 quotaon.c create mode 100644 quotaon.h create mode 100644 quotaon_xfs.c create mode 100644 quotaops.c create mode 100644 quotaops.h create mode 100644 quotastats.8 create mode 100644 quotastats.c create mode 100644 quotasys.c create mode 100644 quotasys.h create mode 100644 quotatab create mode 100644 repquota.8 create mode 100644 repquota.c create mode 100644 rquota.3 create mode 100644 rquota.x create mode 100644 rquota_client.c create mode 100644 rquota_client.h create mode 100644 rquota_server.c create mode 100644 rquota_svc.c create mode 100644 rquotad.8 create mode 100644 set_limits_example.c create mode 100644 setquota.8 create mode 100644 setquota.c create mode 100755 setup_quota_group create mode 100644 svc_socket.c create mode 100644 warnquota.8 create mode 100644 warnquota.c create mode 100644 warnquota.conf create mode 100644 xqmstats.8 create mode 100644 xqmstats.c diff --git a/CVS/Entries b/CVS/Entries new file mode 100644 index 0000000..ba84bb3 --- /dev/null +++ b/CVS/Entries @@ -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 index 0000000..2dc33ce --- /dev/null +++ b/CVS/Repository @@ -0,0 +1 @@ +quota-tools diff --git a/CVS/Root b/CVS/Root new file mode 100644 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 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 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 and -c 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 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 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 . + +* 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 + +* 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 + +* 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 ) + +* Removed searching of /dev dir from rquota_server. Only lookup mounted filesystems. + (Patch by Roman Kagan ) + +* 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 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 ) + +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 + +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 + + +* 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 index 0000000..107f373 --- /dev/null +++ b/Makefile.in @@ -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 index 0000000..6bcb14f --- /dev/null +++ b/README.gettext @@ -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 , 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 index 0000000..0804677 --- /dev/null +++ b/README.ldap-support @@ -0,0 +1,42 @@ +LDAP support for warnquota by James Bourne + +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 index 0000000..9882435 --- /dev/null +++ b/README.mailserver @@ -0,0 +1,14 @@ +Mail server support by James Bourne + +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 index 0000000..d55ff05 --- /dev/null +++ b/aclocal.m4 @@ -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 . +# +# 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 .])], + [$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 index 0000000..4dd508b --- /dev/null +++ b/autom4te.cache/output.0 @@ -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 &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 +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_SYS_STAT_H +# include +#endif +#ifdef STDC_HEADERS +# include +# include +#else +# ifdef HAVE_STDLIB_H +# include +# endif +#endif +#ifdef HAVE_STRING_H +# if !defined STDC_HEADERS && defined HAVE_MEMORY_H +# include +# endif +# include +#endif +#ifdef HAVE_STRINGS_H +# include +#endif +#ifdef HAVE_INTTYPES_H +# include +#endif +#ifdef HAVE_STDINT_H +# include +#endif +#ifdef HAVE_UNISTD_H +# include +#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 if you have libraries in a + nonstandard directory + LIBS libraries to pass to the linker, e.g. -l + CPPFLAGS C/C++/Objective C preprocessor flags, e.g. -I if + you have headers in a nonstandard directory + 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 +#include +#include +#include +/* 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 to if __STDC__ is defined, since + # 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 +@%:@else +@%:@ include +@%:@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 +_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 to if __STDC__ is defined, since + # 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 +@%:@else +@%:@ include +@%:@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 +_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 +#include +#include +#include + +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 + +_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 + +_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 +#include +#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 + +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 +_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 +_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 + +_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 + #include + #include + #include + #include + 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 +_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 +_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 ." + +_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 >$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 index 0000000..722df3a --- /dev/null +++ b/autom4te.cache/output.1 @@ -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 &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 +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_SYS_STAT_H +# include +#endif +#ifdef STDC_HEADERS +# include +# include +#else +# ifdef HAVE_STDLIB_H +# include +# endif +#endif +#ifdef HAVE_STRING_H +# if !defined STDC_HEADERS && defined HAVE_MEMORY_H +# include +# endif +# include +#endif +#ifdef HAVE_STRINGS_H +# include +#endif +#ifdef HAVE_INTTYPES_H +# include +#endif +#ifdef HAVE_STDINT_H +# include +#endif +#ifdef HAVE_UNISTD_H +# include +#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 if you have libraries in a + nonstandard directory + LIBS libraries to pass to the linker, e.g. -l + CPPFLAGS C/C++/Objective C preprocessor flags, e.g. -I if + you have headers in a nonstandard directory + 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 +#include +#include +#include +/* 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 to if __STDC__ is defined, since + # 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 +@%:@else +@%:@ include +@%:@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 +_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 to if __STDC__ is defined, since + # 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 +@%:@else +@%:@ include +@%:@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 +_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 +#include +#include +#include + +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 + +_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 + +_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 +#include +#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 + +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 +_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 +_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 + +_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 . +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 . +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 + #include + #include + #include + #include + 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 +_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 +_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 ." + +_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 >$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 index 0000000..b8de232 --- /dev/null +++ b/autom4te.cache/output.2 @@ -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 &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 +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_SYS_STAT_H +# include +#endif +#ifdef STDC_HEADERS +# include +# include +#else +# ifdef HAVE_STDLIB_H +# include +# endif +#endif +#ifdef HAVE_STRING_H +# if !defined STDC_HEADERS && defined HAVE_MEMORY_H +# include +# endif +# include +#endif +#ifdef HAVE_STRINGS_H +# include +#endif +#ifdef HAVE_INTTYPES_H +# include +#endif +#ifdef HAVE_STDINT_H +# include +#endif +#ifdef HAVE_UNISTD_H +# include +#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 if you have libraries in a + nonstandard directory + LIBS libraries to pass to the linker, e.g. -l + CPPFLAGS C/C++/Objective C preprocessor flags, e.g. -I if + you have headers in a nonstandard directory + 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 +#include +#include +#include +/* 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 to if __STDC__ is defined, since + # 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 +@%:@else +@%:@ include +@%:@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 +_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 to if __STDC__ is defined, since + # 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 +@%:@else +@%:@ include +@%:@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 +_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 +#include +#include +#include + +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 + +_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 + +_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 +#include +#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 + +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 +_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 +_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 + +_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 . +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 . +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 + #include + #include + #include + #include + 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 +_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 +_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 ." + +_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=' ' +ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /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 +' >$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 = "" + +} +{ + 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 +' >$CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + for (key in D) D_is_set[key] = 1 + FS = "" +} +/^[\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 index 0000000..91f735f --- /dev/null +++ b/autom4te.cache/requests @@ -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 index 0000000..9e9e4fc --- /dev/null +++ b/autom4te.cache/traces.0 @@ -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 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 header file. */ +#undef HAVE_SYS_STAT_H]) +m4trace:configure.in:49: -1- AH_OUTPUT([HAVE_STDLIB_H], [/* Define to 1 if you have the header file. */ +#undef HAVE_STDLIB_H]) +m4trace:configure.in:49: -1- AH_OUTPUT([HAVE_STRING_H], [/* Define to 1 if you have the header file. */ +#undef HAVE_STRING_H]) +m4trace:configure.in:49: -1- AH_OUTPUT([HAVE_MEMORY_H], [/* Define to 1 if you have the header file. */ +#undef HAVE_MEMORY_H]) +m4trace:configure.in:49: -1- AH_OUTPUT([HAVE_STRINGS_H], [/* Define to 1 if you have the header file. */ +#undef HAVE_STRINGS_H]) +m4trace:configure.in:49: -1- AH_OUTPUT([HAVE_INTTYPES_H], [/* Define to 1 if you have the header file. */ +#undef HAVE_INTTYPES_H]) +m4trace:configure.in:49: -1- AH_OUTPUT([HAVE_STDINT_H], [/* Define to 1 if you have the header file. */ +#undef HAVE_STDINT_H]) +m4trace:configure.in:49: -1- AH_OUTPUT([HAVE_UNISTD_H], [/* Define to 1 if you have the 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 index 0000000..dd69637 --- /dev/null +++ b/autom4te.cache/traces.1 @@ -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 .])], + [$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 index 0000000..a18ff41 --- /dev/null +++ b/autom4te.cache/traces.2 @@ -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 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 header file. */ +#undef HAVE_SYS_STAT_H]) +m4trace:configure.in:52: -1- AH_OUTPUT([HAVE_STDLIB_H], [/* Define to 1 if you have the header file. */ +#undef HAVE_STDLIB_H]) +m4trace:configure.in:52: -1- AH_OUTPUT([HAVE_STRING_H], [/* Define to 1 if you have the header file. */ +#undef HAVE_STRING_H]) +m4trace:configure.in:52: -1- AH_OUTPUT([HAVE_MEMORY_H], [/* Define to 1 if you have the header file. */ +#undef HAVE_MEMORY_H]) +m4trace:configure.in:52: -1- AH_OUTPUT([HAVE_STRINGS_H], [/* Define to 1 if you have the header file. */ +#undef HAVE_STRINGS_H]) +m4trace:configure.in:52: -1- AH_OUTPUT([HAVE_INTTYPES_H], [/* Define to 1 if you have the header file. */ +#undef HAVE_INTTYPES_H]) +m4trace:configure.in:52: -1- AH_OUTPUT([HAVE_STDINT_H], [/* Define to 1 if you have the header file. */ +#undef HAVE_STDINT_H]) +m4trace:configure.in:52: -1- AH_OUTPUT([HAVE_UNISTD_H], [/* Define to 1 if you have the 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 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 . + * + * 1999-02-22 Arkadiusz Mi¶kiewicz + * - added Native Language Support + * 2000-01-20 James Antill + * - Added error message if /proc/partitions cannot be opened + * 2000-05-09 Erik Troan + * - Added cache for UUID and disk labels + * 2000-11-07 Nathan Scott + * - Added XFS support + */ + +#include "config.h" + +#include +#include +#include +#include +#include +#include + +#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 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 index 0000000..69e6178 --- /dev/null +++ b/common.c @@ -0,0 +1,127 @@ +/* + * + * Common things for all utilities + * + * Jan Kara - sponsored by SuSE CR + * + * Jani Jaakkola - syslog support + */ + +#include "config.h" + +#include +#include +#include +#include +#include +#include +#include + +#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 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 index 0000000..432e3b5 --- /dev/null +++ b/config.h.in @@ -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 header file. */ +#undef HAVE_INTTYPES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_MEMORY_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDINT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDLIB_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRINGS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRING_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_STAT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TYPES_H + +/* Define to 1 if you have the 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 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 &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 +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_SYS_STAT_H +# include +#endif +#ifdef STDC_HEADERS +# include +# include +#else +# ifdef HAVE_STDLIB_H +# include +# endif +#endif +#ifdef HAVE_STRING_H +# if !defined STDC_HEADERS && defined HAVE_MEMORY_H +# include +# endif +# include +#endif +#ifdef HAVE_STRINGS_H +# include +#endif +#ifdef HAVE_INTTYPES_H +# include +#endif +#ifdef HAVE_STDINT_H +# include +#endif +#ifdef HAVE_UNISTD_H +# include +#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 if you have libraries in a + nonstandard directory + LIBS libraries to pass to the linker, e.g. -l + CPPFLAGS C/C++/Objective C preprocessor flags, e.g. -I if + you have headers in a nonstandard directory + 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 +#include +#include +#include +/* 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 to if __STDC__ is defined, since + # 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 +#else +# include +#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 +_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 to if __STDC__ is defined, since + # 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 +#else +# include +#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 +_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 +#include +#include +#include + +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 + +_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 + +_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 +#include +#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 + +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 +_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 +_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 + +_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 . +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 . +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 + #include + #include + #include + #include + 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 +_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 +_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 ." + +_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=' ' +ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /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 +' >$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 = "" + +} +{ + 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 +' >$CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + for (key in D) D_is_set[key] = 1 + FS = "" +} +/^[\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 index 0000000..895ee03 --- /dev/null +++ b/configure.in @@ -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 ]) + 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 + #include + #include + #include + #include + 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 index 0000000..5313c7e --- /dev/null +++ b/convertquota.8 @@ -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 \ + diff --git a/convertquota.c b/convertquota.c new file mode 100644 index 0000000..ab16193 --- /dev/null +++ b/convertquota.c @@ -0,0 +1,409 @@ +/* + * + * Utility for converting quota file from old to new format + * + * Sponsored by SuSE CR + */ + +#include "config.h" + +#include +#include +#include +#include +#include +#include +#include + +#include + +#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 index 0000000..fc29a60 --- /dev/null +++ b/doc/CVS/Entries @@ -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 index 0000000..9ca943d --- /dev/null +++ b/doc/CVS/Repository @@ -0,0 +1 @@ +quota-tools/doc diff --git a/doc/CVS/Root b/doc/CVS/Root new file mode 100644 index 0000000..3d66810 --- /dev/null +++ b/doc/CVS/Root @@ -0,0 +1 @@ +jkar8572@linuxquota.cvs.sf.net:/cvsroot/linuxquota/ diff --git a/doc/quotadoc.sgml b/doc/quotadoc.sgml new file mode 100644 index 0000000..ff724bd --- /dev/null +++ b/doc/quotadoc.sgml @@ -0,0 +1,221 @@ + + + + +
+ +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 <format></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 index 0000000..84a858d --- /dev/null +++ b/doc/quotas-1.eps @@ -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 index 0000000..10e200c --- /dev/null +++ b/doc/quotas.ms @@ -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 index 0000000..e008aeb --- /dev/null +++ b/doc/quotas.preformated @@ -0,0 +1,330 @@ + + + + + + + + + + DDiisscc QQuuoottaass iinn aa UUNNIIXX** EEnnvviirroonnmmeenntt + + _R_o_b_e_r_t _E_l_z + Department of Computer Science + University of Melbourne, + Parkville, + Victoria, + Australia. + + + _A_B_S_T_R_A_C_T + + + + 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. + + + 11.. UUsseerrss'' vviieeww ooff ddiisscc qquuoottaass + + To most users, disc quotas will either be of no con- + cern, or a fact of life that cannot be avoided. The + _q_u_o_t_a(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. + + _Q_u_o_t_a 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 oonnllyy + way to reset this condition is to reduce usage below quota, + then log in again. + + 11..11.. SSuurrvviivviinngg wwhheenn qquuoottaa lliimmiitt iiss rreeaacchheedd + + 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 !! shell escape + command to examine his file space, and remove surplus files. + Alternatively, using _c_s_h, 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 + + + 22.. AAddmmiinniisstteerriinngg tthhee qquuoottaa ssyysstteemm + + 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 _c_o_n_f_i_g(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 //uussrr. If possible, //ttmmpp + 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 _e_d_q_u_o_t_a(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 --pp 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 _q_u_o_t_a_o_n(8) command. + _Q_u_o_t_a_o_n will either enable quotas for a particular filesys- + tem, or with the --aa switch, will enable quotas for each + filesystem indicated in //eettcc//ffssttaabb as using quotas. See + _f_s_t_a_b(5) for details. Most sites using the quota system, + will include the line + + /etc/quotaon -a + + in //eettcc//rrcc..llooccaall. + + Should quotas need to be disabled, the _q_u_o_t_a_o_f_f(8) com- + mand will do that, however, should the filesystem be about + to be dismounted, the _u_m_o_u_n_t(8) command will disable quotas + immediately before the filesystem is unmounted. This is + actually an effect of the _u_m_o_u_n_t(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 _q_u_o_t_a_c_h_e_c_k(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 _q_u_o_t_a_c_h_e_c_k when + the filesystem is idle will certainly correct any inaccu- + racy. + + The super-user may use the _q_u_o_t_a(1) command to examine + the usage and quotas of any user, and the _r_e_p_q_u_o_t_a(8) com- + mand may be used to check the usages and limits for all + users on a filesystem. + + 33.. SSoommee iimmpplleemmeennttaattiioonn ddeettaaiill.. + + 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 qquuoottaass 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 _s_e_t_q_u_o_t_a(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. + + 44.. AAcckknnoowwlleeddggmmeennttss + + 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 index 0000000..55d7d65 --- /dev/null +++ b/dqblk_rpc.h @@ -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 index 0000000..7113261 --- /dev/null +++ b/dqblk_v1.h @@ -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 index 0000000..c06168d --- /dev/null +++ b/dqblk_v2.h @@ -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 index 0000000..415e646 --- /dev/null +++ b/dqblk_xfs.h @@ -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 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 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 index 0000000..e9de238 --- /dev/null +++ b/install-sh @@ -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 index 0000000..5c538db --- /dev/null +++ b/ldap-scripts/CVS/Entries @@ -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 index 0000000..1141060 --- /dev/null +++ b/ldap-scripts/CVS/Repository @@ -0,0 +1 @@ +quota-tools/ldap-scripts diff --git a/ldap-scripts/CVS/Root b/ldap-scripts/CVS/Root new file mode 100644 index 0000000..3d66810 --- /dev/null +++ b/ldap-scripts/CVS/Root @@ -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 index 0000000..41c74d9 --- /dev/null +++ b/ldap-scripts/applySystemQuotas.pl @@ -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 index 0000000..fdebd09 --- /dev/null +++ b/ldap-scripts/edquota_editor @@ -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 index 0000000..b5e216f --- /dev/null +++ b/ldap-scripts/quota.schema @@ -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 index 0000000..90ab1e8 --- /dev/null +++ b/ldap-scripts/setSystemQuotas.pl @@ -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 index 0000000..7cafc44 --- /dev/null +++ b/ldap-scripts/setquota-ldap.pl @@ -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 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 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 index 0000000000000000000000000000000000000000..da0ae844cdd3590cf4df8e9f8c9eed4b8bbc7d39 GIT binary patch literal 269469 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 literal 0 HcmV?d00001 diff --git a/packaging/quota.changes b/packaging/quota.changes new file mode 100644 index 0000000..324df17 --- /dev/null +++ b/packaging/quota.changes @@ -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 index 0000000..47aad39 --- /dev/null +++ b/packaging/quota.spec @@ -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 index 0000000..7be7731 --- /dev/null +++ b/po/CVS/Entries @@ -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 index 0000000..49f91b6 --- /dev/null +++ b/po/CVS/Repository @@ -0,0 +1 @@ +quota-tools/po diff --git a/po/CVS/Root b/po/CVS/Root new file mode 100644 index 0000000..3d66810 --- /dev/null +++ b/po/CVS/Root @@ -0,0 +1 @@ +jkar8572@linuxquota.cvs.sf.net:/cvsroot/linuxquota/ diff --git a/po/fr.po b/po/fr.po new file mode 100644 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 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 index 0000000..3ba3756 --- /dev/null +++ b/po/pl.po.orig @@ -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 index 0000000..a52f6aa --- /dev/null +++ b/po/pl.po.rej @@ -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 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 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 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 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 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 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 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 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 index 0000000..9eb7214 --- /dev/null +++ b/quota_nld.8 @@ -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 index 0000000..538702d --- /dev/null +++ b/quota_nld.c @@ -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 index 0000000..32fce65 --- /dev/null +++ b/quota_tree.h @@ -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 index 0000000..ed23e73 --- /dev/null +++ b/quotacheck.8 @@ -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 index 0000000..41901f1 --- /dev/null +++ b/quotacheck.c @@ -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 index 0000000..0abdaaa --- /dev/null +++ b/quotacheck.h @@ -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 index 0000000..d0ed3d5 --- /dev/null +++ b/quotacheck_v1.c @@ -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 index 0000000..77afde3 --- /dev/null +++ b/quotacheck_v2.c @@ -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 index 0000000..683903d --- /dev/null +++ b/quotactl.2 @@ -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 index 0000000000000000000000000000000000000000..bbb4fe0f87f052fcbeb3b3f8d6d2b469e42d71fe GIT binary patch literal 21774 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 literal 0 HcmV?d00001 diff --git a/quotadebug.c b/quotadebug.c new file mode 100644 index 0000000..5d31c42 --- /dev/null +++ b/quotadebug.c @@ -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 index 0000000..a1f2f46 --- /dev/null +++ b/quotagrpadmins @@ -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 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 = "afile_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 = "afile_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 = "afile_ops_1; + else if (is_tree_qfmt(fmt)) + h->qh_ops = "afile_ops_2; + else if (fmt == QF_META) + h->qh_ops = "afile_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 = "afile_ops_1; + else + h->qh_ops = "afile_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 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 index 0000000..e5df683 --- /dev/null +++ b/quotaio_generic.c @@ -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 index 0000000..422fb52 --- /dev/null +++ b/quotaio_generic.h @@ -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 index 0000000..f1f714f --- /dev/null +++ b/quotaio_meta.c @@ -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 index 0000000..14fe410 --- /dev/null +++ b/quotaio_rpc.c @@ -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 index 0000000..cdc0e8f --- /dev/null +++ b/quotaio_tree.c @@ -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 index 0000000..0edbc16 --- /dev/null +++ b/quotaio_v1.c @@ -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 index 0000000..b74290b --- /dev/null +++ b/quotaio_v1.h @@ -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 index 0000000..2e3c725 --- /dev/null +++ b/quotaio_v2.c @@ -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 index 0000000..197bb65 --- /dev/null +++ b/quotaio_v2.h @@ -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 index 0000000..4729317 --- /dev/null +++ b/quotaio_xfs.c @@ -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 index 0000000..cf89973 --- /dev/null +++ b/quotaio_xfs.h @@ -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 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 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 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 index 0000000..a2c9f5e --- /dev/null +++ b/quotaon_xfs.c @@ -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 index 0000000..4f230d0 --- /dev/null +++ b/quotaops.c @@ -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 index 0000000..acd8d30 --- /dev/null +++ b/quotaops.h @@ -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 index 0000000..6ebfccf --- /dev/null +++ b/quotastats.8 @@ -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 index 0000000..1ec2137 --- /dev/null +++ b/quotastats.c @@ -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 index 0000000..8df5e3b --- /dev/null +++ b/quotasys.c @@ -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 index 0000000..90e5aae --- /dev/null +++ b/quotasys.h @@ -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 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 index 0000000..7580f64 --- /dev/null +++ b/repquota.8 @@ -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 index 0000000..7e007ce --- /dev/null +++ b/repquota.c @@ -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 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 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 index 0000000..d4c68b7 --- /dev/null +++ b/rquota_client.c @@ -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 index 0000000..3730a8d --- /dev/null +++ b/rquota_client.h @@ -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 index 0000000..cb3c44d --- /dev/null +++ b/rquota_server.c @@ -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 index 0000000..c0f7efe --- /dev/null +++ b/rquota_svc.c @@ -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 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 index 0000000..755fb2f --- /dev/null +++ b/set_limits_example.c @@ -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 index 0000000..624deec --- /dev/null +++ b/setquota.8 @@ -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 index 0000000..1020d8f --- /dev/null +++ b/setquota.c @@ -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 index 0000000..7343fea --- /dev/null +++ b/setup_quota_group @@ -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 index 0000000..927b2ea --- /dev/null +++ b/svc_socket.c @@ -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 index 0000000..89844ec --- /dev/null +++ b/warnquota.8 @@ -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 index 0000000..e46b601 --- /dev/null +++ b/warnquota.c @@ -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 index 0000000..929998c --- /dev/null +++ b/warnquota.conf @@ -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 index 0000000..a36a138 --- /dev/null +++ b/xqmstats.8 @@ -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 index 0000000..cdac4a6 --- /dev/null +++ b/xqmstats.c @@ -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; +} -- 2.7.4