* Copyright (c) 1980 Regents of the University of California.
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
"@(#) Copyright (c) 1980 Regents of the University of California.\n\
static char sccsid
[] = "@(#)ncheck.c 5.6 (Berkeley) %G%";
* ncheck -- obtain file names from reading filesystem
#define MAXNINDIR (MAXBSIZE / sizeof (daddr_t))
struct dinode itab
[MAXIPG
];
int iflg
; /* number of inodes being searched for */
for(iflg
=0; iflg
<NB
; iflg
++) {
fprintf(stderr
, "ncheck: bad flag %c\n", (*argv
)[1]);
fprintf(stderr
, "ncheck: cannot open %s\n", file
);
bread(SBOFF
, (char *)&sblock
, SBSIZE
);
if (sblock
.fs_magic
!= FS_MAGIC
) {
printf("%s: not a file system\n", file
);
dev_bsize
= sblock
.fs_fsize
/ fsbtodb(&sblock
, 1);
hsize
= sblock
.fs_ipg
* sblock
.fs_ncg
- sblock
.fs_cstotal
.cs_nifree
+ 1;
htab
= (struct htab
*)malloc(hsize
* sizeof(struct htab
));
strngtab
= (char *)malloc(30 * hsize
);
if (htab
== 0 || strngtab
== 0) {
printf("not enough memory to allocate tables\n");
for (c
= 0; c
< sblock
.fs_ncg
; c
++) {
bread(fsbtodb(&sblock
, cgimin(&sblock
, c
)), (char *)itab
,
sblock
.fs_ipg
* sizeof (struct dinode
));
for(j
= 0; j
< sblock
.fs_ipg
; j
++) {
if (itab
[j
].di_mode
!= 0)
for (c
= 0; c
< sblock
.fs_ncg
; c
++) {
bread(fsbtodb(&sblock
, cgimin(&sblock
, c
)), (char *)itab
,
sblock
.fs_ipg
* sizeof (struct dinode
));
for(j
= 0; j
< sblock
.fs_ipg
; j
++) {
if (itab
[j
].di_mode
!= 0)
for (c
= 0; c
< sblock
.fs_ncg
; c
++) {
bread(fsbtodb(&sblock
, cgimin(&sblock
, c
)), (char *)itab
,
sblock
.fs_ipg
* sizeof (struct dinode
));
for(j
= 0; j
< sblock
.fs_ipg
; j
++) {
if (itab
[j
].di_mode
!= 0)
for (i
= 0; i
< hsize
; i
++)
for (i
= iflg
; i
< NB
; i
++)
register struct dinode
*ip
;
for (i
= 0; i
< iflg
; i
++)
if (ino
== ilist
[i
].ino
) {
ilist
[i
].mode
= ip
->di_mode
;
ilist
[i
].uid
= ip
->di_uid
;
ilist
[i
].gid
= ip
->di_gid
;
if ((ip
->di_mode
& IFMT
) != IFDIR
) {
if (sflg
==0 || nxfile
>=NB
)
if ((ip
->di_mode
&IFMT
)==IFBLK
|| (ip
->di_mode
&IFMT
)==IFCHR
|| ip
->di_mode
&(ISUID
|ISGID
)) {
ilist
[nxfile
].mode
= ip
->di_mode
;
ilist
[nxfile
].uid
= ip
->di_uid
;
ilist
[nxfile
++].gid
= ip
->di_gid
;
register struct dinode
*ip
;
register struct direct
*dp
;
if((ip
->di_mode
&IFMT
) != IFDIR
)
for (dp
= readdir(&dirp
); dp
!= NULL
; dp
= readdir(&dirp
)) {
hp
= lookup(dp
->d_ino
, 0);
hp
->h_name
= &strngtab
[strngloc
];
strngloc
+= strlen(dp
->d_name
) + 1;
strcpy(hp
->h_name
, dp
->d_name
);
register struct dinode
*ip
;
register struct direct
*dp
;
if((ip
->di_mode
&IFMT
) != IFDIR
)
for(dp
= readdir(&dirp
); dp
!= NULL
; dp
= readdir(&dirp
)) {
if(aflg
==0 && dotname(dp
))
if(sflg
== 0 && iflg
== 0)
for(k
= 0; ilist
[k
].ino
!= 0; k
++)
if(ilist
[k
].ino
== dp
->d_ino
)
printf("mode %-6o uid %-5d gid %-5d ino ",
ilist
[k
].mode
, ilist
[k
].uid
, ilist
[k
].gid
);
printf("%-5u\t", dp
->d_ino
);
printf("/%s", dp
->d_name
);
if (lookup(dp
->d_ino
, 0))
* get next entry in a directory.
register struct dirstuff
*dirp
;
register struct direct
*dp
;
if (dirp
->loc
>= dirp
->ip
->di_size
)
if (blkoff(&sblock
, dirp
->loc
) == 0) {
lbn
= lblkno(&sblock
, dirp
->loc
);
bread(fsbtodb(&sblock
, d
), dirp
->dbuf
,
dblksize(&sblock
, dirp
->ip
, lbn
));
(dirp
->dbuf
+ blkoff(&sblock
, dirp
->loc
));
dirp
->loc
+= dp
->d_reclen
;
register struct direct
*dp
;
(dp
->d_name
[1]=='.' && dp
->d_name
[2]==0))
register struct htab
*hp
;
if ((hp
= lookup(i
, 0)) == 0) {
pname(hp
->h_pino
, ++lev
);
printf("/%s", hp
->h_name
);
register struct htab
*hp
;
for (hp
= &htab
[i
%hsize
]; hp
->h_ino
;) {
if (++hp
>= &htab
[hsize
])
fprintf(stderr
, "ncheck: hsize of %d is too small\n", hsize
);
lseek(fi
, bno
* dev_bsize
, 0);
if (read(fi
, buf
, cnt
) != cnt
) {
fprintf(stderr
, "ncheck: read error %d\n", bno
);
* Swiped from standalone sys.c.
fprintf(stderr
, "ncheck: bn %d negative\n", bn
);
* blocks 0..NDADDR are direct blocks
* addresses NIADDR have single and double indirect blocks.
* the first step is to determine how many levels of indirection.
for (j
= NIADDR
; j
> 0; j
--) {
printf("ncheck: bn %ld ovf, ino %u\n", bn
, ino
);
* fetch the first indirect block address from the inode
nb
= gip
->di_ib
[NIADDR
- j
];
printf("ncheck: bn %ld void1, ino %u\n", bn
, ino
);
* fetch through the indirect blocks
for (; j
<= NIADDR
; j
++) {
bread(fsbtodb(&sblock
, nb
), b
[j
], sblock
.fs_bsize
);
i
= (bn
/ sh
) % NINDIR(&sblock
);
printf("ncheck: bn %ld void2, ino %u\n", bn
, ino
);