#!/usr/gnu/bin/perl -w use strict; my $VERSION = '1.5' ; =pod Copyright (c) 2000-2001 John Stumbles and the University of Reading. All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. C H A N G E H I S T O R Y =========================== 1.5 14Feb01 outputs version number, does not send END tag 1.4 14Feb01 takes filespec to look for quotas files 1.3 08Aug00 revert to not sending uids when no quota 1.2 07Aug00 now send record of just uid when all fields are 0 1.1 07Aug00 no longer /2 block figures =========================== From /usr/include/sys/fs/ufs_quota.h /* * The dqblk structure defines the format of the disk quota file * (as it appears on disk) - the file is an array of these structures * indexed by user number. The setquota sys call establishes the inode * for each quota file (a pointer is retained in the mount structure). */ struct dqblk { uint32_t dqb_bhardlimit; /* absolute limit on disk blks alloc */ uint32_t dqb_bsoftlimit; /* preferred limit on disk blks */ uint32_t dqb_curblocks; /* current block count */ uint32_t dqb_fhardlimit; /* maximum # allocated files + 1 */ uint32_t dqb_fsoftlimit; /* preferred file limit */ uint32_t dqb_curfiles; /* current # allocated files */ uint32_t dqb_btimelimit; /* time limit for excessive disk use */ uint32_t dqb_ftimelimit; /* time limit for excessive files */ }; =cut my $qlen = 32 ; # 8 * 32-bit == 4 byte my $filespec = shift or die "Usage $0 filespec\n" ; open (QUOTAS, "ls $filespec |") or die "*** ERROR could not ls $filespec\n$!"; $filespec =~ s/\*/.*/g; print "#VERSION\t$VERSION\n"; while () { chomp ; next unless (m|$filespec|) ; print "$_\n"; unless (open (Q, $_)) { print "# could not open quotas file: $!\n" ; next ; } my $qbuf ; printf "#%-5s %-10s %-10s %-10s %-10s %-10s %-10s %-10s %010s\n",'uid', 'blocks-hard', 'blocks-soft', 'curblocks', 'files-hard', 'files-soft', 'curfiles', 'btimelimit', 'ftimelimit' ; foreach my $uid (0..65536) { last unless (sysread Q, $qbuf, $qlen) ; my $bhardlimit ; # absolute limit on disk blks alloc */ my $bsoftlimit; # preferred limit on disk blks */ my $curblocks; # current block count */ my $fhardlimit; # maximum # allocated files + 1 */ my $fsoftlimit; # preferred file limit */ my $curfiles; # current # allocated files */ my $btimelimit; # time limit for excessive disk use */ my $ftimelimit; # time limit for excessive files */ ($bhardlimit, $bsoftlimit, $curblocks, $fhardlimit, $fsoftlimit, $curfiles, $btimelimit, $ftimelimit) = unpack ("V V V V V V V V", $qbuf) ; # VAX (little-endian) order # next unless ($bhardlimit or $bsoftlimit or $curblocks or $fhardlimit or $fsoftlimit or $curfiles or $btimelimit or $ftimelimit) ; # print for transmission to other process next unless ($bhardlimit or $bsoftlimit or $curblocks or $fhardlimit or $fsoftlimit or $curfiles or $btimelimit or $ftimelimit) ; printf "%u\t%u\t%u\t%u\t%u\t%u\t%u\t%u\t%u\n", $uid, $bhardlimit, $bsoftlimit, $curblocks, $fhardlimit, $fsoftlimit, $curfiles, $btimelimit, $ftimelimit ; } } __END__ # pretty print # printf "%5u %10u %10u %10u %10u %10u %10u %10u %10u\n", $uid, # $bhardlimit/2, $bsoftlimit/2, $curblocks/2, $fhardlimit, $fsoftlimit, $curfiles, $btimelimit, $ftimelimit ;