- e2fsck now handles SIGINFO (Ctrl+T): print progress bar once

- Bugfix: fsck_ext2fs would abort the boot when run as part of
  /etc/rc and e2fsck had repaired a file system. fsck_ext2fs
  now maps exit codes 0 to 3 from e2fsck to 0. If e2fsck is
  aborted by a signal or an exit code of 4 or higher, maps to
  EXIT_FAILURE.

PR:		ports/63320
Submitted by:	maintainer
This commit is contained in:
Kirill Ponomarev
2004-02-24 21:55:22 +00:00
parent 36f3f6d94c
commit 11ad482d5f
3 changed files with 93 additions and 6 deletions

View File

@@ -7,7 +7,7 @@
PORTNAME= e2fsprogs
PORTVERSION= 1.35.w20040131
PORTREVISION= 1
PORTREVISION= 2
CATEGORIES= sysutils
MASTER_SITES= ${MASTER_SITE_SOURCEFORGE}
MASTER_SITE_SUBDIR= ${PORTNAME}

View File

@@ -6,21 +6,34 @@
*
* $FreeBSD$
*
* Upstream: $Id: fsck_ext2fs.c,v 1.2 2004/02/24 20:57:02 emma Exp $
*
* format: gindent -kr
*/
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/wait.h>
#include <sys/time.h>
#include <sys/resource.h>
int
main(int argc, char **argv)
__attribute__ ((noreturn))
static int die(const char *tag)
{
int ch, i = 1, force = 0;
perror(tag);
exit(EXIT_FAILURE);
}
int main(int argc, char **argv)
{
int ch, i = 1, force = 0, status;
long block = 0;
enum { normal, preen, yes, no } mode = normal;
char *cmd[256];
pid_t pid;
cmd[0] = "/sbin/e2fsck";
while ((ch = getopt(argc, argv, "BFpfnyb:")) != -1) {
@@ -43,6 +56,8 @@ main(int argc, char **argv)
case 'B':
case 'F':
default:
fprintf(stderr, "%s: unknown option -%c\n",
argv[0], optopt);
exit(EXIT_FAILURE);
}
}
@@ -76,6 +91,24 @@ main(int argc, char **argv)
cmd[i++] = 0;
(void)execv(cmd[0], cmd);
exit(EXIT_FAILURE);
pid = fork();
switch (pid) {
case -1:
/* error */
die("fork");
break;
case 0:
/* child */
(void) execv(cmd[0], cmd);
perror("execve");
_exit(127);
default:
/* parent */
if (pid != waitpid(pid, &status, 0))
die("waitpid");
if (WIFSIGNALED(status)
|| (WIFEXITED(status) && WEXITSTATUS(status) >= 4))
exit(EXIT_FAILURE);
}
exit(EXIT_SUCCESS);
}

View File

@@ -0,0 +1,54 @@
--- e2fsprogs-1.35/e2fsck/unix.c~ Sun Dec 7 18:11:38 2003
+++ e2fsprogs-1.35/e2fsck/unix.c Tue Feb 24 22:13:52 2004
@@ -416,6 +416,24 @@
return 0;
}
+static int e2fsck_progress_once(e2fsck_t ctx, int pass, unsigned long cur, unsigned long max)
+{
+ char buf[80];
+ float percent;
+
+ if (pass == 0)
+ return 0;
+
+ percent = calc_percent(&e2fsck_tbl, pass, cur, max);
+ e2fsck_simple_progress(ctx, ctx->device_name,
+ percent, 0);
+
+ printf("\n");
+ ctx->progress = 0;
+ return 0;
+}
+
+
#define PATH_SET "PATH=/sbin"
static void reserve_stdio_fds(void)
@@ -448,6 +466,17 @@
ctx->progress_fd = 0;
}
+static void signal_progress_now(int sig EXT2FS_ATTR((unused)))
+{
+ e2fsck_t ctx = e2fsck_global_ctx;
+
+ if (!ctx)
+ return;
+
+ ctx->progress = e2fsck_progress_once;
+ ctx->progress_fd = 0;
+}
+
static void signal_progress_off(int sig EXT2FS_ATTR((unused)))
{
e2fsck_t ctx = e2fsck_global_ctx;
@@ -740,6 +769,8 @@
sigaction(SIGUSR1, &sa, 0);
sa.sa_handler = signal_progress_off;
sigaction(SIGUSR2, &sa, 0);
+ sa.sa_handler = signal_progress_now;
+ sigaction(SIGINFO, &sa, 0);
#endif
/* Update our PATH to include /sbin if we need to run badblocks */