From: Yang Lin Date: Wed, 30 May 2012 11:43:21 +0000 (+0800) Subject: Initial commit to Gerrit X-Git-Tag: 1.0_branch^0 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=8c82de96cd23e4823a2d29eb2de2295c0866b0c9;p=profile%2Fivi%2Fquota.git Initial commit to Gerrit --- 8c82de96cd23e4823a2d29eb2de2295c0866b0c9 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 0000000..da0ae84 Binary files /dev/null and b/packaging/quota-4.0.pre1.tar.bz2 differ diff --git a/packaging/quota.changes b/packaging/quota.changes new file mode 100644 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 0000000..bbb4fe0 Binary files /dev/null and b/quotadebug differ 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; +}