* Copyright (c) 1988, 1990, 1993
* The Regents of the University of California. All rights reserved.
* %sccs.include.proprietary.c%
static char copyright
[] =
"@(#) Copyright (c) 1988, 1990, 1993\n\
The Regents of the University of California. All rights reserved.\n";
static char sccsid
[] = "@(#)ncheck.c 8.1 (Berkeley) %G%";
* ncheck -- obtain file names from reading filesystem
#define MAXNINDIR (MAXBSIZE / sizeof (daddr_t))
#include <ufs/ufs/dinode.h>
struct dinode itab
[MAXBSIZE
/sizeof(struct dinode
)];
int iflg
; /* number of inodes being searched for */
char *malloc(), *strcpy();
struct direct
*nreaddir();
for(iflg
=0; iflg
<NB
&& argc
>= 2; iflg
++) {
(void) fprintf(stderr
, "ncheck: bad flag %c\n",
(void) fprintf(stderr
, "ncheck: cannot open %s\n", file
);
(void) printf("%s:\n", file
);
sblockp
= (struct fs
*)malloc((unsigned)SBSIZE
);
(void) printf("icheck: couldn't malloc superblock memory\n");
bread((daddr_t
)SBOFF
, (char *)sblockp
, (long)SBSIZE
);
if (sblockp
->fs_magic
!= FS_MAGIC
) {
(void) printf("%s: not a file system\n", file
);
dev_bsize
= sblockp
->fs_fsize
/ fsbtodb(sblockp
, 1);
hsize
= sblockp
->fs_ipg
* sblockp
->fs_ncg
-
sblockp
->fs_cstotal
.cs_nifree
+ 1;
htab
= (struct htab
*)malloc((unsigned)hsize
* sizeof(struct htab
));
strngtab
= malloc((unsigned)(30 * hsize
));
if (htab
== 0 || strngtab
== 0) {
(void) printf("not enough memory to allocate tables\n");
for (c
= 0; c
< sblockp
->fs_ncg
; c
++) {
i
< sblockp
->fs_ipg
/ INOPF(sblockp
);
bread(fsbtodb(sblockp
, cgimin(sblockp
, c
) + i
),
(char *)itab
, sblockp
->fs_bsize
);
for (j
= 0; j
< INOPB(sblockp
); j
++) {
if (itab
[j
].di_mode
!= 0)
for (c
= 0; c
< sblockp
->fs_ncg
; c
++) {
i
< sblockp
->fs_ipg
/ INOPF(sblockp
);
bread(fsbtodb(sblockp
, cgimin(sblockp
, c
) + i
),
(char *)itab
, sblockp
->fs_bsize
);
for (j
= 0; j
< INOPB(sblockp
); j
++) {
if (itab
[j
].di_mode
!= 0)
for (c
= 0; c
< sblockp
->fs_ncg
; c
++) {
i
< sblockp
->fs_ipg
/ INOPF(sblockp
);
bread(fsbtodb(sblockp
, cgimin(sblockp
, c
) + i
),
(char *)itab
, sblockp
->fs_bsize
);
for (j
= 0; j
< INOPB(sblockp
); 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
= nreaddir(&dirp
); dp
!= NULL
; dp
= nreaddir(&dirp
)) {
hp
= lookup(dp
->d_ino
, 0);
hp
->h_name
= &strngtab
[strngloc
];
strngloc
+= strlen(dp
->d_name
) + 1;
(void) strcpy(hp
->h_name
, dp
->d_name
);
register struct dinode
*ip
;
register struct direct
*dp
;
if((ip
->di_mode
&IFMT
) != IFDIR
)
for(dp
= nreaddir(&dirp
); dp
!= NULL
; dp
= nreaddir(&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
)
(void) printf("mode %-6o uid %-5d gid %-5d ino ",
ilist
[k
].mode
, ilist
[k
].uid
, ilist
[k
].gid
);
(void) printf("%-5lu\t", dp
->d_ino
);
(void) 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(sblockp
, dirp
->loc
) == 0) {
lbn
= lblkno(sblockp
, dirp
->loc
);
bread(fsbtodb(sblockp
, d
), dirp
->dbuf
,
(long)dblksize(sblockp
, dirp
->ip
, lbn
));
(dirp
->dbuf
+ blkoff(sblockp
, 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
);
(void) printf("/%s", hp
->h_name
);
register struct htab
*hp
;
for (hp
= &htab
[i
%hsize
]; hp
->h_ino
;) {
if (++hp
>= &htab
[hsize
])
(void) fprintf(stderr
, "ncheck: hsize of %ld is too small\n",
register int i
, cnt
= lcount
;
register off_t off
= bno
* dev_bsize
;
(void) lseek(fi
, off
, SEEK_SET
);
if (read(fi
, buf
, cnt
) != cnt
) {
(void) fprintf(stderr
, "ncheck: read error %ld\n", bno
);
/* THIS INDICATES A SERIOUS BUG */
/* bzero is probably not correct, but will do */
"ncheck: bread: cnt %d not multiple of %d\n",
for (i
= 0; i
< cnt
; i
+= dev_bsize
) {
(void) lseek(fi
, off
, SEEK_SET
);
if (read(fi
, buf
, dev_bsize
) != dev_bsize
) {
"ncheck: re-read error %ld\n", bno
);
* Swiped from standalone sys.c.
(void) fprintf(stderr
, "ncheck: bn %ld 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
--) {
(void) printf("ncheck: bn %ld ovf, ino %lu\n", bn
, ino
);
* fetch the first indirect block address from the inode
nb
= gip
->di_ib
[NIADDR
- j
];
(void) printf("ncheck: bn %ld void1, ino %lu\n", bn
, ino
);
* fetch through the indirect blocks
for (; j
<= NIADDR
; j
++) {
bread(fsbtodb(sblockp
, nb
), b
[j
], sblockp
->fs_bsize
);
i
= (bn
/ sh
) % NINDIR(sblockp
);
(void) printf("ncheck: bn %ld void2, ino %lu\n", bn
,