quota-tools/0000755000175000017500000000000012023342623013130 5ustar michaelmichaelquota-tools/quotatab0000644000175000017500000000040511650022303014665 0ustar michaelmichael# # 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 quota-tools/quota.10000644000175000017500000001035311650022303014340 0ustar michaelmichael.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 --always-resolve Always try to translate user / group name to uid / gid even if the name is composed of digits only. .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 -f, --filesystem-list report quotas only for filesystems specified on command line. .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 quota will always send paths with a leading 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. .TP .B --show-mntpoint Show also mount point as a filesystem identification. .TP .B --hide-device Do not show device name in a filesystem identification. .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), .BR warnquota (8), .BR setquota (8) quota-tools/repquota.c0000644000175000017500000002320211723777524015155 0ustar michaelmichael/* * * Utility for reporting quotas * * Based on old repquota. * Jan Kara - Sponsored by SuSE CZ */ #include "config.h" #include #include #include #include #include #include #include #include #include #include #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 */ static int flags, fmt = -1; static char **mnt; static int mntcnt; static int cached_dquots; static 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 9 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_INITSCAN, MS_LOCALONLY | (flags & FL_NOAUTOFS ? MS_NO_AUTOFS : 0)); else handles = create_handle_list(mntcnt, mnt, type, fmt, IOI_READONLY | IOI_INITSCAN, 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; } quota-tools/dqblk_v1.h0000644000175000017500000000067511650022303015007 0ustar michaelmichael/* * 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 quota-tools/repquota.80000644000175000017500000001032411650022303015054 0ustar michaelmichael.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 quota limits set with .BR edquota (8) or .BR setquota (8). In the second column repquota prints two characters marking which limits are exceeded. If user is over his space softlimit or reaches his space hardlimit in case softlimit is unset, the first character is '+'. Otherwise the character printed is '-'. The second character denotes the state of inode usage analogously. .B repquota has to translate ids of all users/groups to names (unless option .B -n was specified) so 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 a 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) quota-tools/configure.in0000644000175000017500000002007212015475724015454 0ustar michaelmichaeldnl 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_ARG_ENABLE(static-link, [ --enable-static-link=[yes/no] Link all binaries statically [default=no].], , enable_static_link="no") if test "x$enable_static_link" != "xyes"; then 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 else CFLAGS="$CFLAGS -static" LDFLAGS="$LDFLAGS -static" fi dnl Strip binaries before installation AC_ARG_ENABLE(strip-binaries, [ --enable-strip-binaries=[yes/no] Strip binaries while installing them [default=yes].], , enable_strip="yes") if test "x$enable_strip" = "xyes"; then STRIP="-s" else STRIP="" 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(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_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.01"], [Version of quota tools]) AC_SUBST(LIBMALLOC) AC_SUBST(INSTMO) AC_SUBST(ROOTSBIN) AC_SUBST(CPPFLAGS) AC_SUBST(STRIP) AC_OUTPUT(Makefile) quota-tools/quotaio_generic.h0000644000175000017500000000133111650022303016447 0ustar michaelmichael/* * * 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); /* Generic routine for scanning dquots when quota format does not have * better way */ int generic_scan_dquots(struct quota_handle *h, int (*process_dquot)(struct dquot *dquot, char *dqname), int (*get_dquot)(struct dquot *dquot)); #endif quota-tools/rquota_svc.c0000644000175000017500000003216211723777610015504 0ustar michaelmichael/* * 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 * changes for new utilities by Jan Kara * patches by Jani Jaakkola * * 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 #include #include #include #include /* for pmap_unset */ #include #include /* getenv, exit */ #include /* strcmp */ #include #include #include #include #include #ifdef HOSTS_ACCESS #include #include 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 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 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 listen on given port\n\ -x --xtab 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. */ static 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 */ } quota-tools/doc/0000755000175000017500000000000011567551265013715 5ustar michaelmichaelquota-tools/doc/quotas.preformated0000644000175000017500000003223611442151253017452 0ustar michaelmichael 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. quota-tools/doc/quotadoc.sgml0000644000175000017500000002502711442151253016407 0ustar michaelmichael
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> ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quota-tools/doc/quotas.ms���������������������������������������������������������������������������0000644�0001750�0001750�00000027306�11442151253�015563� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������.\" 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. ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quota-tools/doc/quotas-1.eps������������������������������������������������������������������������0000644�0001750�0001750�00000552462�11442151253�016077� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������%!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 ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quota-tools/quotasys.c������������������������������������������������������������������������������0000644�0001750�0001750�00000077614�11757121400�015204� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * * 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); } /* * 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 */ static 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 (!strcmp(unit, _("second")) || !strcmp(unit, _("seconds"))) *res = num; else if (!strcmp(unit, _("minute")) || !strcmp(unit, _("minutes"))) *res = num * 60; else if (!strcmp(unit, _("hour")) || !strcmp(unit, _("hours"))) *res = num * 60 * 60; else if (!strcmp(unit, _("day")) || !strcmp(unit, _("days"))) *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); } /* * Wrappers for mount options processing functions */ /* * Check for XFS filesystem with quota accounting enabled */ static int hasxfsquota(const char *dev, struct mntent *mnt, int type, int flags) { u_int16_t sbflags; struct xfs_mem_dqinfo info; if (flags & MS_XFS_DISABLED) return QF_XFS; 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)) return QF_XFS; else if (type == GRPQUOTA && (info.qs_flags & XFS_QUOTA_GDQ_ACCT)) return QF_XFS; #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, "/")) return QF_ERROR; else if (type == USRQUOTA && (sbflags & XFS_QUOTA_UDQ_ACCT)) return QF_XFS; else if (type == GRPQUOTA && (sbflags & XFS_QUOTA_GDQ_ACCT)) return QF_XFS; #endif /* XFS_ROOTHACK */ } return QF_ERROR; } static int hasvfsmetaquota(const char *dev, struct mntent *mnt, int type, int flags) { uint32_t fmt; if (!quotactl(QCMD(Q_GETFMT, type), dev, 0, (void *)&fmt)) return QF_META; return QF_ERROR; } /* Return pointer to given mount option in mount option string */ char *str_hasmntopt(const char *optstring, const char *opt) { const char *p = optstring; const char *s; int len = strlen(opt); do { s = p; while (*p && *p != ',' && *p != '=') p++; /* Found option? */ if (p - s == len && !strncmp(s, opt, len)) return (char *)s; /* Skip mount option argument if there's any */ if (*p == '=') { p++; while (*p && *p != ',') p++; } /* Skip separating ',' */ if (*p) p++; } while (*p); return NULL; } /* Return if given option has nonempty argument */ static char *hasmntoptarg(const char *optstring, const char *opt) { char *p = str_hasmntopt(optstring, opt); if (!p) return NULL; p += strlen(opt); if (*p == '=' && p[1] != ',') return p+1; return NULL; } /* Copy out mount option argument to a buffer */ static void copy_mntoptarg(char *buf, const char *optarg, int buflen) { char *sep = strchr(optarg, ','); if (!sep) sstrncpy(buf, optarg, min(buflen, strlen(optarg) + 1)); else sstrncpy(buf, optarg, min(buflen, sep - optarg + 1)); } /* * Check to see if a particular quota is to be enabled (filesystem mounted with proper option) */ static int hasquota(const char *dev, struct mntent *mnt, int type, int flags) { if (!strcmp(mnt->mnt_type, MNTTYPE_GFS2) || !strcmp(mnt->mnt_type, MNTTYPE_XFS)) return hasxfsquota(dev, mnt, type, flags); if (!strcmp(mnt->mnt_type, MNTTYPE_OCFS2)) return hasvfsmetaquota(dev, mnt, type, flags); /* * For ext4 we check whether it has quota in system files and if not, * we fall back on checking standard quotas. Furthermore we cannot use * standard GETFMT quotactl because that does not distinguish between * quota in system file and quota in ordinary file. */ if (!strcmp(mnt->mnt_type, MNTTYPE_EXT4)) { struct if_dqinfo kinfo; if (quotactl(QCMD(Q_GETINFO, type), dev, 0, (void *)&kinfo) == 0) { if (kinfo.dqi_flags & DQF_SYS_FILE) return QF_META; } } /* NFS always has quota or better there is no good way how to detect it */ if (nfs_fstype(mnt->mnt_type)) return QF_RPC; if ((type == USRQUOTA) && (hasmntopt(mnt, MNTOPT_USRQUOTA) || hasmntoptarg(mnt->mnt_opts, MNTOPT_USRJQUOTA))) return QF_VFSUNKNOWN; if ((type == GRPQUOTA) && (hasmntopt(mnt, MNTOPT_GRPQUOTA) || hasmntoptarg(mnt->mnt_opts, MNTOPT_GRPJQUOTA))) return QF_VFSUNKNOWN; if ((type == USRQUOTA) && hasmntopt(mnt, MNTOPT_QUOTA)) return QF_VFSUNKNOWN; return -1; } /* 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 mount_entry *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 = str_hasmntopt(mnt->me_opts, MNTOPT_USRQUOTA))) { if (*(pathname = option + strlen(MNTOPT_USRQUOTA)) == '=') has_quota_file_definition = 1; } else if (type == USRQUOTA && (option = hasmntoptarg(mnt->me_opts, MNTOPT_USRJQUOTA))) { pathname = option; has_quota_file_definition = 1; sstrncpy(qfullname, mnt->me_dir, sizeof(qfullname)); sstrncat(qfullname, "/", sizeof(qfullname)); } else if (type == GRPQUOTA && (option = str_hasmntopt(mnt->me_opts, MNTOPT_GRPQUOTA))) { pathname = option + strlen(MNTOPT_GRPQUOTA); if (*pathname == '=') { has_quota_file_definition = 1; pathname++; } } else if (type == GRPQUOTA && (option = hasmntoptarg(mnt->me_opts, MNTOPT_GRPJQUOTA))) { pathname = option; has_quota_file_definition = 1; sstrncpy(qfullname, mnt->me_dir, sizeof(qfullname)); sstrncat(qfullname, "/", sizeof(qfullname)); } else if (type == USRQUOTA && (option = str_hasmntopt(mnt->me_opts, MNTOPT_QUOTA))) { pathname = option + strlen(MNTOPT_QUOTA); if (*pathname == '=') { has_quota_file_definition = 1; pathname++; } } else return -1; if (has_quota_file_definition) { int len = strlen(qfullname); copy_mntoptarg(qfullname + len, pathname, sizeof(qfullname) - len); } else { snprintf(qfullname, PATH_MAX, "%s/%s.%s", mnt->me_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 mount_entry *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->me_type)) goto add_entry; break; case QF_XFS: if (!strcmp(mnt->me_type, MNTTYPE_XFS) || !strcmp(mnt->me_type, MNTTYPE_GFS2)) goto add_entry; break; default: if (strcmp(mnt->me_type, MNTTYPE_XFS) && strcmp(mnt->me_type, MNTTYPE_GFS2) && !nfs_fstype(mnt->me_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 { fs_quota_stat_t dummy; if (!quotactl(QCMD(Q_XGETQSTAT, 0), "/dev/root", 0, (void *)&dummy) || (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(struct mount_entry *mnt, int type, int fmt) { if (mnt->me_qfmt[type] < 0) return -1; if (fmt == QF_RPC) return -1; if (mnt->me_qfmt[type] == QF_XFS) { if ((fmt == -1 || fmt == QF_XFS) && xfs_kern_quota_on(mnt->me_devname, type)) /* XFS quota format */ return QF_XFS; return -1; } /* No more chances for XFS format to succeed... */ if (fmt == QF_XFS) return -1; /* Meta format is always enabled */ if (mnt->me_qfmt[type] == QF_META) return QF_META; /* Check whether quota is turned on... */ if (kernel_iface == IFACE_GENERIC) { int actfmt; if (quotactl(QCMD(Q_GETFMT, type), mnt->me_devname, 0, (void *)&actfmt) >= 0) { actfmt = kern2utilfmt(actfmt); if (actfmt >= 0) return actfmt; } } else { if ((fmt == -1 || fmt == QF_VFSV0) && v2_kern_quota_on(mnt->me_devname, type)) return QF_VFSV0; if ((fmt == -1 || fmt == QF_VFSOLD) && v1_kern_quota_on(mnt->me_devname, type)) return QF_VFSOLD; } return -1; } /* * * mtab/fstab handling routines * */ 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 */ 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, autofsdir_allocated; char **autofsdir; #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: /* Prepare table of mount entries */ mnt_entries = smalloc(sizeof(struct mount_entry) * ALLOC_ENTRIES_NUM); mnt_entries_cnt = 0; allocated += ALLOC_ENTRIES_NUM; /* Prepare table of autofs mountpoints */ autofsdir = smalloc(sizeof(char *) * ALLOC_ENTRIES_NUM); autofsdircnt = 0; autofsdir_allocated = ALLOC_ENTRIES_NUM; while ((mnt = getmntent(mntf))) { const char *devname; char *opt; int qfmt[MAXQUOTAS]; 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 == autofsdir_allocated) { autofsdir_allocated += ALLOC_ENTRIES_NUM; autofsdir = srealloc(autofsdir, autofsdir_allocated * sizeof(char *)); } autofsdir[autofsdircnt] = smalloc(strlen(mnt->mnt_dir) + 2); strcpy(autofsdir[autofsdircnt], mnt->mnt_dir); strcat(autofsdir[autofsdircnt], "/"); autofsdircnt++; free((char *)devname); continue; } if (flags & MS_LOCALONLY && nfs_fstype(mnt->mnt_type)) { free((char *)devname); continue; } if (hasmntopt(mnt, MNTOPT_NOQUOTA)) { free((char *)devname); continue; } if (hasmntopt(mnt, MNTOPT_BIND)) { free((char *)devname); continue; /* We just ignore bind mounts... */ } if ((opt = hasmntoptarg(mnt->mnt_opts, MNTOPT_LOOP))) { char loopdev[PATH_MAX]; copy_mntoptarg(opt, loopdev, PATH_MAX); free((char *)devname); devname = sstrdup(loopdev); } /* Further we are not interested in mountpoints without quotas and we don't want to touch them */ qfmt[USRQUOTA] = hasquota(devname, mnt, USRQUOTA, flags); qfmt[GRPQUOTA] = hasquota(devname, mnt, GRPQUOTA, flags); if (qfmt[USRQUOTA] < 0 && qfmt[GRPQUOTA] < 0) { 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)) { errstr(_("Device (%s) filesystem is mounted on unsupported device type. Skipping.\n"), devname); free((char *)devname); continue; } 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[i].me_dir = NULL; memcpy(&mnt_entries[i].me_qfmt, qfmt, sizeof(qfmt)); mnt_entries_cnt++; } else free((char *)devname); /* We don't need it any more */ } endmntent(mntf); for (i = 0; i < autofsdircnt; i++) free(autofsdir[i]); free(autofsdir); 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) { while (++act_checked < mnt_entries_cnt) { if (!str_hasmntopt(mnt_entries[act_checked].me_opts, 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 mount_entry *get_next_mount(void) { int mntpos; if (!check_dirs_cnt) { /* Scan all mountpoints? */ if (!find_next_entry_all(&mntpos)) return NULL; mnt_entries[mntpos].me_dir = mnt_entries[mntpos].me__dir; } else { if (!find_next_entry_sel(&mntpos)) return NULL; mnt_entries[mntpos].me_dir = check_dirs[act_checked].sd_name; } return &mnt_entries[mntpos]; } /* * 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; } ��������������������������������������������������������������������������������������������������������������������quota-tools/set_limits_example.c��������������������������������������������������������������������0000644�0001750�0001750�00000002542�11723517743�017203� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "config.h" #include <sys/types.h> #include <sys/quota.h> #include <errno.h> #include <stdio.h> #include "pot.h" static 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); } } tatic 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 gid %ld : %s\n"), to, strerror(errno)); return (1); } } else { errstr( _("copy_group_quota_limits: Failed to get groupquota for gid %ld : %s\n"), from, strerror(errno)); return (1); } } main(int argc, char **argv) { gettexton(); copy_user_quota_limits("/dev/hda8", 152, 151); } ��������������������������������������������������������������������������������������������������������������������������������������������������������������quota-tools/quotaio_generic.c�����������������������������������������������������������������������0000644�0001750�0001750�00000010547�11650022303�016453� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * 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 <pwd.h> #include <grp.h> #include <stdlib.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; } static int scan_one_dquot(struct dquot *dquot, int (*get_dquot)(struct dquot *)) { int ret; struct util_dqblk *dqb = &dquot->dq_dqb; memset(dqb, 0, sizeof(struct util_dqblk)); ret = get_dquot(dquot); if (ret < 0) return ret; if (!dqb->dqb_bhardlimit && !dqb->dqb_bsoftlimit && !dqb->dqb_ihardlimit && !dqb->dqb_isoftlimit && !dqb->dqb_curinodes && !dqb->dqb_curspace) return 1; return 0; } /* Generic quota scanning using passwd... */ int generic_scan_dquots(struct quota_handle *h, int (*process_dquot)(struct dquot *dquot, char *dqname), int (*get_dquot)(struct dquot *dquot)) { struct dquot *dquot = get_empty_dquot(); int ret = 0; dquot->dq_h = h; if (h->qh_type == USRQUOTA) { struct passwd *usr; setpwent(); while ((usr = getpwent()) != NULL) { dquot->dq_id = usr->pw_uid; ret = scan_one_dquot(dquot, get_dquot); if (ret < 0) break; if (ret > 0) continue; ret = process_dquot(dquot, usr->pw_name); if (ret < 0) break; } endpwent(); } else if (h->qh_type == GRPQUOTA) { struct group *grp; setgrent(); while ((grp = getgrent()) != NULL) { dquot->dq_id = grp->gr_gid; ret = scan_one_dquot(dquot, get_dquot); if (ret < 0) break; if (ret > 0) continue; ret = process_dquot(dquot, grp->gr_name); if (ret < 0) break; } endgrent(); } free(dquot); return ret; } ���������������������������������������������������������������������������������������������������������������������������������������������������������quota-tools/Changelog�������������������������������������������������������������������������������0000644�0001750�0001750�00000131370�12015475551�014757� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Changes in quota-tools from 4.00 to 4.01 * fix compilation failure with --enable-bsd_behaviour=no (Jan Kara) * fix quota(1) for NFS mountpoints (Jan Kara) * fix reporting of huge quota limits over rpc (Jan Kara) * fix repquota to report all users on XFS (Jan Kara) * fixed edquota(8) for more users (Jan Kara) * remove fixed limit on number of autofs mount points (Jan Kara) * add quota type names to message catalogue (Jan Kara) * typo fixes, message changes for easier i18n (Jan Kara) * created Czech translation (Petr Pisar) * store PID of quota_nld into lock file (Petr Pisar) * warnquota: Fix manpage formatting (Jan Kara) * warnquota: Allow specifying of filesystems to check (Jan Kara) * add support for quotas on ext4 in system files (Jan Kara) * quotaon: Remove duplicated check for hasquota() (Jan Kara) * quotacheck: Fix warning about journaled quota for 3.0 and newer kernels (Jan Kara) * edquota: Fix localication of time units (Jan Kara) * rip out ALTFORMAT config option (Jan Kara) * add support for dynamic RPC block to support larger quotas (Petr Pisar) * check set limits fit into the range supported by RPC transport (Petr Pisar) * do not report missing utmp record to syslog (Petr Pisar) Changes in quota-tools from 4.00-pre1 to 4.00 * get_qf_name() does not check quota file presence (Petr Pisar) * report quotacheck failures by return code (Petr Pisar) * make global symbols static as possible (Petr Pisar) * implement repquota for filesystems without quota files (Jan Kara) * initialize v2r1 ddquot padding in dump (Jan Kara) * fix ddquot buffer leak (Petr Pisar) * fix check in setgraces() in setquota.c (Petr Pisar) * forbid grace time setting over RPC (Jan Kara) * fix synopsis and properly report errors during remote grace period setting (Jan Kara) * do not use real domains in warnquota example (Petr Pisar) * make RPC handle properly host names with colons (Jan Kara) * explain meaning of the second column in repquota output (Jan Kara) * initialize vfsold block and inode value boundaries for new quota file (Petr Pisar) * setquota manpage typo fix (John Bradshaw) * implement quotacheck for GFS2 (Abhijith Das) * add quotasync tool (Abhijith Das) * correct --no-mixed-pathnames documentation (Petr Pisar) * allow admin to not strip quota binaries while installing them (Jan Kara) * document --always-resolve at edquota and setquota (Petr Pisar) * comment example quotatab to silent warnquota (Petr Pisar) * improve comments in warnquota.conf (Ondrej Vasik) * fix help text for quotaoff (Ondrej Vasik) * make quota, setquota, and edquota recognize -h option (Ondrej Vasik) * check whether set limits fit into range supported by quota format (Jan Kara) * add next3 support (Amir G) * remove checking of filesystem type from hasquota() (Jan Kara) * create quota-nfs.sh script for nicer quota(1) output formatting on some NFS clients (Jan Kara) * add options for quota(1) modifying formatting of filesystem identificaion (Jan Kara) * minor updates of manpages (Jan Kara) * quotactl manpage was moved to man-pages package (Jan Kara) * fix quotaon to work properly with XFS filesystems (Eric Sandeen, Jan Kara) * fix quotaon to print all informational messages only in verbose mode (Jan Kara) * fix warnquota manpage to not speak about RPC (Jan Kara) * fix repquota to get latest quota info header (Jan Kara) * do not count system inodes into quota for ext[234] (Jan Kara) * improve detection of XFS kernel quota interface (Jan Kara) * support of GFS2 filesystem (Christoph Hellwig) * avoid memory corruption of NULL address (Petr Pisar) * fixup typos in manpages (Michael Meskes) * added german translation (Michael Bunk) * added --enable-static-link configure option (Jan Kara) Changes in quota-tools from 3.17 to 4.00-pre1 * don't try to set inode flags when getting them failed (Michalski Wojciech) * added liblber to the list of libraries needed for LDAP support (Michael Meskes) * Rewritten configuration script to create config.h (Jan Kara) * Use /proc/mounts for mountpoint scanning (Jan Kara) * Removed use of reserved identifiers (Jan Kara) * Improved manpage of quota_nld (Eddie Eyles) * Fixed long option handling of quota_nld (Jan Kara) * Fixed error reporting when rpc format specified on command line (Jan Kara) * Convert quota limits using rq_bsize from RPC request (Jan Kara) * Added noreturn attribute to die to avoid false warnings (Jan Kara) * 64-bit quota support, rewritten some code to allow clean integration (Jan Kara) * Improved header of quota an repquota output when -s option is used (Jan Kara) * Fixed mountpoint scanning when NFS mountpoint is specified on command line (Jan Kara) * Updated manpage of quotactl(2) (Jan Kara) Changes in quota-tools from 3.16 to 3.17 * Updated quotactl(2) manpage to mention possible ERANGE error (Jan Kara) * Fix hostname checking of rpc.rquotad. It could allow access even though hostname was in /etc/hosts.deny (Jan Kara) * do not allow setting of user's grace time when softlimit is not exceeded (Jan Kara) * fix reference to rpc manpage (anonymous reporter) * add EXT4 (not only EXT4DEV) to the list of supported filesystems (Mingming Cao) * fix setting of more than 31-bit block and inode limits (Gui Xiaohua) * fixed bug in error reporting when quota reading fails (Jan Kara) * added support for quota formats with hidden quota files (Jan Kara) * remove IMMUTABLE flag from quota file in quotacheck (Jan Kara) * fix bug in warnquota which could result in bogus hostname and domainname (anonymous reporter) * implemented writing of messages that user got below hard/soft limits to quota_nld (Jan Kara) * use PKG_CHECK_MODULES to check for DBUS (Ladislav Michnovic) * Implement setting of charset for emails sent by warnquota (Michael Meskes) * Added quota_nld to the list of installed programs (Jan Kara) * some typos fixes (Matthew Boyle) * fixed possible segfault when unpriviledged user run edquota (Matthew Boyle) * fixed format strings to use "%llu" and "%lld" instead of "%Lu" and "%Ld" (Ladislav Michnovic) * removed ssl, resolv, lber from the list of LDAP libraries since we don't need them directly (Jan Kara) * added limits.h include to quota_nld (Jan Kara) * fixed repquota to work with limits over 4 TB (Jan Kara, Michael Meier) Changes in quota-tools from 3.15 to 3.16 * added information message about journaled quota to quotacheck (Jan Kara, Alex Tomas) * added pointers to quota_nld and warnquota to some manpages (Jan Kara) * ported quota_nld to libnl-1.1 (Jan Kara) * let setquota batch mode accept comments and blank lines, add -c option (Jacky Bruno, Jan Kara) * print more verbose list of compile options when --version specified (Jan Kara) * quotaon(8) should work only on local filesystems (Ladislav Michnovic) * made possible to use quota rpc in mixed NFSv3 and NFSv4 environments (Jan Kara) * fixed compilation with openLDAP library versions 2.1 and 2.2 (Jan Kara) * always define allow_severity and deny_severity for older versions of libwrap (Martin Jacobs) * cleaned up host_access() handling (Jan Kara) * configure script now correctly reports checking of libwrap (Jan Kara) * added MPFS to the list of supported filesystems (Dave Boone) * all binaries are now stripped during installation (Jan Kara) * updated Polish translations (Jakub Bogusz) * fixed typo in a quotaon message (Jakub Bogusz) * fixed warnquota to check URI only if LDAP enabled (Michael Meskes) Changes in quota-tools from 3.14 to 3.15 * added a wrapper script around setquota which also updates LDAP (Stefan Adams) * implemented quota netlink daemon to listen to kernel netlink messages and send them to DBUS and / or write them to the console (Jan Kara) * modified configure scripts and warnquota to check for new LDAP library and allow use of URI (Jan Kara) * fix LDAP scripts to set VISUAL instead of EDITOR (Michael Meskes) * added ext4 filesystem to the list of supported filesystems (Jan Kara) * pot.o is now compiled with CFLAGS (Ladislav Michnovic) * use -fPIE for compilation when available (Jan Kara, Ladislav Michnovic) * fixed some more problems XFS quotaon (Kouta Ooizumi, Jan Kara) * fixed two mistakes in quotaon(8) manpage (Utako Kusaka) * added option -A to quota(1) to report all NFS mountpoints (Jan Kara) * fixed XFS handling to work with loopback mounted devices (Jan Kara) * fixed mountpoints scanning to make XFS -x delete command work (Jan Kara) * fixes of signed vs unsigned int issues (Jan Kara) * fixed a format string bug in reporting of raw grace times in repquota (Jan Kara) * added repquota(8) and quota(1) option for better parsable output (Jan Kara) * fixed error handling in edquota(8) when creating tmp file (Jan Kara) Changes in quota-tools from 3.13 to 3.14 * updated Polish translations (Jakub Bogusz) * print user/group names in error messages when cannot get quota information (Michal Marek, Jan Kara) * added option --always-resolve to force resolving even names with digits only (Jan Kara) * minor language corrections in manpages (Jan Kara) * implemented long options parsing for all quota tools (Jan Kara) * quota(1) has -f option to specify filesystem list (Jan Kara) * corrected some informal language in messages (Jan Kara) * we cannot even stat NFS mounts in local mode as server may be unreachable (Jan Kara) * fixed error messages in getprivs() (Jan Kara, Brian Morris) * made UID/GID prints unsigned (Matthew Kent) * fixed very verbose printing for quotacheck (Jan Kara) * fixed off-by-one bug in mount options parsing (Jan Kara) * implemented nicer message formatting for warnquota(8) (Jan Kara) * quota(1) has -w option to supress line wrapping for long device names (Jan Kara) * quota(1) prints grace time even if hard limit is reached (Jan Kara) * fixed journaled quota format detection in quotacheck (Jan Kara) Changes in quota-tools from 3.12 to 3.13 * fixed mistakes in several error messages, improved error reporting functions (Dmitry V. Levin) * volume label and UUID support for reiserfs (Jan Kara) * support for LABEL= and UUID= on a command line (Jan Kara) * parse NFSD export table to find pseudofilesystem root for NFSv4 (Jan Kara) * handle better when quota file should become empty (Niu YaWei) * minor manpage and help-text fixes (Jan Kara) * fixed quotacheck(8) to check each block only once (Jan Kara) * fixed quotacheck(8) messages about corrupted blocks (Jan Kara) * fixed quotacheck(8) to rename quota files after turning quotas off (Jan Kara) * added sanity check to quota reporting (Jan Kara) * fixed check for illegal references in quotacheck(8) (Jan Kara) * added NFSv4 to the list of supported fs types (Jan Kara) * updating of progress is now less frequent - should speedup quotacheck -v a bit (Jan Kara) * added printing of directories to quotacheck(8) (Jan Kara, Jan Engelhardt) * added dynamic mountpoint array allocation (Jan Kara) * made quotacheck(8) more friendly to journaled quota (Jan Kara) * changed configure to detect whether nls is needed (Tomasz Kloczko, Jan Kara) * added JFS into a set of supported filesystems (David Kleikamp) * added French translation (Jerome Schell) * fixed quota tools to set of grace time only after exceeding soft limit, not at reaching (Jan Kara) * fixed exit codes of setquota(8) and edquota(8) (Jan Kara) * updated Polish translations (Jakub Bogusz) * fixed "bashism" is Makefile (Michael Meskes) Changes in quota-tools from 3.11 to 3.12 * fixed bug in quotaon(8) reporting (Paul Szabo) * added manpages for xqmstats & quotastats (Max Vozeler) * fixed a few memleaks (Jan Kara) * fixed bug when root had no usage and limits (Jan Kara) * added a few perl wrappers for LDAP (Stefan Adams) * added note about availability of -r option to manpages (Jan Kara) * maximal number of groups is now got via sysconf (Nathan Scott) * added batch mode to the setquota(8) (Jan Kara) * added reference to setquota(8) to manpages of other tools (Jan Kara) * fixed bug in --port option of rquotad (Max Kalika) * updated quota documentation (Jan Kara) * disabling nls via configure (Jan Kara) * fixed warning when gettext not used (Peter Breitenlohner) * fixed typo in rquotad.8 (Peter Breitenlohner) * fixed compiler warning in quotacheck.c (Peter Breitenlohner) * added config option for putting some important binaries to /sbin regardless $(prefix) (Jan Kara) * added config option to warnquota(8) for CCing admin only specified amount of time before grace time runs out (Jan Kara) Changes in quota-tools from 3.10 to 3.11 * quota-tools should again use old RPC protocol when needed (Jan Kara) * add FIOQSIZE for x84_64 architecture (Jan Kara) * quotacheck(8) does not count quota files to usage (Jan Kara) * tools now honor journalled quota mount options (Jan Kara) * manpage of repquota(8) stated falsely that repquota works over RPC (Jan Kara) * added -T flag to quot(8) to avoid truncation of names (Andre Nathan) * added -q flag to quot(8) to avoid sorting of names (Andre Nathan) * added #include <paths.h> in quotasys.c to avoid compile problems on some systems (Jan Kara) * changed detection of filesystem to be able to parse comma separated list (Jan Kara) * fixed bug in quotacheck(8) which counted wrongly files larger than 2GB (Posta Zoltan) * fixed compile problem with quotacheck and new kernels (Michael Meskes, Jan Kara) * fixed typo in quotacheck manpage (Noel Koethe) * warnquota(8) can get mail addresses via LDAP (James Bourne) * warnquota(8) can avoid sending e-mail when user is over quota on mail partition (James Bourne) * fixed bug in quotacheck(8) which counted directories twice sometimes (Jan Kara) * edquota(8) now allows parameters in VISUAL/EDITOR env. params (Jan Kara) * reverted changes in detection of kernel from 3.10 - interface obsoleted in 2.6 kernel (Jan Kara) Changes in quota-tools from 3.09 to 3.10 * alternative port can be specified to rpc.rquotad by -p option (Jan Kara) * Fixed processing of device-backed loop mounts (Jari Ruusu) * Fixed fake error messages from rpc.rquotad (Jan Kara) * quota(1) now does not print info for NFS filesystems without quotas (Jan Kara) * XFS roothack option disabled by default (Nathan Scott) * added option to warnquota(8) to supress details of report (Marco van Wieringen) * fixed problems with multiple lines values in warnquota(8) (F. Depke) * changed detection of kernel interface so that it works even without /proc (Jan Kara, Johan Ekenberg) * updated Polish messages (Jakub Bogusz) * updated quotactl(2) manpage (Jan Kara) * fixed bug in -f option of edquota(8) (Jan Kara) * fixed formatting bug in warnquota(8) (Jan Kara) * added option -s (choice of more appropriate units) to warnquota(8) (Jan Kara) Changes in quota-tools from 3.08 to 3.09 * minor update of quota(1) manpage (Jan Kara) * quotacheck(8) now remembers only hardlinked files and not all inodes with n_link > 1 (Jan Kara, Jan Kasprzak) * quotacheck(8) doesn't store structures for all users in old quota format (Jan Kasprzak) * fixed minor bug in documentation (Jan Kara, Lucas Brasilino) * repquota(8) handles multiple entries in /etc/passwd better (Jan Kara) * made tools not to touch mountpoints mounted without quota options (Jan Kara) * added option for ignoring autofs mountpoints to quota(1), quot(8), repquota(8) and rpc.rquotad(8) (Jan Kara, Paul Szabo) * updated xqmstats (Nathan Scott) Changes in quota-tools from 3.07 to 3.08 * Fixed infinite loop in quotacheck under RH7.1 (?) * Made quota tools aware of /etc/services (H. J. Lu) * Updated edquota(8) and setquota(8) to allow setting of individual grace time (Jan Kara) * Fixed bug in convertquota(8) when quota was turned on during converting (Jan Kara) * Add support for XFS filesystems without root special casing (Christoph Hellwig) * XFS documentation updates (Nathan Scott) Changes in quota-tools from 3.06 to 3.07 * Added creation of bin and sbin dir during make install; removed hardcoded /sbin directory for some utilities. (Jan Kara) * Add support for 32 bit uid's and gid's when using EXT2_DIRECT. (Michael Meskes) * updated manpage of rpc.rquotad (Jan Kara) * setquota is disabled by default in rpc.rquotad (Jan Kara) * setquota using RPC is disabled by default in configure (Jan Kara) * rised maximal number of mountpoint to 256 (Jan Kara) * small fix in configure (Nathan Scott) * small fix in quotacheck(8) docs (Jan Kara) * fixed quotacheck(8) to continue when old quota files were not found (Jan Kara) * quota(1) now doesn't report failure to connect to rpc.rquotad server when -Q specified (Jan Kara) * add quota(1) option -l (report only local filesystems) (Jan Kara) * warnquota(8) now also mails specified member of the group about violation of the group quotas when -g option is specified (Jan Kara) * added options by which user can specify whether repquota(8) should translate names in big chunks by scanning all users or individually. Added automagic detection using nsswitch.conf which behaviour should lead to faster translating. (Jan Kara) Changes in quota-tools from 3.05 to 3.06 * fixed caching of libwrap configure result (Jan Kara) * fixed copying of quotafile name from mtab (?) * warnquota.conf is now installed in config dir (Jan Kara) * updated format detection to reflect changes in kernel interface in 2.5.18 (Jan Kara) * fixed scanning of non-mountpoint directories (Jan Kara) * fixed detection of XFS format (Jan Kara) * fixed printing of 'over softlimit sign' in quota(1) (Jan Kara) Changes in quota-tools from 3.04 to 3.05 * quota tools should honour 'noquota' mount option (Jan Kara) * fixes in manpages (Arkadiusz Miskiewicz) * fixed detection of libwrap in configure (Arkadiusz Miskiewicz) * added forgotten ROOTDIR to path to gettext catalogs (Arkadiusz Miskiewicz) * quotacheck uses newest format supported by kernel when creating new quota files (Jan Kara) * fixed bug in IO initialization when -F xfs was given (Jan Kara) * added support for quota 6.5.1 (Jan Kara) * quotaon(8) now can get format parameter (Jan Kara) * fixed bad return value of quota(1) (Jan Kara) * fixed bug in quota format format detection (Jan Kara) Changes in quota-tools from 3.03 to 3.04 * added -D_FILE_OFFSET_BITS=64 to Makefile - fixes problems with large files with some libcs (Michael Meskes) * added -p (print state) to quotaon (Vladimir Linek, Jan Kara) * made quotaon(8) write better error messages (Jan Kara) * make install now creates man directories (Jan Kara) * added -q <quotatab> and -c <configfile> options to warnquota(8) (Jan Kara) * added some notes about quotatab to warnquota manpage (Jan Kara) * fixed bug in options parsing of warnquota(8) (Michael Meskes) * ignore automount mountpoints (Philippe Troin) * fixed minor bug in printing grace times (Jan Kara) * fixed quotaon(8) behaviour when it sees newer kernel then it's able to handle (Jan Kara) * minor formatting change in quotactl(2) manpage (Nathan Scott) * init_io() is now more paranoid about quota turned on in kernel (Jan Kara) Changes in quota-tools from 3.02 to 3.03 * added -f <filesystem> option (perform operation only for given filesystem) for edquota (Jan Kara) * quotacheck now skips quota file scanning when file not found (Jan Kara) * repquota shouldn't show grace times when softlimit is not exceeded (Jan Kara) * removed bogus error message in mountpoint scanning (Jan Kara) * fixed mountpoint scanning initialization (solved rpc.rquotad SEGFAULT) (Jan Kara) * rpc.rquotad now doesn't need mountpoint for quota operations (Jan Kara) * fixed compilation on sparc (Michael Meskes, Jan Kara) Changes in quota-tools from 3.01 to 3.02 * added -n option (don't resolve names) to repquota (Jan Kara) * quota tools now correctly handle zero grace times in old format (Jan Kara) * edquota, setquota commit just grace times and flags - fixed possible races when used on live filesystem (Jan Kara) * another fix to quotastats (Jan Kara) * added check to format detection for bad endianity (Jan Kara) * implemented conversion of files with bad endianity (Jan Kara) * fixes in warnquota, warnquota now allows line splitting by '\', text of mail can be specified in config file (Jan Kara) Changes in quota-tools from 3.01-final to 3.01 * quotastats should now work better on old kernels (Jan Kara) * quotacheck is more strict in checking it's arguments (Jan Kara) * edquota and setquota should be now save to run for working user (number of used blocks and inodes could be wrong in previous versions) (Jan Kara) Changes in quota-tools from 3.01-pre9 to 3.01-final * quotacheck is using ext2_ino_t if defined (Jani Jaakkola, Jan Kara) * rpc.rquotad now closes stdin, stdout unless run on foreground (Jani Jaakkola) * setquota can be disabled in rpc.rquotad by commandline option (Jani Jaakkola) * quota-tools should now work well also on RH 7.1 (Anders Blomdell, Jan Kara) * quotacheck makes backup files only when told by option (Preston Brown) * quotacheck now uses vfsv0 format when no quotafile is found (Jan Kara) * fixed mountpoint scanning bug when bad mountpoint was specified (Jan Kara) * fixed bug when device was specified instead of mountpoint (Preston Brown) * fixed bug when scanning mountpoint NFS mounted filesystem (Jan Kara) * repquota now resolves more names at once which makes it a lot faster (Jan Kara) Changes in quota-tools from 3.01-pre8 to 3.01-pre9 * Improved host access handling (Jan Kara) * Improved RPC error reporting (Jan Kara) * Fixed bug in quotaon when run of kernel with XFS (Jan Kara) * Implemented new mtab scanning with fallback to fstab when mtab not found (Jan Kara) * Improved speed of repquota for old quota format (Jan Kara) * New Makefile style (Jan Kara) * Fixed bug in configure in detecting of e2fslib (Jan Kara) * Implemented automatic choice of units in quota(1) and repquota(8) (Jan Kara) Changes in quota-tools from 3.01-pre7 to 3.01-pre8 * Fixed typo in option in convertquota. (Jan Kara) * Grace times are updated when quota limits are set. (Jan Kara) * Fixed possible segfault in rpc.rquotad when no filesystems with quota were found. (Jan Kara) Changes in quota-tools from 3.01-pre6 to 3.01-pre7 * Fixed a bug in quotacheck (SEGFAULT on -aR) (Jan Kara) * Fixed bug in rquota (grace times) (Jan Kara) Changes in quota-tools from 3.01-pre5 to 3.01-pre6 * Fixed bug in quotacheck for new quota format (it created corrupted quota files). (Jan Kara) * Fixed bug in version reporting for quot. (Jan Kara) * repquota now has -t option - when specified it will be truncating names so output will be nicer (Jan Kara) Changes in quota-tools from 3.01-pre2 to 3.01-pre5 * Fixed endian bug in the ext2 mount by LABEL or by UUID handling code, and added XFS support to this code also. (Nathan Scott) * Fix bug in handling of multiple mount points sharing the same device. (Jan Kara) * Fix warnquota output for devices with long names. (Jan Kara) * Updated man pages. (Jan Kara, Nathan Scott) * Added a port of the BSD quot(8) utility, with XFS support. (Nathan Scott) * Added xqmstats(8) utility for reporting activity statistics for the XFS Quota Manager - XQM. (Nathan Scott) * Fix up numerous compiler warnings and all the minor problems that revealed - package now compiled with -Wall by default. (Jan Kara, Nathan Scott) * Rewrote the error output handler (now uses errstr function) which also displays the correct programname of the program issueing the error. * Additional configure option BSD_BEHAVIOUR for more the old BSD behaviour as wanted by some people. * EOF -> -1, sprintf -> snprintf fixes * Don't turn quotas on on NFS * Fixed quota format detection, related bugs in quotaon * IO code now allows readonly access, doesn't open quotafile when not needed * Fixed bug in old quotaformat initialization * quota(1) now exits with nonzero exitcode when over quota * Manpage cleanup Changes in quota-tools from 2.00 to 3.01-pre2 * This is a complete rewrite of the quota package, most importantly adding support for the new Linux quota format and also support for XFS quota. * The internal data structures and algorithms were redesigned and rewritten by Jan Kara (jack@ucw.cz) so that different versions and different types of quota can be used with these tools. * Support for XFS quota has been added by Nathan Scott (nathans@sgi.com). * Add options like RPC, ALT_FORMAT, RPC_SETQUOTA, EXT2_DIRECT to configure. (Jan Kara) * Fix atoi() -> strtol() and detect mistakes in numeric input. (Jan Kara) * Add '-V' option to all tools to display the version. (Jan Kara) * Reworked time conversion routines. (Jan Kara) * setquota - added -t parameter and allow variable number of filesystems to be specified. (Jan Kara) Changes in quota-tools from 1.70 to 2.00 * Added patches from Steven Walker <smw8923@cmsu2.cmsu.edu> for supporting rpc_setquota call and tcp-wrappers check in rquotad. * Splited quota manipulation from setquota, edquota, quota etc. to quotaops.c so things are coded only once. Also added support for remote quota editing and setting using rquota extensions. * Fixed problems with parsing of /etc/fstab in hasquota.c (incorrectly assumed that it was the only option followed by an '='). Patch by Simon Huggins <huggie@earth.li>. * Extracted quota-io into quotaio.c so we only need to update repquota.c and quotaio.c when we change the way quotas are stored in the quotafile for bigger uids and gids. * Added prototype user copying to setquota ala edquota -p only this time only for a specific filesystem. * Fixed quota tools for quotas bigger then 4 Gb. Patch by Stephen C. Tweedie <sct@redhat.com> * Changed rpc.rquotad to scan all device entries in /dev to support also devfs systems and systems with special hardware RAID controllers. * Added autoconf support to the quota-utils. Patches by Andreas Gruenbacher <a.gruenbacher@bestbits.at> * Added extra filesystem types to mntent to reflect the current linux filesystems * Rewrote hasquota.c to check for the MNTOPT_QUOTA option. (Request from Phil Stracchino <alaric@babcom.com>) * Removed searching of /dev dir from rquota_server. Only lookup mounted filesystems. (Patch by Roman Kagan <Roman.Kagan@itep.ru>) * Added gettext NLS support all credits go to the guys named in the README.gettext. * Added the redhat patches to the standard tree. * blocksize patch * fhs patch * hjl patch * label patch * SPARC patch * Changed Q_SETQUOTA to Q_SETQLIM in quotaops.c for the putprivs function. This fixed a problem where we restore bogos usage info by edquota etc. when a user resets its quota usage while running for example edquota. We should only change the limits because thats the only things we can change using these kind of tools. (Bug report by Dr. Michael Meskes <michael@fam-meskes.de> from the Debian bug-archive) * Added numeric option to quota and setquota to allow to set quota for users/groups not in the localy known through name-services. (Modified the patches send by Oscar Martín <oscar@cdrtcampos.es>) Changes in quota-tools from 1.65 to 1.70 * Fixed problems when turning off one type of quota taking offline the other type too. * Fixed bugs as reported on bugtraq for negative ids and problems with usernames with only digits. * Added setquota (to se quotas from the commandline) as send to me by Martin Bene <mb@sime.com> Changes in quota-tools from 1.60 to 1.65 * Created new diffs again for the newer kernel (2.1.[78]x). * Added sample program that copies quota-settings from one user to an other. * Added /etc/quotatab support as developed by Jon Lewis <jlewis@inorganic5.fdt.net> * Added some changes to /usr/src/linux/fs/nfsd/vfs.c to support quotas for the kernel-nfsd too. (Most other filesystems are gone and the ones remaining either don't need quotas or are not used by big groups of users.) Changes in quota-tools from 1.55 to 1.60 * Added new option to kernel root_squash which means when that option is set the kernel system treats root as any normal user and he cannot write to any file anymore without obeing the quota limits. * Added support for root_squash to quotaon and quotaoff using the new rsquash option in mntent. In the run also rewrote the hasquota function. * Added patches to Makefile.std which should make it more FSSTND compliant. * Added extra check to rpc.rquotad to check the special device type when scanning the /dev dir for the right device. Changes in quota-tools from 1.52 to 1.55 * Added all patches and enhancements I collected the last few months. (As always some have undergone some rewriting and are only a special option. But they are in) * Changed check on ruid in edquota to an access-check on the quota-files. If you have write permissions on the quota-files as a group its probably ok to allow you to change the quotas. If not the system operator should take apropriate actions. Install edquota SUID-root if you want people who are able to write to your quotafiles to change quotas. If you don't install it SUID root it will only update the files which can give strange problems with the kernel overwriting your updates. * Added the EPS-file of the sheets from Remy Card which he used at the Berlin Linux seminar. And because they describe everything in detail its a nice enhancement to the current HTML docs. Changes in quota-tools from 1.50 to 1.52 * Hopefully fixed some problems with makefiles and the like. * Did some rewrite on the mountlist handling, removed limit on number of superblocks by allocating them within the mountlist. (This code is not available within the standard kernel. Until I find the time and feel like it I will put all my new enhancements in my very own (just a bit different) kernel sourcetree back into the mainstream kernels.) Changes in quota-tools from 1.34 to 1.50 * Wrote some new docs, right into html use Mosaic, Netscape or lynx or whatever HTML-browser to see whats in. Also did the manual-pages, its just a quick hack hope this helps people using quota. * Added DIRECT EXT2 access to quotacheck which should make scanning ext2 disks quite some faster. On the other hand you now need the ext2fs libs to compile the quotacheck program. (Enhancement by Edvard Tuinder) * Added dquot_operations to include/linux/fs.h * Changed include/linux/quota.h according to new standard. * Changed fs/dquot.c according to new standard. * Added support to quotaon-systemcall for initializing the superblock with a pointer to the dquot operations. * Remove fs/fileio.c and include/linux/fileio.h including all references to it. * Added support to the different filesystems to call the new dquot_alloc and dquot_free functions on block/inode allocation or freeing. (currently ext2) * People can add support to any filesystem if they want, for now I have been lazy and only implemented it for ext2-fs. Which by the way is probably the most difficult of all the filesystems. If one feels up to it you can try adding it to your favorit filesystem. I will accept patches, and include them with or without changes. * Added some patches for dynamic allocation of quotafilenames in hasquota. (patches by Remy Card) * Rewrote quota_transfer again, as a never ending story... * A new run off cleanups have been taking place, removed the QF_OPENING and QF_CLOSING flags because we don't need them anymore. The new code uses dquot pointers. If we initialize the dquot pointer after we have setup everything we don't have do be afraid that we get dqget calls while we don't want them. * Fixed some bugs with not dropping dquot pointers which lead to memory leaks in the long run because dquots kept being hold because the kernel thought it was still being used. * Added some stats to the code which can be viewed with quotastats. Not real interesting at the user level but quite handy debugging the quota system. Changes in quota-tooles from 1.33 to 1.34 * Changed hasquota.c to not insert a slash when the mnt->mnt_dir already ends with a slash. So something like //quota.user shouldn't happen anymore. * Cleaned up fs/fileio.c, removed some unneeded dummy_inodes in unlink and rmdir vfs functions. Now rely on incrementing i_count when deleting a dir or file and release it when I iput the inode. Should work because when a executable is running when it gets deleted this also happens. Also renamed and cleanup the rest of the funtions. vfs_rename function should now also work for a hardlinked file. * Changed vfs_chown functions to reset SUID and SGID on a chown because the new kernel wants that. * Changed locking on I/O to use semaphores instead off the mnt_flags used before. The old stuff could lock quota easily probably because the operation wasn't atomic. This should now be fixed. * Fixed check_bdq to only give back a available blocks when the current number of blocks are below the hardlimit. There was a bugfix for this one so I applied that. * Changed has_quota funtion to use a static buffer instead of mallocing one everytime it needs one. Hope this helps with the reported memory leak on the rquotad. * Fixed some little bugs in dquot.c with the setting of the QF_OPENING flag and not resseting it on failure of opening the quotafile. * Added changes needed because the VFS-layer changed to use iattr structs for the notify_change function. * Fixed quota_transfer to work again with the new iattr structs, hopefully it works ok now. It was brought to my attension that it wasn't working the way it should in the old version. So I first checked out the fix that I received, but that didn't solve the problem either so I fixed it myself. * Combined the new writeaccess stuff with the stuff I already had. Also cleaned up vfs layer some more because of the use of the new vfs_getwriteaccess and vfs_putwriteaccess functions. This also involved the quotaon function that should now return a propper errno on failure and not the standard EIO that it was in earlier versions. Changes in quota-tools from 1.32 to 1.33 * Ported the stuff back to the normal kernel to make a diff-file quite easy. * Fixed some typos that could trigger a kernel panic because the locking gets killed when a quota is exeeded. * Fixed the stuff to work with the the new-tty-drivers. * This patches aren't that well tested on the machines I use because I use a complete different kernel over here. But thats why this is called BETA software. The bigfiles in this package are copies of the files used in my kernel so some thing are tested more then others. * Fixed quotacheck not to memset the whole quota when there are no blocks allocated by this user. Changes in quota-tools from 1.31 to 1.32 * Fixed diff-files, the are now made as unified diffs. * Checked the specifications for the rquota service, I was correct we only need to respond to udp connections. Changes in quota-tools from 1.3 to 1.31 * Changed quotacheck program to stuff directories it encounters on a directory stack and check them later on. This way there is at any time one directory opened for reading. In the old situation it could happen that more then one directory were open at the same time and with nasty directory structures this could give to much open directories at ones, leading to an error by the O.S. * Added some hooks for debugging the memory usage by the program, and make the stdout used for the -v flag non-buffered for more speed. * Added variabele to mountstruct for flags, now we can mask when we are opening or closeing a quotafile, when we are we may not give out pointers with the dq_get function, otherwise we run into problems later on. * Ok updated fs/*.c missed patch to fs/inode.c that solves a race condition. * Added vfs_rename function that takes care of renaming files on top of already existing files. We were missing those ones, thanks to David Black for reporting this. If there are still problems I will hear so and try to fix them as soon as I can. Changes in quota-tools from 1.2 to 1.3 * We only reply to rpc_quota_request made to the udp port of the rquotad, I just removed support for the TCP service, I don't think it's needed to have the TCP service for just exchanging about 40 bytes of data. Too much overhead setting up a TCP connection. * Changed vfs_write function within fileio.h to be a bit smarter. If the fileposition + number of bytes to be written is less then the current size of the file we should even bother checking it. And if the number of wanted_blocks equals to 0 why even bother checking the quota no changes are made anyway. * Rewrote the quota stuff to be much more flexible, we now use pointers that are located within the inode for fast lookup. This is a bit more to setup but is much faster when used over and over again. Its based on the setup used for inode caching and is mostly rewritten code with some extensions that were needed for the dquot structs. And of course a lot extra because dquot aren't exactly inodes. * Ok file is called dquot.c again because it specific to diskquotas. If we ever get process quota, we have to move the system-call interface to the kernel dir. * splitted fileio header into fileio.c and fileio.h. Fileio.c contains the code for all the functions, fileio.h contains the prototypes for the functions when quota is enabled and defines to the the default inode operations if it is disabled. * Moved device management code to the file fs/super.c and made it a bit more general. The stuff now can also be used for other purposes. For now it contains the devicename, the directory the filesystem is mounted on, a pointer to the superblock and the quota expire times and filepointers, this can be extended in the future and this can be used for other purposes then only quota. Its in super.c because it is related to mounting a filesystem. The rootfilesystem is a special case for which I don't have a nice solution right now. * Cleaned up the file file_table.c and renamed it to file.c, otherwise we should call inode.c inode_table.c etc. More is static now, the file_table isn't accesable anymore from everywhere, and the functions that need the info within file.c should be located within that file. A good example is the function used by the vhangup code, it now calls a routine within file.c and so we don't have export any data anymore. * changed decrement quota to reset the DQ_INODES and DQ_BLKS flag on a decrement of a quota. It seems that we should bark again when one goes over his quota after he removed something, ok should work this way. * changed set_dqblk to set the grace period when a new usage is set and one exceeds his softlimit by that operation. Better then just setting the graceperiod when he allocates any more inodes or blocks. Only can give surprises when logging in but who cares they can ask the sysadmin to give them a hand with cleaning there dirs. * quotaoff is very simple now just reset all the pointers that point to a dquot and trash the cache for all dquots that are related to the device being turned of. This way the next time you put it on the stuff get read again from disk and not from the cache. * changed most of the file structs to be a filepointer and request it with get_empty_filp. This way we allocate it from the file_table which is more the way it should be, Ok I know the dummy_inodes isn't that nice either, but for that we don't have an other choice. Also it makes live much easier this way. See the core dump stuff. * used some more constants for setting up the file pointers, this should make it easier to read. So ok Edvard ? * rewrote most functions such as quota_alloc, quota_remove and quota_transfer to use a for loop which counts from 0 to the number of quotas -1. This way it should be easy to extend the quota stuff to maintain even more types of quota. (At the moment I can think of one more, what about quotas for a processgroups) :-) * rewrote quota_transfer, its still the most complicated function of the three manipulate functions, but it looks much cleaner then the one we had. * changed the system-call interface again this should be the last time, hope to have it made more intelligent now, most of the calls are quite the same, so just set flags and call one functions. Saves some functions. * And more cleanups to the vfs-layer. Did a kind of indent on all the sources in the fs-dir by hand. All references to file pointers are now done by a variable that is called filp. This is done to be a bit more consistent all through the code. Before is was called file, filp, f etc. * As of the indent I changed all tabs to be 3 spaces this makes it a bit larger but much better to read. * Someone reported that there are problems with fstab when you use something like usrquota=/usr/adm/quota.user,grpquota=/usr/adm/quota.grp. I don't know if the problems is also in the new libs, if so I have a replacement here for the entire mntent stuff. I wrote this way back and it work ok so if you have problems mail me and I will send you the sources. For now I didn't include it yet in the standard mainline distribution. * Ok added hooks to the fork code forgot that, ok this has cost me some searching. We must doe an vfs_open_filp when a process forks and the filepointers are copied or incremented. Changes in quota-tools from 1.1 to 1.2 * Changed repquota.c to display at max 8 chars of username. * Changed rquota_svc.c and rquota_server.c to handle both version 1 and 2 requests. Now we should be able to communicate with sun systems. SUN systems send out version 1 request which we can handle now. * Changed quota.c to first send out a version 2 rquota request and if that fails to try it with a version 1 request. Now we should be able to query a rquotad on a sun-server exporting a NFS disk. * Changed kernel diffs, now use a header file fileio.h with vfs functions for writing, truncating, creating files/nodes. This cleaned up the kernel diffs quite a bit. (Should have done this way back, but it is done now) * Fixed some small bugs with handling graceperiods again. Changed the code in the systemcall interface all bugs should be gone now there. * Wrote a new program warnquota. No manpage yet but it has no flags so that's simple. You can run this from your crontab just like you run quotacheck every night from cron. This program mails a message to all users that violated the quota system. * Changed fileio.h with unlinking and rmdir to make a copy of the inode. Hope this fixes some problems we have seen with xiafs. It isn't to bad either should have been this way from the beginning. A pointer to a inode that is removed is a bit to tricky a copy in local memory is much saver. * Changed fs/quota.c to not check if the quotafile is on the same device as the device for which it contains info. Found that in a document but it's silly and so it's removed now. Who cares where you put it as long the kernel can find it and it is the right format. (Now something like usrquota="/var/adm/quota_src.user" should work :-)) * Changed edquota behaviour with -p flag. It now copies the current usage to the new situation. Changes in quota-tools from 1.0 to 1.1 * Moved check to test on quota on a certain filesystem to seperate file hasquota.c * Changed hasquota.c to use quotafile given in fstab file instead of the default name of a quotafile. We now can define ourself where to put our quotafile. Something like "usrquota=/usr/adm/quotasrc.user" * Changed graceperiod counting was doing it the wrong way around. Now we add the expiretime to the current time and that is the grace-period a user has before we see a softlimit as a hardlimit. * Changed allocation when not enough blocks can be allocated from ones quota. Now you get as many blocks as you can affort yourself and not as in the earlier version, nothing. This was a bit of a bitch to tackle but it seems to work ok now for regular files and core-files. * Changed the quota.h file to include a prototype for a new function blocks_to_isize that calculates the maximum isize for a file when allocating less blocks than requested. Also included macro's for min() and max(). * Added rquotad program for own convinience, this was build from scratch with only the rquota.x file. It seems to work quite nice between LINUX machines don't have the resources to test it with other then LINUX machines. We probably need a new version number for this type of rquota. Something like rquota version 2 or something like that. * Changed quota program to use a rpc-call to the rquotad on one of you disk server machines. See #ifdef RPC in quota.c. Use small timeout because I don't wanna wait to long when a machine is down. Increase it when you have problems with slow hosts. * Rewrite of quotacheck program. This one is much faster, about 60%. Thanks to Edvard for this big improvement. * Changed namei.c to iput the inode of a dir when doing a remove of a dir. I never had problems with it but it seems that ext2 doesn't care to much when you unlink a dir while you have the inode still open. Fixed it and it works now ok also on xiafs which had problems with it, and of course the fragment should have give this error because you have to iput the dir before you remove it. * Changed source of quotacheck to create new quotafile with at least the gracetimes. Now there should never be a problem when turning on quota with the quotactl systemcall after one has run quotacheck to create the correct quotafiles. * Changed code of quota.c to read MOUNTED(mtab) instead of FSTAB(fstab) when showing quotainfo. ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quota-tools/quotaio_v2.c����������������������������������������������������������������������������0000644�0001750�0001750�00000037273�11650022303�015373� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * 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); d->dqb_pad = 0; /* Initialize because of qtree_entry_unused() scan */ 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; h->qh_info.dqi_max_b_limit = ~(uint32_t)0; h->qh_info.dqi_max_i_limit = ~(uint32_t)0; h->qh_info.dqi_max_b_usage = ~(uint64_t)0; h->qh_info.dqi_max_i_usage = ~(uint32_t)0; } 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; h->qh_info.dqi_max_b_limit = ~(uint64_t)0; h->qh_info.dqi_max_i_limit = ~(uint64_t)0; h->qh_info.dqi_max_b_usage = ~(uint64_t)0; h->qh_info.dqi_max_i_usage = ~(uint64_t)0; } } 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; h->qh_info.dqi_max_b_limit = ~(uint32_t)0; h->qh_info.dqi_max_i_limit = ~(uint32_t)0; h->qh_info.dqi_max_b_usage = ~(uint64_t)0; h->qh_info.dqi_max_i_usage = ~(uint32_t)0; } 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; h->qh_info.dqi_max_b_limit = ~(uint64_t)0; h->qh_info.dqi_max_i_limit = ~(uint64_t)0; h->qh_info.dqi_max_b_usage = ~(uint64_t)0; h->qh_info.dqi_max_i_usage = ~(uint64_t)0; } 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 { if (check_dquot_range(dquot) < 0) { errno = ERANGE; return -1; } qtree_write_dquot(dquot); } return 0; } static int v2_scan_dquots(struct quota_handle *h, int (*process_dquot) (struct dquot *, char *)) { 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; } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quota-tools/quotaio_xfs.h���������������������������������������������������������������������������0000644�0001750�0001750�00000014531�11650022303�015641� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * 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) /* * Accounting values. These can only be set for filesystem with * non-transactional quotas that require quotacheck(8) in userspace. */ #define FS_DQ_BCOUNT (1<<12) #define FS_DQ_ICOUNT (1<<13) #define FS_DQ_RTBCOUNT (1<<14) #define FS_DQ_ACCT_MASK (FS_DQ_BCOUNT | FS_DQ_ICOUNT | FS_DQ_RTBCOUNT) /* * 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 */ �����������������������������������������������������������������������������������������������������������������������������������������������������������������������quota-tools/setquota.8������������������������������������������������������������������������������0000644�0001750�0001750�00000010103�11650022303�015054� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������.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 \-u | .B \-g ] [ .B \-F .I quotaformat ] .I block-grace .I inode-grace .B \-a | .I filesystem... .LP .B setquota .B \-T [ .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 leading 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 --always-resolve Always try to translate user / group name to uid / gid even if the name is composed of digits only. .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 corresponding 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) �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quota-tools/quot.h����������������������������������������������������������������������������������0000644�0001750�0001750�00000010511�11661012724�014272� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * 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, const char *fsdir); /* * === End of XFS specific types and definitions === */ ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quota-tools/quotaio_rpc.c���������������������������������������������������������������������������0000644�0001750�0001750�00000003473�11650022303�015623� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * 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 int rpc_init_io(struct quota_handle *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 = { init_io: rpc_init_io, read_dquot: rpc_read_dquot, commit_dquot: rpc_commit_dquot }; /* * Define maximal values RPC client can transmit to server. */ static int rpc_init_io(struct quota_handle *h) { #ifdef RPC h->qh_info.dqi_max_b_limit = ~(uint32_t)0; h->qh_info.dqi_max_i_limit = ~(uint32_t)0; h->qh_info.dqi_max_b_usage = (~(uint32_t)0) << QUOTABLOCK_BITS; h->qh_info.dqi_max_i_usage = ~(uint32_t)0; return 0; #else return -1; #endif } /* * 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 } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quota-tools/quotaon.8�������������������������������������������������������������������������������0000644�0001750�0001750�00000014261�11650022303�014706� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������.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 -x, --xfs-command enforce Switch on limit enforcement for XFS filesystems. This is the default action for any XFS filesystem. This option is only applicable to XFS, and is silently ignored for other filesystem types. .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 off limit enforcement for XFS filesystems (perform quota accounting only). This is the default action for any XFS filesystem. This option is only applicable to XFS, and is silently ignored for other filesystem types. .TP .B -x, --xfs-command account This option can be used to disable quota accounting. It is not possible to enable quota accounting by quota tools. Use .IR mount (8) for that. This option is only applicable to XFS filesystems, 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) �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quota-tools/pot.c�����������������������������������������������������������������������������������0000644�0001750�0001750�00000000652�11650022303�014074� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#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 } ��������������������������������������������������������������������������������������quota-tools/quotaio_tree.c��������������������������������������������������������������������������0000644�0001750�0001750�00000035444�11650022303�016001� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * 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); free(ddquot); 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; free(ddquot); die(2, _("Cannot read quota structure for id %u: %s\n"), dquot->dq_id, strerror(errno)); } info->dqi_ops->disk2mem_dqblk(dquot, ddquot); } free(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; } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quota-tools/quotaon.h�������������������������������������������������������������������������������0000644�0001750�0001750�00000001023�11661012460�014763� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * 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 typedef int (newstate_t) (struct mount_entry * mnt, int type, char *file, int flags); extern int xfs_newstate(struct mount_entry *mnt, int type, char *file, int flags); extern int pinfo(char *fmt, ...); �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quota-tools/xqmstats.8������������������������������������������������������������������������������0000644�0001750�0001750�00000001124�11442151253�015104� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������.\" 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). ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quota-tools/warnquota.c�����������������������������������������������������������������������������0000644�0001750�0001750�00000075773�11723520336�015345� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * 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> * * 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 pipe: %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. Not sending mail.\n"), offender->offender_name); 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(int fs_count, char **fs) { 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(fs_count, fs, USRQUOTA, -1, IOI_READONLY | IOI_INITSCAN, 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(fs_count, fs, GRPQUOTA, -1, IOI_READONLY | IOI_INITSCAN, 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] [filesystem...]\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(argc - optind, argc > optind ? argv + optind : NULL); wc_exit(0); return 0; } �����quota-tools/quotaio.h�������������������������������������������������������������������������������0000644�0001750�0001750�00000014333�11661007725�014776� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * * 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 <stdint.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 */ #define QF_VFSUNKNOWN 6 /* Some VFS quotas, we didn't detect particular format yet */ 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 */ uint64_t dqi_max_b_limit; /* Maximal block limit storable in current format */ uint64_t dqi_max_i_limit; /* Maximal inode limit storable in current format */ uint64_t dqi_max_b_usage; /* Maximal block usage storable in current format */ uint64_t dqi_max_i_usage; /* Maximal inode usage storable in current format */ 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_dir[PATH_MAX]; /* Directory filesystem is mounted at */ 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) struct mount_entry; /* Check quota format used on specified medium and initialize it */ struct quota_handle *init_io(struct mount_entry *mnt, int type, int fmt, int flags); /* Create new quotafile of specified format on given filesystem */ struct quota_handle *new_io(struct mount_entry *mnt, int type, int fmt); /* Close quotafile */ int end_io(struct quota_handle *h); /* Get empty quota structure */ struct dquot *get_empty_dquot(void); /* Check whether values in current dquot can be stored on disk */ int check_dquot_range(struct dquot *dquot); #endif /* GUARD_QUOTAIO_H */ �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quota-tools/edquota.c�������������������������������������������������������������������������������0000644�0001750�0001750�00000024630�11757162647�014766� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * 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; static int flags, quotatype; static int fmt = -1; static char *protoname; static char *dirname; static 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 [-u|g] [-F formatname] [-f filesystem] -t\n\ \tedquota [-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); } static 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, "ughrmntTVp:F:f:", long_opts, NULL)) != -1) { #else while ((ret = getopt_long(argc, argv, "ughtTVp: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); case 'h': 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(); } if (flags & FL_REMOTE && (flags & (FL_EDIT_TIMES | FL_EDIT_PERIOD))) { errstr(_("Cannot change grace times over RPC protocol.\n")); usage(); } return optind; } static 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); /* * Open in rw mode because we can reuse the file for * editting next user as well. */ if ((tmpfd = open(tmpfil, O_RDWR)) < 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; } ��������������������������������������������������������������������������������������������������������quota-tools/quot.8����������������������������������������������������������������������������������0000644�0001750�0001750�00000002506�11442151253�014215� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������.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. ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quota-tools/aclocal.m4������������������������������������������������������������������������������0000644�0001750�0001750�00000013217�11442155663�015006� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# generated automatically by aclocal 1.11 -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, # 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. # pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- # # Copyright © 2004 Scott James Remnant <scott@netsplit.com>. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # PKG_PROG_PKG_CONFIG([MIN-VERSION]) # ---------------------------------- AC_DEFUN([PKG_PROG_PKG_CONFIG], [m4_pattern_forbid([^_?PKG_[A-Z_]+$]) m4_pattern_allow([^PKG_CONFIG(_PATH)?$]) AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility])dnl if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) fi if test -n "$PKG_CONFIG"; then _pkg_min_version=m4_default([$1], [0.9.0]) AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) PKG_CONFIG="" fi fi[]dnl ])# PKG_PROG_PKG_CONFIG # PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) # # Check to see whether a particular set of modules exists. Similar # to PKG_CHECK_MODULES(), but does not set variables or print errors. # # # Similar to PKG_CHECK_MODULES, make sure that the first instance of # this or PKG_CHECK_MODULES is called, or make sure to call # PKG_CHECK_EXISTS manually # -------------------------------------------------------------- AC_DEFUN([PKG_CHECK_EXISTS], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl if test -n "$PKG_CONFIG" && \ AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then m4_ifval([$2], [$2], [:]) m4_ifvaln([$3], [else $3])dnl fi]) # _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) # --------------------------------------------- m4_define([_PKG_CONFIG], [if test -n "$$1"; then pkg_cv_[]$1="$$1" elif test -n "$PKG_CONFIG"; then PKG_CHECK_EXISTS([$3], [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null`], [pkg_failed=yes]) 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 --print-errors "$2" 2>&1` else $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors "$2" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD ifelse([$4], , [AC_MSG_ERROR(dnl [Package requirements ($2) were not met: $$1_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. _PKG_TEXT ])], [AC_MSG_RESULT([no]) $4]) elif test $pkg_failed = untried; then ifelse([$4], , [AC_MSG_FAILURE(dnl [The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. _PKG_TEXT To get pkg-config, see <http://pkg-config.freedesktop.org/>.])], [$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 ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quota-tools/quotaops.c������������������������������������������������������������������������������0000644�0001750�0001750�00000036051�12014471022�015150� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * 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; char name[MAXNAMELEN]; #if defined(BSD_BEHAVIOUR) int j, ngroups; uid_t euid; gid_t gidset[NGROUPS], *gidsetp; #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)); 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); } 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; char fsp[BUFSIZ], line[BUFSIZ]; 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); 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); } 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)); 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); } 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; char fsp[BUFSIZ], bunits[10], iunits[10], line[BUFSIZ]; 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]); } /* * 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; } 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); } } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quota-tools/bylabel.c�������������������������������������������������������������������������������0000644�0001750�0001750�00000014657�11650022303�014716� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Derived from the util-linux/mount/mount_by_label.c source, * currently maintained by Andries Brouwer <aeb@cwi.nl>. * * 1999-02-22 Arkadiusz Mi¶kiewicz <misiek@misiek.eu.org> * - added Native Language Support * 2000-01-20 James Antill <james@and.org> * - Added error message if /proc/partitions cannot be opened * 2000-05-09 Erik Troan <ewt@redhat.com> * - Added cache for UUID and disk labels * 2000-11-07 Nathan Scott <nathans@sgi.com> * - Added XFS support */ #include "config.h" #include <stdio.h> #include <sys/param.h> #include <string.h> #include <ctype.h> #include <fcntl.h> #include <unistd.h> #include "bylabel.h" #include "common.h" #include "pot.h" #define PROC_PARTITIONS "/proc/partitions" #define DEVLABELDIR "/dev" static struct uuidCache_s { struct uuidCache_s *next; char uuid[16]; char *label; char *device; } *uuidCache = NULL; #define EXT2_SUPER_MAGIC 0xEF53 struct ext2_super_block { u_char s_dummy1[56]; u_char s_magic[2]; u_char s_dummy2[46]; u_char s_uuid[16]; u_char s_volume_name[16]; }; #define ext2magic(s) ((uint) s.s_magic[0] + (((uint) s.s_magic[1]) << 8)) #define XFS_SUPER_MAGIC "XFSB" #define XFS_SUPER_MAGIC2 "BSFX" struct xfs_super_block { u_char s_magic[4]; u_char s_dummy[28]; u_char s_uuid[16]; u_char s_dummy2[60]; u_char s_fsname[12]; }; #define REISER_SUPER_MAGIC "ReIsEr2Fs" struct reiserfs_super_block { u_char s_dummy1[52]; u_char s_magic[10]; u_char s_dummy2[22]; u_char s_uuid[16]; u_char s_volume_name[16]; }; static inline unsigned short swapped(unsigned short a) { return (a >> 8) | (a << 8); } /* for now, only ext2 and xfs are supported */ static int get_label_uuid(const char *device, char **label, char *uuid) { /* start with ext2 and xfs tests, taken from mount_guess_fstype */ /* should merge these later */ int fd, rv = 1; size_t namesize; struct ext2_super_block e2sb; struct xfs_super_block xfsb; struct reiserfs_super_block reisersb; fd = open(device, O_RDONLY); if (fd < 0) return rv; if (lseek(fd, 1024, SEEK_SET) == 1024 && read(fd, (char *)&e2sb, sizeof(e2sb)) == sizeof(e2sb) && ext2magic(e2sb) == EXT2_SUPER_MAGIC) { memcpy(uuid, e2sb.s_uuid, sizeof(e2sb.s_uuid)); namesize = sizeof(e2sb.s_volume_name); *label = smalloc(namesize + 1); sstrncpy(*label, (char *)e2sb.s_volume_name, namesize); rv = 0; } else if (lseek(fd, 0, SEEK_SET) == 0 && read(fd, (char *)&xfsb, sizeof(xfsb)) == sizeof(xfsb) && (strncmp((char *)&xfsb.s_magic, XFS_SUPER_MAGIC, 4) == 0 || strncmp((char *)&xfsb.s_magic, XFS_SUPER_MAGIC2, 4) == 0)) { memcpy(uuid, xfsb.s_uuid, sizeof(xfsb.s_uuid)); namesize = sizeof(xfsb.s_fsname); *label = smalloc(namesize + 1); sstrncpy(*label, (char *)xfsb.s_fsname, namesize); rv = 0; } else if (lseek(fd, 65536, SEEK_SET) == 65536 && read(fd, (char *)&reisersb, sizeof(reisersb)) == sizeof(reisersb) && !strncmp((char *)&reisersb.s_magic, REISER_SUPER_MAGIC, 9)) { memcpy(uuid, reisersb.s_uuid, sizeof(reisersb.s_uuid)); namesize = sizeof(reisersb.s_volume_name); *label = smalloc(namesize + 1); sstrncpy(*label, (char *)reisersb.s_volume_name, namesize); rv = 0; } close(fd); return rv; } static void uuidcache_addentry(char *device, char *label, char *uuid) { struct uuidCache_s *last; if (!uuidCache) { last = uuidCache = smalloc(sizeof(*uuidCache)); } else { for (last = uuidCache; last->next; last = last->next); last->next = smalloc(sizeof(*uuidCache)); last = last->next; } last->next = NULL; last->device = device; last->label = label; memcpy(last->uuid, uuid, sizeof(last->uuid)); } static void uuidcache_init(void) { char line[100]; char *s; int ma, mi, sz; static char ptname[100]; FILE *procpt; char uuid[16], *label; char device[110]; int firstPass; int handleOnFirst; if (uuidCache) return; procpt = fopen(PROC_PARTITIONS, "r"); if (!procpt) return; for (firstPass = 1; firstPass >= 0; firstPass--) { fseek(procpt, 0, SEEK_SET); while (fgets(line, sizeof(line), procpt)) { if (sscanf(line, " %d %d %d %[^\n ]", &ma, &mi, &sz, ptname) != 4) continue; /* skip extended partitions (heuristic: size 1) */ if (sz == 1) continue; /* look only at md devices on first pass */ handleOnFirst = !strncmp(ptname, "md", 2); if (firstPass != handleOnFirst) continue; /* skip entire disk (minor 0, 64, ... on ide; 0, 16, ... on sd) */ /* heuristic: partition name ends in a digit */ for (s = ptname; *s; s++); if (isdigit(s[-1])) { /* * Note: this is a heuristic only - there is no reason * why these devices should live in /dev. * Perhaps this directory should be specifiable by option. * One might for example have /devlabel with links to /dev * for the devices that may be accessed in this way. * (This is useful, if the cdrom on /dev/hdc must not * be accessed.) */ snprintf(device, sizeof(device), "%s/%s", DEVLABELDIR, ptname); if (!get_label_uuid(device, &label, uuid)) uuidcache_addentry(sstrdup(device), label, uuid); } } } fclose(procpt); } #define UUID 1 #define VOL 2 static char *get_spec_by_x(int n, const char *t) { struct uuidCache_s *uc; uuidcache_init(); uc = uuidCache; while (uc) { switch (n) { case UUID: if (!memcmp(t, uc->uuid, sizeof(uc->uuid))) return sstrdup(uc->device); break; case VOL: if (!strcmp(t, uc->label)) return sstrdup(uc->device); break; } uc = uc->next; } return NULL; } static u_char fromhex(char c) { if (isdigit(c)) return (c - '0'); else if (islower(c)) return (c - 'a' + 10); else return (c - 'A' + 10); } static char *get_spec_by_uuid(const char *s) { u_char uuid[16]; int i; if (strlen(s) != 36 || s[8] != '-' || s[13] != '-' || s[18] != '-' || s[23] != '-') goto bad_uuid; for (i = 0; i < 16; i++) { if (*s == '-') s++; if (!isxdigit(s[0]) || !isxdigit(s[1])) goto bad_uuid; uuid[i] = ((fromhex(s[0]) << 4) | fromhex(s[1])); s += 2; } return get_spec_by_x(UUID, (char *)uuid); bad_uuid: errstr(_("Found an invalid UUID: %s\n"), s); return NULL; } static char *get_spec_by_volume_label(const char *s) { return get_spec_by_x(VOL, s); } const char *get_device_name(const char *item) { const char *rc; if (!strncmp(item, "UUID=", 5)) rc = get_spec_by_uuid(item + 5); else if (!strncmp(item, "LABEL=", 6)) rc = get_spec_by_volume_label(item + 6); else rc = sstrdup(item); if (!rc) errstr(_("Error checking device name: %s\n"), item); return rc; } ���������������������������������������������������������������������������������quota-tools/quotacheck.h����������������������������������������������������������������������������0000644�0001750�0001750�00000003242�11650022303�015424� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * * 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 ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quota-tools/rquota.x��������������������������������������������������������������������������������0000644�0001750�0001750�00000006616�11442151253�014646� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* @(#)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; ������������������������������������������������������������������������������������������������������������������quota-tools/quota.c���������������������������������������������������������������������������������0000644�0001750�0001750�00000031314�11723516475�014445� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * 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 #define FL_SHOW_MNTPOINT 16384 #define FL_SHOW_DEVICE 32768 static int flags, fmt = -1; char *progname; static 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\ --show-mntpoint show mount point of the file system in output\n\ --hide-device do not show file system device in output\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); } static 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")); } } static void print_fs_location(struct dquot *q) { struct quota_handle *h = q->dq_h; if (flags & FL_QUIET) { if (flags & FL_SHOW_DEVICE) printf(" %s", h->qh_quotadev); if (flags & FL_SHOW_MNTPOINT) printf(" %s", h->qh_dir); putchar('\n'); } else { int wrap = 0; if (flags & FL_SHOW_DEVICE && flags & FL_SHOW_MNTPOINT && !(flags & FL_NOWRAP)) wrap = 1; else if (flags & FL_SHOW_DEVICE && strlen(h->qh_quotadev) > 15 && !(flags & FL_NOWRAP)) wrap = 1; else if (flags & FL_SHOW_MNTPOINT && strlen(h->qh_dir) > 15 && !(flags & FL_NOWRAP)) wrap = 1; if (flags & FL_SHOW_DEVICE) { if (wrap || flags & FL_SHOW_MNTPOINT) printf("%s", h->qh_quotadev); else printf("%15s", h->qh_quotadev); } if (flags & FL_SHOW_MNTPOINT) { if (flags & FL_SHOW_DEVICE) putchar(' '); if (wrap || flags & FL_SHOW_DEVICE) printf("%s", h->qh_dir); else printf("%15s", h->qh_dir); } if (wrap) printf("\n%15s", ""); } } static 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", msgi); print_fs_location(q); } if (msgb) { printf("\t%s", msgb); print_fs_location(q); } 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, ""); print_fs_location(q); 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' }, { "show-mntpoint", 0, NULL, 257 }, { "hide-device", 0, NULL, 258 }, { NULL, 0, NULL, 0 } }; gettexton(); progname = basename(argv[0]); flags |= FL_SHOW_DEVICE; while ((ret = getopt_long(argc, argv, "hguqvsVliQF: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 257: flags |= FL_SHOW_MNTPOINT; break; case 258: flags &= ~FL_SHOW_DEVICE; break; case 'V': version(); exit(0); case 'h': 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; } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quota-tools/convertquota.c��������������������������������������������������������������������������0000644�0001750�0001750�00000024050�11723516217�016037� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * * Utility for converting quota file from old to new format * * Sponsored by SuSE CR */ #include "config.h" #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <fcntl.h> #include <errno.h> #include <getopt.h> #include <asm/byteorder.h> #include "pot.h" #include "common.h" #include "quotaio.h" #include "quotasys.h" #include "quota.h" #include "bylabel.h" #include "quotaio_v2.h" #include "dqblk_v2.h" #define ACT_FORMAT 1 /* Convert format from old to new */ #define ACT_ENDIAN 2 /* Convert endianity */ static char *mntpoint; char *progname; static int ucv, gcv; static struct quota_handle *qn; /* Handle of new file */ static int action; /* Action to be performed */ static 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 mount_entry *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 mount_entry *mnt) { struct quota_handle *qo; int ret = 0; if (!(qo = init_io(mnt, type, infmt, IOI_INITSCAN))) { errstr(_("Cannot open old format file for %ss on %s\n"), _(type2name(type)), mnt->me_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->me_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 mount_entry *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->me_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->me_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 mount_entry *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 mount_entry *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; } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quota-tools/README.gettext��������������������������������������������������������������������������0000644�0001750�0001750�00000001654�11442151253�015502� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������If you want to generate new po file: "make pot" and look for a file named pot.po. To generate mo files from po files: "make mo", it's also done when you "make install", if you want to install only mo files ( no programs ) "make inst_mo", mo files will be copied to: /usr/share/locale/'languages names'/LC_MESSAGES/quota.mo. warnquota ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ this program was modifiated to be more configurable - you can now specify new warning message ( also sender, cc, etc. ) without recompiling the program. all you need is to edit pot.po ( make pot ), you will find in it mail message, and etc. - create new strings, make mo with msgfmt, and copy mo file to /usr/share/locale/'lang'/LC_MESSAGES/quota.mo. now you have new warning mail message. gettext support was added by Paul Niewiadomski <lilo@free.poltronic.net>, any questions, suggestions are welcome. thanks to ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Roman_Kaminski@saba.com.pl������������������������������������������������������������������������������������quota-tools/quotacheck.c����������������������������������������������������������������������������0000644�0001750�0001750�00000102557�11725163601�015442� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * * 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 */ static dev_t cur_dev; /* Device we are working on */ static 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 */ static int uwant, gwant, ucheck, gcheck; /* Does user want to check user/group quota; Do we check user/group quota? */ static char *mntpoint; /* Mountpoint to check */ char *progname; struct util_dqinfo old_info[MAXQUOTAS]; /* Loaded infos */ static char extensions[MAXQUOTAS + 2][20] = INITQFNAMES; /* Extensions depending on quota type */ static char *basenames[] = INITQFBASENAMES; /* Names of quota files */ #ifdef DEBUG_MALLOC static size_t malloc_mem = 0; static size_t free_mem = 0; #endif static struct dquot *dquot_hash[MAXQUOTAS][DQUOTHASHSIZE]; static 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 inode %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(const 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(const 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 (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(const 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 file inode bitmap\n"), (int)error); return -1; } if ((error = ext2fs_allocate_inode_bitmap(fs, "directory inode map", &inode_dir_map))) { errstr(_("errstr (%d) while allocating directory inode 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 (i_num) { if ((i_num == EXT2_ROOT_INO || i_num >= EXT2_FIRST_INO(fs->super)) && 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(const 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 mount_entry *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->me_dir); if (kern_quota_on(mnt, 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->me_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->me_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->me_devname, 0, NULL) < 0) die(4, _("Error while syncing quotas on %s: %s\n"), mnt->me_devname, 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->me_devname); 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 mount_entry *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 if (cfmt == QF_XFS) /* No renaming for xfs/gfs2 */ return 0; 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->me_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 mount_entry *mnt, int type) { struct dquot *dquot; uint i; struct quota_handle *h; unsigned int commit = 0; debug(FL_DEBUG, _("Dumping gathered data for %ss.\n"), _(type2name(type))); if (cfmt == QF_XFS) { if (!(h = init_io(mnt, type, cfmt, IOI_READONLY))) { errstr(_("Cannot initialize IO on xfs/gfs2 quotafile: %s\n"), strerror(errno)); return -1; } } else { 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; /* For XFS/GFS2, we don't bother with actually checking * what the usage value is in the internal quota file. * We simply attempt to update the usage for every quota * we find in the fs scan. The filesystem decides in the * quotactl handler whether to update the usage in the * quota file or not. */ commit = cfmt == QF_XFS ? COMMIT_USAGE : COMMIT_ALL; update_grace_times(dquot); h->qh_ops->commit_dquot(dquot, commit); } 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, 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->me_devname); else { if (quotactl(QCMD((kernel_iface == IFACE_GENERIC) ? Q_QUOTAOFF : Q_6_5_QUOTAOFF, type), mnt->me_devname, 0, NULL) < 0) errstr(_("Cannot turn %s quotas off on %s: %s\nKernel won't know about changes quotacheck did.\n"), _(type2name(type)), mnt->me_devname, 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->me_devname, util2kernfmt(cfmt), filename); else ret = quotactl(QCMD(Q_6_5_QUOTAON, type), mnt->me_devname, 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->me_devname, strerror(errno)); } free(filename); } } else if (rename_files(mnt, type) < 0) return -1; return 0; } /* Substract space used by old quota file from usage. * Return non-zero in case of failure, zero otherwise. */ static int sub_quota_file(struct mount_entry *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 name could not been determined. Usage will not be subtracted.\n"), _(type2name(ftype))); return 0; } if (stat(filename, &st) < 0) { debug(FL_VERBOSE, _("Cannot stat old %s quota file %s: %s. Usage will not be subtracted.\n"), _(type2name(ftype)), filename, strerror(errno)); free(filename); return 0; } 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 -1; } d->dq_dqb.dqb_curinodes--; d->dq_dqb.dqb_curspace -= qspace; debug(FL_DEBUG, _("Substracted %lu bytes.\n"), (unsigned long)qspace); return 0; } /* Buffer quotafile, run filesystem scan, dump quotafiles. * Return non-zero value in case of failure, zero otherwise. */ static int check_dir(struct mount_entry *mnt) { struct stat st; int remounted = 0; int failed = 0; if (lstat(mnt->me_dir, &st) < 0) die(2, _("Cannot stat mountpoint %s: %s\n"), mnt->me_dir, strerror(errno)); if (!S_ISDIR(st.st_mode)) die(2, _("Mountpoint %s is not a directory?!\n"), mnt->me_dir); cur_dev = st.st_dev; files_done = dirs_done = 0; /* * For gfs2, we scan the fs first and then tell the kernel about the new usage. * So, there's no need to load any information. We also don't remount the * filesystem read-only because for a clustering filesystem it won't stop * modifications from other nodes anyway. */ if (cfmt == QF_XFS) goto start_scan; 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 0; if (!(flags & FL_NOREMOUNT)) { /* Now we try to remount fs read-only to prevent races when scanning filesystem */ if (mount (NULL, mnt->me_dir, mnt->me_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->me_dir); if (!ask_yn(_("Should I continue?"), 0)) { printf(_("As you wish... Canceling check of this file.\n")); failed = -1; 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->me_dir); failed = -1; goto out; } } else remounted = 1; debug(FL_DEBUG, _("Filesystem remounted read-only\n")); } start_scan: debug(FL_VERBOSE, _("Scanning %s [%s] "), mnt->me_devname, mnt->me_dir); #if defined(EXT2_DIRECT) if (!strcmp(mnt->me_type, MNTTYPE_EXT2) || !strcmp(mnt->me_type, MNTTYPE_EXT3) || !strcmp(mnt->me_type, MNTTYPE_NEXT3)) { if ((failed = ext2_direct_scan(mnt->me_devname)) < 0) goto out; } else { #else if (mnt->me_dir) { #endif if (flags & FL_VERYVERBOSE) putchar('\n'); if ((failed = scan_dir(mnt->me_dir)) < 0) goto out; } dirs_done++; if (flags & FL_VERBOSE || flags & FL_VERYVERBOSE) fputs(_("done\n"), stdout); if (ucheck) { failed |= sub_quota_file(mnt, USRQUOTA, USRQUOTA); failed |= sub_quota_file(mnt, USRQUOTA, GRPQUOTA); } if (gcheck) { failed |= sub_quota_file(mnt, GRPQUOTA, USRQUOTA); failed |= 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->me_dir, mnt->me_type, MS_MGC_VAL | MS_REMOUNT, NULL) < 0) die(4, _("Cannot remount filesystem %s read-write. cannot write new quota files.\n"), mnt->me_dir); debug(FL_DEBUG, _("Filesystem remounted RW.\n")); } if (ucheck) failed |= dump_to_file(mnt, USRQUOTA); if (gcheck) failed |= dump_to_file(mnt, GRPQUOTA); out: remove_list(); return failed; } /* Detect quota format from filename of present files */ static int detect_filename_format(struct mount_entry *mnt, int type) { char *option; struct stat statbuf; char namebuf[PATH_MAX]; int journal = 0; int fmt; if (strcmp(mnt->me_type, MNTTYPE_XFS) == 0 || strcmp(mnt->me_type, MNTTYPE_GFS2) == 0) return QF_XFS; if (type == USRQUOTA) { if ((option = str_hasmntopt(mnt->me_opts, MNTOPT_USRQUOTA))) option += strlen(MNTOPT_USRQUOTA); else if ((option = str_hasmntopt(mnt->me_opts, MNTOPT_USRJQUOTA))) { journal = 1; option += strlen(MNTOPT_USRJQUOTA); } else if ((option = str_hasmntopt(mnt->me_opts, MNTOPT_QUOTA))) option += strlen(MNTOPT_QUOTA); } else { if ((option = str_hasmntopt(mnt->me_opts, MNTOPT_GRPQUOTA))) option += strlen(MNTOPT_GRPQUOTA); else if ((option = str_hasmntopt(mnt->me_opts, MNTOPT_GRPJQUOTA))) { journal = 1; option += strlen(MNTOPT_GRPJQUOTA); } } if (!option) die(2, _("Cannot find quota option on filesystem %s with quotas!\n"), mnt->me_dir); if (journal) { char fmtbuf[64], *space; if (!(option = str_hasmntopt(mnt->me_opts, MNTOPT_JQFMT))) { jquota_err: errstr(_("Cannot detect quota format for journalled quota on %s\n"), mnt->me_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->me_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->me_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 int compatible_fs_qfmt(char *fstype, int fmt) { /* We never check XFS, NFS, and filesystems supporting VFS metaformat */ if (!strcmp(fstype, MNTTYPE_XFS) || nfs_fstype(fstype) || meta_qf_fstype(fstype)) return 0; /* In all other cases we can pick a format... */ if (fmt == -1) return 1; /* XFS format is supported only by GFS2 */ if (fmt == QF_XFS) return !strcmp(fstype, MNTTYPE_GFS2); /* Anything but GFS2 supports all other formats */ return !!strcmp(fstype, MNTTYPE_GFS2); } /* Parse kernel version and warn if not using journaled quotas */ static void warn_if_jquota_supported(void) { struct utsname stats; int v; char *errch; if (uname(&stats) < 0) { errstr(_("Cannot get system info: %s\n"), strerror(errno)); return; } if (strcmp(stats.sysname, "Linux")) return; v = strtol(stats.release, &errch, 10); if (v < 2) return; if (v >= 3) goto warn; if (*errch != '.') return; v = strtol(errch + 1, &errch, 10); if (*errch != '.' || v < 6) return; v = strtol(errch + 1, &errch, 10); if (v < 11) return; warn: 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")); } /* Return 0 in case of success, non-zero otherwise. */ static int check_all(void) { struct mount_entry *mnt; int checked = 0; static int warned; int failed = 0; 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->me_dir, "/")) continue; if (!compatible_fs_qfmt(mnt->me_type, fmt)) { debug(FL_DEBUG | FL_VERBOSE, _("Skipping %s [%s]\n"), mnt->me_devname, mnt->me_dir); continue; } cfmt = fmt; if (uwant && me_hasquota(mnt, USRQUOTA)) ucheck = 1; else ucheck = 0; if (gwant && me_hasquota(mnt, GRPQUOTA)) 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->me_devname); failed = -1; continue; } debug(FL_DEBUG, _("Detected quota format %s\n"), fmt2name(cfmt)); } if (flags & FL_VERBOSE && !str_hasmntopt(mnt->me_opts, MNTOPT_USRJQUOTA) && !str_hasmntopt(mnt->me_opts, MNTOPT_GRPJQUOTA) && !warned && (!strcmp(mnt->me_type, MNTTYPE_EXT3) || !strcmp(mnt->me_type, MNTTYPE_EXT4) || !strcmp(mnt->me_type, MNTTYPE_NEXT3) || !strcmp(mnt->me_type, MNTTYPE_EXT4DEV) || !strcmp(mnt->me_type, MNTTYPE_REISER))) { warned = 1; warn_if_jquota_supported(); } checked++; failed |= 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")); failed = -1; } return failed; } int main(int argc, char **argv) { int failed; gettexton(); progname = basename(argv[0]); parse_options(argc, argv); init_kernel_interface(); failed = 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 (failed ? EXIT_FAILURE : EXIT_SUCCESS); } �������������������������������������������������������������������������������������������������������������������������������������������������quota-tools/quotastats.8����������������������������������������������������������������������������0000644�0001750�0001750�00000001337�11442151253�015436� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������.\" 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). �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quota-tools/rquota_client.c�������������������������������������������������������������������������0000644�0001750�0001750�00000022260�12014470222�016144� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * 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. * * 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 */ static 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; } } static int split_nfs_mount(char *devname, char **host, char **path) { char *pathname; /* NFS server name contained in brackets? */ if (*devname == '[') { *host = devname + 1; pathname = strchr(devname, ']'); if (!pathname || pathname[1] != ':') return 0; /* Autofs? */ if (pathname[2] == '(') return 0; *pathname = 0; *path = pathname + 2; return 1; } *host = devname; pathname = strchr(devname, ':'); if (!pathname) return 0; /* Autofs? */ if (pathname[1] == '(') return 0; *pathname = 0; *path = pathname + 1; return 1; } /* * 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); if (!split_nfs_mount(fsname_tmp, &host, &pathname)) { free(fsname_tmp); return -ENOENT; } /* 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 }; /* RPC limits values to 32b variables. Prevent value wrapping. */ if (check_dquot_range(dquot) < 0) return -ERANGE; /* * 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); if (!split_nfs_mount(fsname_tmp, &host, &pathname)) { free(fsname_tmp); return -ENOENT; } /* 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 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quota-tools/quotaio.c�������������������������������������������������������������������������������0000644�0001750�0001750�00000020131�11661037157�014764� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * * 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 mount_entry *mnt, int type, int fmt, int flags) { char *qfname = NULL; int fd = -1, kernfmt; struct quota_handle *h = smalloc(sizeof(struct quota_handle)); int nameflag; if (!me_hasquota(mnt, type)) goto out_handle; if (stat(mnt->me_devname, &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->me_devname, sizeof(h->qh_quotadev)); sstrncpy(h->qh_fstype, mnt->me_type, MAX_FSTYPE_LEN); sstrncpy(h->qh_dir, mnt->me_dir, PATH_MAX); if (nfs_fstype(mnt->me_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; memset(&h->qh_info, 0, sizeof(h->qh_info)); h->qh_ops->init_io(h); 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->me_type, MNTTYPE_XFS) || /* XFS filesystem? */ !strcmp(mnt->me_type, MNTTYPE_GFS2)) { /* 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(mnt, type, fmt); if (kernfmt >= 0) { h->qh_io_flags |= IOFL_QUOTAON; fmt = kernfmt; /* Default is kernel used format */ } } if (meta_qf_fstype(mnt->me_type) || mnt->me_qfmt[type] == QF_META) { if (!QIO_ENABLED(h)) { errstr(_("Quota not supported by the filesystem.\n")); goto out_handle; } h->qh_fd = -1; h->qh_fmt = fmt; goto set_ops; } nameflag = (!QIO_ENABLED(h) || flags & IOI_INITSCAN) ? NF_FORMAT : 0; if (fmt == -1) { /* Let's try any VFSv0 quota format... */ if (get_qf_name(mnt, type, QF_VFSV0, nameflag, &qfname) >= 0) fmt = QF_VFSV0; /* And then VFSv1 quota format... */ else if (get_qf_name(mnt, type, QF_VFSV1, nameflag, &qfname) >= 0) fmt = QF_VFSV1; /* And then old quota format... */ else if (get_qf_name(mnt, type, QF_VFSOLD, nameflag, &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, nameflag, &qfname) < 0) { errstr(_("Quota file not found or has wrong format.\n")); goto out_handle; } } if (!QIO_ENABLED(h) || flags & IOI_INITSCAN) { /* Need to open file? */ if (QIO_ENABLED(h)) { /* Kernel uses same file? */ unsigned int cmd = (kernel_iface == IFACE_GENERIC) ? Q_SYNC : Q_6_5_SYNC; if (quotactl(QCMD(cmd, h->qh_type), h->qh_quotadev, 0, NULL) < 0) { die(4, _("Cannot sync quotas on device %s: %s\n"), h->qh_quotadev, strerror(errno)); } } /* 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 mount_entry *mnt, int type, int fmt) { char *qfname; int fd; struct quota_handle *h; char namebuf[PATH_MAX]; if (fmt == -1) fmt = QF_VFSV0; else if (fmt == QF_RPC || fmt == QF_XFS) { errstr(_("Creation of %s quota format is not supported.\n"), fmt2name(fmt)); return NULL; } /* * For filesystems which never have quotas in quota files or for * filesystems which have quotas already stored in system files we * refuse to create anything. */ if (meta_qf_fstype(mnt->me_type) || mnt->me_qfmt[type] == QF_META) { errstr(_("Quota on %s is stored in system files and must" " be manipulated by fs tools.\n"), mnt->me_dir); 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; } h = smalloc(sizeof(struct quota_handle)); h->qh_fd = fd; h->qh_io_flags = 0; sstrncpy(h->qh_quotadev, mnt->me_devname, sizeof(h->qh_quotadev)); sstrncpy(h->qh_fstype, mnt->me_type, MAX_FSTYPE_LEN); sstrncpy(h->qh_dir, mnt->me_dir, PATH_MAX); 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; } /* * Check whether values in current dquot can be stored on disk */ int check_dquot_range(struct dquot *dquot) { struct util_dqinfo *info = &dquot->dq_h->qh_info; if (dquot->dq_dqb.dqb_bhardlimit > info->dqi_max_b_limit || dquot->dq_dqb.dqb_bsoftlimit > info->dqi_max_b_limit || dquot->dq_dqb.dqb_ihardlimit > info->dqi_max_i_limit || dquot->dq_dqb.dqb_isoftlimit > info->dqi_max_i_limit) { errstr(_("Trying to set quota limits out of range " "supported by quota format on %s.\n"), dquot->dq_h->qh_quotadev); return -1; } if (dquot->dq_dqb.dqb_curinodes > info->dqi_max_i_usage || dquot->dq_dqb.dqb_curspace > info->dqi_max_b_usage) { errstr(_("Trying to set quota usage out of range " "supported by quota format on %s.\n"), dquot->dq_h->qh_quotadev); return -1; } return 0; } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quota-tools/quota_nld.c�����������������������������������������������������������������������������0000644�0001750�0001750�00000030100�11723521263�015261� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * 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 <signal.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 static int flags; static 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 } }; static 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) { /* * This can happen quite easily so don't spam syslog with * the error */ if (flags & FL_NODAEMON) 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)); } } /* Build file name (absolute path) to PID file of this daemon. * The returned name is allocated on heap. */ static char *build_pid_file_name(void) { char *pid_name = NULL; if (!progname) { errstr(_("Undefined program name.\n")); return NULL; } pid_name = malloc(9 + strlen(progname) + 4 + 1); if (!pid_name) { errstr(_("Not enough memory to build PID file name.\n")); return NULL; } sprintf(pid_name, "/var/run/%s.pid", progname); return pid_name; } /* Store daemon's PID to file */ static int store_pid(void) { FILE *pid_file; char *pid_name; pid_name = build_pid_file_name(); if (!pid_name) return -1; pid_file = fopen(pid_name, "w"); if (!pid_file) { errstr(_("Could not open PID file '%s': %s\n"), pid_name, strerror(errno)); free(pid_name); return -1; } if (fprintf(pid_file, "%jd\n", (intmax_t)getpid()) < 0) { errstr(_("Could not write daemon's PID into '%s'.\n"), pid_name); fclose(pid_file); free(pid_name); return -1; } if (fclose(pid_file)) { errstr(_("Could not close PID file '%s'.\n"), pid_name); free(pid_name); return -1; } free(pid_name); return 0; } /* Handler for SIGTERM to remove PID file */ static void remove_pid(int signal) { char *pid_name; pid_name = build_pid_file_name(); if (pid_name) { unlink(pid_name); free(pid_name); } exit(EXIT_SUCCESS); } /* Store daemon's PID into file and register its removal on SIGTERM */ static void use_pid_file(void) { struct sigaction term_action; term_action.sa_handler = remove_pid; term_action.sa_flags = 0; if (sigaction(SIGTERM, &term_action, NULL)) errstr(_("Could not register PID file removal on SIGTERM.\n")); if (store_pid()) errstr(_("Could not store my PID %jd.\n"), (intmax_t )getpid()); } 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); use_pid_file(); } run(nhandle); return 0; } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quota-tools/Makefile.in�����������������������������������������������������������������������������0000644�0001750�0001750�00000011575�11723774233�015222� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PROGS = quotacheck quotaon quota quot repquota warnquota quotastats xqmstats edquota setquota convertquota rpc.rquotad quotasync @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 quotasync.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@ STRIP = @STRIP@ 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_ -kN_ -d pot *.c *.h 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) $(STRIP) -m $(DEF_SBIN_MODE) \ quotacheck quotaon $(ROOTDIR)$(root_sbindir) -$(LN) quotaon $(ROOTDIR)$(root_sbindir)/quotaoff -$(INSTALL) $(STRIP) -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) $(STRIP) -m $(DEF_SBIN_MODE) quota quotasync $(ROOTDIR)$(bindir) -$(INSTALL) $(STRIP) -m $(DEF_SBIN_MODE) rpc.rquotad $(ROOTDIR)$(sbindir) ifneq ($(NETLINKLIBS),) -$(INSTALL) $(STRIP) -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) quotasync: quotasync.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) �����������������������������������������������������������������������������������������������������������������������������������quota-tools/quotaio_v1.c����������������������������������������������������������������������������0000644�0001750�0001750�00000026604�11650022303�015366� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * 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; h->qh_info.dqi_max_b_limit = ~(uint32_t)0; h->qh_info.dqi_max_i_limit = ~(uint32_t)0; h->qh_info.dqi_max_b_usage = ((uint64_t)(~(uint32_t)0)) << V1_DQBLK_SIZE_BITS; h->qh_info.dqi_max_i_usage = ~(uint32_t)0; 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; h->qh_info.dqi_max_b_limit = ~(uint32_t)0; h->qh_info.dqi_max_i_limit = ~(uint32_t)0; h->qh_info.dqi_max_b_usage = ((uint64_t)(~(uint32_t)0)) << V1_DQBLK_SIZE_BITS; h->qh_info.dqi_max_i_usage = ~(uint32_t)0; 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 { if (check_dquot_range(dquot) < 0) { errno = ERANGE; return -1; } 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; 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... */ } ����������������������������������������������������������������������������������������������������������������������������quota-tools/quotagrpadmins��������������������������������������������������������������������������0000644�0001750�0001750�00000000334�11442151253�016112� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # 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 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quota-tools/warnquota.8�����������������������������������������������������������������������������0000644�0001750�0001750�00000004715�11711623724�015260� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������.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 ] [ .IR filesystem ... ] .SH DESCRIPTION .B warnquota checks the disk quota for specified local filesystems (or for each local filesystem if none specified) 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 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 ���������������������������������������������������quota-tools/quotastats.c����������������������������������������������������������������������������0000644�0001750�0001750�00000010005�11650022303�015473� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * 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> * * 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; } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quota-tools/dqblk_xfs.h�����������������������������������������������������������������������������0000644�0001750�0001750�00000001055�11650022303�015252� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * 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 �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quota-tools/setquota.c������������������������������������������������������������������������������0000644�0001750�0001750�00000030264�11723777645�015174� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * * 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 static int flags, fmt = -1; static char **mnt; char *progname; static int mntcnt; static qid_t protoid, id; static 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(_("%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 = "ghp:urmVF:taTbc"; #else char *opts = "ghp: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_RPC && (flags & (FL_GRACE | FL_INDIVIDUAL_GRACE))) { errstr(_("Cannot set grace times over RPC protocol.\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++], _("Bad block softlimit")); toset.dqb_bhardlimit = parse_unum(argstr[optind++], _("Bad block hardlimit")); toset.dqb_isoftlimit = parse_unum(argstr[optind++], _("Bad inode softlimit")); toset.dqb_ihardlimit = parse_unum(argstr[optind++], _("Bad 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++], _("Bad block grace time")); toset.dqb_itime = parse_unum(argstr[optind++], _("Bad 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++], _("Bad block grace time")); if (!strcmp(argstr[optind], _("unset"))) { toset.dqb_itime = 0; optind++; } else toset.dqb_itime = now + parse_unum(argstr[optind++], _("Bad 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, ret = 0; for (i = 0; handles[i]; i++) { if (!handles[i]->qh_ops->write_info) { errstr(_("Setting grace period on %s is not supported.\n"), handles[i]->qh_quotadev); ret = -1; continue; } 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 ret; } /* 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; } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quota-tools/quotasync.c�����������������������������������������������������������������������������0000644�0001750�0001750�00000004752�11723777303�015347� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <fcntl.h> #include <string.h> #include <errno.h> #include <getopt.h> #include "pot.h" #include "common.h" #include "quotasys.h" #include "quotaio.h" #define FL_USER 1 /* sync user quotas */ #define FL_GROUP 2 /* sync group quotas */ #define FL_ALL 4 /* sync quotas on all filesystems */ static int flags, fmt = -1; static char **mnt; static int mntcnt; char *progname; static void usage(void) { errstr(_("Utility for syncing quotas.\nUsage:\n%s [-ug] -a | mntpoint...\n\n"), progname); fprintf(stderr, _("Bugs to %s\n"), MY_EMAIL); exit(1); } static void parse_options(int argcnt, char **argstr) { int ret; struct option long_opts[] = { { "user", 0, NULL, 'u' }, { "group", 0, NULL, 'g' }, { "all", 0, NULL, 'a' }, { "version", 0, NULL, 'V' }, { "help", 0, NULL, 'h' }, { NULL, 0, NULL, 0 } }; while ((ret = getopt_long(argcnt, argstr, "ahugV", 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 'a': flags |= FL_ALL; break; } } if ((flags & FL_ALL && optind != argcnt) || (!(flags & FL_ALL) && optind == argcnt)) { fputs(_("Bad number of arguments.\n"), stderr); usage(); } if (!(flags & FL_ALL)) { mnt = argstr + optind; mntcnt = argcnt - optind; } if (!(flags & (FL_USER | FL_GROUP))) flags |= FL_USER; } static int sync_one(int type, char *dev) { int qcmd = QCMD(Q_SYNC, type); return quotactl(qcmd, dev, 0, NULL); } static int syncquotas(int type) { struct quota_handle **handles, *h; int i, ret = 0; if (flags & FL_ALL) { if (sync_one(type, NULL) < 0) errstr(_("%s quota sync failed: %s\n"), _(type2name(type)), strerror(errno)); return -1; } handles = create_handle_list(mntcnt, mnt, type, fmt, IOI_READONLY, MS_LOCALONLY | MS_NO_AUTOFS); for (i = 0; handles[i]; i++) { h = handles[i]; if (sync_one(type, h->qh_quotadev)) { errstr(_("%s quota sync failed for %s: %s\n"), _(type2name(type)), h->qh_quotadev, strerror(errno)); ret = -1; } } dispose_handle_list(handles); return ret; } int main(int argc, char **argv) { int ret = 0; gettexton(); progname = basename(argv[0]); parse_options(argc, argv); init_kernel_interface(); if (flags & FL_USER) if (syncquotas(USRQUOTA)) ret = 1; if (flags & FL_GROUP) if (syncquotas(GRPQUOTA)) ret = 1; return ret; } ����������������������quota-tools/svc_socket.c����������������������������������������������������������������������������0000644�0001750�0001750�00000006047�11650022303�015441� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* 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); } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quota-tools/quotaio_meta.c��������������������������������������������������������������������������0000644�0001750�0001750�00000002722�11650022303�015761� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * 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); } static int meta_scan_dquots(struct quota_handle *h, int (*process_dquot)(struct dquot *dquot, char *dqname)) { return generic_scan_dquots(h, process_dquot, vfs_get_dquot); } 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, scan_dquots: meta_scan_dquots, }; ����������������������������������������������quota-tools/configure�������������������������������������������������������������������������������0000755�0001750�0001750�00000476241�12015475733�015067� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.65. # # # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, # 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 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 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 # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (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 # 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 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="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_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV export CONFIG_SHELL exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { 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_fn_error "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error ERROR [LINENO LOG_FD] # --------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with status $?, using 1 if that was 0. as_fn_error () { as_status=$?; test $as_status -eq 0 && as_status=1 if test "$3"; then as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3 fi $as_echo "$as_me: error: $1" >&2 as_fn_exit $as_status } # as_fn_error 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 if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi 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'` # 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_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # 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; as_fn_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 } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac 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='mkdir -p "$as_dir"' 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'" test -n "$DJDIR" || exec 7<&0 </dev/null exec 6>&1 # Name of the host. # hostname on some systems (SVR3.2, Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME= PACKAGE_TARNAME= PACKAGE_VERSION= PACKAGE_STRING= PACKAGE_BUGREPORT= PACKAGE_URL= ac_unique_file="quota.c" # Factoring default headers for most tests. ac_includes_default="\ #include <stdio.h> #ifdef HAVE_SYS_TYPES_H # include <sys/types.h> #endif #ifdef HAVE_SYS_STAT_H # include <sys/stat.h> #endif #ifdef STDC_HEADERS # include <stdlib.h> # include <stddef.h> #else # ifdef HAVE_STDLIB_H # include <stdlib.h> # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include <memory.h> # endif # include <string.h> #endif #ifdef HAVE_STRINGS_H # include <strings.h> #endif #ifdef HAVE_INTTYPES_H # include <inttypes.h> #endif #ifdef HAVE_STDINT_H # include <stdint.h> #endif #ifdef HAVE_UNISTD_H # include <unistd.h> #endif" ac_subst_vars='LTLIBOBJS LIBOBJS STRIP 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_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_static_link enable_strip_binaries enable_ldapmail enable_ext2direct enable_netlink 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_fn_error "invalid feature name: $ac_useropt" 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_fn_error "invalid feature name: $ac_useropt" 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_fn_error "invalid package name: $ac_useropt" 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_fn_error "invalid package name: $ac_useropt" 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_fn_error "unrecognized option: \`$ac_option' Try \`$0 --help' for more information." ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error "invalid variable name: \`$ac_envvar'" ;; esac 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_fn_error "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error "unrecognized options: $ac_unrecognized_opts" ;; *) $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_fn_error "expected an absolute directory name for --$ac_var: $ac_val" 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_fn_error "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error "pwd does not report name of working directory" # 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_fn_error "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error "$ac_msg" 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-static-link=yes/no Link all binaries statically default=no. --enable-strip-binaries=yes/no Strip binaries while installing them default=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-rpc=yes/no Enable RPC support default=yes. --enable-rpcsetquota=yes/no Use RPC for setting quotas default=no. --enable-xfs_roothack=yes/no Support old XFS root filesystems default=no. --enable-bsd_behaviour=yes/no Mimic BSD behaviour default=yes. --enable-libefence=yes/no Use Electric Fence memory checks default=no. --enable-nls=yes/no Enable gettext default=yes. --enable-rootsbin=yes/no Use /sbin for some important binaries regardless $prefix default=no. --enable-proc-mounts=path Use alternate file instead of /etc/mtab default=/proc/mounts. Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L<lib dir> if you have libraries in a nonstandard directory <lib dir> LIBS libraries to pass to the linker, e.g. -l<library> CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if you have headers in a nonstandard directory <include dir> CPP C preprocessor PKG_CONFIG path to pkg-config utility DBUS_CFLAGS C compiler flags for DBUS, overriding pkg-config DBUS_LIBS linker flags for DBUS, overriding pkg-config Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to the package provider. _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.65 Copyright (C) 2009 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 ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack 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:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack 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:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack 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:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { 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:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 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 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack 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:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { 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_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_check_decl LINENO SYMBOL VAR # ------------------------------------ # Tests whether SYMBOL is declared, setting cache variable VAR accordingly. ac_fn_c_check_decl () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $2 is declared" >&5 $as_echo_n "checking whether $2 is declared... " >&6; } if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { #ifndef $2 (void) $2; #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} } # ac_fn_c_check_decl # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$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:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} } # ac_fn_c_check_header_mongrel # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} } # ac_fn_c_check_header_compile 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.65. 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) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append 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 as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset 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:${as_lineno-$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= ;; #( *) { eval $ac_var=; 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'; as_fn_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 $as_echo "/* confdefs.h */" > 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 cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _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 /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$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. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$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:${as_lineno-$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:${as_lineno-$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:${as_lineno-$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:${as_lineno-$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:${as_lineno-$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:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$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. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$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_fn_error "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## 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:${as_lineno-$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:${as_lineno-$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:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$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:${as_lineno-$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:${as_lineno-$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:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$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:${as_lineno-$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:${as_lineno-$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:${as_lineno-$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:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$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:${as_lineno-$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:${as_lineno-$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:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$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:${as_lineno-$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:${as_lineno-$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:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$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:${as_lineno-$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:${as_lineno-$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:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$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:${as_lineno-$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:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error "no acceptable C compiler found in \$PATH See \`config.log' for more details." "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* 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:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&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:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; 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 if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { as_fn_set_status 77 as_fn_error "C compiler cannot create executables See \`config.log' for more details." "$LINENO" 5; }; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$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:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; 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:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details." "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <stdio.h> int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { 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:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details." "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$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 confdefs.h - <<_ACEOF >conftest.$ac_ext /* 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:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; 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:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error "cannot compute suffix of object files: cannot compile See \`config.log' for more details." "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$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 confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else 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:${as_lineno-$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:${as_lineno-$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 confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes 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:${as_lineno-$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:${as_lineno-$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 confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <stdarg.h> #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg 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:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : 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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if test "${ac_cv_prog_CPP+set}" = set; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since # <limits.h> exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include <limits.h> #else # include <assert.h> #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # 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 confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <ac_nonexistent.h> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # 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:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since # <limits.h> exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include <limits.h> #else # include <assert.h> #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # 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 confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <ac_nonexistent.h> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # 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:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details." "$LINENO" 5; } 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:${as_lineno-$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 as_fn_arith $ac_count + 1 && ac_count=$as_val 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_fn_error "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$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 as_fn_arith $ac_count + 1 && ac_count=$as_val 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_fn_error "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$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 confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <stdlib.h> #include <stdarg.h> #include <string.h> #include <float.h> int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else 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 confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <string.h> _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <stdlib.h> _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <ctype.h> #include <stdlib.h> #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do for ac_t in install-sh install.sh shtool; do if test -f "$ac_dir/$ac_t"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/$ac_t -c" break 2 fi done done if test -z "$ac_aux_dir"; then as_fn_error "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 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:${as_lineno-$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:${as_lineno-$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' # Check whether --enable-static-link was given. if test "${enable_static_link+set}" = set; then : enableval=$enable_static_link; else enable_static_link="no" fi if test "x$enable_static_link" != "xyes"; then { $as_echo "$as_me:${as_lineno-$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 confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : compilepie="yes" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test "x$compilepie" != "xyes"; then CFLAGS="$oldCFLAGS" LDFLAGS="$oldLDFLAGS" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi else CFLAGS="$CFLAGS -static" LDFLAGS="$LDFLAGS -static" fi # Check whether --enable-strip-binaries was given. if test "${enable_strip_binaries+set}" = set; then : enableval=$enable_strip_binaries; else enable_strip="yes" fi if test "x$enable_strip" = "xyes"; then STRIP="-s" else STRIP="" 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:${as_lineno-$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 confdefs.h - <<_ACEOF >conftest.$ac_ext /* 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 if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_ldap_ldap_initialize=yes else ac_cv_lib_ldap_ldap_initialize=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$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:${as_lineno-$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 confdefs.h - <<_ACEOF >conftest.$ac_ext /* 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 if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_ldap_ldap_init=yes else ac_cv_lib_ldap_ldap_init=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$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" $as_echo "#define USE_LDAP_MAIL_LOOKUP 1" >>confdefs.h COMPILE_OPTS="$COMPILE_OPTS USE_LDAP_MAIL_LOOKUP" if test "x$have_new_ldap" = "xyes"; then $as_echo "#define USE_LDAP_23 1" >>confdefs.h ac_fn_c_check_decl "$LINENO" "ldap_perror" "ac_cv_have_decl_ldap_perror" "#include <ldap.h> " if test "x$ac_cv_have_decl_ldap_perror" = x""yes; then : else $as_echo "#define NEED_LDAP_PERROR 1" >>confdefs.h fi fi else if test "x$enable_ldapmail" = "xyes"; then as_fn_error "LDAP support required but library not found." "$LINENO" 5; 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` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " eval as_val=\$$as_ac_Header 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 ac_fn_c_check_header_mongrel "$LINENO" "ext2fs/ext2fs.h" "ac_cv_header_ext2fs_ext2fs_h" "$ac_includes_default" if test "x$ac_cv_header_ext2fs_ext2fs_h" = x""yes; then : ext2fshead="yes" fi if test "x$ext2fshead" = "xyes"; then $as_echo "#define HAVE_EXT2_INCLUDE 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ext2_ino_t" >&5 $as_echo_n "checking for ext2_ino_t... " >&6; } have_ext2_ino_t="no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <ext2fs/ext2fs.h> _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "ext2_ino_t" >/dev/null 2>&1; then : have_ext2_ino_t="yes" fi rm -f conftest* if test "x$have_ext2_ino_t" != "xyes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: found" >&5 $as_echo "found" >&6; } $as_echo "#define HAVE_EXT2_INO_T 1" >>confdefs.h 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:${as_lineno-$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 confdefs.h - <<_ACEOF >conftest.$ac_ext /* 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 if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_com_err_com_err=yes else ac_cv_lib_com_err_com_err=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$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:${as_lineno-$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 confdefs.h - <<_ACEOF >conftest.$ac_ext /* 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 if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_ext2fs_ext2fs_initialize=yes else ac_cv_lib_ext2fs_ext2fs_initialize=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$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_fn_error "Ext2 direct support required but libraries not found." "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$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_fn_error "Ext2 direct support required but header files not found." "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$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 $as_echo "#define EXT2_DIRECT 1" >>confdefs.h 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:${as_lineno-$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:${as_lineno-$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:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 $as_echo "$PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$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:${as_lineno-$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:${as_lineno-$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:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 $as_echo "$ac_pt_PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$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:${as_lineno-$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:${as_lineno-$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:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } PKG_CONFIG="" fi fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for DBUS" >&5 $as_echo_n "checking for DBUS... " >&6; } if test -n "$DBUS_CFLAGS"; then pkg_cv_DBUS_CFLAGS="$DBUS_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"dbus-1\""; } >&5 ($PKG_CONFIG --exists --print-errors "dbus-1") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_DBUS_CFLAGS=`$PKG_CONFIG --cflags "dbus-1" 2>/dev/null` else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$DBUS_LIBS"; then pkg_cv_DBUS_LIBS="$DBUS_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"dbus-1\""; } >&5 ($PKG_CONFIG --exists --print-errors "dbus-1") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_DBUS_LIBS=`$PKG_CONFIG --libs "dbus-1" 2>/dev/null` else pkg_failed=yes 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 --print-errors "dbus-1" 2>&1` else DBUS_PKG_ERRORS=`$PKG_CONFIG --print-errors "dbus-1" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$DBUS_PKG_ERRORS" >&5 as_fn_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. " "$LINENO" 5 elif test $pkg_failed = untried; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables DBUS_CFLAGS and DBUS_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see <http://pkg-config.freedesktop.org/>. See \`config.log' for more details." "$LINENO" 5; } else DBUS_CFLAGS=$pkg_cv_DBUS_CFLAGS DBUS_LIBS=$pkg_cv_DBUS_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } : fi { $as_echo "$as_me:${as_lineno-$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 confdefs.h - <<_ACEOF >conftest.$ac_ext /* 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 if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_nl_genl_register=yes else ac_cv_lib_nl_genl_register=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$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_fn_error "Required libraries for quota netlink daemon not found." "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$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_fn_error "Required headers for quota netlink daemon not found." "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$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:${as_lineno-$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 confdefs.h - <<_ACEOF >conftest.$ac_ext /* 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 if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_gethostbyname=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ 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:${as_lineno-$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:${as_lineno-$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 confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <tcpd.h> struct request_info request; int deny_severity, allow_severity; int main () { hosts_access(&request); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_wrap_main=yes; LIBS="$saved_LIBS"; { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else ac_cv_lib_wrap_main=no; LIBS="$saved_LIBS"; { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi if test ${ac_cv_lib_wrap_main} = yes; then ac_fn_c_check_header_mongrel "$LINENO" "tcpd.h" "ac_cv_header_tcpd_h" "$ac_includes_default" 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" $as_echo "#define HOSTS_ACCESS 1" >>confdefs.h COMPILE_OPTS="$COMPILE_OPTS HOSTS_ACCESS" fi { $as_echo "$as_me:${as_lineno-$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 confdefs.h - <<_ACEOF >conftest.$ac_ext /* 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 if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_const=yes else ac_cv_c_const=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 $as_echo "$ac_cv_c_const" >&6; } if test $ac_cv_c_const = no; then $as_echo "#define const /**/" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$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 confdefs.h - <<_ACEOF >conftest.$ac_ext /* 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 if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_inline=$ac_kw 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:${as_lineno-$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-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_rpc" = "yes" ; then $as_echo "#define RPC 1" >>confdefs.h COMPILE_OPTS="$COMPILE_OPTS RPC" fi if test "$enable_rpcsetquota" = "yes" ; then $as_echo "#define RPC_SETQUOTA 1" >>confdefs.h COMPILE_OPTS="$COMPILE_OPTS RPC_SETQUOTA" fi if test "$enable_xfs_roothack" = "yes" ; then $as_echo "#define XFS_ROOTHACK 1" >>confdefs.h COMPILE_OPTS="$COMPILE_OPTS XFS_ROOTHACK" fi if test "$enable_bsd_behaviour" = "yes" ; then $as_echo "#define BSD_BEHAVIOUR 1" >>confdefs.h 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 $as_echo "#define USE_GETTEXT 1" >>confdefs.h 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 $as_echo "#define PACKAGE_VERSION \"4.01\"" >>confdefs.h 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:${as_lineno-$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= ;; #( *) { eval $ac_var=; 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:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} cat confcache >$cache_file else { $as_echo "$as_me:${as_lineno-$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. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append 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:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_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} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_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 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 # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (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 # 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 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error ERROR [LINENO LOG_FD] # --------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with status $?, using 1 if that was 0. as_fn_error () { as_status=$?; test $as_status -eq 0 && as_status=1 if test "$3"; then as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3 fi $as_echo "$as_me: error: $1" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith 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 if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi 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'` # 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 ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac 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 # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { 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_fn_error "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' 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 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=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.65. 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 and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, 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 the package provider." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ config.status configured by $0, generated by GNU Autoconf 2.65, with options \\"\$ac_cs_config\\" Copyright (C) 2009 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 ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; 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 as_fn_append 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 as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --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_fn_error "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append 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_fn_error "invalid argument: \`$ac_config_target'" "$LINENO" 5;; 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 'as_fn_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_fn_error "cannot create a temporary directory in ." "$LINENO" 5 # 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=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 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_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 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_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' <conf$$subs.awk | sed ' /^[^""]/{ N s/\n// } ' >>$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { 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_fn_error "could not setup config files machinery" "$LINENO" 5 _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_fn_error "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' <confdefs.h | sed ' s/'"$ac_delim"'/"\\\ "/g' >>$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\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_fn_error "could not setup config headers machinery" "$LINENO" 5 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_fn_error "invalid tag \`$ac_tag'" "$LINENO" 5;; :[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_fn_error "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append 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:${as_lineno-$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_fn_error "could not create $ac_file" "$LINENO" 5 ;; 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"; as_fn_mkdir_p 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:${as_lineno-$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_fn_error "could not create $ac_file" "$LINENO" 5 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:${as_lineno-$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_fn_error "could not create $ac_file" "$LINENO" 5 ;; :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_fn_error "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$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_fn_error "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error "could not create -" "$LINENO" 5 fi ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error "write failure creating $CONFIG_STATUS" "$LINENO" 5 # 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 || as_fn_exit $? fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quota-tools/warnquota.conf��������������������������������������������������������������������������0000644�0001750�0001750�00000005756�11711622507�016042� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# 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" MAIL_CMD = "/bin/echo" FROM = "bas@example.com" # but they don't have to be: SUBJECT = Hey, user, clean up your account! CC_TO = "sysadm@example.com" # 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@example.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 true if you want to use it # If you have at least LDAP 2.3 installed, you should use LDAP_URI # LDAP_URI = ldaps://my.server:389 # Otherwise you should 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 # ������������������quota-tools/rquotad.8�������������������������������������������������������������������������������0000644�0001750�0001750�00000005162�11650022303�014677� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������.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) ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quota-tools/quotacheck_v1.c�������������������������������������������������������������������������0000644�0001750�0001750�00000004320�11650022303�016023� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * * 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; } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quota-tools/edquota.8�������������������������������������������������������������������������������0000644�0001750�0001750�00000011216�11650022303�014657� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������.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 edquota will always send paths with a leading 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 --always-resolve Always try to translate user / group name to uid / gid even if the name is composed of digits only. .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) ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quota-tools/bylabel.h�������������������������������������������������������������������������������0000644�0001750�0001750�00000000155�11650022303�014707� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#ifndef BYLABEL_H_ #define BYLABEL_H_ const char *get_device_name(const char *item); #endif /* BYLABEL_H_ */ �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quota-tools/ldap-scripts/���������������������������������������������������������������������������0000755�0001750�0001750�00000000000�11623305600�015534� 5����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quota-tools/ldap-scripts/setquota-ldap.pl�����������������������������������������������������������0000644�0001750�0001750�00000013627�11442151253�020667� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/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, ")"; } ���������������������������������������������������������������������������������������������������������quota-tools/ldap-scripts/quota.schema���������������������������������������������������������������0000644�0001750�0001750�00000001050�11442151253�020045� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������## ## 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 )) ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quota-tools/ldap-scripts/edquota_editor�������������������������������������������������������������0000755�0001750�0001750�00000002333�11442151253�020475� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/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; } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quota-tools/ldap-scripts/setSystemQuotas.pl���������������������������������������������������������0000755�0001750�0001750�00000007532�11442151253�021302� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/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; } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������quota-tools/ldap-scripts/applySystemQuotas.pl�������������������������������������������������������0000755�0001750�0001750�00000006235�11442151253�021633� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/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; } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quota-tools/quota.h���������������������������������������������������������������������������������0000644�0001750�0001750�00000012243�11723774273�014454� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#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. * N_ is gettext magic for static strings */ #define N_(x) (x) #define INITQFNAMES { \ N_("user"), /* USRQUOTA */ \ N_("group"), /* GRPQUOTA */ \ N_("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) #define DQF_SYS_FILE 0x10000 /* Quota stored in a system file */ 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_ */ �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quota-tools/quotaops.h������������������������������������������������������������������������������0000644�0001750�0001750�00000001320�11650022303�015143� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#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 */ ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quota-tools/quota_tree.h����������������������������������������������������������������������������0000644�0001750�0001750�00000003714�11650022303�015451� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#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 ����������������������������������������������������quota-tools/pot.po����������������������������������������������������������������������������������0000644�0001750�0001750�00000156060�11723774311�014313� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2012-03-01 23:31+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" #: bylabel.c:253 #, c-format msgid "Found an invalid UUID: %s\n" msgstr "" #: bylabel.c:273 #, c-format msgid "Error checking device name: %s\n" msgstr "" #: common.c:124 #, c-format msgid "Quota utilities version %s.\n" msgstr "" #: common.c:125 #, c-format msgid "Compiled with:%s\n" msgstr "" #: common.c:126 convertquota.c:48 quotacheck.c:318 quotasync.c:26 #: repquota.c:64 warnquota.c:994 #, c-format msgid "Bugs to %s\n" msgstr "" #: convertquota.c:41 #, 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 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" msgstr "" #: convertquota.c:97 msgid "You have to specify source and target format of conversion.\n" msgstr "" #: convertquota.c:112 quotacheck.c:404 quotaon.c:137 quotasync.c:64 #: repquota.c:141 setquota.c:221 msgid "Bad number of arguments.\n" msgstr "" #: convertquota.c:119 msgid "You have to specify action to perform.\n" msgstr "" #: convertquota.c:166 quotacheck_v2.c:241 quotaio_tree.c:58 #, c-format msgid "Cannot read block %u: %s\n" msgstr "" #: convertquota.c:191 convertquota.c:283 #, c-format msgid "Cannot commit dquot for id %u: %s\n" msgstr "" #: convertquota.c:239 msgid "Cannot read header of old quotafile.\n" msgstr "" #: convertquota.c:243 msgid "" "Bad file magic or version (probably not quotafile with bad endianity).\n" msgstr "" #: convertquota.c:254 msgid "Cannot read information about old quotafile.\n" msgstr "" #: convertquota.c:296 msgid "Cannot get name of new quotafile.\n" msgstr "" #: convertquota.c:302 quotacheck.c:753 #, c-format msgid "Cannot rename new quotafile %s to name %s: %s\n" msgstr "" #: convertquota.c:316 #, c-format msgid "Cannot open old format file for %ss on %s\n" msgstr "" #: convertquota.c:321 convertquota.c:354 #, c-format msgid "Cannot create file for %ss for new format on %s: %s\n" msgstr "" #: convertquota.c:344 #, c-format msgid "Cannot open old quota file on %s: %s\n" msgstr "" #: convertquota.c:380 msgid "Unknown action should be performed.\n" msgstr "" #: edquota.c:81 #, 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 [-u|g] [-F formatname] [-f filesystem] -t\n" "\tedquota [-u|g] [-F formatname] [-f filesystem] -T username|groupname ...\n" msgstr "" #: edquota.c:85 msgid "" "\n" "-u, --user edit user data\n" "-g, --group edit group data\n" msgstr "" #: edquota.c:89 msgid "" "-r, --remote edit remote quota (via RPC)\n" "-m, --no-mixed-pathnames trim leading slashes from NFSv4 mountpoints\n" msgstr "" #: 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 "" #: edquota.c:101 quota.c:111 setquota.c:79 #, c-format msgid "Bugs to: %s\n" msgstr "" #: edquota.c:183 msgid "" "Prototype name does not make sense when editing grace period or times.\n" msgstr "" #: edquota.c:187 msgid "Cannot change grace times over RPC protocol.\n" msgstr "" #: edquota.c:205 #, c-format msgid "Cannot get quota information for user %s\n" msgstr "" #: edquota.c:211 msgid "fsname mismatch\n" msgstr "" #: edquota.c:253 msgid "No filesystems with quota detected.\n" msgstr "" #: edquota.c:269 #, c-format msgid "Cannot create temporary file: %s\n" msgstr "" #: edquota.c:274 #, c-format msgid "Cannot change owner of temporary file: %s\n" msgstr "" #: edquota.c:281 msgid "Cannot write grace times to file.\n" msgstr "" #: edquota.c:285 msgid "Error while editing grace times.\n" msgstr "" #: edquota.c:289 msgid "Failed to parse grace times file.\n" msgstr "" #: edquota.c:298 edquota.c:324 #, c-format msgid "Cannot get quota information for user %s.\n" msgstr "" #: edquota.c:300 msgid "Cannot write individual grace times to file.\n" msgstr "" #: edquota.c:305 msgid "Error while editing individual grace times.\n" msgstr "" #: edquota.c:310 msgid "Cannot read individual grace times from file.\n" msgstr "" #: edquota.c:326 msgid "Cannot write quotas to file.\n" msgstr "" #: edquota.c:331 msgid "Error while editing quotas.\n" msgstr "" #: edquota.c:337 msgid "Cannot reopen!" msgstr "" #: edquota.c:339 msgid "Cannot read quotas from file.\n" msgstr "" #: quota.c:85 msgid "Usage: quota [-guqvswim] [-l | [-Q | -A]] [-F quotaformat]\n" msgstr "" #: quota.c:86 msgid "\tquota [-qvswim] [-l | [-Q | -A]] [-F quotaformat] -u username ...\n" msgstr "" #: quota.c:87 msgid "\tquota [-qvswim] [-l | [-Q | -A]] [-F quotaformat] -g groupname ...\n" msgstr "" #: quota.c:88 msgid "\tquota [-qvswugQm] [-F quotaformat] -f filesystem ...\n" msgstr "" #: quota.c:89 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" "-m, --no-mixed-pathnames trim leading slashes from NFSv4 mountpoints\n" " --show-mntpoint show mount point of the file system in output\n" " --hide-device do not show file system device in output\n" "-h, --help display this help message and exit\n" "-V, --version display version information and exit\n" "\n" msgstr "" #: quota.c:120 msgid "space" msgstr "" #: quota.c:122 msgid "blocks" msgstr "" #: quota.c:124 #, c-format msgid "Disk quotas for %s %s (%cid %u): %s\n" msgstr "" #: quota.c:127 msgid "Filesystem" msgstr "" #: quota.c:128 quota.c:129 msgid "quota" msgstr "" #: quota.c:128 quota.c:129 msgid "limit" msgstr "" #: quota.c:128 quota.c:129 msgid "grace" msgstr "" #: quota.c:129 msgid "files" msgstr "" #: quota.c:201 msgid "File limit reached on" msgstr "" #: quota.c:207 msgid "In file grace period on" msgstr "" #: quota.c:211 msgid "Over file quota on" msgstr "" #: quota.c:217 msgid "Block limit reached on" msgstr "" #: quota.c:223 msgid "In block grace period on" msgstr "" #: quota.c:227 msgid "Over block quota on" msgstr "" #: quota.c:290 quotasys.c:288 msgid "none" msgstr "" #: quota.c:396 #, c-format msgid "Warning: Ignoring -%c when filesystem list specified.\n" msgstr "" #: quota.c:403 msgid "No filesystem specified.\n" msgstr "" #: quota.c:411 #, c-format msgid "Gid set allocation (%d): %s\n" msgstr "" #: quota.c:417 #, c-format msgid "getgroups(): %s\n" msgstr "" #: quotacheck.c:96 msgid "Not enough memory.\n" msgstr "" #: quotacheck.c:128 #, c-format msgid "Adding hardlink for inode %llu\n" msgstr "" #: quotacheck.c:171 #, c-format msgid "Adding dquot structure type %s for %d\n" msgstr "" #: quotacheck.c:257 #, c-format msgid "Cannot open file %s: %s\n" msgstr "" #: quotacheck.c:262 msgid "Cannot get exact used space... Results might be inaccurate.\n" msgstr "" #: quotacheck.c:300 #, 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 "" #: quotacheck.c:430 #, c-format msgid "error (%d) while opening %s\n" msgstr "" #: quotacheck.c:435 #, c-format msgid "error (%d) while allocating file inode bitmap\n" msgstr "" #: quotacheck.c:440 #, c-format msgid "errstr (%d) while allocating directory inode bitmap\n" msgstr "" #: quotacheck.c:445 #, c-format msgid "error (%d) while opening inode scan\n" msgstr "" #: quotacheck.c:450 #, c-format msgid "error (%d) while starting inode scan\n" msgstr "" #: quotacheck.c:458 #, c-format msgid "Found i_num %ld, blocks %ld\n" msgstr "" #: quotacheck.c:464 msgid "High uid detected.\n" msgstr "" #: quotacheck.c:480 #, c-format msgid "Something weird happened while scanning. Error %d\n" msgstr "" #: quotacheck.c:504 #, c-format msgid "Cannot stat directory %s: %s\n" msgstr "" #: quotacheck.c:516 #, c-format msgid "" "\n" "Can open directory %s: %s\n" msgstr "" #: quotacheck.c:528 #, c-format msgid "" "lstat: Cannot stat `%s/%s': %s\n" "Guess you'd better run fsck first !\n" "exiting...\n" msgstr "" #: quotacheck.c:539 #, c-format msgid "pushd %s/%s\n" msgstr "" #: quotacheck.c:555 #, c-format msgid "\tAdding %s size %lld ino %d links %d uid %u gid %u\n" msgstr "" #: quotacheck.c:565 msgid "Scanning stored directories from directory stack\n" msgstr "" #: quotacheck.c:569 #, c-format msgid "" "popd %s\n" "Entering directory %s\n" msgstr "" #: quotacheck.c:581 #, c-format msgid "Leaving %s\n" msgstr "" #: quotacheck.c:621 #, c-format msgid "Going to check %s quota file of %s\n" msgstr "" #: quotacheck.c:627 #, c-format msgid "" "Quota for %ss is enabled on mountpoint %s so quotacheck might damage the " "file.\n" msgstr "" #: quotacheck.c:628 quotacheck.c:939 msgid "Should I continue?" msgstr "" #: quotacheck.c:629 quotacheck.c:940 #, c-format msgid "As you wish... Canceling check of this file.\n" msgstr "" #: quotacheck.c:634 #, 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 "" #: quotacheck.c:641 #, c-format msgid "Error while syncing quotas on %s: %s\n" msgstr "" #: quotacheck.c:646 #, c-format msgid "Cannot get quotafile name for %s\n" msgstr "" #: quotacheck.c:651 quotaio.c:150 quotasys.c:552 #, c-format msgid "Cannot open quotafile %s: %s\n" msgstr "" #: quotacheck.c:691 msgid "Renaming new files to proper names.\n" msgstr "" #: quotacheck.c:693 #, c-format msgid "Cannot get name of old quotafile on %s.\n" msgstr "" #: quotacheck.c:696 msgid "Old file not found.\n" msgstr "" #: quotacheck.c:699 #, c-format msgid "Error while searching for old quota file %s: %s\n" msgstr "" #: quotacheck.c:708 msgid "Old file found removed during check!\n" msgstr "" #: quotacheck.c:711 #, c-format msgid "Error while opening old quota file %s: %s\n" msgstr "" #: quotacheck.c:717 #, c-format msgid "EXT2_IOC_GETFLAGS failed: %s\n" msgstr "" #: quotacheck.c:721 #, c-format msgid "Quota file %s has IMMUTABLE flag set. Clearing.\n" msgstr "" #: quotacheck.c:724 #, c-format msgid "Failed to remove IMMUTABLE flag from quota file %s: %s\n" msgstr "" #: quotacheck.c:733 #, c-format msgid "Renaming old quotafile to %s~\n" msgstr "" #: quotacheck.c:739 #, c-format msgid "Name of quota file too long. Contact %s.\n" msgstr "" #: quotacheck.c:741 #, c-format msgid "Cannot rename old quotafile %s to %s: %s\n" msgstr "" #: quotacheck.c:747 msgid "Renaming new quotafile\n" msgstr "" #: quotacheck.c:759 #, c-format msgid "Cannot change permission of %s: %s\n" msgstr "" #: quotacheck.c:766 #, c-format msgid "Cannot open new quota file %s: %s\n" msgstr "" #: quotacheck.c:771 #, c-format msgid "Warning: Cannot set EXT2 flags on %s: %s\n" msgstr "" #: quotacheck.c:791 #, c-format msgid "Dumping gathered data for %ss.\n" msgstr "" #: quotacheck.c:794 #, c-format msgid "Cannot initialize IO on xfs/gfs2 quotafile: %s\n" msgstr "" #: quotacheck.c:800 #, c-format msgid "Cannot initialize IO on new quotafile: %s\n" msgstr "" #: quotacheck.c:827 #, c-format msgid "Cannot finish IO on new quotafile: %s\n" msgstr "" #: quotacheck.c:830 msgid "Data dumped.\n" msgstr "" #: quotacheck.c:835 #, c-format msgid "Cannot find checked quota file for %ss on %s!\n" msgstr "" #: quotacheck.c:839 #, c-format msgid "" "Cannot turn %s quotas off on %s: %s\n" "Kernel won't know about changes quotacheck did.\n" msgstr "" #: quotacheck.c:852 #, c-format msgid "" "Cannot turn %s quotas on on %s: %s\n" "Kernel won't know about changes quotacheck did.\n" msgstr "" #: quotacheck.c:874 #, c-format msgid "Substracting space used by old %s quota file.\n" msgstr "" #: quotacheck.c:876 #, c-format msgid "" "Old %s file name could not been determined. Usage will not be substracted.\n" msgstr "" #: quotacheck.c:881 #, c-format msgid "Cannot stat old %s quota file %s: %s. Usage will not be substracted.\n" msgstr "" #: quotacheck.c:893 #, c-format msgid "" "Quota structure for %s owning quota file not present! Something is really " "wrong...\n" msgstr "" #: quotacheck.c:898 #, c-format msgid "Substracted %lu bytes.\n" msgstr "" #: quotacheck.c:911 #, c-format msgid "Cannot stat mountpoint %s: %s\n" msgstr "" #: quotacheck.c:913 #, c-format msgid "Mountpoint %s is not a directory?!\n" msgstr "" #: quotacheck.c:938 #, c-format msgid "" "Cannot remount filesystem mounted on %s read-only. Counted values might not " "be right.\n" msgstr "" #: quotacheck.c:946 #, 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 "" #: quotacheck.c:954 msgid "Filesystem remounted read-only\n" msgstr "" #: quotacheck.c:957 #, c-format msgid "Scanning %s [%s] " msgstr "" #: quotacheck.c:974 msgid "done\n" msgstr "" #: quotacheck.c:983 #, c-format msgid "Checked %d directories and %d files\n" msgstr "" #: quotacheck.c:987 #, c-format msgid "" "Cannot remount filesystem %s read-write. cannot write new quota files.\n" msgstr "" #: quotacheck.c:988 msgid "Filesystem remounted RW.\n" msgstr "" #: quotacheck.c:1031 #, c-format msgid "Cannot find quota option on filesystem %s with quotas!\n" msgstr "" #: quotacheck.c:1037 #, c-format msgid "Cannot detect quota format for journalled quota on %s\n" msgstr "" #: quotacheck.c:1103 #, c-format msgid "Cannot get system info: %s\n" msgstr "" #: quotacheck.c:1123 msgid "" "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" msgstr "" #: quotacheck.c:1137 quotasys.c:642 msgid "Cannot initialize mountpoint scan.\n" msgstr "" #: quotacheck.c:1142 #, c-format msgid "Skipping %s [%s]\n" msgstr "" #: quotacheck.c:1159 #, c-format msgid "" "Cannot guess format from filename on %s. Please specify format on " "commandline.\n" msgstr "" #: quotacheck.c:1164 #, c-format msgid "Detected quota format %s\n" msgstr "" #: quotacheck.c:1185 msgid "" "Cannot find filesystem to check or filesystem not mounted with quota " "option.\n" msgstr "" #: quotacheck.c:1203 #, c-format msgid "" "Allocated %d bytes memory\n" "Free'd %d bytes\n" "Lost %d bytes\n" msgstr "" #: quotacheck_v1.c:32 #, c-format msgid "Cannot read entry for id %u from quotafile %s: %s\n" msgstr "" #: quotacheck_v1.c:35 #, c-format msgid "Entry for id %u is truncated.\n" msgstr "" #: quotacheck_v1.c:64 msgid "Loading first quota entry with grace times.\n" msgstr "" #: quotacheck_v1.c:68 #, c-format msgid "Cannot read first entry from quotafile %s: %s\n" msgstr "" #: quotacheck_v1.c:72 #, c-format msgid "" "WARNING - Quotafile %s was probably truncated. Cannot save quota " "settings...\n" msgstr "" #: quotacheck_v1.c:78 msgid "First entry loaded.\n" msgstr "" #: quotacheck_v2.c:55 msgid "Checking quotafile info...\n" msgstr "" #: quotacheck_v2.c:60 #, c-format msgid "Cannot read info from quota file %s: %s\n" msgstr "" #: quotacheck_v2.c:65 #, c-format msgid "" "WARNING - Quota file %s was probably truncated. Cannot save quota " "settings...\n" msgstr "" #: quotacheck_v2.c:77 msgid "WARNING - Quota file info was corrupted.\n" msgstr "" #: quotacheck_v2.c:78 #, c-format msgid "" "Size of file: %lu\n" "Blocks: %u Free block: %u Block with free entry: %u Flags: %x\n" msgstr "" #: quotacheck_v2.c:85 #, c-format msgid "" "Setting grace times and other flags to default values.\n" "Assuming number of blocks is %u.\n" msgstr "" #: quotacheck_v2.c:102 msgid "File info done.\n" msgstr "" #: quotacheck_v2.c:113 msgid "Corrupted blocks: " msgstr "" #: quotacheck_v2.c:117 #, c-format msgid "Block %u: " msgstr "" #: quotacheck_v2.c:179 msgid "Duplicated entries." msgstr "" #: quotacheck_v2.c:183 #, c-format msgid "" "Found more structures for ID %u. Using values: BHARD: %lld BSOFT: %lld " "IHARD: %lld ISOFT: %lld\n" msgstr "" #: quotacheck_v2.c:191 #, c-format msgid "" "Found more structures for ID %u. Values: BHARD: %lld/%lld BSOFT: %lld/%lld " "IHARD: %lld/%lld ISOFT: %lld/%lld\n" msgstr "" #: quotacheck_v2.c:196 msgid "Should I use new values?" msgstr "" #: quotacheck_v2.c:206 #, c-format msgid "" "ID %u has more structures. User intervention needed (use -i for interactive " "mode or -n for automatic answer).\n" msgstr "" #: quotacheck_v2.c:243 #, c-format msgid "Block %u is truncated.\n" msgstr "" #: quotacheck_v2.c:252 #, c-format msgid "Reference to illegal block %u" msgstr "" #: quotacheck_v2.c:259 #, c-format msgid "Block %u in tree referenced twice" msgstr "" #: quotacheck_v2.c:275 #, c-format msgid "Illegal free block reference to block %u" msgstr "" #: quotacheck_v2.c:278 #, c-format msgid "Corrupted number of used entries (%u)" msgstr "" #: quotacheck_v2.c:330 #, c-format msgid "" "Quota file %s has corrupted headers. You have to specify quota format on " "command line.\n" msgstr "" #: quotacheck_v2.c:346 msgid "Checking quotafile headers...\n" msgstr "" #: quotacheck_v2.c:350 #, c-format msgid "Cannot read header from quotafile %s: %s\n" msgstr "" #: quotacheck_v2.c:352 #, c-format msgid "" "WARNING - Quotafile %s was probably truncated. Cannot save quota " "settings...\n" msgstr "" #: quotacheck_v2.c:358 #, c-format msgid "WARNING - Quota file %s has corrupted headers\n" msgstr "" #: quotacheck_v2.c:362 #, c-format msgid "" "Quota file format version %d does not match the one specified on command " "line (%d). Quota file header may be corrupted.\n" msgstr "" #: quotacheck_v2.c:366 msgid "Continue checking assuming version from command line?" msgstr "" #: quotacheck_v2.c:372 msgid "Headers checked.\n" msgstr "" #: quotacheck_v2.c:388 #, c-format msgid "Do not know how to buffer format %d\n" msgstr "" #: quotacheck_v2.c:398 #, c-format msgid "Headers of file %s checked. Going to load data...\n" msgstr "" #: quotacheck_v2.c:406 msgid "Cannot gather quota data. Tree root node corrupted.\n" msgstr "" #: quotacheck_v2.c:414 msgid "WARNING - Some data might be changed due to corruption.\n" msgstr "" #: quotacheck_v2.c:417 msgid "Not found any corrupted blocks. Congratulations.\n" msgstr "" #: quotaio.c:62 msgid "Only RPC quota format is allowed on NFS filesystem.\n" msgstr "" #: quotaio.c:73 msgid "RPC quota format not compiled.\n" msgstr "" #: quotaio.c:77 msgid "RPC quota format specified for non-NFS filesystem.\n" msgstr "" #: quotaio.c:84 msgid "Only XFS quota format is allowed on XFS filesystem.\n" msgstr "" #: quotaio.c:95 msgid "XFS quota allowed only on XFS filesystem.\n" msgstr "" #: quotaio.c:109 msgid "Quota not supported by the filesystem.\n" msgstr "" #: quotaio.c:129 msgid "Cannot find any quota file to work on.\n" msgstr "" #: quotaio.c:134 msgid "Quota file not found or has wrong format.\n" msgstr "" #: quotaio.c:144 #, c-format msgid "Cannot sync quotas on device %s: %s\n" msgstr "" #: quotaio.c:175 #, c-format msgid "Cannot initialize quota on %s: %s\n" msgstr "" #: quotaio.c:202 #, c-format msgid "Creation of %s quota format is not supported.\n" msgstr "" #: quotaio.c:212 #, c-format msgid "" "Quota on %s is stored in system files and must be manipulated by fs tools.\n" msgstr "" #: quotaio.c:222 #, c-format msgid "Cannot create new quotafile %s: %s\n" msgstr "" #: quotaio.c:296 #, c-format msgid "" "Trying to set quota limits out of range supported by quota format on %s.\n" msgstr "" #: quotaio.c:302 #, c-format msgid "" "Trying to set quota usage out of range supported by quota format on %s.\n" msgstr "" #: quotaio_generic.c:54 #, c-format msgid "Cannot get info for %s quota file from kernel on %s: %s\n" msgstr "" #: quotaio_generic.c:72 #, c-format msgid "Cannot set info for %s quota file from kernel on %s: %s\n" msgstr "" #: quotaio_generic.c:84 #, c-format msgid "Cannot get quota for %s %d from kernel on %s: %s\n" msgstr "" #: quotaio_generic.c:99 #, c-format msgid "Cannot set quota for %s %d from kernel on %s: %s\n" msgstr "" #: quotaio_meta.c:22 msgid "Metadata init_io called when kernel support is not enabled.\n" msgstr "" #: quotaio_meta.c:26 msgid "" "Metadata init_io called when kernel does not support generic quota " "interface!\n" msgstr "" #: quotaio_rpc.c:76 quotaio_v1.c:308 quotaio_v2.c:464 #, c-format msgid "Trying to write quota to readonly quotafile on %s\n" msgstr "" #: quotaio_tree.c:71 #, c-format msgid "Cannot write block (%u): %s\n" msgstr "" #: quotaio_tree.c:94 msgid "Cannot allocate new quota block (out of disk space).\n" msgstr "" #: quotaio_tree.c:202 msgid "find_free_dqentry(): Data block full but it shouldn't.\n" msgstr "" #: quotaio_tree.c:237 #, c-format msgid "Inserting already present quota entry (block %u).\n" msgstr "" #: quotaio_tree.c:260 #, c-format msgid "Cannot write quota (id %u): %s\n" msgstr "" #: quotaio_tree.c:279 #, c-format msgid "Quota write failed (id %u): %s\n" msgstr "" #: quotaio_tree.c:291 #, c-format msgid "Quota structure has offset to other block (%u) than it should (%u).\n" msgstr "" #: quotaio_tree.c:367 #, c-format msgid "Quota for id %u referenced but not present.\n" msgstr "" #: quotaio_tree.c:426 #, c-format msgid "Cannot read quota structure for id %u: %s\n" msgstr "" #: quotaio_tree.c:468 #, c-format msgid "" "Illegal reference (%u >= %u) in %s quota file on %s. Quota file is probably " "corrupted.\n" "Please run quotacheck(8) and try again.\n" msgstr "" #: quotaio_v1.c:214 #, c-format msgid "Trying to write info to readonly quotafile on %s.\n" msgstr "" #: quotaio_v2.c:255 msgid "" "Your quota file is stored in wrong endianity. Please use convertquota(8) to " "convert it.\n" msgstr "" #: quotaio_v2.c:388 #, c-format msgid "Trying to write info to readonly quotafile on %s\n" msgstr "" #: quotaio_v2.c:518 #, c-format msgid "" "Statistics:\n" "Total blocks: %u\n" "Data blocks: %u\n" "Entries: %u\n" "Used average: %f\n" msgstr "" #: quotaio_xfs.c:217 #, c-format msgid "*** Status for %s quotas on device %s\n" msgstr "" #: quotaio_xfs.c:219 quotaio_xfs.c:234 msgid "ON" msgstr "" #: quotaio_xfs.c:219 quotaio_xfs.c:234 msgid "OFF" msgstr "" #: quotaio_xfs.c:221 quotaio_xfs.c:225 #, c-format msgid "Accounting: %s; Enforcement: %s\n" msgstr "" #: quotaio_xfs.c:237 quotaio_xfs.c:241 #, c-format msgid "Accounting [ondisk]: %s; Enforcement [ondisk]: %s\n" msgstr "" #: quotaio_xfs.c:250 quotaio_xfs.c:259 #, c-format msgid "Inode: none\n" msgstr "" #: quotaio_xfs.c:252 quotaio_xfs.c:261 #, c-format msgid "Inode: #%llu (%llu blocks, %u extents)\n" msgstr "" #: quota_nld.c:81 #, 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" " -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" msgstr "" #: quota_nld.c:115 rquota_svc.c:160 #, c-format msgid "Unknown option '%c'.\n" msgstr "" #: quota_nld.c:121 msgid "No possible destination for messages. Nothing to do.\n" msgstr "" #: quota_nld.c:147 msgid "Error parsing netlink message.\n" msgstr "" #: quota_nld.c:154 msgid "" "Unknown format of kernel netlink message!\n" "Maybe your quota tools are too old?\n" msgstr "" #: quota_nld.c:178 msgid "Cannot allocate netlink handle!\n" msgstr "" #: quota_nld.c:182 #, c-format msgid "Cannot connect to netlink socket: %s\n" msgstr "" #: quota_nld.c:185 #, c-format msgid "Cannot resolve quota netlink name: %s\n" msgstr "" #: quota_nld.c:189 #, c-format msgid "Cannot join quota multicast group: %s\n" msgstr "" #: quota_nld.c:194 #, c-format msgid "Cannot register callback for netlink messages: %s\n" msgstr "" #: quota_nld.c:208 #, c-format msgid "Cannot connect to system DBUS: %s\n" msgstr "" #: quota_nld.c:273 #, c-format msgid "Failed to find tty of user %llu to report warning to.\n" msgstr "" #: quota_nld.c:278 #, c-format msgid "Failed to open tty %s of user %llu to report warning.\n" msgstr "" #: quota_nld.c:284 msgid "Warning" msgstr "" #: quota_nld.c:287 msgid "Error" msgstr "" #: quota_nld.c:289 msgid "Info" msgstr "" #: quota_nld.c:292 msgid "file limit reached" msgstr "" #: quota_nld.c:295 msgid "file quota exceeded too long" msgstr "" #: quota_nld.c:298 msgid "file quota exceeded" msgstr "" #: quota_nld.c:301 msgid "block limit reached" msgstr "" #: quota_nld.c:304 msgid "block quota exceeded too long" msgstr "" #: quota_nld.c:307 msgid "block quota exceeded" msgstr "" #: quota_nld.c:310 msgid "got below file limit" msgstr "" #: quota_nld.c:313 msgid "got below file quota" msgstr "" #: quota_nld.c:316 msgid "got below block limit" msgstr "" #: quota_nld.c:319 msgid "got below block quota" msgstr "" #: quota_nld.c:322 msgid "unknown quota warning" msgstr "" #: quota_nld.c:326 #, c-format msgid "Failed to write quota message for user %llu to %s: %s\n" msgstr "" #: quota_nld.c:339 msgid "Cannot create DBUS message: No enough memory.\n" msgstr "" #: quota_nld.c:357 msgid "Failed to write message to dbus: No enough memory.\n" msgstr "" #: quota_nld.c:373 #, c-format msgid "Failed to read or parse quota netlink message: %s\n" msgstr "" #: quota_nld.c:384 msgid "Undefined program name.\n" msgstr "" #: quota_nld.c:389 msgid "Not enough memory to build PID file name.\n" msgstr "" #: quota_nld.c:408 #, c-format msgid "Could not open PID file '%s': %s\n" msgstr "" #: quota_nld.c:414 #, c-format msgid "Could not write daemon's PID into '%s'.\n" msgstr "" #: quota_nld.c:421 #, c-format msgid "Could not close PID file '%s'.\n" msgstr "" #: quota_nld.c:451 msgid "Could not register PID file removal on SIGTERM.\n" msgstr "" #: quota_nld.c:453 #, c-format msgid "Could not store my PID %jd.\n" msgstr "" #: quotaon.c:66 #, 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 %s\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 "" #: quotaon.c:79 msgid "turn quotas off for all filesystems" msgstr "" #: quotaon.c:80 msgid "turn quotas on for all filesystems" msgstr "" #: quotaon.c:141 msgid "Cannot turn on/off quotas via RPC.\n" msgstr "" #: quotaon.c:188 #, c-format msgid "set root_squash on %s: %s\n" msgstr "" #: quotaon.c:192 #, c-format msgid "%s: %s root_squash turned off\n" msgstr "" #: quotaon.c:194 #, c-format msgid "%s: %s root_squash turned on\n" msgstr "" #: quotaon.c:212 #, c-format msgid "quotactl on %s [%s]: %s\n" msgstr "" #: quotaon.c:215 #, c-format msgid "%s [%s]: %s quotas turned off\n" msgstr "" #: quotaon.c:228 #, c-format msgid "cannot find %s on %s [%s]\n" msgstr "" #: quotaon.c:230 #, c-format msgid "using %s on %s [%s]: %s\n" msgstr "" #: quotaon.c:232 msgid "Maybe create new quota files with quotacheck(8)?\n" msgstr "" #: quotaon.c:234 msgid "Quota format not supported in kernel.\n" msgstr "" #: quotaon.c:237 #, c-format msgid "%s [%s]: %s quotas turned on\n" msgstr "" #: quotaon.c:277 msgid "Cannot change state of GFS2 quota.\n" msgstr "" #: quotaon.c:281 msgid "Cannot change state of XFS quota. It's not compiled in kernel.\n" msgstr "" #: quotaon.c:306 #, c-format msgid "Cannot find quota file on %s [%s] to turn quotas on/off.\n" msgstr "" #: quotaon.c:311 #, c-format msgid "Quota file on %s [%s] does not exist or has wrong format.\n" msgstr "" #: quotaon.c:342 #, c-format msgid "%s quota on %s (%s) is %s\n" msgstr "" #: quotaon.c:343 msgid "on" msgstr "" #: quotaon.c:343 msgid "off" msgstr "" #: quotaon.c:359 #, c-format msgid "Name must be quotaon or quotaoff not %s\n" msgstr "" #: quotaon.c:365 #, c-format msgid "Required format %s not supported by kernel.\n" msgstr "" #: quotaon.c:367 msgid "Warning: No quota format detected in the kernel.\n" msgstr "" #: quotaon.c:374 #, c-format msgid "%s: Quota cannot be turned on on NFS filesystem\n" msgstr "" #: quotaon_xfs.c:36 #, c-format msgid "quotactl() on %s: %s\n" msgstr "" #: quotaon_xfs.c:62 quotaon_xfs.c:82 #, c-format msgid "Enabling %s quota on root filesystem (reboot to take effect)\n" msgstr "" #: quotaon_xfs.c:66 #, c-format msgid "Enable XFS %s quota accounting during mount\n" msgstr "" #: quotaon_xfs.c:76 #, c-format msgid "Cannot delete %s quota on %s - switch quota accounting off first\n" msgstr "" #: quotaon_xfs.c:87 #, c-format msgid "Enabling %s quota enforcement on %s\n" msgstr "" #: quotaon_xfs.c:90 #, c-format msgid "Already accounting %s quota on %s\n" msgstr "" #: quotaon_xfs.c:95 #, c-format msgid "Disabling %s quota accounting on %s\n" msgstr "" #: quotaon_xfs.c:99 #, c-format msgid "Quota enforcement already disabled for %s on %s\n" msgstr "" #: quotaon_xfs.c:108 #, c-format msgid "" "Cannot delete %s quota on %s - switch quota enforcement and accounting off " "first\n" msgstr "" #: quotaon_xfs.c:113 #, c-format msgid "Enforcing %s quota already on %s\n" msgstr "" #: quotaon_xfs.c:118 #, c-format msgid "Cannot switch off %s quota accounting on %s when enforcement is on\n" msgstr "" #: quotaon_xfs.c:124 msgid "and accounting " msgstr "" #: quotaon_xfs.c:125 #, c-format msgid "Disabling %s quota enforcement %son %s\n" msgstr "" #: quotaon_xfs.c:131 #, c-format msgid "Unexpected XFS quota state sought on %s\n" msgstr "" #: quotaon_xfs.c:146 #, c-format msgid "quotactl on %s: %s\n" msgstr "" #: quotaon_xfs.c:150 #, c-format msgid "%s: %s quotas turned off\n" msgstr "" #: quotaon_xfs.c:152 #, c-format msgid "%s: %s quotas turned on\n" msgstr "" #: quotaon_xfs.c:166 #, c-format msgid "Failed to delete quota: %s\n" msgstr "" #: quotaon_xfs.c:171 #, c-format msgid "%s: deleted %s quota blocks\n" msgstr "" #: quotaon_xfs.c:224 #, c-format msgid "Invalid argument \"%s\"\n" msgstr "" #: quotaops.c:108 #, c-format msgid "%s (uid %d): Permission denied\n" msgstr "" #: quotaops.c:120 #, c-format msgid "%s (gid %d): gid set allocation (%d): %s\n" msgstr "" #: quotaops.c:131 #, c-format msgid "%s (gid %d): error while trying getgroups(): %s\n" msgstr "" #: quotaops.c:142 #, c-format msgid "%s (gid %d): Permission denied\n" msgstr "" #: quotaops.c:158 #, c-format msgid "error while getting quota from %s for %s (id %u): %s\n" msgstr "" #: quotaops.c:183 #, c-format msgid "Cannot write quota for %u on %s: %s\n" msgstr "" #: quotaops.c:232 msgid "Too many parameters to editor.\n" msgstr "" #: quotaops.c:240 #, c-format msgid "Cannot exec %s\n" msgstr "" #: quotaops.c:259 quotaops.c:384 #, c-format msgid "Cannot duplicate descriptor of file to write to: %s\n" msgstr "" #: quotaops.c:261 #, c-format msgid "Disk quotas for %s %s (%cid %d):\n" msgstr "" #: quotaops.c:265 #, c-format msgid "" " Filesystem blocks soft hard inodes " "soft hard\n" msgstr "" #: quotaops.c:298 #, c-format msgid "WARNING - %s: cannot change current block allocation\n" msgstr "" #: quotaops.c:301 #, c-format msgid "WARNING - %s: cannot change current inode allocation\n" msgstr "" #: quotaops.c:319 quotaops.c:426 #, c-format msgid "Cannot duplicate descriptor of temp file: %s\n" msgstr "" #: quotaops.c:332 #, c-format msgid "" "Bad format:\n" "%s\n" msgstr "" #: quotaops.c:386 #, c-format msgid "Times to enforce softlimit for %s %s (%cid %d):\n" msgstr "" #: quotaops.c:388 quotaops.c:490 #, c-format msgid "Time units may be: days, hours, minutes, or seconds\n" msgstr "" #: quotaops.c:390 #, c-format msgid "" " Filesystem block grace inode grace\n" msgstr "" #: quotaops.c:395 quotaops.c:401 quotaops.c:443 quotaops.c:455 setquota.c:245 #: setquota.c:251 msgid "unset" msgstr "" #: quotaops.c:397 quotaops.c:403 msgid "0seconds" msgstr "" #: quotaops.c:399 quotaops.c:405 quotasys.c:320 #, c-format msgid "%useconds" msgstr "" #: quotaops.c:440 quotaops.c:538 #, c-format msgid "" "bad format:\n" "%s\n" msgstr "" #: quotaops.c:450 quotaops.c:543 msgid "Bad time units. Units are 'second', 'minute', 'hour', and 'day'.\n" msgstr "" #: quotaops.c:486 #, c-format msgid "Cannot duplicate descriptor of file to edit: %s\n" msgstr "" #: quotaops.c:488 #, c-format msgid "Grace period before enforcing soft limits for %ss:\n" msgstr "" #: quotaops.c:491 #, c-format msgid " Filesystem Block grace period Inode grace period\n" msgstr "" #: quotaops.c:517 #, c-format msgid "Cannot reopen temp file: %s\n" msgstr "" #: quotastats.c:48 #, c-format msgid "Cannot read stat file %s: %s\n" msgstr "" #: quotastats.c:83 #, c-format msgid "Error while getting quota statistics from kernel: %s\n" msgstr "" #: quotastats.c:87 #, c-format msgid "Error while getting old quota statistics from kernel: %s\n" msgstr "" #: quotastats.c:101 #, c-format msgid "Kernel quota version: old\n" msgstr "" #: quotastats.c:103 #, c-format msgid "Kernel quota version: %u.%u.%u\n" msgstr "" #: quotastats.c:104 #, c-format msgid "Number of dquot lookups: %ld\n" msgstr "" #: quotastats.c:105 #, c-format msgid "Number of dquot drops: %ld\n" msgstr "" #: quotastats.c:106 #, c-format msgid "Number of dquot reads: %ld\n" msgstr "" #: quotastats.c:107 #, c-format msgid "Number of dquot writes: %ld\n" msgstr "" #: quotastats.c:108 #, c-format msgid "Number of quotafile syncs: %ld\n" msgstr "" #: quotastats.c:109 #, c-format msgid "Number of dquot cache hits: %ld\n" msgstr "" #: quotastats.c:110 #, c-format msgid "Number of allocated dquots: %ld\n" msgstr "" #: quotastats.c:111 #, c-format msgid "Number of free dquots: %ld\n" msgstr "" #: quotastats.c:112 #, c-format msgid "Number of in use dquot entries (user/group): %ld\n" msgstr "" #: quotasync.c:25 #, c-format msgid "" "Utility for syncing quotas.\n" "Usage:\n" "%s [-ug] -a | mntpoint...\n" "\n" msgstr "" #: quotasync.c:89 #, c-format msgid "%s quota sync failed: %s\n" msgstr "" #: quotasync.c:100 #, c-format msgid "%s quota sync failed for %s: %s\n" msgstr "" #: quotasys.c:94 #, c-format msgid "user %s does not exist.\n" msgstr "" #: quotasys.c:123 #, c-format msgid "group %s does not exist.\n" msgstr "" #: quotasys.c:225 #, c-format msgid "" "Unknown quota format: %s\n" "Supported 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" msgstr "" #: quotasys.c:308 #, c-format msgid "%ddays" msgstr "" #: quotasys.c:310 #, c-format msgid "%02d:%02d" msgstr "" #: quotasys.c:322 #, c-format msgid "%uminutes" msgstr "" #: quotasys.c:324 #, c-format msgid "%uhours" msgstr "" #: quotasys.c:326 #, c-format msgid "%udays" msgstr "" #: quotasys.c:335 msgid "second" msgstr "" #: quotasys.c:335 msgid "seconds" msgstr "" #: quotasys.c:337 msgid "minute" msgstr "" #: quotasys.c:337 msgid "minutes" msgstr "" #: quotasys.c:339 msgid "hour" msgstr "" #: quotasys.c:339 msgid "hours" msgstr "" #: quotasys.c:341 msgid "day" msgstr "" #: quotasys.c:341 msgid "days" msgstr "" #: quotasys.c:535 #, c-format msgid "Cannot stat quota file %s: %s\n" msgstr "" #: quotasys.c:681 msgid "Not all specified mountpoints are using quota.\n" msgstr "" #: quotasys.c:695 #, c-format msgid "Error while releasing file on %s\n" msgstr "" #: quotasys.c:754 #, c-format msgid "Cannot create set for sigaction(): %s\n" msgstr "" #: quotasys.c:757 #, c-format msgid "Cannot set signal handler: %s\n" msgstr "" #: quotasys.c:810 #, c-format msgid "Cannot reset signal handler: %s\n" msgstr "" #: quotasys.c:950 msgid "Cannot open any file with mount points.\n" msgstr "" #: quotasys.c:963 #, c-format msgid "Cannot get device name for %s\n" msgstr "" #: quotasys.c:1017 #, c-format msgid "Cannot resolve mountpoint path %s: %s\n" msgstr "" #: quotasys.c:1023 #, c-format msgid "Cannot statfs() %s: %s\n" msgstr "" #: quotasys.c:1035 #, c-format msgid "Cannot stat() mounted device %s: %s\n" msgstr "" #: quotasys.c:1040 #, c-format msgid "" "Device (%s) filesystem is mounted on unsupported device type. Skipping.\n" msgstr "" #: quotasys.c:1050 #, c-format msgid "Cannot stat() mountpoint %s: %s\n" msgstr "" #: quotasys.c:1116 #, c-format msgid "" "Cannot find a device with %s.\n" "Skipping...\n" msgstr "" #: quotasys.c:1120 #, c-format msgid "" "Cannot stat() a mountpoint with %s: %s\n" "Skipping...\n" msgstr "" #: quotasys.c:1128 #, c-format msgid "" "Cannot stat() given mountpoint %s: %s\n" "Skipping...\n" msgstr "" #: quotasys.c:1138 #, c-format msgid "Cannot find a filesystem mountpoint for directory %s\n" msgstr "" #: quotasys.c:1144 #, c-format msgid "Cannot resolve path %s: %s\n" msgstr "" #: quotasys.c:1155 #, c-format msgid "Cannot find mountpoint for device %s\n" msgstr "" #: quotasys.c:1161 #, c-format msgid "Specified path %s is not directory nor device.\n" msgstr "" #: quotasys.c:1169 msgid "No correct mountpoint specified.\n" msgstr "" #: quotasys.c:1224 #, c-format msgid "Mountpoint (or device) %s not found or has no quota enabled.\n" msgstr "" #: quot.c:81 #, c-format msgid "Usage: %s [-acfugvViTq] [filesystem...]\n" msgstr "" #: quot.c:178 #, c-format msgid "%s (%s):\n" msgstr "" #: quot.c:182 quot.c:186 #, c-format msgid "%d\t%llu\t%llu\n" msgstr "" #: quot.c:195 #, c-format msgid "%s (%s) %s:\n" msgstr "" #: quot.c:203 quot.c:205 #, c-format msgid "%8llu " msgstr "" #: quot.c:208 #, c-format msgid "%s" msgstr "" #: quot.c:210 #, c-format msgid "%-8.8s" msgstr "" #: quot.c:212 #, c-format msgid "#%-7d" msgstr "" #: quot.c:214 #, c-format msgid " %8llu %8llu %8llu" msgstr "" #: quot.c:362 #, c-format msgid "cannot open %s: %s\n" msgstr "" #: quot.c:382 #, c-format msgid "XFS_IOC_FSBULKSTAT ioctl failed: %s\n" msgstr "" #: repquota.c:50 #, 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 9 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 "" #: repquota.c:145 msgid "Repquota cannot report through RPC calls.\n" msgstr "" #: repquota.c:149 msgid "Specified both -n and -t but only one of them can be used.\n" msgstr "" #: repquota.c:292 msgid "Space" msgstr "" #: repquota.c:294 msgid "Block" msgstr "" #: repquota.c:296 #, c-format msgid "*** Report for %s quotas on device %s\n" msgstr "" #: repquota.c:299 #, c-format msgid "Block grace time: %s; Inode grace time: %s\n" msgstr "" #: repquota.c:300 #, c-format msgid " %s limits File limits\n" msgstr "" #: repquota.c:301 #, c-format msgid "%-9s used soft hard grace used soft hard grace\n" msgstr "" #: repquota.c:301 msgid "User" msgstr "" #: repquota.c:301 msgid "Group" msgstr "" #: rquota_svc.c:88 #, 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 "" #: rquota_svc.c:99 #, 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 "" #: rquota_svc.c:146 #, c-format msgid "Illegal port number: %s\n" msgstr "" #: rquota_svc.c:153 #, c-format msgid "Cannot access the specified xtab file %s: %s\n" msgstr "" #: rquota_svc.c:183 #, c-format msgid "host %s attempted to call setquota when disabled\n" msgstr "" #: rquota_svc.c:190 #, c-format msgid "host %s attempted to call setquota from port >= 1024\n" msgstr "" #: rquota_svc.c:205 #, c-format msgid "Denied access to host %s\n" msgstr "" #: rquota_svc.c:293 rquota_svc.c:379 msgid "unable to free arguments\n" msgstr "" #: rquota_svc.c:402 #, c-format msgid "" "Warning: Cannot open export table %s: %s\n" "Using '/' as a pseudofilesystem root.\n" msgstr "" #: rquota_svc.c:454 msgid "cannot create udp service.\n" msgstr "" #: rquota_svc.c:458 msgid "unable to register (RQUOTAPROG, RQUOTAVERS, udp).\n" msgstr "" #: rquota_svc.c:462 msgid "unable to register (RQUOTAPROG, EXT_RQUOTAVERS, udp).\n" msgstr "" #: rquota_svc.c:469 msgid "cannot create tcp service.\n" msgstr "" #: rquota_svc.c:473 msgid "unable to register (RQUOTAPROG, RQUOTAVERS, tcp).\n" msgstr "" #: rquota_svc.c:477 msgid "unable to register (RQUOTAPROG, EXT_RQUOTAVERS, tcp).\n" msgstr "" #: rquota_svc.c:486 msgid "svc_run returned\n" msgstr "" #: set_limits_example.c:20 #, c-format msgid "copy_user_quota_limits: Failed to set userquota for uid %ld : %s\n" msgstr "" #: set_limits_example.c:27 #, c-format msgid "copy_user_quota_limits: Failed to get userquota for uid %ld : %s\n" msgstr "" #: set_limits_example.c:43 #, c-format msgid "copy_group_quota_limits: Failed to set groupquota for gid %ld : %s\n" msgstr "" #: set_limits_example.c:50 #, c-format msgid "copy_group_quota_limits: Failed to get groupquota for gid %ld : %s\n" msgstr "" #: setquota.c:55 #, 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 [-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" msgstr "" #: setquota.c:72 msgid "" "-r, --remote set remote quota (via RPC)\n" "-m, --no-mixed-pathnames trim leading slashes from NFSv4 mountpoints\n" msgstr "" #: setquota.c:75 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 "" #: setquota.c:90 warnquota.c:182 #, c-format msgid "%s: %s\n" msgstr "" #: setquota.c:186 msgid "Group and user quotas cannot be used together.\n" msgstr "" #: setquota.c:190 msgid "Prototype user has no sense when editing grace times.\n" msgstr "" #: setquota.c:194 msgid "Cannot set both individual and global grace time.\n" msgstr "" #: setquota.c:198 msgid "Batch mode cannot be used for setting grace times.\n" msgstr "" #: setquota.c:202 msgid "Batch mode and prototype user cannot be used together.\n" msgstr "" #: setquota.c:206 msgid "Cannot set grace times over RPC protocol.\n" msgstr "" #: setquota.c:229 msgid "Bad block softlimit" msgstr "" #: setquota.c:230 msgid "Bad block hardlimit" msgstr "" #: setquota.c:231 msgid "Bad inode softlimit" msgstr "" #: setquota.c:232 msgid "Bad inode hardlimit" msgstr "" #: setquota.c:238 setquota.c:250 msgid "Bad block grace time" msgstr "" #: setquota.c:239 setquota.c:256 msgid "Bad inode grace time" msgstr "" #: setquota.c:262 msgid "Mountpoint not specified.\n" msgstr "" #: setquota.c:317 #, c-format msgid "Line %d too long.\n" msgstr "" #: setquota.c:329 #, c-format msgid "Cannot parse input line %d.\n" msgstr "" #: setquota.c:331 setquota.c:339 msgid "Exitting.\n" msgstr "" #: setquota.c:332 setquota.c:340 msgid "Skipping line.\n" msgstr "" #: setquota.c:337 #, c-format msgid "Unable to resolve name '%s' on line %d.\n" msgstr "" #: setquota.c:383 #, c-format msgid "Setting grace period on %s is not supported.\n" msgstr "" #: setquota.c:405 #, c-format msgid "Not setting block grace time on %s because softlimit is not exceeded.\n" msgstr "" #: setquota.c:409 #, c-format msgid "Not setting inode grace time on %s because softlimit is not exceeded.\n" msgstr "" #: setquota.c:412 #, c-format msgid "" "cannot write times for %s. Maybe kernel does not support such operation?\n" msgstr "" #: svc_socket.c:42 #, c-format msgid "Cannot create socket: %s\n" msgstr "" #: svc_socket.c:49 #, c-format msgid "Cannot set socket options: %s\n" msgstr "" #: svc_socket.c:84 #, c-format msgid "Cannot bind to given address: %s\n" msgstr "" #: 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 "" #: 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 "" #: 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 "" #: 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 "" #: warnquota.c:226 #, c-format msgid "Cannot get name for uid/gid %u.\n" msgstr "" #: warnquota.c:310 #, c-format msgid "Cannot create pipe: %s\n" msgstr "" #: warnquota.c:316 #, c-format msgid "Cannot fork: %s\n" msgstr "" #: warnquota.c:321 #, c-format msgid "Cannot duplicate descriptor: %s\n" msgstr "" #: warnquota.c:325 #, c-format msgid "Cannot execute '%s': %s\n" msgstr "" #: warnquota.c:330 #, c-format msgid "Cannot open pipe: %s\n" msgstr "" #: warnquota.c:411 msgid "Could not setup ldap connection, returning.\n" msgstr "" #: warnquota.c:434 #, c-format msgid "Error with %s.\n" msgstr "" #: warnquota.c:442 #, c-format msgid "Multiple entries found for client %s (%d). Not sending mail.\n" msgstr "" #: warnquota.c:446 #, c-format msgid "Entry not found for client %s. Not sending mail.\n" msgstr "" #: warnquota.c:457 #, c-format msgid "Could not get values for %s.\n" msgstr "" #: warnquota.c:489 #, c-format msgid "Administrator for a group %s not found. Cancelling mail.\n" msgstr "" #: warnquota.c:534 #, c-format msgid "" "\n" " Block limits File limits\n" msgstr "" #: warnquota.c:535 #, c-format msgid "" "Filesystem used soft hard grace used soft hard grace\n" msgstr "" #: warnquota.c:575 #, c-format msgid "Cannot wait for mailer: %s\n" msgstr "" #: warnquota.c:577 msgid "Warning: Mailer exitted abnormally.\n" msgstr "" #: warnquota.c:634 #, c-format msgid "" "Cannot open %s: %s\n" "Will use device names.\n" msgstr "" #: warnquota.c:657 #, c-format msgid "Cannot parse line %d in quotatab (missing ':')\n" msgstr "" #: warnquota.c:671 #, c-format msgid "Cannot stat device %s (maybe typo in quotatab)\n" msgstr "" #: warnquota.c:691 #, c-format msgid "" "Incorrect format string for variable %s.\n" "Unrecognized expression %%%c.\n" msgstr "" #: warnquota.c:730 #, c-format msgid "Cannot open %s: %s\n" msgstr "" #: warnquota.c:750 #, c-format msgid "Line %d too long. Truncating.\n" msgstr "" #: warnquota.c:822 #, c-format msgid "Cannot parse time at CC_BEFORE variable (line %d).\n" msgstr "" #: warnquota.c:846 #, c-format msgid "Error in config file (line %d), ignoring\n" msgstr "" #: warnquota.c:849 #, c-format msgid "Possible error in config file (line %d), ignoring\n" msgstr "" #: warnquota.c:852 msgid "Unterminated last line, ignoring\n" msgstr "" #: warnquota.c:859 #, c-format msgid "" "LDAP library version >= 2.3 detected. Please use LDAP_URI instead of " "hostname and port.\n" "Generated URI %s\n" msgstr "" #: warnquota.c:863 msgid "LDAP library does not support ldap_initialize() but URI is specified." msgstr "" #: warnquota.c:885 #, c-format msgid "Cannot open file with group administrators: %s\n" msgstr "" #: warnquota.c:900 #, c-format msgid "Parse error at line %d. Cannot find end of group name.\n" msgstr "" #: warnquota.c:909 #, c-format msgid "Parse error at line %d. Cannot find administrators name.\n" msgstr "" #: warnquota.c:919 #, c-format msgid "" "Parse error at line %d. Trailing characters after administrators name.\n" msgstr "" #: warnquota.c:982 msgid "" "Usage:\n" " warnquota [-ugsid] [-F quotaformat] [-c configfile] [-q quotatabfile] [-a " "adminsfile] [filesystem...]\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 "" #: warnquota.c:1063 #, c-format msgid "Cannot get host name: %s\n" msgstr "" #: xqmstats.c:32 xqmstats.c:37 msgid "The running kernel does not support XFS\n" msgstr "" #: xqmstats.c:49 #, c-format msgid "XFS Quota Manager dquot statistics\n" msgstr "" #: xqmstats.c:50 #, c-format msgid " reclaims: %u\n" msgstr "" #: xqmstats.c:51 #, c-format msgid " missed reclaims: %u\n" msgstr "" #: xqmstats.c:52 #, c-format msgid " dquot dups: %u\n" msgstr "" #: xqmstats.c:53 #, c-format msgid " cache misses: %u\n" msgstr "" #: xqmstats.c:54 #, c-format msgid " cache hits: %u\n" msgstr "" #: xqmstats.c:55 #, c-format msgid " dquot wants: %u\n" msgstr "" #: xqmstats.c:56 #, c-format msgid " shake reclaims: %u\n" msgstr "" #: xqmstats.c:57 #, c-format msgid " inact reclaims: %u\n" msgstr "" #: xqmstats.c:62 #, c-format msgid "Maximum %u dquots (currently %u incore, %u on freelist)\n" msgstr "" #: quota.h:19 msgid "user" msgstr "" #: quota.h:20 msgid "group" msgstr "" #: quota.h:21 msgid "undefined" msgstr "" ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quota-tools/quota-nfs.sh����������������������������������������������������������������������������0000755�0001750�0001750�00000001357�11650022303�015405� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/bin/bash # This is a script which generates more user friendly output of quota(1) # command for systems with NFS-mounted home directories. # # In the simplest case it is enough to edit BASEDIR to point to a directory # under which home directories are mounted. In more complicated cases, # updating the shell matching code should be simple enough. # # Note that you can use also device name (NFS export in case of NFS mount # point) for your matching. BASEDIR="/home" DIRS=`quota -A -Q -v --show-mntpoint --no-wrap | sed -n -e '3,$p' | cut -d ' ' -f 1,2 | while read DEVICE DIR; do case $DIR in $BASEDIR/$LOGNAME) echo -n "$DIR " ;; $BASEDIR/*) ;; *) echo -n "$DIR " ;; esac done` if [ -n "$DIRS" ]; then quota $@ -f $DIRS fi ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quota-tools/dqblk_v2.h������������������������������������������������������������������������������0000644�0001750�0001750�00000002407�11650022303�015003� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * * 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 ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quota-tools/config.h.in�����������������������������������������������������������������������������0000644�0001750�0001750�00000004646�11650022303�015160� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* config.h.in. Generated from configure.in by autoheader. */ /* Alternative file format of edquota */ #undef ALT_FORMAT /* File with mounted filesystems */ #undef ALT_MTAB /* Check rights to query / set quotas before calling quotactl */ #undef BSD_BEHAVIOUR /* Configuration options */ #undef COMPILE_OPTS /* Scanning of ext? filesystems using e2fslib */ #undef EXT2_DIRECT /* Header files for e2fslib */ #undef HAVE_EXT2_INCLUDE /* ext2fs.h defines ext2_ino_t */ #undef HAVE_EXT2_INO_T /* Define to 1 if you have the <inttypes.h> header file. */ #undef HAVE_INTTYPES_H /* Define to 1 if you have the <memory.h> header file. */ #undef HAVE_MEMORY_H /* Define to 1 if you have the <stdint.h> header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the <stdlib.h> header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the <strings.h> header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the <string.h> header file. */ #undef HAVE_STRING_H /* Define to 1 if you have the <sys/stat.h> header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the <sys/types.h> header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have the <unistd.h> header file. */ #undef HAVE_UNISTD_H /* Use hosts.allow and hosts.deny for access checking of rpc.rquotad */ #undef HOSTS_ACCESS /* ldap_perror function not declared */ #undef NEED_LDAP_PERROR /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Version of quota tools */ #undef PACKAGE_VERSION /* Support for RPC */ #undef RPC /* Allow setting of quotas over RPC */ #undef RPC_SETQUOTA /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* Use gettext to translate messages */ #undef USE_GETTEXT /* LDAP 2.3 or newer installed */ #undef USE_LDAP_23 /* Lookup email address using LDAP */ #undef USE_LDAP_MAIL_LOOKUP /* Assume quota mount options for root filesystem */ #undef XFS_ROOTHACK /* Define to empty if `const' does not conform to ANSI C. */ #undef const /* Define to `__inline__' or `__inline' if that's what the C compiler calls it, or to nothing if 'inline' is not supported under any name. */ #ifndef __cplusplus #undef inline #endif ������������������������������������������������������������������������������������������quota-tools/pot.h�����������������������������������������������������������������������������������0000644�0001750�0001750�00000000256�11650022303�014101� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#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 ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quota-tools/common.h��������������������������������������������������������������������������������0000644�0001750�0001750�00000002232�11650022303�014563� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * * 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 */ ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quota-tools/quotaio_xfs.c���������������������������������������������������������������������������0000644�0001750�0001750�00000016154�11764341235�015655� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * 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 "pot.h" #include "common.h" #include "bylabel.h" #include "quotaio.h" #include "quotasys.h" #include "dqblk_xfs.h" #include "quotaio_generic.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_flags |= XFS_USRQUOTA(h) ? XFS_USER_QUOTA : XFS_GROUP_QUOTA; xdqblk.d_id = id; if (strcmp(h->qh_fstype, MNTTYPE_GFS2) == 0) { if (flags & COMMIT_LIMITS) /* warn/limit */ xdqblk.d_fieldmask |= FS_DQ_BSOFT | FS_DQ_BHARD; if (flags & COMMIT_USAGE) /* block usage */ xdqblk.d_fieldmask |= FS_DQ_BCOUNT; } else { 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_get_dquot(struct dquot *dq) { struct xfs_kern_dqblk d; int qcmd = QCMD(Q_XFS_GETQUOTA, dq->dq_h->qh_type); int ret; memset(&d, 0, sizeof(d)); ret = quotactl(qcmd, dq->dq_h->qh_quotadev, dq->dq_id, (void *)&d); if (ret < 0) { if (errno == ENOENT) return 0; return -1; } xfs_kern2utildqblk(&dq->dq_dqb, &d); return 0; } /* * 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)) { if (!XFS_USRQUOTA(h) && !XFS_GRPQUOTA(h)) return 0; return generic_scan_dquots(h, process_dquot, xfs_get_dquot); } /* * 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; } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quota-tools/README.ldap-support���������������������������������������������������������������������0000644�0001750�0001750�00000002544�11442151253�016447� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������LDAP support for warnquota by James Bourne <jbourne@hardrock.org> The LDAP support added to warnquota allows you to retreive mail routing information from an LDAP server so that you can send mail to the correct addresses. So for example if usera has the email address usera@foo.bar.com and userb has userb@baz.bar.com you can have the attributes as follows (obvious things missing here): dn: uid=usera,ou=People,dc=bar,dc=com uid: usera mail: usera@foo.bar.com dn: uid=userb,ou=People,dc=bar,dc=com uid: userb mail: userb@baz.bar.com warnquota.conf should be set like this (if you allow anonymous binds and reads of the mail attribute: LDAP_MAIL = true LDAP_HOST = ldap.bar.com LDAP_PORT = 389 LDAP_BASEDN = ou=People,dc=bar,dc=com LDAP_SEARCH_ATTRIBUTE = uid LDAP_MAIL_ATTRIBUTE = mail LDAP_DEFAULT_MAIL_DOMAIN = bar.com If not, just add: LDAP_BINDDN = uid=readonly,dc=bar,dc=com LDAP_BINDPW = it'sapasswd and you will bind as the user readonly and search that way. If you need to do lookups using a different attribute (Novell eDir for example uses cn=username) change the LDAP_SEARCH_ATTRIBUTE to cn. Same with LDAP_MAIL_ATTRIBUTE. If you use mail routing in LDAP (roughly following the Laser Draft) you can set this to mailLocalAddress and warnquota will send to that address. This will guarentee that your quota mail will be delivered to the correct address. ������������������������������������������������������������������������������������������������������������������������������������������������������������quota-tools/convertquota.8��������������������������������������������������������������������������0000644�0001750�0001750�00000002716�11650022303�015754� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������.TH CONVERTQUOTA 8 "Fri Aug 20 1999" .UC 4 .SH NAME convertquota \- convert quota from old file format to new one .SH SYNOPSIS .B convertquota [ .B -ug ] .B -e .I filesystem .LP .B convertquota [ .B -ug ] .B -f .IR oldformat , newformat .I filesystem .SH DESCRIPTION .B convertquota converts old quota files .BR quota.user and .BR quota.group to files .BR aquota.user and .BR aquota.group in new format currently used by 2.4.0-ac? and newer or by SuSE or Red Hat Linux 2.4 kernels on .IR filesystem . .PP New file format allows using quotas for 32-bit uids / gids, setting quotas for root, accounting used space in bytes (and so allowing use of quotas in ReiserFS) and it is also architecture independent. This format introduces Radix Tree (a simple form of tree structure) to quota file. .SH OPTIONS .TP .B -u, --user convert user quota file. This is the default. .TP .B -g, --group convert group quota file. .TP .B -f, --convert-format \f2oldformat,newformat\f1 convert quota file from .I oldformat to .IR newformat . .TP .B -e, --convert-endian convert vfsv0 file format from big endian to little endian (old kernels had a bug and did not store quota files in little endian format). .TP .B -V, --version print version information. .SH FILES .TP 20 .B aquota.user new user quota file .TP .B aquota.group new group quota file .SH "SEE ALSO" .BR quota (1), .BR setquota (8), .BR edquota (8), .BR quotacheck (8), .BR quotaon (8), .BR repquota (8) .SH AUTHOR Jan Kara \<jack@suse.cz\> ��������������������������������������������������quota-tools/quotacheck_v2.c�������������������������������������������������������������������������0000644�0001750�0001750�00000033161�11723521212�016035� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * * 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; } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quota-tools/quotaio_v2.h����������������������������������������������������������������������������0000644�0001750�0001750�00000006266�11650022303�015376� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * * 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 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quota-tools/quot.c����������������������������������������������������������������������������������0000644�0001750�0001750�00000022537�11723777403�014313� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * 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 static __uint64_t sizes[TSIZE]; static __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 *, const char *, int); static void creport(const char *, const 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 mount_entry *mntp; while ((mntp = get_next_mount())) { /* Currently, only XFS is implemented... */ if (strcmp(mntp->me_type, MNTTYPE_XFS) == 0) { checkXFS(mntp->me_devname, mntp->me_dir); doit = 1; } /* ...additional filesystems types here. */ if (doit) { if (cflag) creport(mntp->me_devname, mntp->me_dir); if (!cflag && uflag) report(mntp->me_devname, mntp->me_dir, 0); if (!cflag && gflag) report(mntp->me_devname, mntp->me_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, const 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, const char *fsdir, int type) { du_t *dp; printf(_("%s (%s) %ss:\n"), file, fsdir, _(type2name(type))); 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, const 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); } �����������������������������������������������������������������������������������������������������������������������������������������������������������������quota-tools/rquota.3��������������������������������������������������������������������������������0000644�0001750�0001750�00000001145�11442151253�014531� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������.\"@(#)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) ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quota-tools/po/�������������������������������������������������������������������������������������0000755�0001750�0001750�00000000000�11724000137�013544� 5����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quota-tools/po/de.po��������������������������������������������������������������������������������0000644�0001750�0001750�00000262623�11650022303�014504� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. # msgid "" msgstr "" "Project-Id-Version: quota-tools\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-02-21 12:18+0100\n" "PO-Revision-Date: 2010-02-21 13:10+0100\n" "Last-Translator: Michael Bunk <mb@computer-leipzig.com>\n" "Language-Team: LANGUAGE <LL@li.org>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: German\n" "X-Poedit-Country: GERMANY\n" #: bylabel.c:253 #, c-format msgid "Found an invalid UUID: %s\n" msgstr "Ungültige UUID gefunden: %s\n" #: bylabel.c:273 #, c-format msgid "Error checking device name: %s\n" msgstr "Fehler bei Prüfung des Gerätenamens: %s\n" #: common.c:124 #, c-format msgid "Quota utilities version %s.\n" msgstr "Quota-Hilfsprogramme Version %s.\n" #: common.c:125 #, c-format msgid "Compiled with:%s\n" msgstr "Compiliert mit:%s\n" #: common.c:126 #: convertquota.c:48 #: quotacheck.c:318 #: repquota.c:64 #: warnquota.c:996 #, c-format msgid "Bugs to %s\n" msgstr "Fehler an %s\n" #: convertquota.c:41 #, 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 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" msgstr "" "Hilfsprogramm zur Konvertierung von Quota-Dateien.\n" "Verwendung:\n" "\t%s [Optionen] Mountpunkt\n" "\n" "-u, --user Eine Nutzerquotadatei umwandeln\n" "-g, --group Eine Gruppenquotadatei umwandel\n" "-e, --convert-endian Quotadatei in richtige Bytereihenfolge umwandeln\n" "-f, --convert-format oldfmt,newfmt Aus altem Format in das VFSv0-Quotaformat umwandeln\n" "-h, --help Diesen Hilfetext anzeigen und beenden\n" "-V, --version Versionsinformation ausgeben und beenden\n" "\n" #: convertquota.c:97 msgid "You have to specify source and target format of conversion.\n" msgstr "Für Konvertierungen müssen Sie das Quell- und das Zielformat angeben.\n" #: convertquota.c:112 #: quotacheck.c:404 #: quotaon.c:133 #: repquota.c:141 #: setquota.c:217 msgid "Bad number of arguments.\n" msgstr "Falsche Anzahl an Argumenten.\n" #: convertquota.c:119 msgid "You have to specify action to perform.\n" msgstr "Sie müssen die auszuführende Aktion angeben.\n" #: convertquota.c:166 #: quotacheck_v2.c:241 #: quotaio_tree.c:58 #, c-format msgid "Cannot read block %u: %s\n" msgstr "Kann Block nicht lesen %u: %s\n" #: convertquota.c:191 #: convertquota.c:283 #, c-format msgid "Cannot commit dquot for id %u: %s\n" msgstr "Kann dquot für id %u nicht speichern: %s\n" #: convertquota.c:239 msgid "Cannot read header of old quotafile.\n" msgstr "Kann Kopfinformation einer Quotadatei alten Formats nicht lesen.\n" #: convertquota.c:243 msgid "Bad file magic or version (probably not quotafile with bad endianity).\n" msgstr "Falsche Magische Bytefolge oder Version (wahrscheinlich keine Quotadatei mit falscher Bytereihenfolge).\n" #: convertquota.c:254 msgid "Cannot read information about old quotafile.\n" msgstr "Kann Information über Quotadatei im alten Format nicht lesen.\n" #: convertquota.c:296 msgid "Cannot get name of new quotafile.\n" msgstr "Kann Namen der Quotadatei im neuen Format nicht bekommen.\n" #: convertquota.c:302 #: quotacheck.c:752 #, c-format msgid "Cannot rename new quotafile %s to name %s: %s\n" msgstr "Kann neue Quotadatei %s nicht in %s umbenennen: %s\n" #: convertquota.c:316 #, c-format msgid "Cannot open old format file for %ss on %s\n" msgstr "Kann Quotadatei alten Formats nicht für %ss in %s öffnen\n" #: convertquota.c:321 #: convertquota.c:354 #, c-format msgid "Cannot create file for %ss for new format on %s: %s\n" msgstr "Kann Datei für %ss im neuen Format auf %s nicht anlegen: %s\n" #: convertquota.c:344 #, c-format msgid "Cannot open old quota file on %s: %s\n" msgstr "Kann Quotadatei im alten Format auf %s nicht öffnen: %s\n" #: convertquota.c:380 msgid "Unknown action should be performed.\n" msgstr "Unbekannte Aktion sollte ausgeführt werden.\n" #: edquota.c:81 #, 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 "" "Verwendung:\n" "\tedquota %1$s[-u] [-F formatname] [-p benutzername] [-f dateisystem] benutzername ...\n" "\tedquota %1$s-g [-F formatname] [-p gruppenname] [-f dateisystem] gruppenname ...\n" "\tedquota %1$s[-u|g] [-F formatname] [-f dateisystem] -t\n" "\tedquota %1$s[-u|g] [-F formatname] [-f dateisystem] -T benutzername|gruppenname ...\n" #: edquota.c:85 msgid "" "\n" "-u, --user edit user data\n" "-g, --group edit group data\n" msgstr "" "\n" "-u, --user Benutzerdaten bearbeiten\n" "-g, --group Gruppendaten bearbeiten\n" #: edquota.c:89 msgid "" "-r, --remote edit remote quota (via RPC)\n" "-m, --no-mixed-pathnames trim leading slashes from NFSv4 mountpoints\n" msgstr "" "-r, --remote entferne Quota bearbeiten (über RPC)\n" "-m, --no-mixed-pathnames entferne führende Schrägstriche von NFSv4-Mountpunkten\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=formatname Quotas eines bestimmten Formats bearbeiten\n" "-p, --prototype=name Kopiere Daten von einem Vorlagenutzer/einer Vorlagegruppe\n" " --always-resolve Versuche stets, einen Namen aufzulösen, auch wenn er\n" " nur aus Ziffern besteht\n" "-f, --filesystem=filesystem Bearbeite nur Daten eines bestimmten Dateisystems\n" "-t, --edit-period Bearbeite Standard-Gnadenfrist\n" "-T, --edit-times Bearbeite Gradenfrist eines Nutzers/einer Gruppe\n" "-h, --help Zeige diesen Hilfetext and und beende das Programm\n" "-V, --version Zeige Versionsinformationen and und beende das Programm\n" "\n" #: edquota.c:101 #: quota.c:107 #: setquota.c:79 #, c-format msgid "Bugs to: %s\n" msgstr "Fehler an: %s\n" #: edquota.c:182 msgid "Prototype name does not make sense when editing grace period or times.\n" msgstr "Die Angabe eines Vorlagenamens macht keinen Sinn, wenn Gnadenfrist oder Standard-Gnadenfrist bearbeitet werden soll.\n" #: edquota.c:200 #, c-format msgid "Cannot get quota information for user %s\n" msgstr "Kann Quota-Informationen für Nutzer %s nicht erhalten\n" #: edquota.c:206 msgid "fsname mismatch\n" msgstr "Dateisystemname paßt nicht\n" #: edquota.c:248 msgid "No filesystems with quota detected.\n" msgstr "Keine Dateisysteme mit Quotainformationen gefunden.\n" #: edquota.c:264 #, c-format msgid "Cannot create temporary file: %s\n" msgstr "Kann temporäre Datei nicht anlegen: %s\n" #: edquota.c:269 #, c-format msgid "Cannot change owner of temporary file: %s\n" msgstr "Kann Eigentümer einer temporären Datei nicht ändern: %s\n" #: edquota.c:276 msgid "Cannot write grace times to file.\n" msgstr "Kann Gnadenfristen nicht in Datei ablegen.\n" #: edquota.c:280 msgid "Error while editing grace times.\n" msgstr "Fehler beim Bearbeiten von Gnadenfristen.\n" #: edquota.c:284 msgid "Failed to parse grace times file.\n" msgstr "Konnte Gnadenfristendatei nicht parsen.\n" #: edquota.c:293 #: edquota.c:319 #, c-format msgid "Cannot get quota information for user %s.\n" msgstr "Kann Quota-Informationen für Nutzer %s nicht erhalten.\n" #: edquota.c:295 msgid "Cannot write individual grace times to file.\n" msgstr "Kann einzelne Gnadenfristen nicht in Datei schreiben.\n" #: edquota.c:300 msgid "Error while editing individual grace times.\n" msgstr "Fehler bei Bearbeitung einzelner Gnadenfristen.\n" #: edquota.c:305 msgid "Cannot read individual grace times from file.\n" msgstr "Kann einzelne Gnadenfristen nicht aus Datei lesen.\n" #: edquota.c:321 msgid "Cannot write quotas to file.\n" msgstr "Kann Quotainformationen nicht in Datei schreiben.\n" #: edquota.c:326 msgid "Error while editing quotas.\n" msgstr "Fehler beim Bearbeiten von Quotas.\n" #: edquota.c:332 msgid "Cannot reopen!" msgstr "Kann Datei nicht zum wiederholten Male öffnen!" #: edquota.c:334 msgid "Cannot read quotas from file.\n" msgstr "Kann Quotas nicht aus Datei lesen.\n" #: quot.c:81 #, c-format msgid "Usage: %s [-acfugvViTq] [filesystem...]\n" msgstr "Verwendung: %s [-acfugvViTq] [Dateisystem...]\n" #: quot.c:178 #, c-format msgid "%s (%s):\n" msgstr "%s (%s):\n" #: quot.c:182 #: quot.c:186 #, c-format msgid "%d\t%llu\t%llu\n" msgstr "%d\t%llu\t%llu\n" #: quot.c:195 #, c-format msgid "%s (%s) %s:\n" msgstr "%s (%s) %s:\n" #: quot.c:203 #: quot.c:205 #, c-format msgid "%8llu " msgstr "%8llu " #: quot.c:208 #, c-format msgid "%s" msgstr "%s" #: quot.c:210 #, c-format msgid "%-8.8s" msgstr "%-8.8s" #: quot.c:212 #, c-format msgid "#%-7d" msgstr "#%-7d" #: quot.c:214 #, c-format msgid " %8llu %8llu %8llu" msgstr " %8llu %8llu %8llu" #: quot.c:362 #, c-format msgid "cannot open %s: %s\n" msgstr "Kann nicht öffnen %s: %s\n" #: quot.c:382 #, c-format msgid "XFS_IOC_FSBULKSTAT ioctl failed: %s\n" msgstr "XFS_IOC_FSBULKSTAT ioctl-Aufruf fehlgeschlagen: %s\n" #: quota.c:83 msgid "Usage: quota [-guqvswim] [-l | [-Q | -A]] [-F quotaformat]\n" msgstr "Verwendung: quota [-guqvswim] [-l | [-Q | -A]] [-F quotaformat]\n" #: quota.c:84 msgid "\tquota [-qvswim] [-l | [-Q | -A]] [-F quotaformat] -u username ...\n" msgstr "\tquota [-qvswim] [-l | [-Q | -A]] [-F Quotaformat] -u Benutzername ...\n" #: quota.c:85 msgid "\tquota [-qvswim] [-l | [-Q | -A]] [-F quotaformat] -g groupname ...\n" msgstr "\tquota [-qvswim] [-l | [-Q | -A]] [-F Quotaformat] -g Gruppenname ...\n" #: quota.c:86 msgid "\tquota [-qvswugQm] [-F quotaformat] -f filesystem ...\n" msgstr "\tquota [-qvswugQm] [-F Quotaformat] -f Dateisystem ...\n" #: quota.c:87 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" "-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" msgstr "" "\n" "-u, --user Quota für Nutzer anzeigen\n" "-g, --group Quota für Gruppe anzeigen\n" "-q, --quiet Kürzere Nachricht ausgeben\n" "-v, --verbose Ausführlichere Nachricht ausgeben\n" "-s, --human-readable Zeige Zahlen in menschenfreundlichen Einheiten an (MB, GB...)\n" " --always-resolve Versuche immer, Namen in Benutzerids umzuwandeln, sogar wenn\n" "\t\t\t der Name nur aus Ziffern besteht\n" "-w, --no-wrap Lange Zeilen nicht umbrechen\n" "-p, --raw-grace Gnadenfrist in Sekunden seit der Epoche ausgeben\n" "-l, --local-only NFS-Dateisysteme nicht abfragen\n" "-Q, --quiet-refuse Keine Fehlermeldung ausgeben, wenn ein NFS-Server\n" " nicht antwortet\n" "-i, --no-autofs Autofs-Mountpunkte nicht abfragen\n" "-F, --format=formatname Quotas für ein bestimmtes Format anzeigen\n" "-f, --filesystem-list Quota-Informationen nur für die gegebenen Dateisysteme anzeigen\n" "-A, --nfs-all Quotas für alle NFS-Mountpunkte ausgeben\n" "-m, --no-mixed-pathnames Entferne führende Schrägstriche von NFSv4-Mountpunkten\n" "-h, --help Diese Hilfenachricht ausgeben und beenden\n" "-V, --version Versionsinformation ausgeben und beenden\n" "\n" #: quota.c:116 msgid "space" msgstr "Platz" #: quota.c:118 msgid "blocks" msgstr "Blöcke" #: quota.c:120 #, c-format msgid "Disk quotas for %s %s (%cid %u): %s\n" msgstr "Dateisystemquotas für %s %s (%cid %u): %s\n" #: quota.c:123 msgid "Filesystem" msgstr "Dateisystem" #: quota.c:124 #: quota.c:125 msgid "quota" msgstr "Quota" #: quota.c:124 #: quota.c:125 msgid "limit" msgstr "Limit" #: quota.c:124 #: quota.c:125 msgid "grace" msgstr "Gnadenfrist" #: quota.c:125 msgid "files" msgstr "Dateien" #: quota.c:155 msgid "File limit reached on" msgstr "Dateilimit erreicht auf" #: quota.c:161 msgid "In file grace period on" msgstr "In der Dateignadenfrist auf" #: quota.c:165 msgid "Over file quota on" msgstr "Über dem Dateiquota auf" #: quota.c:171 msgid "Block limit reached on" msgstr "Blocklimit erreicht auf" #: quota.c:177 msgid "In block grace period on" msgstr "In der Blockgnadenfrist auf" #: quota.c:181 msgid "Over block quota on" msgstr "Über dem Blockquota auf" #: quota.c:243 #: quotasys.c:324 msgid "none" msgstr "kein" #: quota.c:339 #, c-format msgid "Warning: Ignoring -%c when filesystem list specified.\n" msgstr "Warnung: Ignoriere -%c, wenn eine Dateisystemliste angegeben wurde.\n" #: quota.c:346 msgid "No filesystem specified.\n" msgstr "Kein Dateisystem angegeben.\n" #: quota.c:354 #, c-format msgid "Gid set allocation (%d): %s\n" msgstr "Gid-set-Speicheranforderung (ngroups=%d): %s\n" #: quota.c:360 #, c-format msgid "getgroups(): %s\n" msgstr "getgroups(): %s\n" #: quota_nld.c:80 #, 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" " -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" msgstr "" "Verwendung: %s [Optionen]\n" "Optionen sind:\n" " -h --help Zeigt diesen Text\n" " -V --version Zeigt Versionsinformation\n" " -C --no-console Versuche, keine Nachrichten auf die Konsole auszugeben\n" " -b --print-below Auch Nachrichten auf Konsole ausgeben, wenn weiche oder harte Limits unterschritten werden\n" " -D --no-dbus Versuche nicht, Nachrichten an DBUS zu schicken\n" " -F --foreground Lasse den Dämon im Vordergrund laufen\n" #: quota_nld.c:114 #: rquota_svc.c:162 #, c-format msgid "Unknown option '%c'.\n" msgstr "Unbekannte Option '%c'.\n" #: quota_nld.c:120 msgid "No possible destination for messages. Nothing to do.\n" msgstr "Kein mögliches Ziel für Nachrichten. Nichts zu tun.\n" #: quota_nld.c:146 msgid "Error parsing netlink message.\n" msgstr "Fehler beim Parsen einer Netlink-Nachricht.\n" #: quota_nld.c:153 msgid "" "Unknown format of kernel netlink message!\n" "Maybe your quota tools are too old?\n" msgstr "" "Unbekanntes Format einer Netlink-Nachricht vom Kernel!\n" "Vielleicht sind Ihre Quota-Tools zu alt?\n" #: quota_nld.c:177 msgid "Cannot allocate netlink handle!\n" msgstr "Kann keinen Speicher für ein Netlink-Handle reservieren!\n" #: quota_nld.c:181 #, c-format msgid "Cannot connect to netlink socket: %s\n" msgstr "Kann nicht zum Netlink-Socket verbinden: %s\n" #: quota_nld.c:184 #, c-format msgid "Cannot resolve quota netlink name: %s\n" msgstr "Kann Quota-Netlink-Namen nicht auflösen: %s\n" #: quota_nld.c:188 #, c-format msgid "Cannot join quota multicast group: %s\n" msgstr "Kann mich Quota-Muticast-Gruppe nicht anschließen: %s\n" #: quota_nld.c:193 #, c-format msgid "Cannot register callback for netlink messages: %s\n" msgstr "Kann Callbackfunktion für Netlink-Nachrichten nicht registrieren: %s\n" #: quota_nld.c:207 #, c-format msgid "Cannot connect to system DBUS: %s\n" msgstr "Kann nicht zum System-DBUS verbinden: %s\n" #: quota_nld.c:267 #, c-format msgid "Failed to find tty of user %llu to report warning to.\n" msgstr "Konnte TTY von Nutzer %llu nicht finden, um eine Warnung dorthin auszugeben.\n" #: quota_nld.c:272 #, c-format msgid "Failed to open tty %s of user %llu to report warning.\n" msgstr "Konnte TTY %s von Nutzer %llu nicht öffnen, um eine Warnung auszugeben.\n" #: quota_nld.c:278 msgid "Warning" msgstr "Warnung" #: quota_nld.c:281 msgid "Error" msgstr "Fehler" #: quota_nld.c:283 msgid "Info" msgstr "Info" #: quota_nld.c:286 msgid "file limit reached" msgstr "Dateilimit erreicht" #: quota_nld.c:289 msgid "file quota exceeded too long" msgstr "Dateiquota zu lange überschritten" #: quota_nld.c:292 msgid "file quota exceeded" msgstr "Dateiquota überschritten" #: quota_nld.c:295 msgid "block limit reached" msgstr "Blocklimit erreicht" #: quota_nld.c:298 msgid "block quota exceeded too long" msgstr "Blockquota zu lange überschritten" #: quota_nld.c:301 msgid "block quota exceeded" msgstr "Blockquota überschritten" #: quota_nld.c:304 msgid "got below file limit" msgstr "Dateilimit unterschritten" #: quota_nld.c:307 msgid "got below file quota" msgstr "Dateiquota unterschritten" #: quota_nld.c:310 msgid "got below block limit" msgstr "Blocklimit unterschritten" #: quota_nld.c:313 msgid "got below block quota" msgstr "Blockquota unterschritten" #: quota_nld.c:316 msgid "unknown quota warning" msgstr "Unbekannte Block-Quota-Warnung" #: quota_nld.c:320 #, c-format msgid "Failed to write quota message for user %llu to %s: %s\n" msgstr "Konnte Quotanachricht für Nutzer %llu an %s nicht schreiben: %s\n" #: quota_nld.c:333 msgid "Cannot create DBUS message: No enough memory.\n" msgstr "Kann DBUS-Nachricht nicht erzeugen: Nicht genug Speicher.\n" #: quota_nld.c:351 msgid "Failed to write message to dbus: No enough memory.\n" msgstr "Konnte Nachricht nicht an DBUS schreiben: Nicht genug Speicher.\n" #: quota_nld.c:367 #, c-format msgid "Failed to read or parse quota netlink message: %s\n" msgstr "Konnte Quota-Netlink-Nachricht nicht lesen oder parsen: %s\n" #: quotacheck.c:96 msgid "Not enough memory.\n" msgstr "Nicht genug Speicher.\n" #: quotacheck.c:128 #, c-format msgid "Adding hardlink for ino %llu\n" msgstr "Füge Hardlink für I-Node %llu hinzu\n" #: quotacheck.c:171 #, c-format msgid "Adding dquot structure type %s for %d\n" msgstr "Füge dquot-Strukturtyp %s für %d hinzu\n" #: quotacheck.c:257 #, c-format msgid "Cannot open file %s: %s\n" msgstr "Kann Datei nicht öffnen %s: %s\n" #: quotacheck.c:262 msgid "Cannot get exact used space... Results might be inaccurate.\n" msgstr "Kann genau verwendeten Platz nicht bestimmen... Die Ergebnisse können ungenau sein.\n" #: quotacheck.c:300 #, 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 "" "Hilfsprogramm zum Prüfen und Reparieren von Quotadateien.\n" "%s [-gucbfinvdmMR] [-F <quota-format>] filesystem|-a\n" "\n" "-u, --user Benutzerdateien prüfen\n" "-g, --group Gruppendateien prüfen\n" "-c, --create-files Neue Quotadateien erzeugen\n" "-b, --backup Sicherungskopien alter Quotadateien erzeugen\n" "-f, --force Prüfung erzwingen, sogar wenn Quotas aktiviert sind\n" "-i, --interactive interaktiver Modus\n" "-n, --use-first-dquot Verwende die erste Kopie einer \"duplicated structure\"\n" "-v, --verbose gib mehr Informationen aus\n" "-d, --debug gib noch mehr Informationen aus\n" "-m, --no-remount Dateisystem nicht als nur-lesbar neu mounten\n" "-M, --try-remount Versuche, das Dateisystem als nur-lesbar zu mounten,\n" " aber setze fort, wenn das fehlschlägt\n" "-R, --exclude-root Das Root-Dateisystem nicht prüfen, wenn alle Dateisysteme geprüft werden\n" "-F, --format=formatname Quotadateien eines bestimmten Formats prüfen\n" "-a, --all Prüfe alle Dateisysteme\n" "-h, --help Zeige diese Nachricht an und beende\n" "-V, --version Zeige Versionsinformation und beende\n" "\n" #: quotacheck.c:408 msgid "XFS quota format needs no checking.\n" msgstr "XFS-Quotaformat erfordert keine Prüfung.\n" #: quotacheck.c:434 #, c-format msgid "error (%d) while opening %s\n" msgstr "Fehler (%d) beim Öffnen von %s\n" #: quotacheck.c:439 #, c-format msgid "error (%d) while allocating inode file bitmap\n" msgstr "Fehler (%d) bei Speicherreservierung für I-Node-Datei-Bittabelle\n" #: quotacheck.c:444 #, c-format msgid "errstr (%d) while allocating inode directory bitmap\n" msgstr "Fehler (%d) bei Speicheranforderung für Inode-Verzeichnis-Bitmap\n" #: quotacheck.c:449 #, c-format msgid "error (%d) while opening inode scan\n" msgstr "Fehler (%d) beim Öffnen des \"Inode-Scans\"\n" #: quotacheck.c:454 #, c-format msgid "error (%d) while starting inode scan\n" msgstr "Fehler (%d) beim Start des Inode-Scans\n" #: quotacheck.c:460 #, c-format msgid "Found i_num %ld, blocks %ld\n" msgstr "i_num %ld, Blöcke %ld gefunden\n" #: quotacheck.c:466 msgid "High uid detected.\n" msgstr "Hohe uid festgestellt.\n" #: quotacheck.c:482 #, c-format msgid "Something weird happened while scanning. Error %d\n" msgstr "Etwas seltsames ist beim Scannnen passiert. Fehler %d\n" #: quotacheck.c:506 #, c-format msgid "Cannot stat directory %s: %s\n" msgstr "Kann Verzeichnisinformationen nicht abrufen %s: %s\n" #: quotacheck.c:518 #, c-format msgid "" "\n" "Can open directory %s: %s\n" msgstr "" "\n" "Kann Verzeichnis öffnen %s: %s\n" #: quotacheck.c:530 #, c-format msgid "" "lstat Cannot stat `%s/%s': %s\n" "Guess you'd better run fsck first !\n" "exiting...\n" msgstr "" "lstat kann kein stat `%s/%s': %s\n" "Ich denke, du solltest besser erst fsck laufen lassen !\n" "Beende...\n" #: quotacheck.c:541 #, c-format msgid "pushd %s/%s\n" msgstr "pushd %s/%s\n" #: quotacheck.c:557 #, c-format msgid "\tAdding %s size %lld ino %d links %d uid %u gid %u\n" msgstr "\tAdding %s size %lld ino %d links %d uid %u gid %u\n" #: quotacheck.c:567 msgid "Scanning stored directories from directory stack\n" msgstr "Scanne auf dem Verzeichnisstapel gespeicherte Verzeichnisse\n" #: quotacheck.c:571 #, c-format msgid "" "popd %s\n" "Entering directory %s\n" msgstr "" "popd %s\n" "Entering directory %s\n" #: quotacheck.c:583 #, c-format msgid "Leaving %s\n" msgstr "Leaving %s\n" #: quotacheck.c:623 #, c-format msgid "Going to check %s quota file of %s\n" msgstr "Going to check %s quota file of %s\n" #: quotacheck.c:629 #, c-format msgid "Quota for %ss is enabled on mountpoint %s so quotacheck might damage the file.\n" msgstr "Quota für %ss ist am Mountpunkt %s aktiviert, dh. quotacheck könnte die Datei beschädigen.\n" #: quotacheck.c:630 #: quotacheck.c:909 msgid "Should I continue" msgstr "Soll ich fortsetzten" #: quotacheck.c:631 #: quotacheck.c:910 #, c-format msgid "As you wish... Canceling check of this file.\n" msgstr "WIe du wünschst... breche Prüfung dieser Datei ab.\n" #: quotacheck.c:636 #, 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 "" "Quota für %ss ist bei Mountpunkte %s aktiviert, dh. quotacheck könnte die Datei beschädigen.\n" "Bitte deaktivieren sie Quotas oder verwenden sie -f, um die Prüfung zu erzwingen.\n" #: quotacheck.c:643 #, c-format msgid "Error while syncing quotas on %s: %s\n" msgstr "Fehler beim Syncen der Quotas auf Dateisystem %s: %s\n" #: quotacheck.c:648 #, c-format msgid "Cannot get quotafile name for %s\n" msgstr "Kann Quotadateinamen für %s nicht erhalten\n" #: quotacheck.c:653 #: quotaio.c:151 #: quotasys.c:539 #, c-format msgid "Cannot open quotafile %s: %s\n" msgstr "Kann Quotadatei nicht öffnen %s: %s\n" #: quotacheck.c:690 msgid "Renaming new files to proper names.\n" msgstr "Benenne neue Dateien mit letztendlichen Namen.\n" #: quotacheck.c:692 #, c-format msgid "Cannot get name of old quotafile on %s.\n" msgstr "Kann Namen der alten Quotadatei auf Dateisystem %s nicht bekommen.\n" #: quotacheck.c:695 msgid "Old file not found.\n" msgstr "Alte Datei nicht gefunden.\n" #: quotacheck.c:698 #, c-format msgid "Error while searching for old quota file %s: %s\n" msgstr "Fehler beim Suchen nach der alten Quotadatei %s: %s\n" #: quotacheck.c:707 msgid "Old file found removed during check!\n" msgstr "Die alte gefundene Datei wurde während der Prüfung entfernt!\n" #: quotacheck.c:710 #, c-format msgid "Error while opening old quota file %s: %s\n" msgstr "Fehler beim Öffnen der alten Quotadatei %s: %s\n" #: quotacheck.c:716 #, c-format msgid "EXT2_IOC_GETFLAGS failed: %s\n" msgstr "EXT2_IOC_GETFLAGS fehlgeschlagen: %s\n" #: quotacheck.c:720 #, c-format msgid "Quota file %s has IMMUTABLE flag set. Clearing.\n" msgstr "Quotadatei %s hat das IMMUTABLE-Flag gesetzt. Lösche es.\n" #: quotacheck.c:723 #, c-format msgid "Failed to remove IMMUTABLE flag from quota file %s: %s\n" msgstr "Konnte IMMUTABLE-Flag in der Quotadatei nicht löschen %s: %s\n" #: quotacheck.c:732 #, c-format msgid "Renaming old quotafile to %s~\n" msgstr "Benenne alte Quotadatei in %s~ um\n" #: quotacheck.c:738 #, c-format msgid "Name of quota file too long. Contact %s.\n" msgstr "Name der Quotadatei zu lang. Kontaktiere %s.\n" #: quotacheck.c:740 #, c-format msgid "Cannot rename old quotafile %s to %s: %s\n" msgstr "Kann alte Quotadatei %s nicht in %s umbenennen: %s\n" #: quotacheck.c:746 msgid "Renaming new quotafile\n" msgstr "Benenne neue Quotadatei um\n" #: quotacheck.c:758 #, c-format msgid "Cannot change permission of %s: %s\n" msgstr "Kann Zugriffsrechte von %s nicht ändern: %s\n" #: quotacheck.c:765 #, c-format msgid "Cannot open new quota file %s: %s\n" msgstr "Kann neue Quotadatei %s nicht öffnen: %s\n" #: quotacheck.c:770 #, c-format msgid "Warning: Cannot set EXT2 flags on %s: %s\n" msgstr "Warnung: Kann EXT2-Flags für %s nicht setzen: %s\n" #: quotacheck.c:789 #, c-format msgid "Dumping gathered data for %ss.\n" msgstr "Gebe gesammelte Daten für %ss aus.\n" #: quotacheck.c:791 #, c-format msgid "Cannot initialize IO on new quotafile: %s\n" msgstr "Kann IO für neue Quotadatei nicht initialisieren: %s\n" #: quotacheck.c:809 #, c-format msgid "Cannot finish IO on new quotafile: %s\n" msgstr "Kann IO an neuer Quotadatei nicht beenden: %s\n" #: quotacheck.c:812 msgid "Data dumped.\n" msgstr "Daten ausgegeben.\n" #: quotacheck.c:817 #, c-format msgid "Cannot find checked quota file for %ss on %s!\n" msgstr "Kann geprüfte Quotadatei für %ss auf %s nicht finden!\n" #: quotacheck.c:821 #, c-format msgid "" "Cannot turn %s quotas off on %s: %s\n" "Kernel won't know about changes quotacheck did.\n" msgstr "" "Kann Quotas vom Typ %s auf %s nicht deaktivieren: %s\n" "Der Kernel wird nichts von quotachecks Änderungen mitbekommen.\n" #: quotacheck.c:834 #, c-format msgid "" "Cannot turn %s quotas on on %s: %s\n" "Kernel won't know about changes quotacheck did.\n" msgstr "" "Kann Quotas vom Typ %s auf %s nicht aktivieren: %s\n" "Der Kernel wird nichts von quotachecks Änderungen mitbekommen.\n" #: quotacheck.c:855 #, c-format msgid "Substracting space used by old %s quota file.\n" msgstr "Subtrahiere den Platz, den die alte Quotadatei für Quotas vom Typ %s verwendet.\n" #: quotacheck.c:857 #, c-format msgid "Old %s file not found. Usage will not be substracted.\n" msgstr "Alte Quotadatei für Quotas vom Typ %s nicht gefunden. Verwendung wird nicht subtrahiert werden.\n" #: quotacheck.c:862 #, c-format msgid "Cannot stat old %s quota file: %s\n" msgstr "Kann stat() für alte %s-Quotadatei aufrufen: %s\n" #: quotacheck.c:874 #, c-format msgid "Quota structure for %s owning quota file not present! Something is really wrong...\n" msgstr "Quota-Datenstruktur in Quotadatei für Typ %s nicht vorhanden! Etwas ist wirklich nicht in Ordnung...\n" #: quotacheck.c:879 #, c-format msgid "Substracted %lu bytes.\n" msgstr "%lu Bytes subtrahiert.\n" #: quotacheck.c:889 #, c-format msgid "Cannot stat mountpoint %s: %s\n" msgstr "Kann stat() für Mountpunkt %s nicht aufrufen: %s\n" #: quotacheck.c:891 #, c-format msgid "Mountpoint %s is not a directory?!\n" msgstr "Mountpunkt %s ist kein Verzeichnis?!\n" #: quotacheck.c:908 #, c-format msgid "Cannot remount filesystem mounted on %s read-only. Counted values might not be right.\n" msgstr "Kann das Dateisystem auf %s nicht als nur-lesbar ummounten. Gezählte Werte könnten falsch sein.\n" #: quotacheck.c:915 #, 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 "" "Kann das Dateisystem auf %s nicht als nur-lesbar ummounten. Gezählte Werte könnten falsch sein.\n" "Bitte beenden sie alle Programme, die auf das Dateisystem schreiben oder verwenden sie -m, um die Prüfung zu erzwingen.\n" #: quotacheck.c:922 msgid "Filesystem remounted read-only\n" msgstr "Dateisystem als nur-lesbar umgemountet\n" #: quotacheck.c:924 #, c-format msgid "Scanning %s [%s] " msgstr "Prüfe %s [%s] " #: quotacheck.c:941 msgid "done\n" msgstr "fertig\n" #: quotacheck.c:950 #, c-format msgid "Checked %d directories and %d files\n" msgstr "%d Verzeichnisse und %d Dateien geprüft\n" #: quotacheck.c:954 #, c-format msgid "Cannot remount filesystem %s read-write. cannot write new quota files.\n" msgstr "Kann Dateisystem %s nicht als les- und schreibbar ummounten. Kann neue Quotadateien nicht schreiben.\n" #: quotacheck.c:955 msgid "Filesystem remounted RW.\n" msgstr "Dateisystem als les- und schreibbar umgemountet.\n" #: quotacheck.c:993 #, c-format msgid "Cannot find quota option on filesystem %s with quotas!\n" msgstr "Kann die Quotaoption auf dem Dateisystem %s mit Quotas nicht finden!\n" #: quotacheck.c:999 #, c-format msgid "Cannot detect quota format for journalled quota on %s\n" msgstr "Kann das Quotaformat für das Journalquota auf %s nicht feststellen\n" #: quotacheck.c:1048 #: quotasys.c:632 msgid "Cannot initialize mountpoint scan.\n" msgstr "Kann die Mountpunkt-Prüfung nicht initialisieren.\n" #: quotacheck.c:1054 #, c-format msgid "Skipping %s [%s]\n" msgstr "Überspringe %s [%s]\n" #: quotacheck.c:1071 #, c-format msgid "Cannot guess format from filename on %s. Please specify format on commandline.\n" msgstr "Kann das Format nicht aus dem Dateinamen auf Dateisysetm %s ableiten. Bitte geben sie das Format auf der Kommandozeile an.\n" #: quotacheck.c:1075 #, c-format msgid "Detected quota format %s\n" msgstr "Quotaformat %s erkannt\n" #: quotacheck.c:1090 #, c-format msgid "Cannot get system info: %s\n" msgstr "Kann Syseminformationen nicht abrufen: %s\n" #: quotacheck.c:1102 msgid "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" msgstr "Ihr Kernel unterstützt wahrscheinlich Journalquotas, aber sie verwenden sie nicht. Vielleicht sollten sie auf Journalquotas umsteigen, um nicht mehr quotacheck nach jedem unsauberen Herunterfahren ausführen zu müssen.\n" #: quotacheck.c:1113 msgid "Cannot find filesystem to check or filesystem not mounted with quota option.\n" msgstr "Kann kein Dateisystem zum Prüfen finden oder Dateisystem nicht mit der Quota-Option gemountet.\n" #: quotacheck.c:1126 #, c-format msgid "" "Allocated %d bytes memory\n" "Free'd %d bytes\n" "Lost %d bytes\n" msgstr "" "%d Bytes Speicher belegt\n" "%d Bytes freigegeben\n" "%d Bytes verloren\n" #: quotacheck_v1.c:32 #, c-format msgid "Cannot read entry for id %u from quotafile %s: %s\n" msgstr "Kann Eintrag für Id %u aus Quotadatei %s nicht lesen: %s\n" #: quotacheck_v1.c:35 #, c-format msgid "Entry for id %u is truncated.\n" msgstr "Eintrag für Id %u ist abgeschnitten.\n" #: quotacheck_v1.c:64 msgid "Loading first quota entry with grace times.\n" msgstr "Lade den ersten Quotaeintrag mit Gnadenfristen.\n" #: quotacheck_v1.c:68 #, c-format msgid "Cannot read first entry from quotafile %s: %s\n" msgstr "Kann ersten Eintrag aus der Quotadatei %s nicht lesen: %s\n" #: quotacheck_v1.c:72 #, c-format msgid "WARNING - Quotafile %s was probably truncated. Cannot save quota settings...\n" msgstr "WARNUNG - Quotadatei %s wurde wahrscheinlich abgeschnitten. Kann Quotaeinstellungen nicht retten...\n" #: quotacheck_v1.c:78 msgid "First entry loaded.\n" msgstr "Ersten Eintrag geladen.\n" #: quotacheck_v2.c:55 msgid "Checking quotafile info...\n" msgstr "Prüfe Informationen der Quotadatei...\n" #: quotacheck_v2.c:60 #, c-format msgid "Cannot read info from quota file %s: %s\n" msgstr "Kann Information nicht aus Quotadatei %s lesen: %s\n" #: quotacheck_v2.c:65 #, c-format msgid "WARNING - Quota file %s was probably truncated. Cannot save quota settings...\n" msgstr "WARNUNG - Quotadatei %s wurde wahrscheinlich abgeschnitten. Kann Quotaeinstellungen nicht retten...\n" #: quotacheck_v2.c:77 msgid "WARNING - Quota file info was corrupted.\n" msgstr "WARNUNG - Quotadateiinformation wurde zerstört.\n" #: quotacheck_v2.c:78 #, c-format msgid "" "Size of file: %lu\n" "Blocks: %u Free block: %u Block with free entry: %u Flags: %x\n" msgstr "" "Dateigröße: %lu\n" "Blöcke: %u Freier Block: %u Block mit freiem Eintrag: %u Flags: %x\n" #: quotacheck_v2.c:85 #, c-format msgid "" "Setting grace times and other flags to default values.\n" "Assuming number of blocks is %u.\n" msgstr "" "Setze Gnadenfristen und andere Flags auf Standardwerde.\n" "Nehme an, daß die Blockanzahl %u beträgt.\n" #: quotacheck_v2.c:102 msgid "File info done.\n" msgstr "Dateiinformationen abgearbeitet.\n" #: quotacheck_v2.c:113 msgid "Corrupted blocks: " msgstr "Zerstörte Blöcke: " #: quotacheck_v2.c:117 #, c-format msgid "Block %u: " msgstr "Block %u: " #: quotacheck_v2.c:179 msgid "Duplicated entries." msgstr "Doppelte Einträge." #: quotacheck_v2.c:183 #, c-format msgid "Found more structures for ID %u. Using values: BHARD: %lld BSOFT: %lld IHARD: %lld ISOFT: %lld\n" msgstr "Mehrere Strukturen für Id %u gefunden. Verwende Werte: BHARD: %lld BSOFT: %lld IHARD: %lld ISOFT: %lld\n" #: quotacheck_v2.c:191 #, c-format msgid "Found more structures for ID %u. Values: BHARD: %lld/%lld BSOFT: %lld/%lld IHARD: %lld/%lld ISOFT: %lld/%lld\n" msgstr "Mehrere Strukturen für Id %u gefunden. Werte: BHARD: %lld/%lld BSOFT: %lld/%lld IHARD: %lld/%lld ISOFT: %lld/%lld\n" #: quotacheck_v2.c:196 msgid "Should I use new values" msgstr "Soll ich neue Werte verwenden" #: quotacheck_v2.c:206 #, 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 hat mehrere Strukturen. Benutzereingriff erforderlich (verwende -i für interaktiven Modus oder -n für automatische Antworten).\n" #: quotacheck_v2.c:243 #, c-format msgid "Block %u is truncated.\n" msgstr "Block %u ist abgeschnitten.\n" #: quotacheck_v2.c:252 #, c-format msgid "Reference to illegal block %u" msgstr "Referenz zu ungültigem Block %u" #: quotacheck_v2.c:259 #, c-format msgid "Block %u in tree referenced twice" msgstr "Block %u wird im Baum doppelt referenziert" #: quotacheck_v2.c:275 #, c-format msgid "Illegal free block reference to block %u" msgstr "Ungültige Referenz auf freien Block %u" #: quotacheck_v2.c:278 #, c-format msgid "Corrupted number of used entries (%u)" msgstr "Ungültige Anzahl verwendeter Einträge (%u)" #: quotacheck_v2.c:330 #, c-format msgid "Quota file %s has corrupted headers. You have to specify quota format on command line.\n" msgstr "Kopfinformationen der Quotadatei %s sind zerstört. Bitte geben sie das Format auf der Kommandozeile an.\n" #: quotacheck_v2.c:346 msgid "Checking quotafile headers...\n" msgstr "Prüfe Kopfinformationen der Quotadateien...\n" #: quotacheck_v2.c:350 #, c-format msgid "Cannot read header from quotafile %s: %s\n" msgstr "Kann Kopfinformationen aus Quotadatei %s nicht lesen: %s\n" #: quotacheck_v2.c:352 #, c-format msgid "WARNING - Quotafile %s was probably truncated. Cannot save quota settings...\n" msgstr "WARNUNG - Quotadatei %s wurde wahrscheinlich abgeschnitten. Kann Quotaeinstellungen nicht retten...\n" #: quotacheck_v2.c:358 #, c-format msgid "WARNING - Quota file %s has corrupted headers\n" msgstr "WARNUNG - Quotadatei %s hat ungültige Kopfinformationen\n" #: quotacheck_v2.c:362 #, c-format msgid "Quota file format version %d does not match the one specified on command line (%d). Quota file header may be corrupted.\n" msgstr "Quotadateiformatversion %d stimmt nicht mit der Version überein, die auf der Kommandozeile angegeben wurde (%d). Quotadateikopf könnte inkonsistent sein.\n" #: quotacheck_v2.c:366 msgid "Continue checking assuming version from command line?" msgstr "Prüfung unter Annahme der Version von der Kommandozeile fortsetzen?" #: quotacheck_v2.c:372 msgid "Headers checked.\n" msgstr "Kopfinformationen geprüft.\n" #: quotacheck_v2.c:388 #, c-format msgid "Do not know how to buffer format %d\n" msgstr "Ich weiß nicht, wie das Format %d zwischenzuspeichern ist\n" #: quotacheck_v2.c:398 #, c-format msgid "Headers of file %s checked. Going to load data...\n" msgstr "Kopfinformationen von Datei %s geprüft. Lade Daten...\n" #: quotacheck_v2.c:406 msgid "Cannot gather quota data. Tree root node corrupted.\n" msgstr "Kann Quotadaten nicht laden. Der Baumwurzelknoten ist zerstört.\n" #: quotacheck_v2.c:414 msgid "WARNING - Some data might be changed due to corruption.\n" msgstr "WARNUNG - Einige Daten könnten wegen der Zerstörung geändert werden.\n" #: quotacheck_v2.c:417 msgid "Not found any corrupted blocks. Congratulations.\n" msgstr "Keine zerstörten Blöcke gefunden. Gratulation.\n" #: quotaio.c:64 msgid "Only RPC quota format is allowed on NFS filesystem.\n" msgstr "Nur das RPC-Quotaformat ist bei NFS-Dateisystemen erlaubt.\n" #: quotaio.c:73 msgid "RPC quota format not compiled.\n" msgstr "RPC-Quotaformat nicht mit einkompiliert.\n" #: quotaio.c:77 msgid "RPC quota format specified for non-NFS filesystem.\n" msgstr "Es wurde das RPC-Quotaformat für ein Nicht-NFS-Dateisystemen angegeben.\n" #: quotaio.c:83 msgid "Only XFS quota format is allowed on XFS filesystem.\n" msgstr "Nur das XFS-Quotaformat ist auf XFS-Dateisystemen erlaubt.\n" #: quotaio.c:94 msgid "XFS quota allowed only on XFS filesystem.\n" msgstr "XFS-Quotaformat nur auf XFS-Dateisystemen erlaubt.\n" #: quotaio.c:108 msgid "Quota not supported by the filesystem.\n" msgstr "Das Dateisystem unterstützt keine Quotas.\n" #: quotaio.c:112 msgid "Operation not supported for filesystems with hidden quota files!\n" msgstr "Operation bei Dateisystemen mit versteckten Quotadateien nicht unterstützt!\n" #: quotaio.c:137 msgid "Cannot find any quota file to work on.\n" msgstr "Kann keine Quotadatei finden, um sie zu bearbeiten.\n" #: quotaio.c:144 msgid "Quota file not found or has wrong format.\n" msgstr "Quotadatei nicht gefunden oder hat falsches Format.\n" #: quotaio.c:176 #, c-format msgid "Cannot initialize quota on %s: %s\n" msgstr "Kann Quotas auf %s nicht initialisieren: %s\n" #: quotaio.c:204 #, c-format msgid "Creation of %s quota format is not supported.\n" msgstr "Erzeugung des %s-Quotaformats wird nicht unterstützt.\n" #: quotaio.c:214 #, c-format msgid "Cannot create new quotafile %s: %s\n" msgstr "Kann neue Quotadatei %s nicht anlegen: %s\n" #: quotaio_generic.c:51 #, c-format msgid "Cannot get info for %s quota file from kernel on %s: %s\n" msgstr "Kann Informationen für %s-Quotadatei auf %s nicht vom Kernel bekommen: %s\n" #: quotaio_generic.c:69 #, c-format msgid "Cannot set info for %s quota file from kernel on %s: %s\n" msgstr "Kann Informationen für %s-Quotadatei vom Kernel auf %s nicht setzen: %s\n" #: quotaio_generic.c:81 #, c-format msgid "Cannot get quota for %s %d from kernel on %s: %s\n" msgstr "Kann Quota für %s %d vom Kernel auf %s nicht bekommen: %s\n" #: quotaio_generic.c:96 #, c-format msgid "Cannot set quota for %s %d from kernel on %s: %s\n" msgstr "Kann Quota für %s %d vom Kernel auf %s nicht setzen: %s\n" #: quotaio_meta.c:22 msgid "Metadata init_io called when kernel support is not enabled.\n" msgstr "Metadata init_io aufgerufen, obwohl Kernelunterstützung dafür nicht aktiviert.\n" #: quotaio_meta.c:26 msgid "Metadata init_io called when kernel does not support generic quota interface!\n" msgstr "Metadata init_io aufgerufen, obwohl Kernel die allgemeine Quotaschnittstelle nicht unterstützt!\n" #: quotaio_rpc.c:58 #: quotaio_v1.c:300 #: quotaio_v2.c:447 #, c-format msgid "Trying to write quota to readonly quotafile on %s\n" msgstr "Versuche Quota in eine nur-lesbare Quotadatei auf %s zu schreiben\n" #: quotaio_tree.c:71 #, c-format msgid "Cannot write block (%u): %s\n" msgstr "Kann Block nicht schreiben (%u): %s\n" #: quotaio_tree.c:94 msgid "Cannot allocate new quota block (out of disk space).\n" msgstr "Kann keinen neune Quotablock belegen (kein Festplattenspeicherplatz mehr).\n" #: quotaio_tree.c:202 msgid "find_free_dqentry(): Data block full but it shouldn't.\n" msgstr "find_free_dqentry(): Datenblock voll, aber er sollte es nicht sein.\n" #: quotaio_tree.c:237 #, c-format msgid "Inserting already present quota entry (block %u).\n" msgstr "Füge schon vorhandenen Quotaeintrag ein (Block %u).\n" #: quotaio_tree.c:260 #, c-format msgid "Cannot write quota (id %u): %s\n" msgstr "Kann Quota nicht schreiben (Id %u): %s\n" #: quotaio_tree.c:278 #, c-format msgid "Quota write failed (id %u): %s\n" msgstr "Quotaschreiben fehlgeschlagen (Id %u): %s\n" #: quotaio_tree.c:290 #, c-format msgid "Quota structure has offset to other block (%u) than it should (%u).\n" msgstr "Quotastruktur hat Versatz (offset) zu einem anderen Block (%u) als sie sollte (%u).\n" #: quotaio_tree.c:366 #, c-format msgid "Quota for id %u referenced but not present.\n" msgstr "Quota für Id %u referenziert aber nicht vorhanden.\n" #: quotaio_tree.c:424 #, c-format msgid "Cannot read quota structure for id %u: %s\n" msgstr "Kann Quotastruktur für Id %u nicht lesen: %s\n" #: quotaio_tree.c:465 #, c-format msgid "" "Illegal reference (%u >= %u) in %s quota file on %s. Quota file is probably corrupted.\n" "Please run quotacheck(8) and try again.\n" msgstr "" "Ungültige Referenz (%u >= %u) in %s-Quotadatei auf %s. Quotadatei ist wahrscheinlich defekt.\n" "Bitte lassen sie quotacheck(8) laufen und versuchen sie es nochmal.\n" #: quotaio_v1.c:206 #, c-format msgid "Trying to write info to readonly quotafile on %s.\n" msgstr "Versuche Information in eine nur-lesbare Quotadatei auf %s zu schreiben.\n" #: quotaio_v1.c:354 #: quotaio_v2.c:490 #, c-format msgid "Cannot sync quotas on device %s: %s\n" msgstr "Kann Quotas auf Gerät %s nicht synchronisieren: %s\n" #: quotaio_v2.c:254 msgid "Your quota file is stored in wrong endianity. Please use convertquota(8) to convert it.\n" msgstr "Ihre Quotadatei ist in der falschen Bytereihenfolge gespeichert. Bitte konvertieren sie sie mit convertquota(8).\n" #: quotaio_v2.c:371 #, c-format msgid "Trying to write info to readonly quotafile on %s\n" msgstr "Versuche Information in eine nur-lesbare Quotadatei auf %s zu schreiben\n" #: quotaio_v2.c:501 #, c-format msgid "" "Statistics:\n" "Total blocks: %u\n" "Data blocks: %u\n" "Entries: %u\n" "Used average: %f\n" msgstr "" "Statistik:\n" "Gesamtblockzahl: %u\n" "Datenblöcke: %u\n" "Enträge: %u\n" "Durchschnittlich verwendet: %f\n" #: quotaio_xfs.c:243 #, c-format msgid "*** Status for %s quotas on device %s\n" msgstr "*** Status für %s-Quotas auf Gerät %s\n" #: quotaio_xfs.c:245 #: quotaio_xfs.c:260 msgid "ON" msgstr "AN" #: quotaio_xfs.c:245 #: quotaio_xfs.c:260 msgid "OFF" msgstr "AUS" #: quotaio_xfs.c:247 #: quotaio_xfs.c:251 #, c-format msgid "Accounting: %s; Enforcement: %s\n" msgstr "Kontierung: %s; Vollstreckung: %s\n" #: quotaio_xfs.c:263 #: quotaio_xfs.c:267 #, c-format msgid "Accounting [ondisk]: %s; Enforcement [ondisk]: %s\n" msgstr "Kontierung [auf Datenträger]: %s; Vollstreckung [auf Datenträger]: %s\n" #: quotaio_xfs.c:276 #: quotaio_xfs.c:285 #, c-format msgid "Inode: none\n" msgstr "Inode: keines\n" #: quotaio_xfs.c:278 #: quotaio_xfs.c:287 #, c-format msgid "Inode: #%llu (%llu blocks, %u extents)\n" msgstr "Inode: #%llu (%llu Blöcke, %u Extents)\n" #: quotaon.c:65 #, 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 "" "Verwendung:\n" "\t%s [-guvp] [-F quotaformat] [-x zustand] -a\n" "\t%s [-guvp] [-F quotaformat] [-x zustand] dateisystem ...\n" "\n" "-a, --all aktiviere Quoatas für alle Dateisysteme\n" "-f, --off deaktiviere Quotas\n" "-u, --user ändere Benutzerquotas\n" "-g, --group ändere Gruppenquotas\n" "-p, --print-state Ausgeben, ob Quotas aktiv sind\n" "-x, --xfs-command=cmd XFS-Quota-Kommando ausführen\n" "-F, --format=formatname ändere bestimmtes Quotaformat\n" "-v, --verbose mehr Nachrichten ausgeben\n" "-h, --help zeige diesen Hilfetext und beende\n" "-V, --version zeige Versionsinformation und beende\n" #: quotaon.c:137 msgid "Cannot turn on/off quotas via RPC.\n" msgstr "Kann Quotas via RPC nicht an-/ausschalten.\n" #: quotaon.c:171 #, c-format msgid "set root_squash on %s: %s\n" msgstr "Setze root_squash auf %s: %s\n" #: quotaon.c:175 #, c-format msgid "%s: %s root_squash turned off\n" msgstr "%s: %s root_squash abgeschalten\n" #: quotaon.c:177 #, c-format msgid "%s: %s root_squash turned on\n" msgstr "%s: %s root_squash angeschalten\n" #: quotaon.c:195 #, c-format msgid "quotactl on %s [%s]: %s\n" msgstr "quotactl auf %s [%s]: %s\n" #: quotaon.c:199 #, c-format msgid "%s [%s]: %s quotas turned off\n" msgstr "%s [%s]: %s Quotas abgeschalten\n" #: quotaon.c:212 #, c-format msgid "cannot find %s on %s [%s]\n" msgstr "Kann %s auf %s [%s] nicht finden\n" #: quotaon.c:214 #, c-format msgid "using %s on %s [%s]: %s\n" msgstr "verwende %s auf %s [%s]: %s\n" #: quotaon.c:216 msgid "Maybe create new quota files with quotacheck(8)?\n" msgstr "Vielleicht sollten sie neue Quotadateien mit quotacheck(8) erzeugen?\n" #: quotaon.c:218 msgid "Quota format not supported in kernel.\n" msgstr "Quotaformat wird vom Kernel nicht unterstützt.\n" #: quotaon.c:222 #, c-format msgid "%s [%s]: %s quotas turned on\n" msgstr "%s [%s]: %s Quotas angeschalten\n" #: quotaon.c:278 msgid "Cannot change state of XFS quota. It's not compiled in kernel.\n" msgstr "Kann Zustand des XFS-Quotas nicht ändern. Unterstützung dafür wurde nicht in den Kernel einkompiliert.\n" #: quotaon.c:308 #, c-format msgid "Cannot find quota file on %s [%s] to turn quotas on/off.\n" msgstr "Kann Quotadatei auf %s [%s] nicht finden, um Quotas zu (de-)aktivieren.\n" #: quotaon.c:313 #, c-format msgid "Quota file on %s [%s] does not exist or has wrong format.\n" msgstr "Quotadatei auf %s [%s] existiert nicht oder hat falsches Format.\n" #: quotaon.c:343 #, c-format msgid "%s quota on %s (%s) is %s\n" msgstr "%s-Quota auf %s (%s) ist %s\n" #: quotaon.c:344 msgid "on" msgstr "an" #: quotaon.c:344 msgid "off" msgstr "aus" #: quotaon.c:360 #, c-format msgid "Name must be quotaon or quotaoff not %s\n" msgstr "Name muss entweder quotaon oder quotaoff sein, aber nicht %s\n" #: quotaon.c:366 #, c-format msgid "Required format %s not supported by kernel.\n" msgstr "Erforderliches Format %s wird nicht vom Kernel unterstützt.\n" #: quotaon.c:368 msgid "Warning: No quota format detected in the kernel.\n" msgstr "Warnung: Kein Quotaformat im Kernel festgestellt.\n" #: quotaon_xfs.c:36 #, c-format msgid "quotactl() on %s: %s\n" msgstr "quotactl() auf %s: %s\n" #: quotaon_xfs.c:62 #: quotaon_xfs.c:82 #, c-format msgid "Enabling %s quota on root filesystem (reboot to take effect)\n" msgstr "Aktiviere %s-Quota auf dem root-Dateisystem (starten sie neu, damit diese Änderung wirksam wird)\n" #: quotaon_xfs.c:66 #, c-format msgid "Enable XFS %s quota accounting during mount\n" msgstr "Aktiviere XFS-%s-Quota-Kontierung während des Mountens\n" #: quotaon_xfs.c:76 #, c-format msgid "Cannot delete %s quota on %s - switch quota accounting off first\n" msgstr "Kann %s-Quota auf %s nicht löschen - deaktivieren sie zuerst Quotakontierung\n" #: quotaon_xfs.c:87 #, c-format msgid "Enabling %s quota enforcement on %s\n" msgstr "Aktiviere %s-Quotavollstreckung auf %s\n" #: quotaon_xfs.c:90 #, c-format msgid "Already accounting %s quota on %s\n" msgstr "Kontierung für %s-Quota auf %s ist schon aktiv\n" #: quotaon_xfs.c:95 #, c-format msgid "Disabling %s quota accounting on %s\n" msgstr "Deaktiviere %s-Quota-Kontierung auf %s\n" #: quotaon_xfs.c:99 #, c-format msgid "Quota enforcement already disabled for %s on %s\n" msgstr "Quotavollstreckung schon deaktiviert für %s auf %s\n" #: quotaon_xfs.c:108 #, c-format msgid "Cannot delete %s quota on %s - switch quota enforcement and accounting off first\n" msgstr "Kann %s-Quota auf %s nicht löschen - schalten sie Quotavollstreckuckung und -kontierung zuerst ab\n" #: quotaon_xfs.c:113 #, c-format msgid "Enforcing %s quota already on %s\n" msgstr "Vollstreckung der %s-Quota schon aktiv auf %s\n" #: quotaon_xfs.c:118 #, c-format msgid "Cannot switch off %s quota accounting on %s when enforcement is on\n" msgstr "Kann %s-Quota-Kontierung nicht abschalten auf %s, wenn Vollstreckung aktiv ist\n" #: quotaon_xfs.c:124 msgid "and accounting " msgstr "und -kontierung " #: quotaon_xfs.c:125 #, c-format msgid "Disabling %s quota enforcement %son %s\n" msgstr "Deaktiviere %s-Quota-Vollstreckung %sauf %s\n" #: quotaon_xfs.c:131 #, c-format msgid "Unexpected XFS quota state sought on %s\n" msgstr "Unerwarteter XFS-Quota-Zielzustand angefordert auf %s\n" #: quotaon_xfs.c:146 #, c-format msgid "quotactl on %s: %s\n" msgstr "quotactl auf %s: %s\n" #: quotaon_xfs.c:150 #, c-format msgid "%s: %s quotas turned off\n" msgstr "%s: %s-Quotas deaktiviert\n" #: quotaon_xfs.c:152 #, c-format msgid "%s: %s quotas turned on\n" msgstr "%s: %s-Quotas aktiv\n" #: quotaon_xfs.c:166 #, c-format msgid "Failed to delete quota: %s\n" msgstr "Konnte Quota nicht löschen: %s\n" #: quotaon_xfs.c:172 #, c-format msgid "%s: deleted %s quota blocks\n" msgstr "%s: %s-Quota-Blöcke gelöscht\n" #: quotaon_xfs.c:233 #, c-format msgid "Invalid argument \"%s\"\n" msgstr "Ungültiges Argument \"%s\"\n" #: quotaops.c:108 #, c-format msgid "%s (uid %d): Permission denied\n" msgstr "%s (Benutzer-Id %d): Zugriff verweigert\n" #: quotaops.c:120 #, c-format msgid "%s (gid %d): gid set allocation (%d): %s\n" msgstr "%s (Gid %d): gid set Speicheranforderung (%d): %s\n" #: quotaops.c:131 #, c-format msgid "%s (gid %d): error while trying getgroups(): %s\n" msgstr "%s (Gid %d): Fehler beim Aufruf von getgroups(): %s\n" #: quotaops.c:142 #, c-format msgid "%s (gid %d): Permission denied\n" msgstr "%s (Gid %d): Zugriff verweigert\n" #: quotaops.c:158 #, c-format msgid "error while getting quota from %s for %s (id %u): %s\n" msgstr "Fehler beim Holen der Quotas von %s für %s (Id %u): %s\n" #: quotaops.c:183 #, c-format msgid "Cannot write quota for %u on %s: %s\n" msgstr "Kann Quota für %u auf %s nicht schreiben: %s\n" #: quotaops.c:232 msgid "Too many parameters to editor.\n" msgstr "Zu viele Parameter für den Editor.\n" #: quotaops.c:240 #, c-format msgid "Cannot exec %s\n" msgstr "Kann 'exec %' nicht ausführen\n" #: quotaops.c:259 #: quotaops.c:444 #, c-format msgid "Cannot duplicate descriptor of file to write to: %s\n" msgstr "Kann Dateideskriptor nicht zum Schreiben duplizieren: %s\n" #: quotaops.c:262 #, c-format msgid "Disk quotas for %s %s (%cid %d):\n" msgstr "Datenträgerquotas für %s %s (%cid %d):\n" #: quotaops.c:266 #, c-format msgid " Filesystem blocks soft hard inodes soft hard\n" msgstr " Dateisystem Blöcke weich hart Inodes weich hart\n" #: quotaops.c:278 #, c-format msgid "Quotas for %s %s:\n" msgstr "Quotas für %s %s:\n" #: quotaops.c:280 #: quotaops.c:284 #, c-format msgid "%s %d, limits (soft = %d, hard = %d)\n" msgstr "%s %d, Limits (weich = %d, hart = %d)\n" #: quotaops.c:281 msgid "blocks in use:" msgstr "Blöcke verwendet:" #: quotaops.c:285 msgid "\tinodes in use:" msgstr "\tInodes verwendet:" #: quotaops.c:311 #, c-format msgid "WARNING - %s: cannot change current block allocation\n" msgstr "WARNUNG - %s: Kann aktuelle Blockbelegung nicht ändern\n" #: quotaops.c:314 #, c-format msgid "WARNING - %s: cannot change current inode allocation\n" msgstr "WARNUNG - %s: Kann aktuelle Inodebelegung nicht ändern\n" #: quotaops.c:337 #: quotaops.c:486 #, c-format msgid "Cannot duplicate descriptor of temp file: %s\n" msgstr "Kann Dateideskriptor einer temporären Datei nicht duplizieren: %s\n" #: quotaops.c:351 #, c-format msgid "" "Bad format:\n" "%s\n" msgstr "" "Falsches Format:\n" "%s\n" #: quotaops.c:364 #: quotaops.c:628 #, c-format msgid "%s - bad format\n" msgstr "%s - falsches Format\n" #: quotaops.c:368 #, c-format msgid "%s - %s -- bad format\n" msgstr "%s - %s -- falsches Format\n" #: quotaops.c:373 #, c-format msgid " blocks in use: %llu, limits (soft = %llu, hard = %llu)" msgstr " Blöcke verwendet: %llu, Limits (weich = %llu, hart = %llu)" #: 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 -- falsches Format\n" #: quotaops.c:387 #, c-format msgid "\tinodes in use: %llu, limits (soft = %llu, hard = %llu)" msgstr "\tInodes verwendet: %llu, Limits (weich = %llu, hart = %llu)" #: quotaops.c:446 #, c-format msgid "Times to enforce softlimit for %s %s (%cid %d):\n" msgstr "Gnadenfristen, bis weiche Limits durchgesetzt werden für %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 "Zeiteinheiten dürfen sein: days, hours, minutes, oder seconds\n" #: quotaops.c:450 #, c-format msgid " Filesystem block grace inode grace\n" msgstr " Dateisystem Blockgnadenfrist Inodegnadenfrist\n" #: quotaops.c:455 #: quotaops.c:461 #: quotaops.c:503 #: quotaops.c:515 #: setquota.c:241 #: setquota.c:247 msgid "unset" msgstr "nicht festgelegt" #: quotaops.c:457 #: quotaops.c:463 msgid "0seconds" msgstr "0seconds" #: quotaops.c:465 #: quotasys.c:356 #, c-format msgid "%useconds" msgstr "%useconds" #: quotaops.c:500 #: quotaops.c:616 #, c-format msgid "" "bad format:\n" "%s\n" msgstr "" "falsches Format:\n" "%s\n" #: quotaops.c:510 #: quotaops.c:646 msgid "Bad time units. Units are 'second', 'minute', 'hour', and 'day'.\n" msgstr "Fehlerhafte Zeiteinheiten. Einheiten sind 'second', 'minute', 'hour' und 'day'.\n" #: quotaops.c:546 #, c-format msgid "Cannot duplicate descriptor of file to edit: %s\n" msgstr "Kann Dateideskriptor der zu bearbeitenden Datei nicht duplizieren: %s\n" #: quotaops.c:549 #: quotaops.c:561 #, c-format msgid "Grace period before enforcing soft limits for %ss:\n" msgstr "Gnadenfrist bevor die weichen Limits durchgesetzt werden für %ss:\n" #: quotaops.c:552 #, c-format msgid " Filesystem Block grace period Inode grace period\n" msgstr " Dateisystem Blockgnadenfrist Inodegnadenfrist\n" #: quotaops.c:566 #, c-format msgid "block grace period: %s, file grace period: %s\n" msgstr "Blockgnadenfrist: %s, Dateignadenfrist: %s\n" #: quotaops.c:594 #, c-format msgid "Cannot reopen temp file: %s\n" msgstr "Kann temporäre Datei nicht neu öffnen: %s\n" #: quotaops.c:636 #, c-format msgid " block grace period: %d %s file grace period: %d %s" msgstr " Blockgnadenfrist: %d %s Dateignadenfrist: %d %s" #: quotastats.c:50 #, c-format msgid "Cannot read stat file %s: %s\n" msgstr "Kann 'stat'-Datei %s nicht lesen: %s\n" #: quotastats.c:85 #, c-format msgid "Error while getting quota statistics from kernel: %s\n" msgstr "Fehler beim Holen von Quotastatistiken vom Kernel: %s\n" #: quotastats.c:89 #, c-format msgid "Error while getting old quota statistics from kernel: %s\n" msgstr "Fehler beim Holen von alten Quotastatistiken vom Kernel: %s\n" #: quotastats.c:103 #, c-format msgid "Kernel quota version: old\n" msgstr "Kernel Quota Version: alt\n" #: quotastats.c:105 #, c-format msgid "Kernel quota version: %u.%u.%u\n" msgstr "Kernel Quota Version: %u.%u.%u\n" #: quotastats.c:106 #, c-format msgid "Number of dquot lookups: %ld\n" msgstr "Anzahl an dquot-Nachschlagungen: %ld\n" #: quotastats.c:107 #, c-format msgid "Number of dquot drops: %ld\n" msgstr "Anzahl an dquot-Löschungen: %ld\n" #: quotastats.c:108 #, c-format msgid "Number of dquot reads: %ld\n" msgstr "Anzahl an dquot-Lesevorgängen: %ld\n" #: quotastats.c:109 #, c-format msgid "Number of dquot writes: %ld\n" msgstr "Anzahl an dquot-Schreibvorgängen: %ld\n" #: quotastats.c:110 #, c-format msgid "Number of quotafile syncs: %ld\n" msgstr "Anzahl an Quotadatei-Synchronisierungen: %ld\n" #: quotastats.c:111 #, c-format msgid "Number of dquot cache hits: %ld\n" msgstr "Anzahl an dquot-Cachetreffern: %ld\n" #: quotastats.c:112 #, c-format msgid "Number of allocated dquots: %ld\n" msgstr "Anzahl an belegten dquot-Datenstrukturen: %ld\n" #: quotastats.c:113 #, c-format msgid "Number of free dquots: %ld\n" msgstr "Anzahl freier dquot-Datenstrukturen: %ld\n" #: quotastats.c:114 #, c-format msgid "Number of in use dquot entries (user/group): %ld\n" msgstr "Anzahl verwendeter dquot-Einträge (Benutzer/Gruppen): %ld\n" #: quotasys.c:130 #, c-format msgid "user %s does not exist.\n" msgstr "Benutzer %s existiert nicht.\n" #: quotasys.c:159 #, c-format msgid "group %s does not exist.\n" msgstr "Gruppe %s existiert nicht.\n" #: quotasys.c:261 #, c-format msgid "" "Unknown quota format: %s\n" "Supported 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" msgstr "" "Unbekanntes Quotaformat: %s\n" "Unterstützte Formate sind:\n" " vfsold - originalas Quotaformat\n" " vfsv0 - neues Quotaformat\n" " vfsv1 - Quotaformat mit 64-bit-Limits\n" " rpc - verwende RPC-Aufrufe\n" " xfs - XFS-Quotaformat\n" #: quotasys.c:344 #, c-format msgid "%ddays" msgstr "%ddays" #: quotasys.c:346 #, c-format msgid "%02d:%02d" msgstr "%02d:%02d" #: quotasys.c:358 #, c-format msgid "%uminutes" msgstr "%uminutes" #: quotasys.c:360 #, c-format msgid "%uhours" msgstr "%uhours" #: quotasys.c:362 #, c-format msgid "%udays" msgstr "%udays" #: quotasys.c:522 #, c-format msgid "Cannot stat quota file %s: %s\n" msgstr "Kann Informationen über Quotadatei %s nicht abrufen: %s\n" #: quotasys.c:668 msgid "Not all specified mountpoints are using quota.\n" msgstr "Nicht alle angegebenen Mountpunkte verwenden Quotas.\n" #: quotasys.c:682 #, c-format msgid "Error while releasing file on %s\n" msgstr "Fehler bei Dateifreigabe auf %s\n" #: quotasys.c:741 #, c-format msgid "Cannot create set for sigaction(): %s\n" msgstr "Kann Menge für sigaction() nicht erzeugen: %s\n" #: quotasys.c:744 #, c-format msgid "Cannot set signal handler: %s\n" msgstr "Kann Signalbehandler nicht setzen: %s\n" #: quotasys.c:794 #, c-format msgid "Cannot reset signal handler: %s\n" msgstr "Kann Signalbehandler nicht zurücksetzen: %s\n" #: quotasys.c:928 msgid "Cannot open any file with mount points.\n" msgstr "Kann keine Datei mit Einhängepunkten öffnen.\n" #: quotasys.c:939 #, c-format msgid "Cannot get device name for %s\n" msgstr "Kann Gerätenamen für %s nicht bekommen\n" #: quotasys.c:976 #, c-format msgid "Cannot resolve mountpoint path %s: %s\n" msgstr "Kann Mountpunkt-Pfad %s nicht auflösen: %s\n" #: quotasys.c:982 #, c-format msgid "Cannot statfs() %s: %s\n" msgstr "statfs() für %s fehlgeschlagen: %s\n" #: quotasys.c:994 #, c-format msgid "Cannot stat() mounted device %s: %s\n" msgstr "stat() für eingebundenes Gerät %s fehlgeschlagen: %s\n" #: quotasys.c:1000 #, c-format msgid "Device (%s) filesystem is mounted on unsupported device type. Skipping.\n" msgstr "Gerät (%s): Dateisystem ist auf einem nicht unterstützten Gerätetyp eingehängt. Überspringe.\n" #: quotasys.c:1015 #, c-format msgid "Cannot find device of loopback mount in options for %s. Skipping.\n" msgstr "Kann Gerät des Loopback-Mounts in den Optionen für %s nicht finden. Überspringe.\n" #: quotasys.c:1024 #, c-format msgid "Cannot stat() loopback device %s: %s\n" msgstr "stat() für Loopbackgerät %s fehlgeschlagen: %s\n" #: quotasys.c:1029 #, c-format msgid "Loopback device %s is not block device!\n" msgstr "Loopbackgerät %s ist kein Blockgerät!\n" #: quotasys.c:1047 #, c-format msgid "Cannot stat() mountpoint %s: %s\n" msgstr "stat() für Einhängepunkt %s fehlgeschlagen: %s\n" #: quotasys.c:1111 #, c-format msgid "" "Cannot find a device with %s.\n" "Skipping...\n" msgstr "" "Kann kein Gerät mit %s finden.\n" "Überspringe...\n" #: quotasys.c:1115 #, c-format msgid "" "Cannot stat() a mountpoint with %s: %s\n" "Skipping...\n" msgstr "" "stat() für Einhängepunkt %s fehlgeschlagen: %s\n" "Überspringe...\n" #: quotasys.c:1123 #, c-format msgid "" "Cannot stat() given mountpoint %s: %s\n" "Skipping...\n" msgstr "" "stat() für Einhängepunkt %s fehlgeschlagen: %s\n" "Überspringe...\n" #: quotasys.c:1133 #, c-format msgid "Cannot find a filesystem mountpoint for directory %s\n" msgstr "Kann keinen Dateisystem-Einhängepunkt für Verzeichnis %s finden\n" #: quotasys.c:1139 #, c-format msgid "Cannot resolve path %s: %s\n" msgstr "Kann Pfad %s nicht auflösen: %s\n" #: quotasys.c:1150 #, c-format msgid "Cannot find mountpoint for device %s\n" msgstr "Kann Einhängepunkt für Gerät %s nicht finden\n" #: quotasys.c:1156 #, c-format msgid "Specified path %s is not directory nor device.\n" msgstr "Angegebener Pfad %s ist weder ein Verzeichnis noch ein Gerät.\n" #: quotasys.c:1164 msgid "No correct mountpoint specified.\n" msgstr "Es wurde kein korrekter Einhängepunkt angegeben.\n" #: quotasys.c:1225 #, c-format msgid "Mountpoint (or device) %s not found or has no quota enabled.\n" msgstr "Einhängepunkt oder Gerät %s nicht gefunden oder hat keine aktivierten Quotas.\n" #: repquota.c:50 #, 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 "" "Werkzeug zum Berichten von Quotas.\n" "Verwendung:\n" "%s [-vugsi] [-c|C] [-t|n] [-F quotaformat] (-a | mntpoint)\n" "\n" "-v, --verbose Zeige auch Benutzer/Gruppen ohne Quotaverwendung\n" "-u, --user Zeige Informationen über Benutzer\n" "-g, --group Zeige Informationen über Gruppen\n" "-s, --human-readable Zeige Zahlen in menschenfreundlichen Einheiten (MB, GB, ...)\n" "-t, --truncate-names Beschneide Namen auf 8 Zeichen\n" "-p, --raw-grace Zeige Gnadenfrist in Sekunden seit Beginn der UNIX-Epoche\n" "-n, --no-names Keine Übersetzung von Uids/Gids zu Namen\n" "-i, --no-autofs Vermeide autofs-Einhängepunkte\n" "-c, --batch-translation Übersetze große Mengen an Ids auf einmal\n" "-C, --no-batch-translation Übersetze Ids einzeln\n" "-F, --format=formatname Berichte Informationen für ein bestimmtes Format\n" "-h, --help Zeige diese Hilfenachnicht und beende\n" "-V, --version Zeige Versionsinformation und beende\n" "\n" #: repquota.c:145 msgid "Repquota cannot report through RPC calls.\n" msgstr "Repquota funktioniert nicht über RPC.\n" #: repquota.c:149 msgid "Specified both -n and -t but only one of them can be used.\n" msgstr "Sowohl -n als auch -t wurden angegeben, aber nur eines von beiden kann verwendet werden.\n" #: repquota.c:292 msgid "Space" msgstr "Platz" #: repquota.c:294 msgid "Block" msgstr "Block" #: repquota.c:296 #, c-format msgid "*** Report for %s quotas on device %s\n" msgstr "*** Report für %s Quotas auf Gerät %s\n" #: repquota.c:299 #, c-format msgid "Block grace time: %s; Inode grace time: %s\n" msgstr "Blockgnadenfrist: %s; Inodegnadenfrist: %s\n" #: repquota.c:300 #, c-format msgid " %s limits File limits\n" msgstr " %s Limits Dateilimits\n" #: repquota.c:301 #, c-format msgid "%-9s used soft hard grace used soft hard grace\n" msgstr "%-9s belegt weich hart Gnade belegt weich hart Gnade\n" #: repquota.c:301 msgid "User" msgstr "Benutzer" #: repquota.c:301 msgid "Group" msgstr "Gruppe" #: rquota_svc.c:90 #, 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 "" "Verwendung: %s [Optionen]\n" "Optionen sind:\n" " -h --help zeigt diesen Text\n" " -V --version zeigt Versionsinformationen\n" " -F --foreground Startet den Quota-Service im Vordergrund\n" " -I --autofs Einhängepunkte vom Automounter nicht ignorieren\n" " -p --port <port> Lausche auf gegebenem Port\n" " -s --no-setquota Deaktiviert entfernte Aufrufe für setquota (Voreinstellung)\n" " -S --setquota Aktivierte entfernte Aufrufe für setquota\n" " -x --xtab <path> Daeipfad zu alternativer NFSD-export-Tabelle\n" #: rquota_svc.c:101 #, 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 "" "Verwendung: %s [Optionen]\n" "Optionen sind:\n" " -h --help zeigt diesen Text\n" " -V --version zeigt Versionsinformationen\n" " -F --foreground Startet den Quota-Service im Vordergrund\n" " -I --autofs Einhängepunkte vom Automounter nicht ignorieren\n" " -p --port <port> Lausche auf gegebenem Port\n" " -x --xtab <path> Daeipfad zu alternativer NFSD-export-Tabelle\n" #: rquota_svc.c:148 #, c-format msgid "Illegal port number: %s\n" msgstr "Illegale Portnummer: %s\n" #: rquota_svc.c:155 #, c-format msgid "Cannot access the specified xtab file %s: %s\n" msgstr "Kann auf angegebene xtab-Datei %s nicht zugreifen: %s\n" #: rquota_svc.c:185 #, c-format msgid "host %s attempted to call setquota when disabled\n" msgstr "Rechner %s versuchte setquota aufzurufen, während es deaktiviert ist\n" #: rquota_svc.c:192 #, c-format msgid "host %s attempted to call setquota from port >= 1024\n" msgstr "Rechner %s hat versucht, setquota von einem Port >= 1024 aufzurufen\n" #: rquota_svc.c:207 #, c-format msgid "Denied access to host %s\n" msgstr "Zugang verweigert für Rechner %s\n" #: rquota_svc.c:295 #: rquota_svc.c:381 msgid "unable to free arguments\n" msgstr "Unfähig Argumente freizugeben\n" #: rquota_svc.c:404 #, c-format msgid "" "Warning: Cannot open export table %s: %s\n" "Using '/' as a pseudofilesystem root.\n" msgstr "" "Warnung: Kann Exporttabelle %s nicht öffnen: %s\n" "Verwende '/' als Pseudodateisystemwurzel.\n" #: rquota_svc.c:456 msgid "cannot create udp service.\n" msgstr "Kann keinen UDP-Dienst erzeugen.\n" #: rquota_svc.c:460 msgid "unable to register (RQUOTAPROG, RQUOTAVERS, udp).\n" msgstr "Registrierung fehlgeschlagen (RQUOTAPROG, RQUOTAVERS, udp).\n" #: rquota_svc.c:464 msgid "unable to register (RQUOTAPROG, EXT_RQUOTAVERS, udp).\n" msgstr "Registrierung fehlgeschlagen (RQUOTAPROG, EXT_RQUOTAVERS, udp).\n" #: rquota_svc.c:471 msgid "cannot create tcp service.\n" msgstr "Kann keinen TCP-Dienst erzeugen.\n" #: rquota_svc.c:475 msgid "unable to register (RQUOTAPROG, RQUOTAVERS, tcp).\n" msgstr "Registrierung fehlgeschlagen (RQUOTAPROG, RQUOTAVERS, tcp).\n" #: rquota_svc.c:479 msgid "unable to register (RQUOTAPROG, EXT_RQUOTAVERS, tcp).\n" msgstr "Registrierung fehlgeschlagen (RQUOTAPROG, EXT_RQUOTAVERS, tcp).\n" #: rquota_svc.c:488 msgid "svc_run returned\n" msgstr "svc_run ist zurückgekehrt\n" #: set_limits_example.c:20 #, c-format msgid "copy_user_quota_limits: Failed to set userquota for uid %ld : %s\n" msgstr "copy_user_quota_limits: Benutzerquota für uid %ld setzen fehlgeschlagen: %s\n" #: set_limits_example.c:27 #, c-format msgid "copy_user_quota_limits: Failed to get userquota for uid %ld : %s\n" msgstr "copy_user_quota_limits: Benutzerquota für uid %ld holen fehlgeschlagen: %s\n" #: set_limits_example.c:43 #, c-format msgid "copy_group_quota_limits: Failed to set groupquota for uid %ld : %s\n" msgstr "copy_group_quota_limits: Gruppenquota für uid (gid?) %ld setzen fehlgeschlagen: %s\n" #: set_limits_example.c:50 #, c-format msgid "copy_group_quota_limits: Failed to get groupquota for uid %ld : %s\n" msgstr "copy_group_quota_limits: Gruppenquota für uid (gid?) %ld holen fehlgeschlagen: %s\n" #: setquota.c:55 #, 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 [-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" msgstr "" "Verwendung:\n" " setquota [-u|-g] %1$s[-F Quotaformat] <Benutzer|Gruppe>\n" "\t<block-softlimit> <block-hardlimit> <inode-softlimit> <inode-hardlimit> -a|<Dateisystem>...\n" " setquota [-u|-g] %1$s[-F Quotaformat] <-p protouser|protogroup> <Benutzer|Gruppe> -a|<Dateisystem>...\n" " setquota [-u|-g] %1$s[-F Quotaformat] -b [-c] -a|<Dateisystem>...\n" " setquota [-u|-g] [-F Quotaformat] -t <blockgrace> <inodegrace> -a|<Dateisystem>...\n" " setquota [-u|-g] [-F Quotaformat] <Benutzer|Gruppe> -T <blockgrace> <inodegrace> -a|<Dateisystemsystem>...\n" "\n" "-u, --user Setze Limit für Benutzer\n" "-g, --group Setze Limits für Gruppe\n" "-a, --all Setze Limits für alle Dateisysteme\n" " --always-resolve Versuche stets einen Namen aufzulösen, auch wenn er\n" " nur aus Ziffern besteht\n" "-F, --format=Quotaformat Operiere auf einem bestimmten Quotaformat\n" "-p, --prototype=protoname Kopiere Limits von Benutzer/Gruppe\n" "-b, --batch Lese Limits von Standardeingabe\n" "-c, --continue-batch Eingabeverarbeitung auch bei Fehlern fortsetzen\n" #: setquota.c:72 msgid "" "-r, --remote set remote quota (via RPC)\n" "-m, --no-mixed-pathnames trim leading slashes from NFSv4 mountpoints\n" msgstr "" "-r, --remote Setze entferntes Quota (über RPC)\n" "-m, --no-mixed-pathnames Entferne führende Schrägstriche (/) von NFSv4-Einhängepunkten\n" #: setquota.c:75 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 Bearbeite Standard-Gnadenfrist\n" "-T, --edit-times Bearbeite Gnadenfristen für Benutzer/Gruppe\n" "-h, --help Zeige diese Hilfe und beende\n" "-V, --version Zeige Versionsinformationen und beende\n" "\n" #: setquota.c:90 #, c-format msgid "Bad %s: %s\n" msgstr "Fehlerhafte Angabe für %s: %s\n" #: setquota.c:186 msgid "Group and user quotas cannot be used together.\n" msgstr "Gruppen- und Benutzerquotas können nicht gleichzeitig verändert werden.\n" #: setquota.c:190 msgid "Prototype user has no sense when editing grace times.\n" msgstr "Prototyp macht keinen Sinn beim Bearbeiten von Gnadenfristen.\n" #: setquota.c:194 msgid "Cannot set both individual and global grace time.\n" msgstr "Kann nicht gleichzeitig die individuelle und die Standard-Gnadenfrist setzen.\n" #: setquota.c:198 msgid "Batch mode cannot be used for setting grace times.\n" msgstr "Stapelmodus kann nicht verwendet werden, um Gnadenfristen zu setzen.\n" #: setquota.c:202 msgid "Batch mode and prototype user cannot be used together.\n" msgstr "Stapelmodus und Prototypen können nicht zusammen verwendet werden.\n" #: setquota.c:225 msgid "block softlimit" msgstr "weiches Blocklimit" #: setquota.c:226 msgid "block hardlimit" msgstr "hartes Blocklimit" #: setquota.c:227 msgid "inode softlimit" msgstr "weiches Inodelimit" #: setquota.c:228 msgid "inode hardlimit" msgstr "hartes Inodelimit" #: setquota.c:234 #: setquota.c:246 msgid "block grace time" msgstr "Blockgnadenfrist" #: setquota.c:235 #: setquota.c:252 msgid "inode grace time" msgstr "Inodegnadenfrist" #: setquota.c:258 msgid "Mountpoint not specified.\n" msgstr "Einhängepunkt nicht angegeben.\n" #: setquota.c:313 #, c-format msgid "Line %d too long.\n" msgstr "Zeile %d zu lang.\n" #: setquota.c:325 #, c-format msgid "Cannot parse input line %d.\n" msgstr "Kann Eingabezeile %d nicht verarbeiten.\n" #: setquota.c:327 #: setquota.c:335 msgid "Exitting.\n" msgstr "Beende.\n" #: setquota.c:328 #: setquota.c:336 msgid "Skipping line.\n" msgstr "Überspringe Zeile.\n" #: setquota.c:333 #, c-format msgid "Unable to resolve name '%s' on line %d.\n" msgstr "Kann Namen '%s' in Zeile %d nicht auflösen.\n" #: setquota.c:396 #, c-format msgid "Not setting block grace time on %s because softlimit is not exceeded.\n" msgstr "Setze Blockgnadenfrist auf %s nicht, denn das weiche Limit ist nicht überschritten.\n" #: setquota.c:400 #, c-format msgid "Not setting inode grace time on %s because softlimit is not exceeded.\n" msgstr "Setze Inodegnadenfrist auf %s nicht, denn das weiche Limit ist nicht überschritten.\n" #: setquota.c:403 #, c-format msgid "cannot write times for %s. Maybe kernel does not support such operation?\n" msgstr "Kann die Zeiten für %s nicht schreiben. Vielleicht unterstützt der Kernel diese Operation nicht?\n" #: svc_socket.c:42 #, c-format msgid "Cannot create socket: %s\n" msgstr "Konnte Socket nicht erzeugen: %s\n" #: svc_socket.c:49 #, c-format msgid "Cannot set socket options: %s\n" msgstr "Konnte Socketoptionen nicht setzen: %s\n" #: svc_socket.c:84 #, c-format msgid "Cannot bind to given address: %s\n" msgstr "Kinnd bind-Operation zu gegebener Adresse nicht ausführen: %s\n" #: warnquota.c:56 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 "" "Hallo,\n" "\n" "wir haben festgestellt, dass sie die Quotalimits auf diesem System\n" "überschreiten. Wir haben folgende Überschreitungen festgestellt:\n" "\n" #: warnquota.c:58 #, 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" "Wir hoffen, dass sie aufräumen bevor die Gnadenfrist abgelaufen ist.\n" "\n" "Sie erhalten diese Mitteilung, weil sie auf den oben genannten Dateisystemen\n" "mehr Speicherplatz belegen bzw. Dateien angelegt haben, als ihnen erlaubt ist.\n" "Wenn sie keinen Speicherplatz freigeben bzw. Dateien löschen und wieder unter\n" "ihr Quota kommen bevor die Gnadenfrist abgelaufen ist, werden sie keinen\n" "weiteren Speicherplatz belegen bzw. keine weiteren Dateien anlegen können.\n" "\n" "Für Unterstützung wenden sie sich bitte per E-Mail an %s\n" "oder per Telefon an %s.\n" #: warnquota.c:65 #, 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 "" "Hallo,\n" "\n" "wir haben festgestellt, dass die Gruppe %s, in der sie Mitglied sind, Quotas dieses Systems\n" "überschreitet. Folgende Quotas wurden überschritten:\n" "\n" #: warnquota.c:67 #, 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" "Wir hoffen, dass sie aufräumen bevor die Gnadenfrist abgelaufen ist.\n" "\n" "Sie erhalten diese Mitteilung, weil sie auf den oben genannten Dateisystemen\n" "mehr Speicherplatz belegen bzw. Dateien angelegt haben, als ihnen erlaubt ist.\n" "Wenn sie keinen Speicherplatz freigeben bzw. Dateien löschen und wieder unter\n" "ihr Quota kommen bevor die Gnadenfrist abgelaufen ist, werden sie keinen\n" "weiteren Speicherplatz belegen bzw. keine weiteren Dateien anlegen können.\n" "\n" "Für Unterstützung wenden sie sich bitte per E-Mail an %s\n" "oder per Telefon an %s.\n" #: warnquota.c:184 #, c-format msgid "%s: %s\n" msgstr "%s: %s\n" #: warnquota.c:228 #, c-format msgid "Cannot get name for uid/gid %u.\n" msgstr "Kann Namen für uid/gid %u nicht auflösen.\n" #: warnquota.c:312 #, c-format msgid "Cannot create pipe: %s\n" msgstr "Konnte keine Pipe erzeugen: %s\n" #: warnquota.c:318 #, c-format msgid "Cannot fork: %s\n" msgstr "fork() fehlgeschlagen: %s\n" #: warnquota.c:323 #, c-format msgid "Cannot duplicate descriptor: %s\n" msgstr "Konnte Dateideskriptor nicht duplizieren: %s\n" #: warnquota.c:327 #, c-format msgid "Cannot execute '%s': %s\n" msgstr "Konnte '%s' nicht ausführen: %s\n" #: warnquota.c:332 #, c-format msgid "Cannot open pine: %s\n" msgstr "Konnte pine nicht öffnen: %s\n" #: warnquota.c:413 msgid "Could not setup ldap connection, returning.\n" msgstr "Konnte LDAP-Verbindung nicht herstellen, kehre zurück.\n" #: warnquota.c:436 #, c-format msgid "Error with %s.\n" msgstr "Fehler mit %s.\n" #: warnquota.c:444 #, c-format msgid "Multiple entries found for client %s, %d not sending mail.\n" msgstr "Mehrere Einträge für Client %s gefunden (nämlich %d). Sende keine Mail.\n" #: warnquota.c:448 #, c-format msgid "Entry not found for client %s, %d not sending mail.\n" msgstr "Eintrag für Client %s nicht gefunden (Gefundene LDAP-Einträge: %d). Sende keine Mail.\n" #: warnquota.c:459 #, c-format msgid "Could not get values for %s.\n" msgstr "Konnte keine Werte für %s bekommen.\n" #: warnquota.c:491 #, c-format msgid "Administrator for a group %s not found. Cancelling mail.\n" msgstr "Administrator für Gruppe %s nicht gefunden. Sende keine Mail.\n" #: warnquota.c:536 #, c-format msgid "" "\n" " Block limits File limits\n" msgstr "" "\n" " Blocklimits Dateilimits\n" #: warnquota.c:537 #, c-format msgid "Filesystem used soft hard grace used soft hard grace\n" msgstr "Dateisystem belegt soft hart Gnadenf. belegt soft hart Gnadenf.\n" #: warnquota.c:577 #, c-format msgid "Cannot wait for mailer: %s\n" msgstr "Kann nicht auf das Mailprogramm warten: %s\n" #: warnquota.c:579 msgid "Warning: Mailer exitted abnormally.\n" msgstr "Warnung: Mailprogramm hat sich nicht korrekt beendet.\n" #: warnquota.c:636 #, c-format msgid "" "Cannot open %s: %s\n" "Will use device names.\n" msgstr "" "Kann %s nicht öffnen: %s\n" "Werde Gerätenamen verwenden.\n" #: warnquota.c:659 #, c-format msgid "Cannot parse line %d in quotatab (missing ':')\n" msgstr "Kann Zeile %d in Quotatabelle nicht verarbeiten (fehlender ':')\n" #: warnquota.c:673 #, c-format msgid "Cannot stat device %s (maybe typo in quotatab)\n" msgstr "stat()-Aufruf für Gerät %s fehlgeschlagen (vielleicht ein Fehler in der Quotatabelle)\n" #: warnquota.c:693 #, c-format msgid "" "Incorrect format string for variable %s.\n" "Unrecognized expression %%%c.\n" msgstr "" "Ungültige Formatierungsanweisung für Variable %s.\n" "Nicht erkannter Ausdruck %%%c.\n" #: warnquota.c:732 #, c-format msgid "Cannot open %s: %s\n" msgstr "Kann %s nicht öffnen: %s\n" #: warnquota.c:752 #, c-format msgid "Line %d too long. Truncating.\n" msgstr "Zeile %d zu lang. Schneide sie ab.\n" #: warnquota.c:824 #, c-format msgid "Cannot parse time at CC_BEFORE variable (line %d).\n" msgstr "Kann die Zeit bei CC_BEFORE-Variable nicht verarbeiten (Zeile %d).\n" #: warnquota.c:848 #, c-format msgid "Error in config file (line %d), ignoring\n" msgstr "Fehler in Konfigurationsdatei (Zeile %d). Ignoriere.\n" #: warnquota.c:851 #, c-format msgid "Possible error in config file (line %d), ignoring\n" msgstr "Möglicher Fehler in Konfigurationsdatei in Zeile %d. Ignoriere.\n" #: warnquota.c:854 msgid "Unterminated last line, ignoring\n" msgstr "Fehlendes Zeilendendezeichen in der letzten Zeile. Ignoriere.\n" #: warnquota.c:861 #, c-format msgid "" "LDAP library version >= 2.3 detected. Please use LDAP_URI instead of hostname and port.\n" "Generated URI %s\n" msgstr "" "LDAP-Bibliotheksversion >= 2.3 festgestellt. Bitte verwenden sie LDAP_URI anstelle von Rechnername und Port.\n" "Generierte URI %s\n" #: warnquota.c:865 msgid "LDAP library does not support ldap_initialize() but URI is specified." msgstr "LDAP-Bibliothek unterstützt ldap_initialize() nicht, aber ein URI wurde angegeben." #: warnquota.c:887 #, c-format msgid "Cannot open file with group administrators: %s\n" msgstr "Kann Datei der Gruppenadministratoren nicht öffnen: %s\n" #: warnquota.c:902 #, c-format msgid "Parse error at line %d. Cannot find end of group name.\n" msgstr "Einlesefehler in Zeile %d. Kann kein Ende des Gruppennamens finden.\n" #: warnquota.c:911 #, c-format msgid "Parse error at line %d. Cannot find administrators name.\n" msgstr "Einlesefehler in Zeile %d. Kann Administratornamen nicht finden.\n" #: warnquota.c:921 #, c-format msgid "Parse error at line %d. Trailing characters after administrators name.\n" msgstr "Einlesefehler in Zeile %d. Zusätzliche Zeichen nach dem Administratornamen.\n" #: warnquota.c:984 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 "" "Verwendung:\n" " warnquota [-ugsid] [-F Quotaformat] [-c Konfigurationsdatei] [-q Quotatabelle] [-a Admindatei]\n" "\n" "-u, --user Benutzer warnen\n" "-g, --group Gruppen warnen\n" "-s, --human-readable Angaben in menschenfreundlicheren Einheiten senden\n" "-i, --no-autofs Vermeide Autofs-Einhängepunkte\n" "-d, --no-details Sende keine detaillierten Quotainformationen\n" "-F, --format=Quotaformat Verwende Quotadateien eines bestimmten Formats\n" "-c, --config=Konfigurationsdatein Nichtstandard-Konfigurationsdatei\n" "-q, --quota-tab=Quotatabelle Nichtstandard-Quotatabellendatei\n" "-a, --admins-file=Admindatei Nichtstandard-Gruppenadministratorendatei\n" "-h, --help Hilfe anzeigen und beenden\n" "-v, --version Versionsinformationen anzeigen und beenden\n" "\n" #: warnquota.c:1065 #, c-format msgid "Cannot get host name: %s\n" msgstr "Kann Rechnernamen nicht bekommen: %s\n" #: xqmstats.c:32 #: xqmstats.c:37 msgid "The running kernel does not support XFS\n" msgstr "Der laufende Kernel unterstützt kein XFS.\n" #: xqmstats.c:49 #, c-format msgid "XFS Quota Manager dquot statistics\n" msgstr "XFS-Quota-Manager dquot-Statistiken\n" #: xqmstats.c:50 #, c-format msgid " reclaims: %u\n" msgstr " reclaims: %u\n" #: xqmstats.c:51 #, c-format msgid " missed reclaims: %u\n" msgstr " missed reclaims: %u\n" #: xqmstats.c:52 #, c-format msgid " dquot dups: %u\n" msgstr " dquot dups: %u\n" #: xqmstats.c:53 #, c-format msgid " cache misses: %u\n" msgstr " cache misses: %u\n" #: xqmstats.c:54 #, c-format msgid " cache hits: %u\n" msgstr " cache hits: %u\n" #: xqmstats.c:55 #, c-format msgid " dquot wants: %u\n" msgstr " dquot wants: %u\n" #: xqmstats.c:56 #, c-format msgid " shake reclaims: %u\n" msgstr " shake reclaims: %u\n" #: xqmstats.c:57 #, c-format msgid " inact reclaims: %u\n" msgstr " inact reclaims: %u\n" #: xqmstats.c:62 #, c-format msgid "Maximum %u dquots (currently %u incore, %u on freelist)\n" msgstr "Maximum %u dquots (currently %u incore, %u on freelist)\n" #~ msgid "Bad number of arguments." #~ msgstr "Falsche Anzahl an Argumenten." #~ msgid "Too new quotafile format on %s\n" #~ msgstr "Zu neues Quotadateiformat auf Dateisystem %s\n" #~ msgid "Unknown format" #~ msgstr "Unbekanntes Format" �������������������������������������������������������������������������������������������������������������quota-tools/po/fr.po��������������������������������������������������������������������������������0000644�0001750�0001750�00000172633�11650022303�014524� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# 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" �����������������������������������������������������������������������������������������������������quota-tools/po/pl.po��������������������������������������������������������������������������������0000644�0001750�0001750�00000243237�11650022303�014527� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# 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" �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quota-tools/po/cs.po��������������������������������������������������������������������������������0000644�0001750�0001750�00000272577�11724000137�014535� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Czech translation of quota-tools. # Copyright (C) 2010 THE PACKAGE'S COPYRIGHT HOLDER # msgids are distributed under the same license as particular source files. # msgstrs (i.e. translations) are distributed under GPLv2+. # Petr Pisar <petr.pisar@atlas.cz>, 2010, 2011, 2012. # # grace period → perioda odkladu # grace time → doba odkladu # hard limit → pevný limit # quotafile → kvótový soubor, soubor s kvótami # soft limit → mÄ›kký limit # msgid "" msgstr "" "Project-Id-Version: quota-tools v4.00-10-g400e4b3\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2012-02-28 15:27+0100\n" "PO-Revision-Date: 2012-02-28 16:17+0100\n" "Last-Translator: Petr Pisar <petr.pisar@atlas.cz>\n" "Language-Team: Czech <translation-team-cs@lists.sourceforge.net>\n" "Language: cs\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: bylabel.c:253 #, c-format msgid "Found an invalid UUID: %s\n" msgstr "Nalezeno neplatné UUID: %s\n" #: bylabel.c:273 #, c-format msgid "Error checking device name: %s\n" msgstr "Chyba pÅ™i kontrole názvu zařízení: %s\n" #: common.c:124 #, c-format msgid "Quota utilities version %s.\n" msgstr "Kvótové nástroje (quota-tools) verze %s.\n" #: common.c:125 #, c-format msgid "Compiled with:%s\n" msgstr "PÅ™eloženo s:%s\n" #: common.c:126 convertquota.c:48 quotacheck.c:318 quotasync.c:26 #: repquota.c:64 warnquota.c:994 #, c-format msgid "Bugs to %s\n" msgstr "Chyby hlaste na <%s>\n" #: convertquota.c:41 #, 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 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" msgstr "" "Nástroj na pÅ™evod kvótových souborů.\n" "Použití:\n" "\t%s [pÅ™epínaÄe] bod_pÅ™ipojení\n" "\n" "-u, --user pÅ™evede soubor s kvótami uživatelů\n" "-g, --group pÅ™evede soubor s kvótami skupin\n" "-e, --convert-endian pÅ™evede soubor s kvótami na správnou\n" " endianitu\n" "-f, --convert-format starý,nový pÅ™evede ze starého formátu do formátu " "VFSv0\n" "-h, --help zobrazí tuto nápovÄ›du a skonÄí\n" "-V, --version zobrazí informace o verzi a skonÄí\n" "\n" #: convertquota.c:97 msgid "You have to specify source and target format of conversion.\n" msgstr "Musíte zadat zdrojový a cílový formát pÅ™evodu.\n" #: convertquota.c:112 quotacheck.c:404 quotaon.c:135 quotasync.c:64 #: repquota.c:141 setquota.c:221 msgid "Bad number of arguments.\n" msgstr "Å patný poÄet argumentů.\n" #: convertquota.c:119 msgid "You have to specify action to perform.\n" msgstr "Musíte urÄit požadovanou akci.\n" #: convertquota.c:166 quotacheck_v2.c:241 quotaio_tree.c:58 #, c-format msgid "Cannot read block %u: %s\n" msgstr "Blok %u nelze pÅ™eÄíst: %s\n" #: convertquota.c:191 convertquota.c:283 #, c-format msgid "Cannot commit dquot for id %u: %s\n" msgstr "Nelze zapsat dquot pro ID %u: %s\n" #: convertquota.c:239 msgid "Cannot read header of old quotafile.\n" msgstr "HlaviÄku starého souboru s kvótami nelze pÅ™eÄíst.\n" #: convertquota.c:243 msgid "" "Bad file magic or version (probably not quotafile with bad endianity).\n" msgstr "" "Å patný magický kód nebo verze (pravdÄ›podobnÄ› se nejedná o kvótový soubor\n" "s chybnou endianitou).\n" #: convertquota.c:254 msgid "Cannot read information about old quotafile.\n" msgstr "Údaje o starém kvótovém souboru nelze pÅ™eÄíst.\n" #: convertquota.c:296 msgid "Cannot get name of new quotafile.\n" msgstr "Nelze získat název nového souboru s kvótami.\n" #: convertquota.c:302 quotacheck.c:753 #, c-format msgid "Cannot rename new quotafile %s to name %s: %s\n" msgstr "Nový kvótový soubor %s nelze pÅ™ejmenovat na %s: %s\n" #: convertquota.c:316 #, c-format msgid "Cannot open old format file for %ss on %s\n" msgstr "Nelze otevřít soubor ve starém formátu pro %s na %s\n" #: convertquota.c:321 convertquota.c:354 #, c-format msgid "Cannot create file for %ss for new format on %s: %s\n" msgstr "Nelze vytvoÅ™it soubor pro %s v novém formátu na %s: %s\n" #: convertquota.c:344 #, c-format msgid "Cannot open old quota file on %s: %s\n" msgstr "Nelze otevřít starý kvótový soubor na %s: %s\n" #: convertquota.c:380 msgid "Unknown action should be performed.\n" msgstr "Provedena by mÄ›la být neznámá akce.\n" #: edquota.c:81 #, 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 [-u|g] [-F formatname] [-f filesystem] -t\n" "\tedquota [-u|g] [-F formatname] [-f filesystem] -T username|groupname ...\n" msgstr "" "Použití:\n" "\tedquota %1$s[-u] [-F FORMÃT] [-p UŽIVATEL] [-f SOUBOROVÃ_SYSTÉM] " "UŽIVATEL…\n" "\tedquota %1$s-g [-F FORMÃT] [-p SKUPINA] [-f SOUBOROVÃ_SYSTÉM] SKUPINA…\n" "\tedquota [-u|g] [-F FORMÃT] [-f SOUBOROVÃ_SYSTÉM] -t\n" "\tedquota [-u|g] [-F FORMÃT] [-f SOUBOROVÃ_SYSTÉM] -T UŽIVATEL|SKUPINA…\n" #: edquota.c:85 msgid "" "\n" "-u, --user edit user data\n" "-g, --group edit group data\n" msgstr "" "\n" "-u, --user upraví údaje o uživateli\n" "-g, --group upraví údaje o skupinÄ›\n" #: edquota.c:89 msgid "" "-r, --remote edit remote quota (via RPC)\n" "-m, --no-mixed-pathnames trim leading slashes from NFSv4 mountpoints\n" msgstr "" "-r, --remote upraví vzdálenou kvótu (pÅ™es RPC)\n" "-m, --no-mixed-pathnames odstraní z pÅ™ipojovacích míst NFSv4 poÄáteÄní\n" " lomítka\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=FORMÃT upraví kvóty v zadaném formátu\n" "-p, --prototype=JMÉNO zkopíruje údaje z uživatele/skupiny coby " "vzoru\n" " --always-resolve vždy zkusí pÅ™eložit jméno, i když je tvoÅ™eno\n" " jen Äíslicemi\n" "-f, --filesystem=SOUBOROVÃ_SYSTÉM\n" " upraví údaje jen na zadaném " "SOUBOROVÉM_SYSTÉMU\n" "-t, --edit-period upraví periodu odkladu\n" "-T, --edit-times upraví dobu odkladu pro uživatele/skupinu\n" "-h, --help zobrazí tuto nápovÄ›du a skonÄí\n" "-V, --version zobrazí údaje o verzi a skonÄí\n" "\n" #: edquota.c:101 quota.c:111 setquota.c:79 #, c-format msgid "Bugs to: %s\n" msgstr "" "Chyby v programu zasílejte (anglicky) na: %s\n" "Chyby v pÅ™ekladu (Äesky) na: <translation-team-cs@lists.sourceforge.net>\n" #: edquota.c:183 msgid "" "Prototype name does not make sense when editing grace period or times.\n" msgstr "PÅ™i úpravÄ› periody nebo doby odkladu nedává jméno vzoru smysl.\n" #: edquota.c:187 msgid "Cannot change grace times over RPC protocol.\n" msgstr "Doby odkladu nelze mÄ›nit pÅ™es protokol RPC.\n" #: edquota.c:205 #, c-format msgid "Cannot get quota information for user %s\n" msgstr "Údaj o kvótÄ› uživatele %s nelze získat\n" #: edquota.c:211 msgid "fsname mismatch\n" msgstr "fsname (název souborového systému) se neshoduje\n" #: edquota.c:253 msgid "No filesystems with quota detected.\n" msgstr "Nenalezeny žádné souborové systémy s kvótou.\n" #: edquota.c:269 #, c-format msgid "Cannot create temporary file: %s\n" msgstr "Nelze vytvoÅ™it doÄasný soubor: %s\n" #: edquota.c:274 #, c-format msgid "Cannot change owner of temporary file: %s\n" msgstr "Nelze zmÄ›nit vlastníka doÄasného souboru: %s\n" #: edquota.c:281 msgid "Cannot write grace times to file.\n" msgstr "Do souboru nelze zapsat doby odkladu.\n" #: edquota.c:285 msgid "Error while editing grace times.\n" msgstr "Chyba pÅ™i úpravÄ› dob odkladu.\n" #: edquota.c:289 msgid "Failed to parse grace times file.\n" msgstr "Rozbor souboru s dobami odkladu se nezdaÅ™il.\n" #: edquota.c:298 edquota.c:324 #, c-format msgid "Cannot get quota information for user %s.\n" msgstr "Údaj o kvótÄ› uživatele %s nelze získat.\n" #: edquota.c:300 msgid "Cannot write individual grace times to file.\n" msgstr "Do souboru nelze zapsat jednotlivé doby odkladu.\n" #: edquota.c:305 msgid "Error while editing individual grace times.\n" msgstr "Chyba pÅ™i úpravÄ› jednotlivých dob odkladu.\n" #: edquota.c:310 msgid "Cannot read individual grace times from file.\n" msgstr "Ze souboru nelze naÄíst jednotlivé doby odkladu.\n" #: edquota.c:326 msgid "Cannot write quotas to file.\n" msgstr "Kvóty nelze do souboru zapsat.\n" #: edquota.c:331 msgid "Error while editing quotas.\n" msgstr "Chyba pÅ™i úpravÄ› kvót.\n" #: edquota.c:337 msgid "Cannot reopen!" msgstr "Nelze znovu otevřít!" #: edquota.c:339 msgid "Cannot read quotas from file.\n" msgstr "Kvóty nelze ze souboru.\n" #: quota.c:85 msgid "Usage: quota [-guqvswim] [-l | [-Q | -A]] [-F quotaformat]\n" msgstr "Použití: quota [-guqvswim] [-l | [-Q | -A]] [-f FORMÃT]\n" #: quota.c:86 msgid "\tquota [-qvswim] [-l | [-Q | -A]] [-F quotaformat] -u username ...\n" msgstr "\tquota [-qvswim] [-l | [-Q | -A]] [-F FORMÃT] -u UŽIVATEL…\n" #: quota.c:87 msgid "\tquota [-qvswim] [-l | [-Q | -A]] [-F quotaformat] -g groupname ...\n" msgstr "\tquota [-qvswim] [-l | [-Q | -A]] [-F FORMÃT] -g SKUPINA…\n" #: quota.c:88 msgid "\tquota [-qvswugQm] [-F quotaformat] -f filesystem ...\n" msgstr "\tquota [-qvswugQm] [-F FORMÃT] -f SOUBOROVÃ_SYSTÉM…\n" #: quota.c:89 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" "-m, --no-mixed-pathnames trim leading slashes from NFSv4 mountpoints\n" " --show-mntpoint show mount point of the file system in output\n" " --hide-device do not show file system device in output\n" "-h, --help display this help message and exit\n" "-V, --version display version information and exit\n" "\n" msgstr "" "\n" "-u, --user zobrazí kvótu uživatele\n" "-g, --group zobrazí kvótu skupiny\n" "-q, --quiet vypisuje struÄnÄ›jší hlášky\n" "-v, --verbose vypisuje podrobnÄ›jší hlášky\n" "-s, --human-readable Äísla zobrazí v pÅ™irozeném tvaru (MB, GB…)\n" " --always-resolve vždy zkusí pÅ™eložit jméno na ID, i když je " "tvoÅ™eno\n" " jen Äíslicemi\n" "-w, --no-wrap nezalamuje dlouhé řádky\n" "-p, --raw-grace dobu odkladu vypíše v sekundách od poÄátku epochy\n" "-l, --local-only nedotazuje se souborových systémů pÅ™es NFS\n" "-Q, --quiet-refuse nevypisuje chybové hlášení, když NFS server " "neodpoví\n" "-i, --no-autofs nedotazuje se bodů pÅ™ipojení typu autofs\n" "-F, --format=FORMÃT zobrazí kvótu urÄeného FORMÃTU\n" "-f, --filesystem-list zobrazí údaje o kvótách jen pro zadané systémy\n" " souborů\n" "-A, --nfs-all zobrazí kvóty pro vÅ¡echny místa pÅ™ipojení typu " "NFS\n" "-m, --no-mixed-pathnames odstraní úvodní lomítka z míst pÅ™ipojení typu " "NFSv4\n" " --show-mntpoint zobrazí bod pÅ™ipojení systému souborů\n" " --hide-device nezobrazí zařízení systému souborů\n" "-h, --help zobrazí tuto nápovÄ›du a skonÄí\n" "-V, --version zobrazí údaje o verzi a skonÄí\n" "\n" #: quota.c:120 msgid "space" msgstr "místo" #: quota.c:122 msgid "blocks" msgstr "bloky" # FIXME: third argument is first character of first argument # (user/group → u/g-id). This is not localizable. #: quota.c:124 #, c-format msgid "Disk quotas for %s %s (%cid %u): %s\n" msgstr "Diskové kvóty pro %s %s (%cid %u): %s\n" # FIXME: printf(3) counts bytes, not columns #: quota.c:127 msgid "Filesystem" msgstr "Souborovy system" # FIXME: printf(3) counts bytes, not columns #: quota.c:128 quota.c:129 msgid "quota" msgstr "kvota" # FIXME: printf(3) counts bytes, not columns #: quota.c:128 quota.c:129 msgid "limit" msgstr "limit" # FIXME: printf(3) counts bytes, not columns #: quota.c:128 quota.c:129 msgid "grace" msgstr "odklad" # FIXME: printf(3) counts bytes, not columns #: quota.c:129 msgid "files" msgstr "souboru" #: quota.c:201 msgid "File limit reached on" msgstr "Omezení poÄtu souborů dosaženo na" #: quota.c:207 msgid "In file grace period on" msgstr "V periodÄ› odkladu poÄtu souborů na" #: quota.c:211 msgid "Over file quota on" msgstr "Kvóta na poÄet souborů pÅ™esažena na" #: quota.c:217 msgid "Block limit reached on" msgstr "Omezení na poÄet bloků dosaženo na" #: quota.c:223 msgid "In block grace period on" msgstr "V periodÄ› odkladu poÄtu bloků na" #: quota.c:227 msgid "Over block quota on" msgstr "Kvóta na poÄet bloků pÅ™ekroÄena na" # FIXME: context # None limit # None grace #: quota.c:290 quotasys.c:288 msgid "none" msgstr "žádný" #: quota.c:396 #, c-format msgid "Warning: Ignoring -%c when filesystem list specified.\n" msgstr "Pozor: Je-li zadán seznam souborových systémů, -%c bude ignorován.\n" #: quota.c:403 msgid "No filesystem specified.\n" msgstr "Nezadán žádný systém souborů.\n" #: quota.c:411 #, c-format msgid "Gid set allocation (%d): %s\n" msgstr "Alokace množiny GID (%d): %s\n" #: quota.c:417 #, c-format msgid "getgroups(): %s\n" msgstr "getgroups(): %s\n" #: quotacheck.c:96 msgid "Not enough memory.\n" msgstr "Nedostatek pamÄ›ti.\n" #: quotacheck.c:128 #, c-format msgid "Adding hardlink for ino %llu\n" msgstr "PÅ™idává se pevný odkaz na iuzel %llu\n" #: quotacheck.c:171 #, c-format msgid "Adding dquot structure type %s for %d\n" msgstr "PÅ™idává se struktura dquot typu %s pro %d\n" #: quotacheck.c:257 #, c-format msgid "Cannot open file %s: %s\n" msgstr "Soubor %s nelze otevřít: %s\n" #: quotacheck.c:262 msgid "Cannot get exact used space... Results might be inaccurate.\n" msgstr "" "Nelze zjistit pÅ™esné množství zabraného místa. Výsledky mohou být\n" "nepÅ™esné.\n" #: quotacheck.c:300 #, 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 "" "Nástroj pro kontrolu a opravu kvótových souborů.\n" "%s [-gucbfinvdmMR] [-F FORMÃT_KVÓTY] SOUBOROVÃ_SYSTÉM|-a\n" "\n" "-u, --user zkontrolovat soubory uživatele\n" "-g, --group zkontrolovat soubory skupiny\n" "-c, --create-files vytvoÅ™it nové soubory kvót\n" "-b, --backup vytvoÅ™it zálohy starých souborů kvót\n" "-f, --force vynutit kontrolu, i když kvóty jsou zapnuté\n" "-i, --interactive interaktivní režim\n" "-n, --use-first-dquot použít první kopii zdvojené struktury\n" "-v, --verbose zobrazovat podrobnosti\n" "-d, --debug zobrazovat jeÅ¡tÄ› více podrobností\n" "-m, --no-remount nepÅ™epojovat souborový systém jen pro Ätení\n" "-M, --try-remount zkusit pÅ™epojit souborový systém jen pro Ätení,\n" " pokraÄovat, i když se nezdaří\n" "-R, --exclude-root vynechat koÅ™enový systém, pokud se kontrolují\n" " vÅ¡echny souborové systémy\n" "-F, --format=FORMÃT_KVÓTY\n" " zkontrolovat kvótové soubory daného formátu\n" "-a, --all zkontrolovat vÅ¡echny souborové systémy\n" "-h, --help zobrazit tuto zprávu a skonÄit\n" "-V, --version zobrazit údaje o verzi a skonÄit\n" "\n" #: quotacheck.c:430 #, c-format msgid "error (%d) while opening %s\n" msgstr "chyba (%d) pÅ™i otevírání %s\n" #: quotacheck.c:435 #, c-format msgid "error (%d) while allocating inode file bitmap\n" msgstr "chyba (%d) pÅ™i alokaci bitmapy iuzlů souborů\n" #: quotacheck.c:440 #, c-format msgid "errstr (%d) while allocating inode directory bitmap\n" msgstr "chyba (%d) pÅ™i alokaci bitmapy iuzlů adresářů\n" #: quotacheck.c:445 #, c-format msgid "error (%d) while opening inode scan\n" msgstr "chyba (%d) pÅ™i otevírání vyhledávaÄe iuzlů\n" #: quotacheck.c:450 #, c-format msgid "error (%d) while starting inode scan\n" msgstr "chyba (%d) pÅ™i zahájení prohledávání iuzlů\n" #: quotacheck.c:458 #, c-format msgid "Found i_num %ld, blocks %ld\n" msgstr "Nalezen i_num %ld, bloků %ld\n" #: quotacheck.c:464 msgid "High uid detected.\n" msgstr "Nalezeno vysoké UID.\n" #: quotacheck.c:480 #, c-format msgid "Something weird happened while scanning. Error %d\n" msgstr "PÅ™i prohledávání se stalo nÄ›co divného. Chyba %d\n" #: quotacheck.c:504 #, c-format msgid "Cannot stat directory %s: %s\n" msgstr "Údaje o adresáři %s nelze získat: %s\n" #: quotacheck.c:516 #, c-format msgid "" "\n" "Can open directory %s: %s\n" msgstr "" "\n" "Adresář %s nelze otevřít: %s\n" #: quotacheck.c:528 #, c-format msgid "" "lstat Cannot stat `%s/%s': %s\n" "Guess you'd better run fsck first !\n" "exiting...\n" msgstr "" "lstat: Nelze získat údaje o „%s/%s“: %s\n" "Bylo by lepší, kdybyste nejprve spustili fsck!\n" "KonÄí se…\n" #: quotacheck.c:539 #, c-format msgid "pushd %s/%s\n" msgstr "pushd %s/%s\n" #: quotacheck.c:555 #, c-format msgid "\tAdding %s size %lld ino %d links %d uid %u gid %u\n" msgstr "\tPÅ™idává se %s: velikost %lld iuzel %d odkazů %d, UID %u GID %u\n" #: quotacheck.c:565 msgid "Scanning stored directories from directory stack\n" msgstr "Prohledávají se adresáře uložené na zásobníku adresářů\n" #: quotacheck.c:569 #, c-format msgid "" "popd %s\n" "Entering directory %s\n" msgstr "" "popd %s\n" "Vstupuje se do adresáře %s\n" #: quotacheck.c:581 #, c-format msgid "Leaving %s\n" msgstr "OpouÅ¡tí se %s\n" #: quotacheck.c:621 #, c-format msgid "Going to check %s quota file of %s\n" msgstr "Bude se kontrolovat %s kvótový soubor systému %s\n" #: quotacheck.c:627 #, c-format msgid "" "Quota for %ss is enabled on mountpoint %s so quotacheck might damage the " "file.\n" msgstr "" "Kvóta pro %s je na systému %s zapnuta,\n" "takže quotacheck by mohl daný soubor poÅ¡kodit.\n" #: quotacheck.c:628 quotacheck.c:939 msgid "Should I continue" msgstr "Má se pokraÄovat?" #: quotacheck.c:629 quotacheck.c:940 #, c-format msgid "As you wish... Canceling check of this file.\n" msgstr "Jak si pÅ™ejete. Kontrola tohoto souboru se ruší.\n" #: quotacheck.c:634 #, 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 "" "Kvóta pro %s je na systému %s zapnuta,\n" "takže quotacheck by mohl daný soubor poÅ¡kodit. Prosím, kvóty vypnÄ›te,\n" "nebo kontrolu vynuÅ¥te pÅ™epínaÄem „-f“.\n" #: quotacheck.c:641 #, c-format msgid "Error while syncing quotas on %s: %s\n" msgstr "Chyba pÅ™i synchronizaci kvót na %s: %s\n" #: quotacheck.c:646 #, c-format msgid "Cannot get quotafile name for %s\n" msgstr "Nelze získat název kvótového souboru pro %s\n" #: quotacheck.c:651 quotaio.c:150 quotasys.c:552 #, c-format msgid "Cannot open quotafile %s: %s\n" msgstr "Kvótový soubor %s nelze otevřít: %s\n" #: quotacheck.c:691 msgid "Renaming new files to proper names.\n" msgstr "Nové soubory se pÅ™ejmenovávají na správné názvy.\n" #: quotacheck.c:693 #, c-format msgid "Cannot get name of old quotafile on %s.\n" msgstr "Nelze zjistit název starého kvótového souboru na %s.\n" #: quotacheck.c:696 msgid "Old file not found.\n" msgstr "Starý kvótový soubor nenalezen.\n" #: quotacheck.c:699 #, c-format msgid "Error while searching for old quota file %s: %s\n" msgstr "Chyba pÅ™i hledávání starého kvótového souboru %s: %s\n" #: quotacheck.c:708 msgid "Old file found removed during check!\n" msgstr "Starý soubor byl bÄ›hem kontroly odstranÄ›n!\n" #: quotacheck.c:711 #, c-format msgid "Error while opening old quota file %s: %s\n" msgstr "Chyba pÅ™i otevírání starého kvótového souboru %s: %s\n" #: quotacheck.c:717 #, c-format msgid "EXT2_IOC_GETFLAGS failed: %s\n" msgstr "Volání EXT2_IOC_GETFLAGS selhalo: %s\n" #: quotacheck.c:721 #, c-format msgid "Quota file %s has IMMUTABLE flag set. Clearing.\n" msgstr "" "Kvótový soubor %s má nastaven příznak\n" "NEMÄšNITELNOSTI (immutable). Příznak odebrán.\n" #: quotacheck.c:724 #, c-format msgid "Failed to remove IMMUTABLE flag from quota file %s: %s\n" msgstr "Odebrání příznaku NEMÄšNITELNOSTI z kvótového souboru %s selhalo: %s\n" #: quotacheck.c:733 #, c-format msgid "Renaming old quotafile to %s~\n" msgstr "Starý kvótový soubor se pÅ™ejmenovává na %s~\n" #: quotacheck.c:739 #, c-format msgid "Name of quota file too long. Contact %s.\n" msgstr "Název kvótového souboru je příliÅ¡ dlouhý. Kontaktujte %s.\n" #: quotacheck.c:741 #, c-format msgid "Cannot rename old quotafile %s to %s: %s\n" msgstr "Starý kvótový soubor %s nelze pÅ™ejmenovat na %s: %s\n" #: quotacheck.c:747 msgid "Renaming new quotafile\n" msgstr "PÅ™ejmenovává se nový kvótový soubor\n" #: quotacheck.c:759 #, c-format msgid "Cannot change permission of %s: %s\n" msgstr "Nelze zmÄ›nit práva souboru %s: %s\n" #: quotacheck.c:766 #, c-format msgid "Cannot open new quota file %s: %s\n" msgstr "Nový kvótový soubor %s nelze otevřít: %s\n" #: quotacheck.c:771 #, c-format msgid "Warning: Cannot set EXT2 flags on %s: %s\n" msgstr "Pozor: Příznak EXT2 nelze u %s nastavit: %s\n" #: quotacheck.c:791 #, c-format msgid "Dumping gathered data for %ss.\n" msgstr "Zapisují se data nasbíraná pro %s.\n" #: quotacheck.c:794 #, c-format msgid "Cannot initialize IO on xfs/gfs2 quotafile: %s\n" msgstr "Nelze inicializovat I/O na kvótovém souboru XFS/GFS2: %s\n" #: quotacheck.c:800 #, c-format msgid "Cannot initialize IO on new quotafile: %s\n" msgstr "Nelze inicializovat I/O na novém kvótovém souboru: %s\n" #: quotacheck.c:827 #, c-format msgid "Cannot finish IO on new quotafile: %s\n" msgstr "Nelze dokonÄit I/O na novém kvótovém souboru: %s\n" #: quotacheck.c:830 msgid "Data dumped.\n" msgstr "Data zapsána.\n" #: quotacheck.c:835 #, c-format msgid "Cannot find checked quota file for %ss on %s!\n" msgstr "Nelze najít kontrolovaný kvótový soubor pro %s na %s!\n" #: quotacheck.c:839 #, c-format msgid "" "Cannot turn %s quotas off on %s: %s\n" "Kernel won't know about changes quotacheck did.\n" msgstr "" "Kvóty %s na %s nelze vypnout: %s\n" "Jádro se nedozví o zmÄ›nách, které nástroj quotacheck provedl.\n" #: quotacheck.c:852 #, c-format msgid "" "Cannot turn %s quotas on on %s: %s\n" "Kernel won't know about changes quotacheck did.\n" msgstr "" "Kvóty %s na %s nelze zapnout: %s\n" "Jádro se nedozví o zmÄ›nách, které nástroj quotacheck provedl.\n" #: quotacheck.c:874 #, c-format msgid "Substracting space used by old %s quota file.\n" msgstr "OdeÄítá se místo zabrané starým %s kvótovým souborem.\n" #: quotacheck.c:876 #, c-format msgid "" "Old %s file name could not been determined. Usage will not be substracted.\n" msgstr "" "Název starého %s souboru nemohl být urÄen. Místo nebude odeÄteno.\n" #: quotacheck.c:881 #, c-format msgid "Cannot stat old %s quota file %s: %s. Usage will not be substracted.\n" msgstr "" "Nebylo možné zjistit údaje o starém kvótovém %s souboru %s: %s.\n" "Místo nebude odeÄteno.\n" #: quotacheck.c:893 #, c-format msgid "" "Quota structure for %s owning quota file not present! Something is really " "wrong...\n" msgstr "" "Kvótová struktura pro %s vlastnícího kvótový soubor není přítomna!\n" "NÄ›co se opravdu pokazilo.\n" # FIXME: plural #: quotacheck.c:898 #, c-format msgid "Substracted %lu bytes.\n" msgstr "OdeÄteno %'lu bajtů.\n" #: quotacheck.c:911 #, c-format msgid "Cannot stat mountpoint %s: %s\n" msgstr "Nelze získat údaje o přípojném bodu %s: %s\n" #: quotacheck.c:913 #, c-format msgid "Mountpoint %s is not a directory?!\n" msgstr "Přípojný bod %s není adresářem?!\n" #: quotacheck.c:938 #, c-format msgid "" "Cannot remount filesystem mounted on %s read-only. Counted values might not " "be right.\n" msgstr "" "Souborový systém pÅ™ipojený do %s nelze pÅ™epojit\n" "jen pro Ätení. VypoÄtené hodnoty nemusí být správné.\n" #: quotacheck.c:946 #, 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 "" "Souborový systém pÅ™ipojený do %s nelze pÅ™epojit\n" "jen pro Ätení, tudíž vypoÄtené hodnoty nemusí být správné.\n" "Prosím, zastavte vÅ¡echny programy zapisující do souborového systému, nebo\n" "kontrolu vynuÅ¥te pÅ™epínaÄem -m.\n" #: quotacheck.c:954 msgid "Filesystem remounted read-only\n" msgstr "Systém souborů pÅ™epojen jen pro Ätení\n" #: quotacheck.c:957 #, c-format msgid "Scanning %s [%s] " msgstr "Prohledává se %s [%s]" #: quotacheck.c:974 msgid "done\n" msgstr "hotovo\n" # FIXME: plurals #: quotacheck.c:983 #, c-format msgid "Checked %d directories and %d files\n" msgstr "Zkontrolováno %d adresářů a %d souborů\n" #: quotacheck.c:987 #, c-format msgid "" "Cannot remount filesystem %s read-write. cannot write new quota files.\n" msgstr "" "Systém souborů %s nelze pÅ™epojit pro zápis. Nový soubor\n" "s kvótami nelze zapsat.\n" #: quotacheck.c:988 msgid "Filesystem remounted RW.\n" msgstr "Systém souborů pÅ™epojen pro zápis.\n" #: quotacheck.c:1031 #, c-format msgid "Cannot find quota option on filesystem %s with quotas!\n" msgstr "U souborového systému %s s kvótami nelze nalézt kvótový parametr!\n" #: quotacheck.c:1037 #, c-format msgid "Cannot detect quota format for journalled quota on %s\n" msgstr "U žurnálované kvóty na %s nelze urÄit formát\n" #: quotacheck.c:1103 #, c-format msgid "Cannot get system info: %s\n" msgstr "Nelze získat údaje o systému: %s\n" #  FXIME: msgid misses new lines. #: quotacheck.c:1123 msgid "" "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" msgstr "" "VaÅ¡e jádro zjevnÄ› podporuje žurnálované kvóty, ale vy je nepoužíváte.\n" "Zvažte použití žurnálovaných kvót, což umožňuje se vyhnout pouÅ¡tÄ›ní\n" "quotacheck po neÄistém vypnutí systému.\n" #: quotacheck.c:1137 quotasys.c:642 msgid "Cannot initialize mountpoint scan.\n" msgstr "Prohledávání bodu pÅ™ipojení nelze inicializovat.\n" #: quotacheck.c:1142 #, c-format msgid "Skipping %s [%s]\n" msgstr "PÅ™eskakuje se %s [%s]\n" #: quotacheck.c:1159 #, c-format msgid "" "Cannot guess format from filename on %s. Please specify format on " "commandline.\n" msgstr "" "Z názvu souboru na %s nelze uhádnout formát.\n" "Prosím, zadejte formát na příkazovém řádku.\n" #: quotacheck.c:1164 #, c-format msgid "Detected quota format %s\n" msgstr "ZjiÅ¡tÄ›n formát kvóty %s\n" #: quotacheck.c:1185 msgid "" "Cannot find filesystem to check or filesystem not mounted with quota " "option.\n" msgstr "" "Nelze nalézt systém souborů urÄený ke kontrole nebo systém souborů není\n" "pÅ™ipojen s kvótovým parametrem.\n" # FIXME: plurals #: quotacheck.c:1203 #, c-format msgid "" "Allocated %d bytes memory\n" "Free'd %d bytes\n" "Lost %d bytes\n" msgstr "" "Alokováno %'d bajtů pamÄ›ti\n" "UvolnÄ›no %'d bajtů\n" "Ztraceno %'d bajtů\n" #: quotacheck_v1.c:32 #, c-format msgid "Cannot read entry for id %u from quotafile %s: %s\n" msgstr "Z kvótového souboru %2$s nelze pÅ™eÄíst záznam pro ID %1$u: %3$s\n" #: quotacheck_v1.c:35 #, c-format msgid "Entry for id %u is truncated.\n" msgstr "Záznam pro ID %u je zkrácen.\n" #: quotacheck_v1.c:64 msgid "Loading first quota entry with grace times.\n" msgstr "NaÄítá se první záznam kvóty s dobami odkladu.\n" #: quotacheck_v1.c:68 #, c-format msgid "Cannot read first entry from quotafile %s: %s\n" msgstr "Z kvótového souboru %s nelze naÄíst první záznam: %s\n" # FIXME: duplicated message to quotacheck_v2.c:65 #: quotacheck_v1.c:72 #, c-format msgid "" "WARNING - Quotafile %s was probably truncated. Cannot save quota " "settings...\n" msgstr "" "POZOR – Kvótový soubor %s byl pravdÄ›podobnÄ› zkrácen. Nastavení kvót\n" "nelze uložit…\n" #: quotacheck_v1.c:78 msgid "First entry loaded.\n" msgstr "První záznam naÄten.\n" #: quotacheck_v2.c:55 msgid "Checking quotafile info...\n" msgstr "Kontrolují se údaje kvótového souboru…\n" #: quotacheck_v2.c:60 #, c-format msgid "Cannot read info from quota file %s: %s\n" msgstr "Údaje z kvótového souboru %s nelze pÅ™eÄíst: %s\n" #: quotacheck_v2.c:65 #, c-format msgid "" "WARNING - Quota file %s was probably truncated. Cannot save quota " "settings...\n" msgstr "" "POZOR – Kvótový soubor %s byl pravdÄ›podobnÄ› zkrácen. Nastavení kvót\n" "nelze uložit…\n" #: quotacheck_v2.c:77 msgid "WARNING - Quota file info was corrupted.\n" msgstr "POZOR – Údaje v kvótovém souboru byly poÅ¡kozeny.\n" #: quotacheck_v2.c:78 #, c-format msgid "" "Size of file: %lu\n" "Blocks: %u Free block: %u Block with free entry: %u Flags: %x\n" msgstr "" "Velikost souboru: %lu\n" "Bloků: %u Volných bloků: %u Bloků z volnými záznamy: %u Příznaky: %x\n" #: quotacheck_v2.c:85 #, c-format msgid "" "Setting grace times and other flags to default values.\n" "Assuming number of blocks is %u.\n" msgstr "" "Doby odkladu a příznaku se nastavují na výchozí hodnoty.\n" "PÅ™edpokládaný poÄet bloků je %u.\n" #: quotacheck_v2.c:102 msgid "File info done.\n" msgstr "Údaje souboru hotovy.\n" #: quotacheck_v2.c:113 msgid "Corrupted blocks: " msgstr "PoÅ¡kozené bloky: " #: quotacheck_v2.c:117 #, c-format msgid "Block %u: " msgstr "Blok %u: " #: quotacheck_v2.c:179 msgid "Duplicated entries." msgstr "Zdvojené záznamy." #: quotacheck_v2.c:183 #, c-format msgid "" "Found more structures for ID %u. Using values: BHARD: %lld BSOFT: %lld " "IHARD: %lld ISOFT: %lld\n" msgstr "" "Nalezeno více struktur pro ID %u. Použijí se hodnoty:\n" "\tBHARD: %lld BSOFT: %lld IHARD: %lld ISOFT: %lld\n" #: quotacheck_v2.c:191 #, c-format msgid "" "Found more structures for ID %u. Values: BHARD: %lld/%lld BSOFT: %lld/%lld " "IHARD: %lld/%lld ISOFT: %lld/%lld\n" msgstr "" "Nalezeno více struktur pro ID %u. Hodnoty:\n" "\tBHARD: %lld/%lld BSOFT: %lld/%lld IHARD: %lld/%lld ISOFT: %lld/%lld\n" #: quotacheck_v2.c:196 msgid "Should I use new values" msgstr "Mají se použít nové hodnoty?" #: quotacheck_v2.c:206 #, 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 má více struktur. Zásah uživatele nutný (použijte -i pro\n" "interaktivní režim nebo -n pro automatickou odpovÄ›Ä).\n" #: quotacheck_v2.c:243 #, c-format msgid "Block %u is truncated.\n" msgstr "Zkráceno %u bloků.\n" #: quotacheck_v2.c:252 #, c-format msgid "Reference to illegal block %u" msgstr "Odkaz na zakázaný blok %u" #: quotacheck_v2.c:259 #, c-format msgid "Block %u in tree referenced twice" msgstr "Blok %u odkazován ve stromÄ› dvakrát" #: quotacheck_v2.c:275 #, c-format msgid "Illegal free block reference to block %u" msgstr "Zakázaný odkaz volného bloku na blok %u" #: quotacheck_v2.c:278 #, c-format msgid "Corrupted number of used entries (%u)" msgstr "PoÅ¡kozený poÄet použitých záznamů (%u)" #: quotacheck_v2.c:330 #, c-format msgid "" "Quota file %s has corrupted headers. You have to specify quota format on " "command line.\n" msgstr "" "Kvótový soubor %s má poÅ¡kozenou hlaviÄku. Formát souboru je tÅ™eba\n" "zadat z příkazového řádku.\n" #: quotacheck_v2.c:346 msgid "Checking quotafile headers...\n" msgstr "Kontrolují se hlaviÄky kvótového souboru…\n" #: quotacheck_v2.c:350 #, c-format msgid "Cannot read header from quotafile %s: %s\n" msgstr "Z kvótového souboru %s nelze pÅ™eÄíst hlaviÄku: %s\n" # FIXME: duplicated message to quotacheck_v2.c:65 #: quotacheck_v2.c:352 #, c-format msgid "" "WARNING - Quotafile %s was probably truncated. Cannot save quota " "settings...\n" msgstr "" "POZOR – Kvótový soubor %s byl pravdÄ›podobnÄ› zkrácen. Nastavení kvót\n" "nelze uložit…\n" #: quotacheck_v2.c:358 #, c-format msgid "WARNING - Quota file %s has corrupted headers\n" msgstr "POZOR – Kvótový soubor %s má poÅ¡kozené hlaviÄky\n" #: quotacheck_v2.c:362 #, c-format msgid "" "Quota file format version %d does not match the one specified on command " "line (%d). Quota file header may be corrupted.\n" msgstr "" "Verze formátu kvótového souboru %d neodpovídá formátu uvedenému na\n" "příkazovém řádku (%d). HlaviÄka kvótového souboru může být poÅ¡kozena.\n" #: quotacheck_v2.c:366 msgid "Continue checking assuming version from command line?" msgstr "PokraÄovat v kontrole pÅ™edpokládaje verzi z příkazového řádku?" #: quotacheck_v2.c:372 msgid "Headers checked.\n" msgstr "HlaviÄky zkontrolovány.\n" #: quotacheck_v2.c:388 #, c-format msgid "Do not know how to buffer format %d\n" msgstr "Neví se, jak bufferovat formát %d\n" #: quotacheck_v2.c:398 #, c-format msgid "Headers of file %s checked. Going to load data...\n" msgstr "HlaviÄky souboru %s zkontrolovány. Nyní se budou nahrávat data…\n" #: quotacheck_v2.c:406 msgid "Cannot gather quota data. Tree root node corrupted.\n" msgstr "Nelze posbírat údaje o kvótách. KoÅ™enový uzel stromu je poÅ¡kozen.\n" #: quotacheck_v2.c:414 msgid "WARNING - Some data might be changed due to corruption.\n" msgstr "POZOR – NÄ›které údaje mohly být kvůli poÅ¡kození pozmÄ›nÄ›ny.\n" #: quotacheck_v2.c:417 msgid "Not found any corrupted blocks. Congratulations.\n" msgstr "Nenalezeny žádné poÅ¡kozené bloky. BlahopÅ™ejeme.\n" #: quotaio.c:62 msgid "Only RPC quota format is allowed on NFS filesystem.\n" msgstr "Na souborových systémech NFS je povolen jen formát kvóty RPC.\n" #: quotaio.c:73 msgid "RPC quota format not compiled.\n" msgstr "Kvótový formát RPC není zakompilován.\n" #: quotaio.c:77 msgid "RPC quota format specified for non-NFS filesystem.\n" msgstr "Kvótový formát RPC zadán pro ne-NFS souborový systém.\n" #: quotaio.c:84 msgid "Only XFS quota format is allowed on XFS filesystem.\n" msgstr "Pouze kvótový formát XFS je povolen na souborovém systému XFS.\n" #: quotaio.c:95 msgid "XFS quota allowed only on XFS filesystem.\n" msgstr "XFS kvóty jsou povoleny pouze na souborovém systému XFS.\n" #: quotaio.c:109 msgid "Quota not supported by the filesystem.\n" msgstr "Kvóta není souborovým systémem podporována.\n" #: quotaio.c:129 msgid "Cannot find any quota file to work on.\n" msgstr "Nenalezeny žádné kvótové souboru ke zpracování.\n" #: quotaio.c:134 msgid "Quota file not found or has wrong format.\n" msgstr "Kvótový soubor nenalezen nebo má chybný formát.\n" #: quotaio.c:144 #, c-format msgid "Cannot sync quotas on device %s: %s\n" msgstr "Kvóty na zařízení %s nelze synchronizovat: %s\n" #: quotaio.c:175 #, c-format msgid "Cannot initialize quota on %s: %s\n" msgstr "Kvóty na %s nelze inicializovat: %s\n" #: quotaio.c:202 #, c-format msgid "Creation of %s quota format is not supported.\n" msgstr "Tvorba formátu kvóty %s není podporována.\n" #: quotaio.c:212 #, c-format msgid "" "Quota on %s is stored in system files and must be manipulated by fs tools.\n" msgstr "" "Kvóta na %s je uložena v souborovém systému, a musí se s ní\n" "zacházet pomocí nástrojů souborového systému.\n" #: quotaio.c:222 #, c-format msgid "Cannot create new quotafile %s: %s\n" msgstr "Nový kvótový soubor %s nelze vytvoÅ™it: %s\n" #: quotaio.c:296 #, c-format msgid "" "Trying to set quota limits out of range supported by quota format on %s.\n" msgstr "" "Pokus nastavit limit mimo rozsah podporovaný formátem kvóty na %s.\n" #: quotaio.c:302 #, c-format msgid "" "Trying to set quota usage out of range supported by quota format on %s.\n" msgstr "" "Pokus nastavit zabrané místo mimo rozsah podporovaný formátem kvóty na %s.\n" #: quotaio_generic.c:54 #, c-format msgid "Cannot get info for %s quota file from kernel on %s: %s\n" msgstr "Z jádra nelze získat údaje o kvótovém souboru %s na %s: %s\n" #: quotaio_generic.c:72 #, c-format msgid "Cannot set info for %s quota file from kernel on %s: %s\n" msgstr "Z jádra nelze nastavit údaje o kvótovém souboru %s na %s: %s\n" #: quotaio_generic.c:84 #, c-format msgid "Cannot get quota for %s %d from kernel on %s: %s\n" msgstr "Z jádra nelze získat kvótu pro %s %d na %s: %s\n" #: quotaio_generic.c:99 #, c-format msgid "Cannot set quota for %s %d from kernel on %s: %s\n" msgstr "Z jádra nelze nastavit kvótu pro %s %d na %s: %s\n" #: quotaio_meta.c:22 msgid "Metadata init_io called when kernel support is not enabled.\n" msgstr "Funkce metadat init_io zavolána, i když podpora jádra není zapnuta.\n" #: quotaio_meta.c:26 msgid "" "Metadata init_io called when kernel does not support generic quota " "interface!\n" msgstr "" "Funkce metadat init_io zavolána, když jádro nepodporuje obecné rozhraní\n" "pro kvóty!\n" #: quotaio_rpc.c:76 quotaio_v1.c:308 quotaio_v2.c:464 #, c-format msgid "Trying to write quota to readonly quotafile on %s\n" msgstr "Pokus zapsat kvótu do kvótového souboru, který jen pro Ätení, na %s\n" #: quotaio_tree.c:71 #, c-format msgid "Cannot write block (%u): %s\n" msgstr "Nelze zapsat blok (%u): %s\n" #: quotaio_tree.c:94 msgid "Cannot allocate new quota block (out of disk space).\n" msgstr "Nelze alokovat nový kvótový blok (na disku doÅ¡lo místo).\n" #: quotaio_tree.c:202 msgid "find_free_dqentry(): Data block full but it shouldn't.\n" msgstr "find_free_dqentry(): Datový blok je plný, aÄkoliv by nemÄ›l být.\n" #: quotaio_tree.c:237 #, c-format msgid "Inserting already present quota entry (block %u).\n" msgstr "Vložení již přítomného záznamu kvóty (blok %u).\n" #: quotaio_tree.c:260 #, c-format msgid "Cannot write quota (id %u): %s\n" msgstr "Kvótu (ID %u) nelze zapsat: %s\n" #: quotaio_tree.c:279 #, c-format msgid "Quota write failed (id %u): %s\n" msgstr "Zápis kvóty (ID %u) selhal: %s\n" #: quotaio_tree.c:291 #, c-format msgid "Quota structure has offset to other block (%u) than it should (%u).\n" msgstr "Struktura kvóty má pozici na jiném bloku (%u), než by mÄ›la (%u).\n" #: quotaio_tree.c:367 #, c-format msgid "Quota for id %u referenced but not present.\n" msgstr "Kvóta pro ID %u je odkazována, ale není přítomna.\n" #: quotaio_tree.c:426 #, c-format msgid "Cannot read quota structure for id %u: %s\n" msgstr "Strukturu kvóty pro ID %u nelze pÅ™eÄíst: %s\n" #: quotaio_tree.c:468 #, c-format msgid "" "Illegal reference (%u >= %u) in %s quota file on %s. Quota file is probably " "corrupted.\n" "Please run quotacheck(8) and try again.\n" msgstr "" "Zakázaný odkaz (%u >= %u) v kvótovém souboru %s na %s.\n" "Kvótový soubor je pravdÄ›podobnÄ› poÅ¡kozen.\n" "Prosím, spusÅ¥te quotacheck(8) a zkuste to znovu.\n" #: quotaio_v1.c:214 #, c-format msgid "Trying to write info to readonly quotafile on %s.\n" msgstr "" "Pokus zapsat údaje do kvótového souboru, který je jen pro Ätení, na %s.\n" #: quotaio_v2.c:255 msgid "" "Your quota file is stored in wrong endianity. Please use convertquota(8) to " "convert it.\n" msgstr "" "Váš soubor s kvótami je uložen v chybné endianitÄ›. Prosím, pÅ™eveÄte jej\n" "pomocí convertquota(8).\n" # FIXME: duplicate of quotaio_v1.c:206 #: quotaio_v2.c:388 #, c-format msgid "Trying to write info to readonly quotafile on %s\n" msgstr "" "Pokus zapsat údaje do kvótového souboru, který je jen pro Ätení, na %s.\n" #: quotaio_v2.c:518 #, c-format msgid "" "Statistics:\n" "Total blocks: %u\n" "Data blocks: %u\n" "Entries: %u\n" "Used average: %f\n" msgstr "" "Statistika:\n" "Celkem bloků: %u\n" "Datových bloků: %u\n" "Záznamů: %u\n" "PrůmÄ›rnÄ› použito: %f\n" #: quotaio_xfs.c:217 #, c-format msgid "*** Status for %s quotas on device %s\n" msgstr "*** Stav kvót %s na zařízení %s\n" #: quotaio_xfs.c:219 quotaio_xfs.c:234 msgid "ON" msgstr "ZAPNUTO" #: quotaio_xfs.c:219 quotaio_xfs.c:234 msgid "OFF" msgstr "VYPNUTO" #: quotaio_xfs.c:221 quotaio_xfs.c:225 #, c-format msgid "Accounting: %s; Enforcement: %s\n" msgstr "ÚÄtování: %s; Vynucení: %s\n" #: quotaio_xfs.c:237 quotaio_xfs.c:241 #, c-format msgid "Accounting [ondisk]: %s; Enforcement [ondisk]: %s\n" msgstr "ÚÄtování [ondisk]: %s; Vynucení [ondisk]: %s\n" #: quotaio_xfs.c:250 quotaio_xfs.c:259 #, c-format msgid "Inode: none\n" msgstr "Iuzel: žádný\n" #: quotaio_xfs.c:252 quotaio_xfs.c:261 #, c-format msgid "Inode: #%llu (%llu blocks, %u extents)\n" msgstr "Iuzel: Ä. %llu (%'llu bloků, %'u rozsahů)\n" #: quota_nld.c:80 #, 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" " -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" msgstr "" "Použití: %s [PŘEPÃNAÄŒE]\n" "PÅ™epínaÄe jsou:\n" " -h --help zobrazí tento text\n" " -V --version zobrazí údaje o verzi\n" " -C --no-console zprávy nevypisuje na konzoli\n" " -b --print-below na konzoli hlásí rovněž pÅ™echody pod pevný/mÄ›kký limit\n" " -D --no-dbus zprávy nezasílá pÅ™es D-bus\n" " -F --foreground spustit na popÅ™edí\n" #: quota_nld.c:114 rquota_svc.c:160 #, c-format msgid "Unknown option '%c'.\n" msgstr "Neznámý pÅ™epínaÄ â€ž%c“.\n" #: quota_nld.c:120 msgid "No possible destination for messages. Nothing to do.\n" msgstr "Zprávy není, kam posílat. Není, co dÄ›lat.\n" #: quota_nld.c:146 msgid "Error parsing netlink message.\n" msgstr "Chyba rozboru netlinkové zprávy.\n" #: quota_nld.c:153 msgid "" "Unknown format of kernel netlink message!\n" "Maybe your quota tools are too old?\n" msgstr "" "Neznámý formát netlinkové zprávy z jádra!\n" "Nejsou vaÅ¡e nástroje pro kvótu zastaralé?\n" #: quota_nld.c:177 msgid "Cannot allocate netlink handle!\n" msgstr "Nelze alokovat deskriptor netlinku!\n" #: quota_nld.c:181 #, c-format msgid "Cannot connect to netlink socket: %s\n" msgstr "Na netlinkový socket se nelze pÅ™ipojit: %s\n" #: quota_nld.c:184 #, c-format msgid "Cannot resolve quota netlink name: %s\n" msgstr "Nelze pÅ™eložit netlinkový název kvóty: %s\n" #: quota_nld.c:188 #, c-format msgid "Cannot join quota multicast group: %s\n" msgstr "Nelze se pÅ™ipojit k multicastové skupinÄ› kvóty: %s\n" #: quota_nld.c:193 #, c-format msgid "Cannot register callback for netlink messages: %s\n" msgstr "ZpÄ›tné volání pro netlinkové zprávy nelze zaregistrovat: %s\n" #: quota_nld.c:207 #, c-format msgid "Cannot connect to system DBUS: %s\n" msgstr "Nelze se pÅ™ipojit k systémové sbÄ›rnici D-bus: %s\n" #: quota_nld.c:272 #, c-format msgid "Failed to find tty of user %llu to report warning to.\n" msgstr "" "Nebylo možné nalézt TTY uživatele %llu, kam by se mÄ›lo vypsat upozornÄ›ní.\n" #: quota_nld.c:277 #, c-format msgid "Failed to open tty %s of user %llu to report warning.\n" msgstr "" "OtevÅ™ení TTY %s uživatele %llu, kam by se mÄ›lo vypsat upozornÄ›ní, selhalo.\n" #: quota_nld.c:283 msgid "Warning" msgstr "Pozor" #: quota_nld.c:286 msgid "Error" msgstr "Chyba" #: quota_nld.c:288 msgid "Info" msgstr "Na vÄ›domí" #: quota_nld.c:291 msgid "file limit reached" msgstr "limit na soubory dosažen" #: quota_nld.c:294 msgid "file quota exceeded too long" msgstr "kvóta na soubory pÅ™ekroÄena příliÅ¡ dlouho" #: quota_nld.c:297 msgid "file quota exceeded" msgstr "Kvóta na soubory pÅ™ekroÄena" #: quota_nld.c:300 msgid "block limit reached" msgstr "limit na bloky dosažen" #: quota_nld.c:303 msgid "block quota exceeded too long" msgstr "kvóta na bloky pÅ™ekroÄena příliÅ¡ dlouho" #: quota_nld.c:306 msgid "block quota exceeded" msgstr "kvóta na bloky pÅ™ekroÄena" #: quota_nld.c:309 msgid "got below file limit" msgstr "poÄet souborů klesl pod limit" #: quota_nld.c:312 msgid "got below file quota" msgstr "poÄet souborů klesl pod kvótu" #: quota_nld.c:315 msgid "got below block limit" msgstr "poÄet bloků klesl pod limit" #: quota_nld.c:318 msgid "got below block quota" msgstr "poÄet bloků klesl pod kvótu" #: quota_nld.c:321 msgid "unknown quota warning" msgstr "neznámé upozornÄ›ní kvóty" #: quota_nld.c:325 #, c-format msgid "Failed to write quota message for user %llu to %s: %s\n" msgstr "Zápis zprávy o kvótÄ› pro uživatele %llu na %s selhal: %s\n" #: quota_nld.c:338 msgid "Cannot create DBUS message: No enough memory.\n" msgstr "Zprávu D-bus nelze vytvoÅ™it: Nedostatek pamÄ›ti.\n" #: quota_nld.c:356 msgid "Failed to write message to dbus: No enough memory.\n" msgstr "Zprávu nelze zapsat do D-bus: Nedostatek pamÄ›ti.\n" #: quota_nld.c:372 #, c-format msgid "Failed to read or parse quota netlink message: %s\n" msgstr "Netlinkovou zprávu kvóty nebylo možné pÅ™eÄíst nebo rozebrat: %s\n" #: quotaon.c:66 #, 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 %s 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 "" "Použití:\n" "\t%s [-guvp] [-F FORMÃT] [-x STAV] -a\n" "\t%s [-guvp] [-F FORMÃT] [-x STAV] SYSTÉM_SOUBORŮ…\n" "\n" "-a, --all zmÄ›ní stav kvót na %s na vÅ¡ech souborových systémech\n" "-f, --off vypne kvóty\n" "-u, --user operuje nad kvótami uživatele\n" "-g, --group operuje na kvótami skupiny\n" "-p, --print-state vypíše, zda-li jsou kvóty zapnuty, nebo vypnuty\n" "-x, --xfs-command=PŘÃKAZ provede příkaz kvóty XFS\n" "-F, --format=FORMÃT operuje nad zadaným kvótovým formátem\n" "-v, --verbose vypisuje podrobná hlášení\n" "-h, --help zobrazí tuto nápovÄ›du a skonÄí\n" "-V, --version zobrazí údaje o verzi a skonÄí\n" # kvóta je, zmÄ›ní stav kvót na #: quotaon.c:78 quotaon.c:341 msgid "off" msgstr "vypnuto" # kvóta je, zmÄ›ní stav kvót na #: quotaon.c:78 quotaon.c:341 msgid "on" msgstr "zapnuto" #: quotaon.c:139 msgid "Cannot turn on/off quotas via RPC.\n" msgstr "Kvóty nelze pÅ™es RPC zapnout/vypnout.\n" #: quotaon.c:186 #, c-format msgid "set root_squash on %s: %s\n" msgstr "nastavení root_squash na %s: %s\n" #: quotaon.c:190 #, c-format msgid "%s: %s root_squash turned off\n" msgstr "%s: root_squash na %s vypnuto\n" #: quotaon.c:192 #, c-format msgid "%s: %s root_squash turned on\n" msgstr "%s: root_squash na %s zapnuto\n" #: quotaon.c:210 #, c-format msgid "quotactl on %s [%s]: %s\n" msgstr "quotactl na %s [%s]: %s\n" #: quotaon.c:213 #, c-format msgid "%s [%s]: %s quotas turned off\n" msgstr "%s [%s]: kvóty pro %s vypnuty\n" #: quotaon.c:226 #, c-format msgid "cannot find %s on %s [%s]\n" msgstr "%s nelze na %s [%s] nalézt\n" #: quotaon.c:228 #, c-format msgid "using %s on %s [%s]: %s\n" msgstr "použití %s na %s [%s]: %s\n" #: quotaon.c:230 msgid "Maybe create new quota files with quotacheck(8)?\n" msgstr "Možná vytvoÅ™it nové kvótové soubory pomocí quotacheck(8)?\n" #: quotaon.c:232 msgid "Quota format not supported in kernel.\n" msgstr "Formát kvóty není podporován jádrem.\n" #: quotaon.c:235 #, c-format msgid "%s [%s]: %s quotas turned on\n" msgstr "%s [%s]: kvóty %s zapnuty\n" #: quotaon.c:275 msgid "Cannot change state of GFS2 quota.\n" msgstr "Stav kvóty GFS2 nelze zmÄ›nit.\n" #: quotaon.c:279 msgid "Cannot change state of XFS quota. It's not compiled in kernel.\n" msgstr "Stav kvóty XFS nelze zmÄ›nit. Není zakompilováno do jádra.\n" #: quotaon.c:304 #, c-format msgid "Cannot find quota file on %s [%s] to turn quotas on/off.\n" msgstr "" "Pro vypnutí/zapnutí kvót je tÅ™eba kvótový soubor, který nelze na %s [%s] " "nalézt.\n" #: quotaon.c:309 #, c-format msgid "Quota file on %s [%s] does not exist or has wrong format.\n" msgstr "Kvótový soubor na %s [%s] neexistuje nebo má Å¡patný formát.\n" #: quotaon.c:340 #, c-format msgid "%s quota on %s (%s) is %s\n" msgstr "Kvóta %s na %s (%s) je %s\n" #: quotaon.c:357 #, c-format msgid "Name must be quotaon or quotaoff not %s\n" msgstr "Název musí být quotaon nebo quotaoff, ne %s\n" #: quotaon.c:363 #, c-format msgid "Required format %s not supported by kernel.\n" msgstr "Požadovaný formát %s není podporován jádrem.\n" #: quotaon.c:365 msgid "Warning: No quota format detected in the kernel.\n" msgstr "Pozor: Žádný formát kvóty nebyl v jádÅ™e rozpoznán.\n" #: quotaon.c:372 #, c-format msgid "%s: Quota cannot be turned on on NFS filesystem\n" msgstr "%s: Kvótu nelze souborovém systému NFS zapnout.\n" #: quotaon_xfs.c:36 #, c-format msgid "quotactl() on %s: %s\n" msgstr "quotactl() na %s: %s\n" #: quotaon_xfs.c:62 quotaon_xfs.c:82 #, c-format msgid "Enabling %s quota on root filesystem (reboot to take effect)\n" msgstr "" "Zapíná se kvóta pro %s na koÅ™enovém souborovém systému (aby se nastavení " "projevilo, je tÅ™eba rebootovat)\n" #: quotaon_xfs.c:66 #, c-format msgid "Enable XFS %s quota accounting during mount\n" msgstr "ZapnÄ›te úÄtování kvót %s pÅ™i pÅ™ipojení systému\n" #: quotaon_xfs.c:76 #, c-format msgid "Cannot delete %s quota on %s - switch quota accounting off first\n" msgstr "Nelze smazat kvótu %s na %s – nejprve vypnÄ›te úÄtování kvót\n" #: quotaon_xfs.c:87 #, c-format msgid "Enabling %s quota enforcement on %s\n" msgstr "Zapíná se vynucování kvót %s na %s\n" #: quotaon_xfs.c:90 #, c-format msgid "Already accounting %s quota on %s\n" msgstr "Kvóty %s na %s se již poÄítají\n" #: quotaon_xfs.c:95 #, c-format msgid "Disabling %s quota accounting on %s\n" msgstr "Vypíná se úÄtování kvót %s na %s\n" #: quotaon_xfs.c:99 #, c-format msgid "Quota enforcement already disabled for %s on %s\n" msgstr "Vynucování kvót %s na %s již vypnuto\n" #: quotaon_xfs.c:108 #, c-format msgid "" "Cannot delete %s quota on %s - switch quota enforcement and accounting off " "first\n" msgstr "" "Kvótu %s nelze na %s smazat – nejprve je tÅ™eba vypnout vynucování a úÄtování " "kvót\n" #: quotaon_xfs.c:113 #, c-format msgid "Enforcing %s quota already on %s\n" msgstr "Kvóta %s se na %s již vynucuje\n" #: quotaon_xfs.c:118 #, c-format msgid "Cannot switch off %s quota accounting on %s when enforcement is on\n" msgstr "ÚÄtování kvóty %s na %s nelze vypnout, je-li vynucování zapnuto\n" #: quotaon_xfs.c:124 msgid "and accounting " msgstr "a úÄtování" #: quotaon_xfs.c:125 #, c-format msgid "Disabling %s quota enforcement %son %s\n" msgstr "Vypíná se vynucování %2$skvóty %1$s na %3$s\n" #: quotaon_xfs.c:131 #, c-format msgid "Unexpected XFS quota state sought on %s\n" msgstr "Hledán neoÄekávaný stav XFS kvóty na %s\n" #: quotaon_xfs.c:146 #, c-format msgid "quotactl on %s: %s\n" msgstr "quotactl na %s: %s\n" #: quotaon_xfs.c:150 #, c-format msgid "%s: %s quotas turned off\n" msgstr "%s: kvóty %s vypnuty\n" #: quotaon_xfs.c:152 #, c-format msgid "%s: %s quotas turned on\n" msgstr "%s: kvóty %s zapnuty\n" #: quotaon_xfs.c:166 #, c-format msgid "Failed to delete quota: %s\n" msgstr "OdstranÄ›ní kvóty selhalo: %s\n" #: quotaon_xfs.c:171 #, c-format msgid "%s: deleted %s quota blocks\n" msgstr "%s: bloky kvóty %s smazány\n" #: quotaon_xfs.c:224 #, c-format msgid "Invalid argument \"%s\"\n" msgstr "Neplatný argument „%s“\n" #: quotaops.c:108 #, c-format msgid "%s (uid %d): Permission denied\n" msgstr "%s (UID %d): Povolení zamítnuto\n" #: quotaops.c:120 #, c-format msgid "%s (gid %d): gid set allocation (%d): %s\n" msgstr "%s (GID %d): alokace množiny GID (%d): %s\n" #: quotaops.c:131 #, c-format msgid "%s (gid %d): error while trying getgroups(): %s\n" msgstr "%s (GID %d): volání getgroups() skonÄilo chybou: %s\n" #: quotaops.c:142 #, c-format msgid "%s (gid %d): Permission denied\n" msgstr "%s (GID %d): Povolení zamítnuto\n" #: quotaops.c:158 #, c-format msgid "error while getting quota from %s for %s (id %u): %s\n" msgstr "chyba pÅ™i zjišťování kvóty z %s pro %s (ID %u): %s\n" #: quotaops.c:183 #, c-format msgid "Cannot write quota for %u on %s: %s\n" msgstr "Kvótu pro %u nelze na %s zapsat: %s\n" #: quotaops.c:232 msgid "Too many parameters to editor.\n" msgstr "PříliÅ¡ mnoho parametrů editoru.\n" #: quotaops.c:240 #, c-format msgid "Cannot exec %s\n" msgstr "%s nelze spustit\n" #: quotaops.c:259 quotaops.c:384 #, c-format msgid "Cannot duplicate descriptor of file to write to: %s\n" msgstr "Deskriptor souboru nelze zmnožit pro zápis: %s\n" #: quotaops.c:261 #, c-format msgid "Disk quotas for %s %s (%cid %d):\n" msgstr "Diskové kvóty pro %s %s (%cid %d):\n" #: quotaops.c:265 #, c-format msgid "" " Filesystem blocks soft hard inodes " "soft hard\n" msgstr "" " Souborový systém bloků mÄ›kký pevný iuzlů " "mÄ›kký pevný\n" #: quotaops.c:298 #, c-format msgid "WARNING - %s: cannot change current block allocation\n" msgstr "POZOR – %s: množství alokovaných bloků nelze zmÄ›nit\n" #: quotaops.c:301 #, c-format msgid "WARNING - %s: cannot change current inode allocation\n" msgstr "POZOR – %s: množství alokovaných iuzlů nelze zmÄ›nit\n" #: quotaops.c:319 quotaops.c:426 #, c-format msgid "Cannot duplicate descriptor of temp file: %s\n" msgstr "Deskriptor doÄasného souboru nelze zmnožit: %s\n" #: quotaops.c:332 #, c-format msgid "" "Bad format:\n" "%s\n" msgstr "" "Chybný formát:\n" "%s\n" #: quotaops.c:386 #, c-format msgid "Times to enforce softlimit for %s %s (%cid %d):\n" msgstr "ÄŒasy vynucení mÄ›kkého limitu pro %s %s (%cid %d):\n" # XXX: Keep this message on one line because parser expects exact line numbers #: quotaops.c:388 quotaops.c:490 #, c-format msgid "Time units may be: days, hours, minutes, or seconds\n" msgstr "" "Jednotky Äasu smí být: days (dny), hours (hodiny), minutes (minuty) nebo " "seconds (sekundy)\n" #: quotaops.c:390 #, c-format msgid "" " Filesystem block grace inode grace\n" msgstr "" " Souborový systém odklad pro bloky odklad pro " "iuzly\n" #: quotaops.c:395 quotaops.c:401 quotaops.c:443 quotaops.c:455 setquota.c:245 #: setquota.c:251 msgid "unset" msgstr "nenastaveno" #: quotaops.c:397 quotaops.c:403 msgid "0seconds" msgstr "0sekund" # TODO: Pluralize #: quotaops.c:399 quotaops.c:405 quotasys.c:320 #, c-format msgid "%useconds" msgstr "%usekund" #: quotaops.c:440 quotaops.c:538 #, c-format msgid "" "bad format:\n" "%s\n" msgstr "" "chybný formát:\n" "%s\n" #: quotaops.c:450 quotaops.c:543 msgid "Bad time units. Units are 'second', 'minute', 'hour', and 'day'.\n" msgstr "" "Chybné jednotky Äasu. Jednotky jsou „second“, „minute“, „hour“ a „day“.\n" #: quotaops.c:486 #, c-format msgid "Cannot duplicate descriptor of file to edit: %s\n" msgstr "Deskriptor editovaného souboru nelze zmnožit: %s\n" #: quotaops.c:488 #, c-format msgid "Grace period before enforcing soft limits for %ss:\n" msgstr "Perioda odkladu pÅ™ed vynucením mÄ›kkého limitu pro %s:\n" #: quotaops.c:491 #, c-format msgid " Filesystem Block grace period Inode grace period\n" msgstr "" " Souborový systém Perioda odkladu bloků Perioda odkladu iuzlů\n" #: quotaops.c:517 #, c-format msgid "Cannot reopen temp file: %s\n" msgstr "DoÄasný soubor nelze znovu otevřít: %s\n" #: quotastats.c:48 #, c-format msgid "Cannot read stat file %s: %s\n" msgstr "Nelze naÄíst soubor se statistikou %s: %s\n" #: quotastats.c:83 #, c-format msgid "Error while getting quota statistics from kernel: %s\n" msgstr "Chyba pÅ™i získávání statistiky kvót z jádra: %s\n" #: quotastats.c:87 #, c-format msgid "Error while getting old quota statistics from kernel: %s\n" msgstr "Chyba pÅ™i získávání staré statistiky kvót z jádra: %s\n" #: quotastats.c:101 #, c-format msgid "Kernel quota version: old\n" msgstr "Verze jaderného subsystému kvót: stará\n" #: quotastats.c:103 #, c-format msgid "Kernel quota version: %u.%u.%u\n" msgstr "Verze jaderného subsystému kvót: %u.%u.%u\n" #: quotastats.c:104 #, c-format msgid "Number of dquot lookups: %ld\n" msgstr "PoÄet dotazů na dquota: %ld\n" #: quotastats.c:105 #, c-format msgid "Number of dquot drops: %ld\n" msgstr "PoÄet zahození dquot: %ld\n" #: quotastats.c:106 #, c-format msgid "Number of dquot reads: %ld\n" msgstr "PoÄet Ätení dquot: %ld\n" #: quotastats.c:107 #, c-format msgid "Number of dquot writes: %ld\n" msgstr "PoÄet zápisů dquot: %ld\n" #: quotastats.c:108 #, c-format msgid "Number of quotafile syncs: %ld\n" msgstr "PoÄet synchronizací souboru s kvótami: %ld\n" #: quotastats.c:109 #, c-format msgid "Number of dquot cache hits: %ld\n" msgstr "PoÄet úspěšných dotazů na dquot v keÅ¡i: %ld\n" #: quotastats.c:110 #, c-format msgid "Number of allocated dquots: %ld\n" msgstr "PoÄet alokovaných dquot: %ld\n" #: quotastats.c:111 #, c-format msgid "Number of free dquots: %ld\n" msgstr "PoÄet volných dquot: %ld\n" #: quotastats.c:112 #, c-format msgid "Number of in use dquot entries (user/group): %ld\n" msgstr "PoÄet použitých záznamů dquot (uživatel/skupina): %ld\n" #: quotasync.c:25 #, c-format msgid "" "Utility for syncing quotas.\n" "Usage:\n" "%s [-ug] -a | mntpoint...\n" "\n" msgstr "" "Nástroj pro synchronizaci kvót.\n" "Použití:\n" "%s [-ug] -a | PŘÃPOJNÃ_BOD…\n" "\n" #: quotasync.c:89 #, c-format msgid "%s quota sync failed: %s\n" msgstr "synchronizace kvóty %s selhala: %s\n" #: quotasync.c:100 #, c-format msgid "%s quota sync failed for %s: %s\n" msgstr "synchronizace kvóty %s na %s selhala: %s\n" #: quotasys.c:94 #, c-format msgid "user %s does not exist.\n" msgstr "uživatel %s neexistuje.\n" #: quotasys.c:123 #, c-format msgid "group %s does not exist.\n" msgstr "skupina %s neexistuje.\n" #: quotasys.c:225 #, c-format msgid "" "Unknown quota format: %s\n" "Supported 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" msgstr "" "Neznámý formát kvót: %s\n" "Podporované formáty jsou:\n" " vfsold – původní formát kvót\n" " vfsv0 – standardní formát kvót\n" " vfsv1 – formát kvót s 64bitovými limity\n" " rpc – použijí se volání RPC\n" " xfs – formát kvót XFS\n" # TODO: Pluralize #: quotasys.c:308 #, c-format msgid "%ddays" msgstr "%ddnů" #: quotasys.c:310 #, c-format msgid "%02d:%02d" msgstr "%02d:%02d" # TODO: Pluralize #: quotasys.c:322 #, c-format msgid "%uminutes" msgstr "%uminut" # TODO: Pluralize #: quotasys.c:324 #, c-format msgid "%uhours" msgstr "%uhodin" # TODO: Pluralize #: quotasys.c:326 #, c-format msgid "%udays" msgstr "%udnů" # TODO: Pluralize #: quotasys.c:335 msgid "second" msgstr "sekunda" # TODO: Pluralize #: quotasys.c:335 msgid "seconds" msgstr "sekund" # TODO: Pluralize #: quotasys.c:337 msgid "minute" msgstr "minuta" # TODO: Pluralize #: quotasys.c:337 msgid "minutes" msgstr "minut" # TODO: Pluralize #: quotasys.c:339 msgid "hour" msgstr "hodina" # TODO: Pluralize #: quotasys.c:339 msgid "hours" msgstr "hodin" # TODO: Pluralize #: quotasys.c:341 msgid "day" msgstr "den" # TODO: Pluralize #: quotasys.c:341 msgid "days" msgstr "dnů" #: quotasys.c:535 #, c-format msgid "Cannot stat quota file %s: %s\n" msgstr "O souboru s kvótami %s nelze zjistit údaje: %s\n" #: quotasys.c:681 msgid "Not all specified mountpoints are using quota.\n" msgstr "Ne vÅ¡echny použité přípojné body používají kvótu.\n" #: quotasys.c:695 #, c-format msgid "Error while releasing file on %s\n" msgstr "Chyba pÅ™i uvolňování souboru na %s\n" #: quotasys.c:754 #, c-format msgid "Cannot create set for sigaction(): %s\n" msgstr "Nelze vytvoÅ™it množinu pro sigaction(): %s\n" #: quotasys.c:757 #, c-format msgid "Cannot set signal handler: %s\n" msgstr "Nelze nastavit obsluhu signálu: %s\n" #: quotasys.c:810 #, c-format msgid "Cannot reset signal handler: %s\n" msgstr "Nelze znovu nastavit obsluhu signálu: %s\n" #: quotasys.c:950 msgid "Cannot open any file with mount points.\n" msgstr "Žádný soubor s body pÅ™ipojení nelze otevřít.\n" #: quotasys.c:963 #, c-format msgid "Cannot get device name for %s\n" msgstr "Nelze získat název zařízení pro %s\n" #: quotasys.c:1017 #, c-format msgid "Cannot resolve mountpoint path %s: %s\n" msgstr "Nelze pÅ™eložit cestu k bodu pÅ™ipojení %s: %s\n" #: quotasys.c:1023 #, c-format msgid "Cannot statfs() %s: %s\n" msgstr "Nelze vykonat statfs() nad %s: %s\n" #: quotasys.c:1035 #, c-format msgid "Cannot stat() mounted device %s: %s\n" msgstr "Nelze získat údaje o pÅ™ipojeném zařízení %s: %s\n" #: quotasys.c:1040 #, c-format msgid "" "Device (%s) filesystem is mounted on unsupported device type. Skipping.\n" msgstr "" "Souborový systém ze zařízení (%s) je pÅ™ipojen na nepodporovaném druhu\n" "zařízení. PÅ™eskakuje se.\n" #: quotasys.c:1050 #, c-format msgid "Cannot stat() mountpoint %s: %s\n" msgstr "Nad bodem pÅ™ipojení %s nelze zavolat stat(): %s\n" #: quotasys.c:1116 #, c-format msgid "" "Cannot find a device with %s.\n" "Skipping...\n" msgstr "" "Zařízení s %s nelze nalézt.\n" "PÅ™eskakuje se…\n" #: quotasys.c:1120 #, c-format msgid "" "Cannot stat() a mountpoint with %s: %s\n" "Skipping...\n" msgstr "" "Nad bodem pÅ™ipojení s %s nelze zavolat stat(): %s\n" "PÅ™eskakuje se…\n" #: quotasys.c:1128 #, c-format msgid "" "Cannot stat() given mountpoint %s: %s\n" "Skipping...\n" msgstr "" "Nad zadaným bodem pÅ™ipojení %s nelze zavolat stat(): %s\n" "PÅ™eskakuje se…\n" #: quotasys.c:1138 #, c-format msgid "Cannot find a filesystem mountpoint for directory %s\n" msgstr "K adresáři %s nelze pÅ™iÅ™adit bod pÅ™ipojení souborového systému.\n" #: quotasys.c:1144 #, c-format msgid "Cannot resolve path %s: %s\n" msgstr "Cestu %s nelze pÅ™eložit: %s\n" #: quotasys.c:1155 #, c-format msgid "Cannot find mountpoint for device %s\n" msgstr "K zařízení %s nelze pÅ™iÅ™adit bod pÅ™ipojení.\n" #: quotasys.c:1161 #, c-format msgid "Specified path %s is not directory nor device.\n" msgstr "Zadaná cesta %s není ani adresářem ani zařízením.\n" #: quotasys.c:1169 msgid "No correct mountpoint specified.\n" msgstr "Nezadán žádný správný bod pÅ™ipojení.\n" #: quotasys.c:1224 #, c-format msgid "Mountpoint (or device) %s not found or has no quota enabled.\n" msgstr "Bod pÅ™ipojení (nebo zařízení) %s nenalezeno nebo nebo zapnuté kvóty.\n" #: quot.c:81 #, c-format msgid "Usage: %s [-acfugvViTq] [filesystem...]\n" msgstr "Použití: %s [-acfugvViTq] [SYSTÉM_SOUBORŮ…]\n" #: quot.c:178 #, c-format msgid "%s (%s):\n" msgstr "%s (%s):\n" #: quot.c:182 quot.c:186 #, c-format msgid "%d\t%llu\t%llu\n" msgstr "%d\t%llu\t%llu\n" #: quot.c:195 #, c-format msgid "%s (%s) %s:\n" msgstr "%s (%s) %s:\n" #: quot.c:203 quot.c:205 #, c-format msgid "%8llu " msgstr "%8llu " #: quot.c:208 #, c-format msgid "%s" msgstr "%s" #: quot.c:210 #, c-format msgid "%-8.8s" msgstr "%-8.8s" #: quot.c:212 #, c-format msgid "#%-7d" msgstr "Ä%-7d" #: quot.c:214 #, c-format msgid " %8llu %8llu %8llu" msgstr " %8llu %8llu %8llu" #: quot.c:362 #, c-format msgid "cannot open %s: %s\n" msgstr "%s nelze otevřít: %s\n" #: quot.c:382 #, c-format msgid "XFS_IOC_FSBULKSTAT ioctl failed: %s\n" msgstr "IOCTL XFS_IOC_FSBULKSTAT selhalo: %s\n" #: repquota.c:50 #, 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 9 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 "" "Nástroj pro hlášení kvót.\n" "Použití:\n" "%s [-vugsi] [-c|C] [-t|n] [-F FORMÃT_KVÓTY (-a | BOD_PŘIPOJENÃ)\n" "\n" "-v, --verbose zobrazí rovněž uživatele/skupiny, které žádné\n" " místo nezabírají\n" "-u, --user zobrazí údaje o uživatelích\n" "-g, --group zobrazí údaje o skupinách\n" "-s, --human-readable zobrazí poÄty v podobÄ› vhodné pÅ™o ÄlovÄ›ka\n" " (MB, GB, …)\n" "-t, --truncate-names názvy zkrátí na 9 znaků\n" "-p, --raw-grace dobu odkladu zobrazí v sekundách od poÄátku " "epochy\n" "-n, --no-names nepÅ™ekládá UID/GID na jména\n" "-i, --no-autofs nezaobírá se přípojnými body typu autofs\n" "-c, --batch-translation pÅ™ekládá identifikátory ve velkých dávkách\n" "-C, --no-batch-translation pÅ™ekládá identifikátory po jednom\n" "-F, --format=FORMÃT_KVÓTY hlásí údaje u zadaného formátu\n" "-h, --help zobrazí tuto nápovÄ›du a skonÄí\n" "-V, --version zobrazí údaje o verzi a skonÄí\n" "\n" #: repquota.c:145 msgid "Repquota cannot report through RPC calls.\n" msgstr "Repquota nedokáže pracovat pÅ™es volání RPC.\n" #: repquota.c:149 msgid "Specified both -n and -t but only one of them can be used.\n" msgstr "Zadány pÅ™epínaÄe -n i -t, ale použít lze jen jeden z nich.\n" # This is first argument of `%s limits' header #: repquota.c:292 msgid "Space" msgstr "místa" # This is first argument of `%s limits' header #: repquota.c:294 msgid "Block" msgstr "bloků" #: repquota.c:296 #, c-format msgid "*** Report for %s quotas on device %s\n" msgstr "*** Hlášení pro kvóty %s na zařízení %s\n" #: repquota.c:299 #, c-format msgid "Block grace time: %s; Inode grace time: %s\n" msgstr "Doba odkladu bloků: %s, Doba odkladu i-uzlů: %s\n" #: repquota.c:300 #, c-format msgid " %s limits File limits\n" msgstr " Limity %s Limity souborů\n" #: repquota.c:301 #, c-format msgid "%-9s used soft hard grace used soft hard grace\n" msgstr "%-9s užito mÄ›kký pevný odklad užito mÄ›kký pevný odklad\n" #: repquota.c:301 msgid "User" msgstr "Uživatel" #: repquota.c:301 msgid "Group" msgstr "Skupina" #: rquota_svc.c:88 #, 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 "" "Použití: %s [PŘEPÃNAÄŒE]\n" "PÅ™epínaÄe jsou:\n" " -h --help zobrazí tento text\n" " -V --version zobrazí údaje o verzi\n" " -F --foreground spustí službu kvót na popÅ™edí\n" " -I --autofs přípojné body pÅ™ipojené pomocí automounteru nebudou\n" " ignorovány\n" " -p --port PORT poslouchá na zadaném portu\n" " -s --no-setquota zakáže vzdálené nastavování kvót (výchozí)\n" " -S --setquota povolí vzdálené nastavování kvót\n" " -x --xtab CESTA urÄuje náhradní soubor s tabulkou exportů NFS\n" #: rquota_svc.c:99 #, 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 "" "Použití: %s [PŘEPÃNAÄŒE]\n" "PÅ™epínaÄe jsou:\n" " -h --help zobrazí tento text\n" " -V --version zobrazí údaje o verzi\n" " -F --foreground spustí službu kvót na popÅ™edí\n" " -I --autofs přípojné body pÅ™ipojené pomocí automounteru nebudou\n" " ignorovány\n" " -p --port PORT poslouchá na zadaném portu\n" " -x --xtab CESTA urÄuje náhradní soubor s tabulkou exportů NFS\n" #: rquota_svc.c:146 #, c-format msgid "Illegal port number: %s\n" msgstr "Zakázané Äíslo portu: %s\n" #: rquota_svc.c:153 #, c-format msgid "Cannot access the specified xtab file %s: %s\n" msgstr "K zadanému souboru xtab %s nelze pÅ™istoupit: %s\n" #: rquota_svc.c:183 #, c-format msgid "host %s attempted to call setquota when disabled\n" msgstr "" "Stroj %s se pokusil zavolat setquota, aÄkoliv nastavování je zakázáno\n" #: rquota_svc.c:190 #, c-format msgid "host %s attempted to call setquota from port >= 1024\n" msgstr "Stroj %s se pokusil zavolat setquota z portu >= 1024\n" #: rquota_svc.c:205 #, c-format msgid "Denied access to host %s\n" msgstr "Přístup ke stroji %s zamítnut\n" #: rquota_svc.c:293 rquota_svc.c:379 msgid "unable to free arguments\n" msgstr "Argumenty nelze uvolnit\n" #: rquota_svc.c:402 #, c-format msgid "" "Warning: Cannot open export table %s: %s\n" "Using '/' as a pseudofilesystem root.\n" msgstr "" "Pozor: Tabulku exportů %s nelze otevřít: %s\n" "Jako koÅ™en pseudosystému souborů se použije „/“.\n" #: rquota_svc.c:454 msgid "cannot create udp service.\n" msgstr "UDP službu nelze vytvoÅ™it.\n" #: rquota_svc.c:458 msgid "unable to register (RQUOTAPROG, RQUOTAVERS, udp).\n" msgstr "Nelze zaregistrovat (RQUOTAPROG, RQUOTAVERS, UDP.)\n" #: rquota_svc.c:462 msgid "unable to register (RQUOTAPROG, EXT_RQUOTAVERS, udp).\n" msgstr "Nelze zaregistrovat (RQUOTAPROG, EXT_RQUOTAVERS, UDP).\n" #: rquota_svc.c:469 msgid "cannot create tcp service.\n" msgstr "TCP službu nelze vytvoÅ™it.\n" #: rquota_svc.c:473 msgid "unable to register (RQUOTAPROG, RQUOTAVERS, tcp).\n" msgstr "Nelze zaregistrovat (RQUOTAPROG, RQUOTAVERS, TCP).\n" #: rquota_svc.c:477 msgid "unable to register (RQUOTAPROG, EXT_RQUOTAVERS, tcp).\n" msgstr "Nelze zaregistrovat (RQUOTAPROG, EXT_RQUOTAVERS, TCP).\n" #: rquota_svc.c:486 msgid "svc_run returned\n" msgstr "Funkce svc_run() se vrátila.\n" # TODO: Upper-case UID #: set_limits_example.c:20 #, c-format msgid "copy_user_quota_limits: Failed to set userquota for uid %ld : %s\n" msgstr "" "copy_user_quota_limits: Nastavení kvót uživatele s UID %ld selhalo: %s\n" # TODO: Upper-case UID #: set_limits_example.c:27 #, c-format msgid "copy_user_quota_limits: Failed to get userquota for uid %ld : %s\n" msgstr "copy_user_quota_limits: Získání kvót uživatele s UID %ld selhalo: %s\n" #: set_limits_example.c:43 #, c-format msgid "copy_group_quota_limits: Failed to set groupquota for uid %ld : %s\n" msgstr "copy_group_quota_limits: Nastavení kvót skupiny s ID %ld selhalo: %s\n" #: set_limits_example.c:50 #, c-format msgid "copy_group_quota_limits: Failed to get groupquota for uid %ld : %s\n" msgstr "copy_group_quota_limits: Získání kvót skupiny s ID %ld selhalo: %s\n" #: setquota.c:55 #, 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 [-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" msgstr "" "Použití:\n" " setquota [-u|-g] %1$s[-F FORMÃT_KVÓTY] UŽIVATEL|SKUPINA\n" "\tMÄšKKÃ_LIMIT_BLOKÅ® PEVNÃ_LIMIT_BLOKÅ® MÄšKKÃ_LIMIT_IUZLÅ® PEVNÃ_LIMIT_IUZLÅ®\n" "\t-a|SYSTÉM_SOUBORŮ…\n" " setquota [-u|-g] %1$s[-F FORMÃT_KVÓTY] -p VZOROVÃ_UŽIVATEL|" "VZOROVÃ_SKUPINA\n" "\tUŽIVATEL|SKUPINA -a|SYSTÉM_SOUBORŮ…\n" " setquota [-u|-g] %1$s[-F FORMÃT_KVÓTY] -b [-c] -a|SYSTÉM_SOUBORŮ…\n" " setquota [-u|-g] [-F FORMÃT_KVÓTY] -t PERIODA_BLOKÅ® PERIODA_IUZLÅ®\n" "\t-a|SYSTÉM_SOUBORŮ…\n" " setquota [-u|-g] [-F FORMÃT_KVÓTY] UŽIVATEL|SKUPINA -T DOBA_BLOKÅ®\n" "\tDOBA_IUZLÅ® -a|SYSTÉM_SOUBORŮ…\n" "\n" "-u, --user nastaví limity pro uživatele\n" "-g, --group nastaví limity pro skupinu\n" "-a, --all nastaví limity pro vÅ¡echny souborové systémy\n" " --always-resolve vždy pÅ™ekládá jména, i když se skládají jen " "z Äíslic\n" "-F, --format=FORMÃT_KVÓTY pracuje nad urÄitým formátem kvót\n" "-p, --prototype=VZOR zkopíruje limity z uživatele/skupiny\n" "-b, --batch limity naÄte v dávce ze standardního vstupu\n" "-c, --continue-batch pokraÄuje ve zpracování vstupu i v případÄ› chyby\n" #: setquota.c:72 msgid "" "-r, --remote set remote quota (via RPC)\n" "-m, --no-mixed-pathnames trim leading slashes from NFSv4 mountpoints\n" msgstr "" "-r, --remote nastaví vzdálenou kvótu (pÅ™es RPC)\n" "-m, --no-mixed-pathnames odstraní úvodní lomítka z systému NFSv4\n" #: setquota.c:75 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 zmÄ›ní periodu odkladu\n" "-T, --edit-times zmÄ›ní dobu odkladu pro uživatele/skupinu\n" "-h, --help zobrazí tuto nápovÄ›du a skonÄí\n" "-V, --version zobrazí údaje o verzi a skonÄí\n" "\n" #: setquota.c:90 #, c-format msgid "Bad %s: %s\n" msgstr "Å patná hodnota: %s: %s\n" #: setquota.c:186 msgid "Group and user quotas cannot be used together.\n" msgstr "Kvóty skupiny a uživatele nelze použít spoleÄnÄ›.\n" #: setquota.c:190 msgid "Prototype user has no sense when editing grace times.\n" msgstr "Vzorový uživatel nemá smysl, když se mÄ›ní doba odkladu.\n" #: setquota.c:194 msgid "Cannot set both individual and global grace time.\n" msgstr "Jednotlivé a globální doby odkladu nelze nastavit najednou.\n" #: setquota.c:198 msgid "Batch mode cannot be used for setting grace times.\n" msgstr "Dobu odkladu nelze v dávkovém režimu nastavit.\n" #: setquota.c:202 msgid "Batch mode and prototype user cannot be used together.\n" msgstr "Dávkový režim a vzorového uživatele nelze nastavit najednou.\n" #: setquota.c:206 msgid "Cannot set grace times over RPC protocol.\n" msgstr "Doby odkladu nelze nastavit pÅ™es protokol RPC.\n" #: setquota.c:229 msgid "block softlimit" msgstr "mÄ›kký limit bloků" #: setquota.c:230 msgid "block hardlimit" msgstr "pevný limit bloků" #: setquota.c:231 msgid "inode softlimit" msgstr "mÄ›kký limit iuzlů" #: setquota.c:232 msgid "inode hardlimit" msgstr "pevný limit iuzlů" #: setquota.c:238 setquota.c:250 msgid "block grace time" msgstr "doba odkladu bloků" #: setquota.c:239 setquota.c:256 msgid "inode grace time" msgstr "doba odkladu iuzlů" #: setquota.c:262 msgid "Mountpoint not specified.\n" msgstr "Nebyl zadán bod pÅ™ipojení.\n" #: setquota.c:317 #, c-format msgid "Line %d too long.\n" msgstr "Řádek %d je příliÅ¡ dlouhý.\n" #: setquota.c:329 #, c-format msgid "Cannot parse input line %d.\n" msgstr "Vstupní řádek %d nelze rozebrat.\n" #: setquota.c:331 setquota.c:339 msgid "Exitting.\n" msgstr "KonÄí se.\n" #: setquota.c:332 setquota.c:340 msgid "Skipping line.\n" msgstr "Řádek bude pÅ™eskoÄen.\n" #: setquota.c:337 #, c-format msgid "Unable to resolve name '%s' on line %d.\n" msgstr "Jméno „%s“ na řádku %d nelze pÅ™eložit.\n" #: setquota.c:383 #, c-format msgid "Setting grace period on %s is not supported.\n" msgstr "Nastavování periody odkladu na %s není podporováno.\n" #: setquota.c:405 #, c-format msgid "Not setting block grace time on %s because softlimit is not exceeded.\n" msgstr "" "Doba odkladu bloků na %s nebude nastavena, protože mÄ›kký limit není " "pÅ™ekroÄen.\n" #: setquota.c:409 #, c-format msgid "Not setting inode grace time on %s because softlimit is not exceeded.\n" msgstr "" "Doba odkladu iuzlů na %s nebude nastavena, protože mÄ›kký limit není " "pÅ™ekroÄen.\n" #: setquota.c:412 #, c-format msgid "" "cannot write times for %s. Maybe kernel does not support such operation?\n" msgstr "Doby pro %s nelze zapsat. Možná jádro takovou operaci nepodporuje.\n" #: svc_socket.c:42 #, c-format msgid "Cannot create socket: %s\n" msgstr "Socket nelze vytvoÅ™it: %s\n" #: svc_socket.c:49 #, c-format msgid "Cannot set socket options: %s\n" msgstr "Socketu nelze nastavit parametry: %s\n" #: svc_socket.c:84 #, c-format msgid "Cannot bind to given address: %s\n" msgstr "Na zadanou adresu se nelze pÅ™ilepit: %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 "" "Ahoj,\n" "\n" "zaznamenali jsme, že jste ve sporu se systémem kvót na tomto stroji.\n" "Nalezeny byly následující poruÅ¡ení pravidel:\n" "\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" "Doufáme, že si uklidíte dříve, než vyprší perioda odkladu.\n" "\n" "V zásadÄ› to znamená, že systém si myslí, že používáte více diskového\n" "prostoru na oddílech uvedených výše, než máte dovoleno. Pokud soubory\n" "nesmažete a nedostanete se pod váš limit pÅ™ed uplynutím periody odkladu,\n" "systém vám bude bránit v tvorbÄ› nových souborů.\n" "\n" "PotÅ™ebujete-li pomoc, napiÅ¡te nám na %s\n" "nebo zavolejte na %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 "" "Ahoj,\n" "\n" "Zaznamenali jsme, že skupina %s, jímž jste Älenem, poruÅ¡uje na tomto\n" "stroji systém kvót. Byla nalezena následující poruÅ¡ení:\n" "\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" "Prosíme, abyste uklidili data skupiny pÅ™ed vyprÅ¡ením periody odkladu.\n" "\n" "V zásadÄ› to znamená, že systém si myslí, že skupina používá více diskového\n" "prostoru na oddílech uvedených výše, než má dovoleno. Pokud soubory\n" "nesmažete a nedostanete se pod limit skupiny pÅ™ed uplynutím periody\n" "odkladu, systém vám a dalším Älenům skupiny bude bránit v tvorbÄ› nových\n" "souborů.\n" "\n" "PotÅ™ebujete-li pomoc, napiÅ¡te nám na %s\n" "nebo zavolejte na %s.\n" #: warnquota.c:182 #, c-format msgid "%s: %s\n" msgstr "%s: %s\n" #: warnquota.c:226 #, c-format msgid "Cannot get name for uid/gid %u.\n" msgstr "UID/GID %u nelze pÅ™eložit na jméno.\n" #: warnquota.c:310 #, c-format msgid "Cannot create pipe: %s\n" msgstr "Nelze vytvoÅ™it rouru: %s\n" #: warnquota.c:316 #, c-format msgid "Cannot fork: %s\n" msgstr "Voláni fork() selhalo: %s\n" #: warnquota.c:321 #, c-format msgid "Cannot duplicate descriptor: %s\n" msgstr "Deskriptor nelze zdvojit: %s\n" #: warnquota.c:325 #, c-format msgid "Cannot execute '%s': %s\n" msgstr "„%s“ nelze spustit: %s\n" #: warnquota.c:330 #, c-format msgid "Cannot open pine: %s\n" msgstr "Nelze otevřít rouru: %s\n" #: warnquota.c:411 msgid "Could not setup ldap connection, returning.\n" msgstr "Spojení LDAP nelze nastavit.\n" #: warnquota.c:434 #, c-format msgid "Error with %s.\n" msgstr "Chyba u %s.\n" #: warnquota.c:442 #, c-format msgid "Multiple entries found for client %s, %d not sending mail.\n" msgstr "Nalezeno více záznamů pro klienta %s (%d). E-mail nebude odeslán.\n" #: warnquota.c:446 #, c-format msgid "Entry not found for client %s, %d not sending mail.\n" msgstr "Záznam pro klienta %s nenalezen (%d). E-mail nebude odeslán.\n" #: warnquota.c:457 #, c-format msgid "Could not get values for %s.\n" msgstr "Hodnoty pro %s nebylo možné získat.\n" #: warnquota.c:489 #, c-format msgid "Administrator for a group %s not found. Cancelling mail.\n" msgstr "Správce skupiny %s nenalezen. E-mail zruÅ¡en.\n" #: warnquota.c:534 #, c-format msgid "" "\n" " Block limits File limits\n" msgstr "" "\n" " Limity bloků Limity souborů\n" #: warnquota.c:535 #, c-format msgid "" "Filesystem used soft hard grace used soft hard grace\n" msgstr "" "Souborový systém užito mÄ›kký pevný odklad užito mÄ›kký pevný odklad\n" #: warnquota.c:575 #, c-format msgid "Cannot wait for mailer: %s\n" msgstr "Nelze se doÄkat dokonÄení odeslání poÅ¡ty: %s\n" #: warnquota.c:577 msgid "Warning: Mailer exitted abnormally.\n" msgstr "Pozor: Odesílání poÅ¡ty skonÄilo mimořádnÄ›.\n" #: warnquota.c:634 #, c-format msgid "" "Cannot open %s: %s\n" "Will use device names.\n" msgstr "" "%s nelze otevřít: %s\n" "Použijí se názvy zařízení.\n" #: warnquota.c:657 #, c-format msgid "Cannot parse line %d in quotatab (missing ':')\n" msgstr "V souboru quotatab nelze rozebrat řádek %d (chybí „:“)\n" #: warnquota.c:671 #, c-format msgid "Cannot stat device %s (maybe typo in quotatab)\n" msgstr "O zařízení %s nelze získat údaje (možná pÅ™eklep v souboru quotatab)\n" #: warnquota.c:691 #, c-format msgid "" "Incorrect format string for variable %s.\n" "Unrecognized expression %%%c.\n" msgstr "" "Nesprávný formátovací Å™etÄ›zec promÄ›nné %s.\n" "Nerozpoznaný výraz %%%c.\n" #: warnquota.c:730 #, c-format msgid "Cannot open %s: %s\n" msgstr "%s nelze otevřít: %s\n" #: warnquota.c:750 #, c-format msgid "Line %d too long. Truncating.\n" msgstr "Řádek %d je příliÅ¡ dlouhý. Bude zkrácen.\n" #: warnquota.c:822 #, c-format msgid "Cannot parse time at CC_BEFORE variable (line %d).\n" msgstr "ÄŒas v promÄ›nné CC_BEFORE nelze rozebrat (řádek %d).\n" #: warnquota.c:846 #, c-format msgid "Error in config file (line %d), ignoring\n" msgstr "Chyba v konfiguraÄním souboru (řádek %d), ignoruje se.\n" #: warnquota.c:849 #, c-format msgid "Possible error in config file (line %d), ignoring\n" msgstr "Možná chyba v konfiguraÄním souboru (řádek %d), ignoruje se.\n" #: warnquota.c:852 msgid "Unterminated last line, ignoring\n" msgstr "NeukonÄený poslední řádek, ignoruje se.\n" #: warnquota.c:859 #, c-format msgid "" "LDAP library version >= 2.3 detected. Please use LDAP_URI instead of " "hostname and port.\n" "Generated URI %s\n" msgstr "" "ZjiÅ¡tÄ›na verze LDAP knihovny >= 2.3. Prosím, použijte LDAP_URI namísto\n" "názvu stroje a portu.\n" "VytvoÅ™ené URI: %s\n" #: warnquota.c:863 msgid "LDAP library does not support ldap_initialize() but URI is specified." msgstr "LDAP knihovna nepodporuje ldap_initialize(), tÅ™ebaže je zadáno URI." #: warnquota.c:885 #, c-format msgid "Cannot open file with group administrators: %s\n" msgstr "Soubor se správci skupin nelze otevřít: %s\n" #: warnquota.c:900 #, c-format msgid "Parse error at line %d. Cannot find end of group name.\n" msgstr "Chyba pÅ™i rozboru řádku %d. Nelze nalézt konec názvu skupiny.\n" #: warnquota.c:909 #, c-format msgid "Parse error at line %d. Cannot find administrators name.\n" msgstr "Chyba pÅ™i rozboru řádku %d. Nelze nalézt jméno správce.\n" #: warnquota.c:919 #, c-format msgid "" "Parse error at line %d. Trailing characters after administrators name.\n" msgstr "Chyba pÅ™i rozboru řádku %d. PÅ™ebyteÄné znaky za jménem správce.\n" #: warnquota.c:982 msgid "" "Usage:\n" " warnquota [-ugsid] [-F quotaformat] [-c configfile] [-q quotatabfile] [-a " "adminsfile] [filesystem...]\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 "" "Použití:\n" " warnquota [-ugsid] [-F FORMÃT_KVÓT] [-c KONFIGURAÄŒNÃ_SOUBOR]\n" " [-q SOUBOR_QUOTATAB [-a SOUBOR_SE_SPRÃVCI] [SYSTÉM_SOUBORŮ…]\n" "\n" "-u, --user upozorní uživatele\n" "-g, --group upozorní skupiny\n" "-s, --human-readable odesílá údaje v jednotkách vhodných pro\n" " ÄlovÄ›ka\n" "-i, --no-autofs vynechá přípojné body typu autofs\n" "-d, --no-details neodesílá samotné údaje o kvótách\n" "-F, --format=FORMÃT_KVÓT použije kvótové soubory zadaného formátu\n" "-c, --config=KONFIGURAÄŒNÃ_SOUBOR jiný konfiguraÄní soubor\n" "-q, --quota-tab=SOUBOR_QUOTATAB jiný quotatab\n" "-a, --admins-file=SOUBOR_SE_SPRÃVCI\n" " jiný soubor správců\n" "-h, --help zobrazí tuto nápovÄ›du a skonÄí\n" "-v, --version zobrazí údaje o verzi a skonÄí\n" "\n" #: warnquota.c:1063 #, c-format msgid "Cannot get host name: %s\n" msgstr "Nelze získat název stroje: %s\n" #: xqmstats.c:32 xqmstats.c:37 msgid "The running kernel does not support XFS\n" msgstr "Bežící jádro nepodporuje XFS\n" #: xqmstats.c:49 #, c-format msgid "XFS Quota Manager dquot statistics\n" msgstr "Statistika quot Správce kvót XFS\n" #: xqmstats.c:50 #, c-format msgid " reclaims: %u\n" msgstr " uvolnÄ›ní: %u\n" #: xqmstats.c:51 #, c-format msgid " missed reclaims: %u\n" msgstr " nenalezená uvolnÄ›ní: %u\n" #: xqmstats.c:52 #, c-format msgid " dquot dups: %u\n" msgstr " duplikací dquot: %u\n" #: xqmstats.c:53 #, c-format msgid " cache misses: %u\n" msgstr " nenalezení v keÅ¡i: %u\n" #: xqmstats.c:54 #, c-format msgid " cache hits: %u\n" msgstr " zásahů v keÅ¡i: %u\n" #: xqmstats.c:55 #, c-format msgid " dquot wants: %u\n" msgstr " požadavků na dquot: %u\n" #: xqmstats.c:56 #, c-format msgid " shake reclaims: %u\n" msgstr " uvolnÄ›ní setÅ™esením: %u\n" #: xqmstats.c:57 #, c-format msgid " inact reclaims: %u\n" msgstr " uvolnÄ›ní neaktivních: %u\n" #: xqmstats.c:62 #, c-format msgid "Maximum %u dquots (currently %u incore, %u on freelist)\n" msgstr "Maximum %u dquot (nyní %u v jádÅ™e, %u na seznamu volných)\n" #~ msgid "XFS quota format needs no checking.\n" #~ msgstr "Kvóta formátu XFS nevyžaduje žádnou kontrolu.\n" # FIXME: I18N first argument #~ msgid "Cannot stat old %s quota file: %s\n" #~ msgstr "O starém %s kvótovém souboru nelze získat údaje: %s\n" #~ msgid "Operation not supported for filesystems with hidden quota files!\n" #~ msgstr "" #~ "U souborových systémů se skrytými kvótovými soubory není operace " #~ "podporována\n" # TODO: internationalize first argument #~ msgid "Quotas for %s %s:\n" #~ msgstr "Kvóty pro %s %s:\n" #~ msgid "%s %d, limits (soft = %d, hard = %d)\n" #~ msgstr "%s %d, limity (mÄ›kký = %d, pevný = %d)\n" #~ msgid "blocks in use:" #~ msgstr "použitých bloků:" #~ msgid "\tinodes in use:" #~ msgstr "\tpoužitých iuzlů:" #~ msgid "%s - bad format\n" #~ msgstr "%s – chybný formát\n" #~ msgid "%s - %s -- bad format\n" #~ msgstr "%s – %s – chybný formát\n" #~ msgid " blocks in use: %llu, limits (soft = %llu, hard = %llu)" #~ msgstr " použitých bloků: %llu, limity (mÄ›kký = %llu, pevný = %llu)" #~ msgid "%s - %s -- bad format\n" #~ msgstr "%s – %s – chybný formát\n" #~ msgid "\tinodes in use: %llu, limits (soft = %llu, hard = %llu)" #~ msgstr "\tpoužitých iuzlů: %llu, limity (mÄ›kký = %llu, pevný = %llu)" #~ msgid "block grace period: %s, file grace period: %s\n" #~ msgstr "perioda odkladu bloků: %s, perioda odkladu souborů: %s\n" #~ msgid " block grace period: %d %s file grace period: %d %s" #~ msgstr " perioda odkladu bloků: %d %s perioda odkladu souborů: %d %s" #~ msgid "Cannot find device of loopback mount in options for %s. Skipping.\n" #~ msgstr "" #~ "Z voleb pÅ™ipojení %s nelze urÄit zařízení pÅ™ipojené pÅ™es loopback.\n" #~ " PÅ™eskakuje se.\n" #~ msgid "Cannot stat() loopback device %s: %s\n" #~ msgstr "Nad loopback zařízením %s nelze zavolat stat(): %s\n" #~ msgid "Loopback device %s is not block device!\n" #~ msgstr "Loopback zařízení %s není blokovým zařízením!\n" ���������������������������������������������������������������������������������������������������������������������������������quota-tools/mntopt.h��������������������������������������������������������������������������������0000644�0001750�0001750�00000003102�11650022303�014611� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#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_NEXT3 "next3" /* next3 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 */ #define MNTTYPE_GFS2 "gfs2" /* Red Hat Global filesystem 2 */ /* 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 ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quota-tools/quotasys.h������������������������������������������������������������������������������0000644�0001750�0001750�00000012362�11661035314�015200� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * * 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_INITSCAN 0x2 /* Prepare handle for scanning dquots */ #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; 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 mountpoint of a filesystem (strdup()ed) */ const char *me_dir; /* Current mountpoint of a filesystem to process */ int me_qfmt[MAXQUOTAS]; /* Detected quota formats */ }; /* * 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); /* Return pointer to given mount option in mount option string */ char *str_hasmntopt(const char *optstring, const char *opt); /* Check to see if particular quota type is configured */ static inline int me_hasquota(struct mount_entry *mnt, int type) { return mnt->me_qfmt[type] >= 0; } /* 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 mount_entry *mnt, int type, int fmt, int flags, char **filename); /* Detect newest quota format with existing file */ int detect_quota_files(struct mount_entry *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(struct mount_entry *mnt, 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 mount_entry *get_next_mount(void); /* Free all structures associated with mountpoints scan */ void end_mounts_scan(void); #endif /* GUARD_QUOTASYS_H */ ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quota-tools/quotaio_v1.h����������������������������������������������������������������������������0000644�0001750�0001750�00000003262�11650022303�015366� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * 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 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quota-tools/xqmstats.c������������������������������������������������������������������������������0000644�0001750�0001750�00000003414�11650022303�015155� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * 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; } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quota-tools/quotaon_xfs.c���������������������������������������������������������������������������0000644�0001750�0001750�00000014427�11723777061�015670� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * 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, const 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) { pinfo(_("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) { pinfo(_("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) { pinfo(_("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) { pinfo(_("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 "); pinfo(_("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(const 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 (qoff) pinfo(_("%s: %s quotas turned off\n"), dev, _(type2name(type))); else pinfo(_("%s: %s quotas turned on\n"), dev, _(type2name(type))); return 0; } static int xfs_delete(const 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; } pinfo(_("%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 mount_entry *mnt, int type, char *xarg, int flags) { int err = 1; int xopts = 0; int roothack = 0; #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->me_dir, "/") == 0)) { struct xfs_mem_dqinfo info; u_int16_t sbflags = 0; if (!quotactl(QCMD(Q_XFS_GETQSTAT, type), mnt->me_devname, 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) { /* only enfd on/off */ xopts |= (type == USRQUOTA) ? XFS_QUOTA_UDQ_ENFD : XFS_QUOTA_GDQ_ENFD; err = xfs_onoff(mnt->me_devname, type, flags, roothack, xopts); } else if (strcmp(xarg, "account") == 0) { xopts |= (type == USRQUOTA) ? XFS_QUOTA_UDQ_ACCT : XFS_QUOTA_GDQ_ACCT; err = xfs_onoff(mnt->me_devname, type, flags, roothack, xopts); } else if (strcmp(xarg, "enforce") == 0) { xopts |= (type == USRQUOTA) ? XFS_QUOTA_UDQ_ENFD : XFS_QUOTA_GDQ_ENFD; err = xfs_onoff(mnt->me_devname, type, flags, roothack, xopts); } else if (strcmp(xarg, "delete") == 0) { xopts |= (type == USRQUOTA) ? XFS_USER_QUOTA : XFS_GROUP_QUOTA; err = xfs_delete(mnt->me_devname, type, flags, roothack, xopts); } else die(1, _("Invalid argument \"%s\"\n"), xarg); return err; } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quota-tools/README.mailserver�����������������������������������������������������������������������0000644�0001750�0001750�00000001155�11442151253�016163� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Mail server support by James Bourne <jbourne@hardrock.org> If you are running warnquota on a mail server you need to be able to tell warnquota not to send mail when the users quota is either over the hard limit or past the grace period. So, to do this add the value: MAILDEV = any into /etc/warnquota.conf and warnquota will not send mail to those users. If you have only a single partition you wish to apply this rule to, use the device name as the argument to the MAILSERV configuration variable list this: MAILDEV = /dev/sdb1 Please note that specifying checking of mail device may slow down things considerably... �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quota-tools/common.c��������������������������������������������������������������������������������0000644�0001750�0001750�00000004221�11650022303�014556� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * * Common things for all utilities * * Jan Kara <jack@suse.cz> - sponsored by SuSE CR * * Jani Jaakkola <jjaakkol@cs.helsinki.fi> - syslog support */ #include "config.h" #include <stdio.h> #include <stdlib.h> #include <stdarg.h> #include <string.h> #include <syslog.h> #include <sys/types.h> #include <sys/stat.h> #include "pot.h" #include "common.h" static int enable_syslog=0; void use_syslog(void) { openlog(progname,0,LOG_DAEMON); enable_syslog=1; } static void do_syslog(int level, const char *format, va_list args) { char buf[1024]; int i, j; vsnprintf(buf,sizeof(buf),format,args); /* This while removes newlines from the log, so that * syslog() will be called once for every line */ for (i = 0; buf[i]; i = j) { for (j = i; buf[j] && buf[j] != '\n'; j++); if (buf[j] == '\n') buf[j++] = '\0'; syslog(level, "%s", buf + i); } } void die(int ret, char *fmtstr, ...) { va_list args; va_start(args, fmtstr); if (enable_syslog) { do_syslog(LOG_CRIT, fmtstr, args); syslog(LOG_CRIT, "Exiting with status %d", ret); } else { fprintf(stderr, "%s: ", progname); vfprintf(stderr, fmtstr, args); } va_end(args); exit(ret); } void errstr(char *fmtstr, ...) { va_list args; va_start(args, fmtstr); if (enable_syslog) do_syslog(LOG_ERR, fmtstr, args); else { fprintf(stderr, "%s: ", progname); vfprintf(stderr, fmtstr, args); } va_end(args); } void *smalloc(size_t size) { void *ret = malloc(size); if (!ret) { fputs("Not enough memory.\n", stderr); exit(3); } return ret; } void *srealloc(void *ptr, size_t size) { void *ret = realloc(ptr, size); if (!ret) { fputs("Not enough memory.\n", stderr); exit(3); } return ret; } void sstrncpy(char *d, const char *s, size_t len) { strncpy(d, s, len); d[len - 1] = 0; } void sstrncat(char *d, const char *s, size_t len) { strncat(d, s, len); d[len - 1] = 0; } char *sstrdup(const char *s) { char *r = strdup(s); if (!r) { puts("Not enough memory."); exit(3); } return r; } void version(void) { printf(_("Quota utilities version %s.\n"), PACKAGE_VERSION); printf(_("Compiled with:%s\n"), COMPILE_OPTS); printf(_("Bugs to %s\n"), MY_EMAIL); } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quota-tools/rquota_client.h�������������������������������������������������������������������������0000644�0001750�0001750�00000000550�11650022303�016145� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * * 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 ��������������������������������������������������������������������������������������������������������������������������������������������������������quota-tools/quota_nld.8�����������������������������������������������������������������������������0000644�0001750�0001750�00000002643�11650022303�015207� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������.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 ���������������������������������������������������������������������������������������������quota-tools/install-sh������������������������������������������������������������������������������0000755�0001750�0001750�00000012736�11442151253�015146� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/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 ����������������������������������quota-tools/setup_quota_group�����������������������������������������������������������������������0000755�0001750�0001750�00000000351�11442151253�016643� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/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 ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quota-tools/quotaon.c�������������������������������������������������������������������������������0000644�0001750�0001750�00000026324�11723776612�015010� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * 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 <stdarg.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 static int flags, fmt = -1; char *progname; static char **mntpoints; static int mntcnt; static 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 %s\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, strcmp(progname, "quotaon") ? _("turn quotas off for all filesystems") : _("turn quotas on for all filesystems")); 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; } } int pinfo(char *fmt, ...) { va_list arg; int ret; if (!(flags & FL_VERBOSE)) return 0; va_start(arg, fmt); ret = vprintf(fmt, arg); va_end(arg); return ret; } /* * 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_OFF) pinfo(_("%s: %s root_squash turned off\n"), quotadev, type2name(type)); else if (flags & STATEFLAG_ON) pinfo(_("%s: %s root_squash turned on\n"), quotadev, type2name(type)); #endif return 0; } /* * Enable/disable VFS quota on given filesystem */ static int quotaonoff(const char *quotadev, const 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; } pinfo(_("%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; } pinfo(_("%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 mount_entry *mnt, int type, char *file, int flags, int fmt) { int errs = 0; if ((flags & STATEFLAG_OFF) && str_hasmntopt(mnt->me_opts, MNTOPT_RSQUASH)) errs += quotarsquashonoff(mnt->me_devname, type, flags); errs += quotaonoff(mnt->me_devname, mnt->me_dir, file, type, QF_VFSOLD, flags); if ((flags & STATEFLAG_ON) && str_hasmntopt(mnt->me_opts, MNTOPT_RSQUASH)) errs += quotarsquashonoff(mnt->me_devname, type, flags); return errs; } /* * Enable/disable quota on given filesystem (generic VFS quota) */ static int v2_newstate(struct mount_entry *mnt, int type, char *file, int flags, int fmt) { return quotaonoff(mnt->me_devname, mnt->me_dir, file, type, fmt, flags); } /* * 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 mount_entry *mnt, int type, char *extra) { int sflags, ret = 0; sflags = flags & FL_OFF ? STATEFLAG_OFF : STATEFLAG_ON; if (flags & FL_ALL) sflags |= STATEFLAG_ALL; if (!strcmp(mnt->me_type, MNTTYPE_GFS2)) { errstr(_("Cannot change state of GFS2 quota.\n")); return 1; } else if (!strcmp(mnt->me_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; } ret = xfs_newstate(mnt, type, extra, sflags); } else if (mnt->me_qfmt[type] == QF_META) { /* Must be non-empty because empty path is always invalid. */ ret = v2_newstate(mnt, type, ".", sflags, QF_VFSV0); } else { int usefmt; if (!me_hasquota(mnt, type)) 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->me_dir, mnt->me_devname); 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->me_dir, mnt->me_devname); 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 mount_entry *mnt, int type) { int on = 0; if (!strcmp(mnt->me_type, MNTTYPE_XFS) || !strcmp(mnt->me_type, MNTTYPE_GFS2)) { if (kern_qfmt_supp(QF_XFS)) on = kern_quota_on(mnt, type, QF_XFS) != -1; } else if (kernel_iface == IFACE_GENERIC) on = kern_quota_on(mnt, type, -1) != -1; else if (kern_qfmt_supp(QF_VFSV0)) on = kern_quota_on(mnt, type, QF_VFSV0) != -1; else if (kern_qfmt_supp(QF_VFSOLD)) on = kern_quota_on(mnt, type, QF_VFSOLD) != -1; printf(_("%s quota on %s (%s) is %s\n"), _(type2name(type)), mnt->me_dir, mnt->me_devname, on ? _("on") : _("off")); return on; } int main(int argc, char **argv) { struct mount_entry *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->me_type)) { if (!(flags & FL_ALL)) errstr(_("%s: Quota cannot be turned on on NFS filesystem\n"), mnt->me_devname); 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; } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quota-tools/dqblk_rpc.h�����������������������������������������������������������������������������0000644�0001750�0001750�00000001021�11650022303�015227� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * 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 ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������quota-tools/quotacheck.8����������������������������������������������������������������������������0000644�0001750�0001750�00000012735�11650022303�015353� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������.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 omitted 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\> �����������������������������������quota-tools/rquota_server.c�������������������������������������������������������������������������0000644�0001750�0001750�00000022612�11765646017�016220� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * 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. * * 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; } /* XDR transports 32b variables exactly. Find smallest needed shift to fit * 64b variable into into 32 bits and to preserve precision as high as * possible. */ static int find_block_shift(qsize_t hard, qsize_t soft, qsize_t cur) { int shift; qsize_t value = hard; if (value < soft) value = soft; if (value < cur) value = cur; value >>= 32; for (shift = QUOTABLOCK_BITS; value; shift++) value >>= 1; return shift; } static inline void servutil2netdqblk(struct rquota *n, struct util_dqblk *u) { time_t now; int shift; shift = find_block_shift(u->dqb_bhardlimit, u->dqb_bsoftlimit, toqb(u->dqb_curspace)); n->rq_bsize = 1 << shift; n->rq_bhardlimit = u->dqb_bhardlimit >> (shift - QUOTABLOCK_BITS); n->rq_bsoftlimit = u->dqb_bsoftlimit >> (shift - QUOTABLOCK_BITS); n->rq_fhardlimit = u->dqb_ihardlimit; n->rq_fsoftlimit = u->dqb_isoftlimit; n->rq_curblocks = toqb(u->dqb_curspace) >> (shift - QUOTABLOCK_BITS); n->rq_curfiles = u->dqb_curinodes; time(&now); 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 mount_entry *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 mount_entry *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; 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)); } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������