add a SIGINFO handler progress indicator

This commit is contained in:
dbj 2003-04-21 07:58:55 +00:00
parent cb30d7ce0b
commit 2e6348f3d8
2 changed files with 32 additions and 3 deletions

View File

@ -1,4 +1,4 @@
.\" $NetBSD: newfs_msdos.8,v 1.9 2002/10/01 13:40:47 wiz Exp $
.\" $NetBSD: newfs_msdos.8,v 1.10 2003/04/21 07:58:55 dbj Exp $
.\" Copyright (c) 1998 Robert Nordier
.\" All rights reserved.
.\"
@ -127,6 +127,19 @@ File system size.
.It Fl u Ar track-size
Number of sectors per track.
.El
.Pp
If
.Nm
receives a
.Dv SIGINFO
signal
(see the
.Sy status
argument for
.Xr stty 1 ) ,
a line will be written to the standard error output indicating
the name of the device currently being formatted, the sector
number being written, and the total number of sectors to be written.
.Sh NOTES
FAT file system parameters occupy a "Boot Sector BPB (BIOS Parameter
Block)" in the first of the "reserved" sectors which precede the actual

View File

@ -1,4 +1,4 @@
/* $NetBSD: newfs_msdos.c,v 1.9 2001/09/17 16:26:56 toshii Exp $ */
/* $NetBSD: newfs_msdos.c,v 1.10 2003/04/21 07:58:55 dbj Exp $ */
/*
* Copyright (c) 1998 Robert Nordier
@ -33,7 +33,7 @@
static const char rcsid[] =
"$FreeBSD: src/sbin/newfs_msdos/newfs_msdos.c,v 1.15 2000/10/10 01:49:37 wollman Exp $";
#else
__RCSID("$NetBSD: newfs_msdos.c,v 1.9 2001/09/17 16:26:56 toshii Exp $");
__RCSID("$NetBSD: newfs_msdos.c,v 1.10 2003/04/21 07:58:55 dbj Exp $");
#endif
#endif /* not lint */
@ -224,6 +224,8 @@ static u_int8_t bootcode[] = {
0
};
static int got_siginfo = 0; /* received a SIGINFO */
static void check_mounted(const char *, mode_t);
static void getstdfmt(const char *, struct bpb *);
static void getdiskinfo(int, const char *, const char *, int,
@ -235,6 +237,7 @@ static int oklabel(const char *);
static void mklabel(u_int8_t *, const char *);
static void setstr(u_int8_t *, const char *, size_t);
static void usage(void);
static void infohandler(int sig);
/*
* Construct a FAT12, FAT16, or FAT32 file system.
@ -567,7 +570,14 @@ main(int argc, char *argv[])
if (!(img = malloc(bpb.bps)))
err(1, NULL);
dir = bpb.res + (bpb.spf ? bpb.spf : bpb.bspf) * bpb.nft;
signal(SIGINFO, infohandler);
for (lsn = 0; lsn < dir + (fat == 32 ? bpb.spc : rds); lsn++) {
if (got_siginfo) {
fprintf(stderr,"%s: writing sector %u of %u (%u%%)\n",
fname,lsn,(dir + (fat == 32 ? bpb.spc : rds)),
(lsn*100)/(dir + (fat == 32 ? bpb.spc : rds)));
got_siginfo = 0;
}
x = lsn;
if (opt_B &&
fat == 32 && bpb.bkbs != MAXU16 &&
@ -959,3 +969,9 @@ usage(void)
fprintf(stderr, "\t-u sectors/track\n");
exit(1);
}
void
infohandler(int sig)
{
got_siginfo = 1;
}