diff options
Diffstat (limited to 'disk-utils/fsck.c')
-rw-r--r-- | disk-utils/fsck.c | 64 |
1 files changed, 52 insertions, 12 deletions
diff --git a/disk-utils/fsck.c b/disk-utils/fsck.c index 299a77525..6ef8ad198 100644 --- a/disk-utils/fsck.c +++ b/disk-utils/fsck.c @@ -141,6 +141,7 @@ static int progress; static int progress_fd; static int force_all_parallel; static int report_stats; +static FILE *report_stats_file; static int num_running; static int max_running; @@ -586,16 +587,28 @@ static void print_stats(struct fsck_instance *inst) timersub(&inst->end_time, &inst->start_time, &delta); - fprintf(stdout, "%s: status %d, rss %ld, " - "real %ld.%06ld, user %d.%06d, sys %d.%06d\n", - fs_get_device(inst->fs), - inst->exit_status, - inst->rusage.ru_maxrss, - delta.tv_sec, delta.tv_usec, - (int)inst->rusage.ru_utime.tv_sec, - (int)inst->rusage.ru_utime.tv_usec, - (int)inst->rusage.ru_stime.tv_sec, - (int)inst->rusage.ru_stime.tv_usec); + if (report_stats_file) + fprintf(report_stats_file, "%s %d %ld " + "%ld.%06ld %d.%06d %d.%06d\n", + fs_get_device(inst->fs), + inst->exit_status, + inst->rusage.ru_maxrss, + delta.tv_sec, delta.tv_usec, + (int)inst->rusage.ru_utime.tv_sec, + (int)inst->rusage.ru_utime.tv_usec, + (int)inst->rusage.ru_stime.tv_sec, + (int)inst->rusage.ru_stime.tv_usec); + else + fprintf(stdout, "%s: status %d, rss %ld, " + "real %ld.%06ld, user %d.%06d, sys %d.%06d\n", + fs_get_device(inst->fs), + inst->exit_status, + inst->rusage.ru_maxrss, + delta.tv_sec, delta.tv_usec, + (int)inst->rusage.ru_utime.tv_sec, + (int)inst->rusage.ru_utime.tv_usec, + (int)inst->rusage.ru_stime.tv_sec, + (int)inst->rusage.ru_stime.tv_usec); } /* @@ -1371,11 +1384,12 @@ static void __attribute__((__noreturn__)) usage(FILE *out) fputs(_(" -N do not execute, just show what would be done\n"), out); fputs(_(" -P check filesystems in parallel, including root\n"), out); fputs(_(" -R skip root filesystem; useful only with '-A'\n"), out); - fputs(_(" -r report statistics for each device checked\n"), out); + fputs(_(" -r [<fd>] report statistics for each device checked;\n" + " file descriptor is for GUIs\n"), out); fputs(_(" -s serialize the checking operations\n"), out); fputs(_(" -T do not show the title on startup\n"), out); fputs(_(" -t <type> specify filesystem types to be checked;\n" - " <type> is allowed to be a comma-separated list\n"), out); + " <type> is allowed to be a comma-separated list\n"), out); fputs(_(" -V explain what is being done\n"), out); fputs(_(" -? display this help and exit\n"), out); @@ -1399,6 +1413,7 @@ static void parse_argv(int argc, char *argv[]) int opt = 0; int opts_for_fsck = 0; struct sigaction sa; + int report_stats_fd = 0; /* * Set up signal action @@ -1504,6 +1519,21 @@ static void parse_argv(int argc, char *argv[]) break; case 'r': report_stats = 1; + if (arg[j+1]) { /* -r<fd> */ + report_stats_fd = string_to_int(arg+j+1); + if (report_stats_fd < 0) + report_stats_fd = 0; + else + goto next_arg; + } else if (i+1 < argc && *argv[i+1] != '-') { /* -r <fd> */ + report_stats_fd = string_to_int(argv[i+1]); + if (report_stats_fd < 0) + report_stats_fd = 0; + else { + ++i; + goto next_arg; + } + } break; case 's': serialize = 1; @@ -1542,6 +1572,16 @@ static void parse_argv(int argc, char *argv[]) opt = 0; } } + + /* Validate the report stats file descriptor to avoid disasters */ + if (report_stats_fd) { + report_stats_file = fdopen(report_stats_fd, "w"); + if (!report_stats_file) + err(FSCK_EX_ERROR, + _("invalid argument -r %d"), + report_stats_fd); + } + if (getenv("FSCK_FORCE_ALL_PARALLEL")) force_all_parallel++; if ((tmp = getenv("FSCK_MAX_INST"))) |