static char version
[] = "@(#)utilities.c 3.4 (Berkeley) %G%";
switch (dp
->di_mode
& IFMT
) {
printf("bad file type 0%o\n", dp
->di_mode
);
pfatal("INTERNAL ERROR: GOT TO reply()");
if (nflag
|| dfile
.wfdes
< 0) {
if (getline(stdin
, line
, sizeof(line
)) == EOF
)
if (line
[0] == 'y' || line
[0] == 'Y')
register char *p
, *lastloc
;
while ((n
= getc(fp
)) != '\n') {
if (!isspace(n
) && p
< lastloc
)
register struct filecntl
*fcp
;
dblk
= fsbtodb(&sblock
, blk
);
if (bread(fcp
, bp
->b_un
.b_buf
, dblk
, size
) != 0) {
(void)bwrite(fcp
, bp
->b_un
.b_buf
, bp
->b_bno
, (long)bp
->b_size
);
for (i
= 0, j
= 0; i
< sblock
.fs_cssize
; i
+= sblock
.fs_bsize
, j
++) {
(void)bwrite(&dfile
, (char *)sblock
.fs_csp
[j
],
fsbtodb(&sblock
, sblock
.fs_csaddr
+ j
* sblock
.fs_frag
),
sblock
.fs_cssize
- i
< sblock
.fs_bsize
?
sblock
.fs_cssize
- i
: sblock
.fs_bsize
);
pfatal("CANNOT %s: BLK %ld", s
, blk
);
if (reply("CONTINUE") == 0)
errexit("Program terminated\n");
if (sblk
.b_bno
!= SBLOCK
) {
(void)close(dfile
.rfdes
);
(void)close(dfile
.wfdes
);
bread(fcp
, buf
, blk
, size
)
register struct filecntl
*fcp
;
if (lseek(fcp
->rfdes
, (long)dbtob(blk
), 0) < 0)
else if (read(fcp
->rfdes
, buf
, (int)size
) == size
)
bwrite(fcp
, buf
, blk
, size
)
register struct filecntl
*fcp
;
if (lseek(fcp
->wfdes
, (long)dbtob(blk
), 0) < 0)
else if (write(fcp
->wfdes
, buf
, (int)size
) == size
) {
* allocate a data block with the specified number of fragments
if (frags
<= 0 || frags
> sblock
.fs_frag
)
for (i
= 0; i
< fmax
- sblock
.fs_frag
; i
+= sblock
.fs_frag
) {
for (j
= 0; j
<= sblock
.fs_frag
- frags
; j
++) {
for (k
= 1; k
< frags
; k
++)
for (k
= 0; k
< frags
; k
++)
* Free a previously allocated block
idesc
.id_numfrags
= frags
;
getpathname(namebuf
, curdir
, ino
)
if (statemap
[ino
] != DSTATE
&& statemap
[ino
] != DFOUND
) {
bzero(&idesc
, sizeof(struct inodesc
));
cp
= &namebuf
[BUFSIZ
- 1];
idesc
.id_parent
= curdir
;
if ((ckinode(ginode(ino
), &idesc
) & STOP
) == 0)
idesc
.id_number
= idesc
.id_parent
;
idesc
.id_func
= findname
;
if ((ckinode(ginode(idesc
.id_number
), &idesc
) & STOP
) == 0)
if (cp
< &namebuf
[MAXNAMLEN
])
bcopy(cp
, namebuf
, &namebuf
[BUFSIZ
] - cp
);
* determine whether an inode should be fixed.
register struct inodesc
*idesc
;
if (idesc
->id_type
== DATA
)
direrr(idesc
->id_number
, msg
);
if (reply("SALVAGE") == 0) {
errexit("UNKNOWN INODESC FIX MODE %d\n", idesc
->id_fix
);
* An inconsistency occured which shouldn't during normal operations.
* Die if preening, otherwise just printf.
printf("%s: UNEXPECTED INCONSISTENCY; RUN fsck MANUALLY.\n",
* Pwarn is like printf when not preening,
* or a warning (preceded by filename) when preening.
pwarn(s
, a1
, a2
, a3
, a4
, a5
, a6
)
printf(s
, a1
, a2
, a3
, a4
, a5
, a6
);
* Stub for routines from kernel.
pfatal("INTERNAL INCONSISTENCY:");