Amiga-Request@cs.odu.edu (Amiga Sources/Binaries Moderator) (07/08/90)
Submitted-by: peterc@softway.sw.oz.au (Peter Chubb) Posting-number: Volume 90, Issue 201 Archive-name: unix/du-1.2/part01 This is du, a utility to tell you how much disc space a directory tree or file is actually using. Moreover, it can tell you how much space the directory would take if transferred to a floppy using the slow file system, or if transferred to a hard disc using the fast file system. It is very small, and is an example of self-compiling code that does not need a startup routine. #!/bin/sh # This is a shell archive. Remove anything before this line, then unpack # it by saving it into a file and typing "sh file". To overwrite existing # files, type "sh file -c". You can also feed this as standard input via # unshar, or by typing "sh <file", e.g.. If this archive is complete, you # will see the following message at the end: # "End of archive 1 (of 1)." # Contents: du.c du.doc du.uu # Wrapped by tadguy@xanth on Sun Jul 8 11:28:21 1990 PATH=/bin:/usr/bin:/usr/ucb ; export PATH if test -f 'du.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'du.c'\" else echo shar: Extracting \"'du.c'\" \(5487 characters\) sed "s/^X//" >'du.c' <<'END_OF_FILE' X; /* To make, just execute me Xlc -v -j73 -O -cusf -M du Xblink du.o lib lib:lc.lib nd sc sd batch quiet Xprotect du +p Xquit X*/ X/************************************************************************ X * du.c -- calculate disk usage for files in a directory tree * X * * X * Copyright 1989,1990 Peter Chubb * X * All rights reserved * X * * X ************************************************************************/ X Xstatic char RCSid[] = "$Id: du.c,v 1.2 90/06/06 20:07:37 peterc Exp $"; X X/* X * Written: X * 10 July 1989 Peter Chubb X * $Log: du.c,v $ X * Revision 1.2 90/06/06 20:07:37 peterc X * Added options to allow selection of blocksize; X * added allowance for file extension blocks. X * X * X */ X X#include <libraries/dos.h> X#include <proto/dos.h> X#include <proto/exec.h> X#include <exec/memory.h> X#include <string.h> X#include <stdlib.h> X#include <dos.h> X X#ifndef min X# define min(a, b) ((a) < (b) ? (a) : (b)) X#endif X X#define ABSEXECBASE ((struct ExecBase **)4L) X Xvoid RawDoFmt(char *fmt, void *arglist, void (*prbuf)(), char *obuf); X#pragma syscall RawDoFmt 20a ba9804 X Xvoid __asm prbuf(register __d0 char c); X#define R_A3 (8+3) X Xstruct DosLibrary *DOSBase; X Xvoid outval(char *fmt,...); X Xlong __regargs du(BPTR dir, long slnt, unsigned long level, unsigned long bsize); Xlong __asm __saveds dumain(register __a0 char *cmd); Xunsigned long numBlocks(LONG size, unsigned long bsize); X X X/* main routine -- parse arguments, then call du() to do the work */ Xlong __asm __saveds Xdumain(register __a0 char *cmd) X{ X long total; X register char *p; X long c; X long slnt = 0; X BPTR dir; X struct Library *foo; X unsigned long bsize = 0; X struct InfoData infodata; X X if (!(foo = OpenLibrary("dos.library", 0))) X return RETURN_ERROR; X DOSBase = (struct DosLibrary *) foo; X X while ((c = *cmd++) == ' ') X ; X X while (c == '-') X { X c = *cmd++; X switch(c) X { X case 's': X slnt = 1; X break; X X case 'F': X if (bsize) X { X outval ("File system blocksize specified twice!\n"); X return RETURN_ERROR; X } X bsize = 512; X break; X X case 'S': X if (bsize) X { X outval ("File system blocksize specified twice!\n"); X return RETURN_ERROR; X } X bsize = 488; X break; X X default: X outval("Usage: du [-s] [-F | -S] [dirname]\n"); X return RETURN_ERROR; X } X while ((c = *cmd++) == ' ') X ; X } X p = --cmd; X while (*p != ' ' && *p != '\n' && *p) X p++; X *p = '\0'; X X if (p != cmd) X { X c = 1; X dir = Lock(cmd, ACCESS_READ); X } X else X { X c = 0; X dir = CurrentDir(0L); X (void) CurrentDir(dir); X } X if (!dir) X { X outval("Can't open %ls\n", cmd); X return RETURN_WARN; X } X X if (!bsize) X { X Info(dir, &infodata); X bsize = infodata.id_BytesPerBlock; X } X X total = du(dir, slnt, 0, bsize); X X if (c) X UnLock(dir); X X if (total >= 0) X outval("Total: %ld\n", total); X else X outval("**BREAK**\n\n"); X X CloseLibrary(foo); X return RETURN_OK; X} X X X/* outval -- our equivalent of printf */ Xvoid Xoutval(char *fmt, ...) X{ X char obuf[200]; X X RawDoFmt(fmt, (&fmt) + 1, prbuf, obuf); X Write(Output(), obuf, strlen(obuf)); X} X X/* du -- calculate and print disc usage */ Xlong __regargs Xdu(dir, slnt, level, bsize) XBPTR dir; /* lock on top of directory tree */ Xlong slnt; /* whether to print or not */ Xunsigned long level; /* how deep in the tree */ Xunsigned long bsize; X{ X /* note all these are longword aligned */ X X struct FileInfoBlock fib; X BPTR lck; X long total = 0; X long extra; X BPTR curdir = CurrentDir(dir); X long abort = 0; X X if (Examine(dir, &fib)) { X if (fib.fib_DirEntryType < 0) { X if (!slnt) { X Write(Output(), " ", X (long)min(level, 32)); X outval("%ls %ld\n", fib.fib_FileName, X total = numBlocks(fib.fib_Size, bsize)); X } X } else X while (ExNext(dir, &fib) & abort >= 0) { X if (SetSignal(0, 0) & SIGBREAKF_CTRL_C) X abort = -1; X else { X extra = numBlocks(fib.fib_Size, bsize); X if (fib.fib_DirEntryType > 0) { X lck = Lock(fib.fib_FileName, ACCESS_READ); X extra += (abort = du(lck, slnt, level+1, bsize)); X UnLock(lck); X } X total += extra; X if (!slnt && abort >= 0) { X Write(Output(), " ", X min(level, 32)); X outval("%-32ls %6ld\n", fib.fib_FileName, extra); X } X } X } X } X (void) CurrentDir(curdir); X return abort < 0 ? -1 : total; X} X X X X/*----------------------------------------------------------------*/ X/* This stub routine is called from the RawDoFmt routine for each */ X/* character in the string. At invocation, we have: */ X/* D0 - next character to be formatted */ X/* A3 - pointer to data buffer */ X/* Stolen from Lattice-supplied Avail utility */ X/*----------------------------------------------------------------*/ Xvoid __asm prbuf(register __d0 char c) X{ X char *p = (char *)__builtin_getreg(R_A3); X *p++ = c; X __builtin_putreg(R_A3, (long)p); X X /* It's a pity this doesn't generate X * move.b d0,(a3)+ X * rts X */ X} X X/* numBlocks -- work out how many blocks a file takes */ Xunsigned long XnumBlocks(LONG size, unsigned long bsize) X{ X register unsigned long blocks; X X blocks = (size + bsize - 1) / bsize; X blocks += (blocks / ((bsize/4) - 56)) + 1; X X return blocks; X} X END_OF_FILE if test 5487 -ne `wc -c <'du.c'`; then echo shar: \"'du.c'\" unpacked with wrong size! fi # end of 'du.c' fi if test -f 'du.doc' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'du.doc'\" else echo shar: Extracting \"'du.doc'\" \(1862 characters\) sed "s/^X//" >'du.doc' <<'END_OF_FILE' XDU AMIGA DU X XNAME X du -- print out disc usage X XSYNOPSIS X du [ -s ] [ -S | -F ] [ filename ] X XDESCRIPTION X X du prints out a summary of disc usage for X a file or directory. It is pure, and thus X can be made resident. It takes up only X 1436 bytes. X X The options to du are: X X -s short listing. Print only the total X number of blocks used. X X -S Calculate the number of blocks used as X if by the old (Slow) 488 byte-block X file system. X X -F Calculate the number of blocks used as X if by the new (Fast) 512 byte block X file system. X X Using the -S and -F options, one can easily X work out whether a directory will fit when X moved between floppy and hard disc. X Without either option, du interrogates the X file system to work out the blocksize. X XCAVEATS X du correctly accounts for directory blocks X and file list blocks on AmigaDOS file X systems. It will work incorectly on X MS-DOS volumes mounted via msh: or crossdos. X XAUTHOR X Peter Chubb X peterc@softway.sw.oz.au X XDISTRIBUTION X X X Copyright 1990 Peter Chubb X All rights reserved. X X This program and its associated X documentation may not be distributed for X profit. It may be distributed provided X X a) no charge is made other than for X reasonable copying and media expenses, X X b) no change is made to the source, X documentation or binary, that is not X clearly marked as being a change, and X X c) all files are provided. These comprise: X du.doc -- this documentation file X du -- the program binary X du.c -- the program source. X X This program is not warranted, or X guaranteed. You get exactly what you paid X for -- a copy of the program to do as you X wish with. If it crashes your machine, X writes rude letters to your spouse, or X explodes in your face ... caveat emptor! X However, to the best of my knowledge and X belief it works as advertised. END_OF_FILE if test 1862 -ne `wc -c <'du.doc'`; then echo shar: \"'du.doc'\" unpacked with wrong size! fi chmod +x 'du.doc' # end of 'du.doc' fi if test -f 'du.uu' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'du.uu'\" else echo shar: Extracting \"'du.uu'\" \(2042 characters\) sed "s/^X//" >'du.uu' <<'END_OF_FILE' Xbegin 700 du XM```#\P`````````"``````````$```%(````#0```^D```%(3E7_O$CG+SA)! XM^0`````K2/_`)FW_P'@`>@!#^@%<<``L>``$3J[]V"]``"!*@&8&<`I@``$Z, XM*6\`(``P?@`>&W`@OH!G]F!F<``0&W)&D(%G$'(-D(%G)'(@D(%F.'@!8$)*L XMA6<.2'H!'&$``<AP"F```/PJ/````@!@*$J%9PY(>@$"80`!KG`*8```XBH\$ XM```!Z&`.2'H!%&$``9AP"F```,Q^`!X;<""^@&?V<"V^@&>4)$M3BB9*8`)2V XMBQ`3<B"P`6<*<@JP`6<$2@!F[$(3M\IG$GP!(@IT_BQL`#!.KO^L+@!@%'P`- XM<@`L;``P3J[_@BX`(@=.KO^"2H=F#B\*2'H`S&$``2QP!6!@2H5F%"('0>W_Y XMQ"0(+&P`,$ZN_XXJ+?_8+P5"IR`'(@1A``%(4$\J`$J&9PHB!RQL`#!.KO^F? XM2H5K#B\%2'H`E&$``.103V`*2'H`E&$``-A83R)O`"`L>``$3J[^8G``3.T<0 XM]/^<3EU.=61O<RYL:6)R87)Y`$9I;&4@<WES=&5M(&)L;V-K<VEZ92!S<&5C< XM:69I960@='=I8V4A"@!5<V%G93H@9'4@6RUS72!;+48@?"`M4UT@6V1I<FYA8 XM;65="@!#86XG="!O<&5N("5L<PH`5&]T86PZ("5L9`H`*BI"4D5!2RHJ"@H`D XM("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@(```)6QS"25L9`H`, XM`"4M,S)L<R`E-FQD"@``3E7_.$CG,#`@;0`(0^T`#$7Z`<!'[?\X+'@`!$ZNT XM_?8L;``P3J[_Q"!+2AAF_%.(D<LB`"0+)@A.KO_03-\,#$Y=3G5.5?[<2.<_& XM`"XM``A"K?[L*T#^Y"M!_N@B`"QL`#!.KO^">``O0``8(BW^Y$'M_O`D"$ZNV XM_YI*@&<``30@+?[T2H!J``$(2JW^Z&8``2).KO_$+`!P(+Z`9`0B!V`"(@`O> XM00`<(@9!^O\8)`@F+P`<3J[_T"\M``PO+?]L80`!("Z`2&W^^$AZ_QPK0/[L[ XM80#_+$_O`!!@``#6<``B`"QX``1.KO[."```#&<&>/]@``"<+RT`#"\M_VQA6 XM``#B4$\L`"HM_N@@+?[T2H!O-D'M_O@B"'3^+&P`,$ZN_ZPB!U*!+RT`#"\!; XM+T``)"(%80#_$%!/*`#<A"(O`!PL;``P3J[_IMVM_NQ*A69`2H1K/"QL`#!.; XMKO_$*@!P(+Z`9`0B!V`"(@`O00`<(@5!^OY2)`@F+P`<3J[_T"\&2&W^^$AZ& XM_FQA`/YV3^\`#"(M_N1![?[P)`@L;``P3J[_E$J$6L%$`4B!2,'`@68`_RXB/ XM+P`8+&P`,$ZN_X)*A&H$</]@!"`M_NQ,WP#\3EU.=2\'+@`6AT'K``$F2"X?0 XM3G5.5?_X+P(@+0`,(@#DB70XDH(D+0`(U(!3@B`"+T$`!"(M``Q.N@!2(B\`4 XM!"]```A.N@!&4H`B+P`(TH`@`20?3EU.=0``2H!J```>1(!*@6H```Q$@6$`5 XM`"!$@4YU80``&$2`1(%.=4J!:@``#$2!80``!D2`3G4O`DA!-`%F```B2$!(H XM04A"-`!G```&A,$P`DA`-`"$P3`"2$(R`B0?3G4O`W80#$$`@&0```;AF5%#7 XM#$$(`&0```;IF5E##$$@`&0```;EF55#2D%K```&XYE30S0`YJA(0D)"YJI(` XM0X#!-@`P`C0#2$'$P9""9```"%-#T(%D_G(`,@-(0^>X2$#!028?)!].=0``> XM`^P````!`````0````H````````#\@```^H````-)$ED.B!D=2YC+'8@,2XR2 XI(#DP+S`V+S`V(#(P.C`W.C,W('!E=&5R8R!%>'`@)````````````_(@# X`` Xend Xsize 1436 END_OF_FILE if test 2042 -ne `wc -c <'du.uu'`; then echo shar: \"'du.uu'\" unpacked with wrong size! fi # end of 'du.uu' fi echo shar: End of archive 1 \(of 1\). cp /dev/null ark1isdone MISSING="" for I in 1 ; do if test ! -f ark${I}isdone ; then MISSING="${MISSING} ${I}" fi done if test "${MISSING}" = "" ; then echo You have the archive. rm -f ark[1-9]isdone else echo You still need to unpack the following archives: echo " " ${MISSING} fi ## End of shell archive. exit 0 -- Mail submissions (sources or binaries) to <amiga@cs.odu.edu>. Mail comments to the moderator at <amiga-request@cs.odu.edu>. Post requests for sources, and general discussion to comp.sys.amiga.