static char *sccsid
= "@(#)ncheck.c 2.4 (Berkeley) %G%";
* ncheck -- obtain file names from reading filesystem
#define MAXNINDIR (MAXBSIZE / sizeof (daddr_t))
struct dinode itab
[MAXIPG
];
char strngtab
[30 * HSIZE
];
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(SBLOCK
, (char *)&sblock
, SBSIZE
);
if (sblock
.fs_magic
!= FS_MAGIC
) {
printf("%s: not a file system\n", file
);
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 ((lbn
= lblkno(&sblock
, dirp
->loc
)) == 0) {
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: out of core-- increase HSIZE\n");
lseek(fi
, bno
* DEV_BSIZE
, 0);
if (read(fi
, buf
, cnt
) != cnt
) {
fprintf(stderr
, "ncheck: read error %d\n", bno
);
if(i
> NINDIR(&sblock
)) {
fprintf(stderr
, "ncheck: %u - huge directory\n", ino
);
bread(fsbtodb(&sblock
, gip
->di_ib
[i
]), (char *)ibuf
, sizeof(ibuf
));