static char *sccsid
= "@(#)du.c 4.1 (Berkeley) %G%";
#define EQ(x,y) (strcmp(x,y)==0)
char path
[256], name
[256];
} else if(EQ(argv
[i
], "-a")) {
strcpy(path
, Noarg
? ".": argv
[i
]);
if(np
= rindex(name
, '/')) {
if(chdir(*name
? name
: "/") == -1) {
fprintf(stderr
, "cannot chdir()\n");
blocks
= descend(path
, *np
? np
: ".");
printf("%ld %s\n", blocks
, path
);
int dir
= 0, /* open directory */
struct direct dentry
[BUFSIZ
/ sizeof (struct direct
)];
register struct direct
*dp
;
if(stat(fname
,&Statb
)<0) {
fprintf(stderr
, "--bad status < %s >\n", name
);
if(Statb
.st_nlink
> 1 && (Statb
.st_mode
&S_IFMT
)!=S_IFDIR
) {
for(i
= 0; i
<= linked
; ++i
) {
if(ml
[i
].ino
==Statb
.st_ino
&& ml
[i
].dev
==Statb
.st_dev
)
ml
[linked
].dev
= Statb
.st_dev
;
ml
[linked
].ino
= Statb
.st_ino
;
blocks = (Statb.st_size + BSIZE-1) >> BSHIFT;
blocks
= (Statb
.st_size
+ 511) >> 9;
if((Statb
.st_mode
&S_IFMT
)!=S_IFDIR
) {
printf("%ld %s\n", blocks
, np
);
for(offset
=0; offset
< dirsize
; offset
+= BUFSIZ
) { /* each block */
dsize
= BUFSIZ
<(dirsize
-offset
)? BUFSIZ
: (dirsize
-offset
);
if((dir
=open(".",0))<0) {
fprintf(stderr
, "--cannot open < %s >\n",
if(offset
) lseek(dir
, (long)offset
, 0);
if(read(dir
, (char *)dentry
, dsize
)<0) {
fprintf(stderr
, "--cannot read < %s >\n",
if(read(dir
, (char *)dentry
, dsize
)<0) {
fprintf(stderr
, "--cannot read < %s >\n",
for(dp
=dentry
, entries
=dsize
>>4; entries
; --entries
, ++dp
) {
/* each directory entry */
if(c1
== endofname
) /* ?? */
blocks
+= descend(np
, endofname
+1);
printf("%ld %s\n", blocks
, np
);
fprintf(stderr
, "Bad directory <%s>\n", np
);
while(*--endofname
!= '/');