const char *defstr;
const char *short_yes = _("yY");
const char *short_no = _("nN");
+ const char *short_yesall = _("aA");
+ const char *yesall_prompt = _(" ('a' enables 'yes' to all) ");
+ const char *extra_prompt = "";
+ static int yes_answers;
#ifdef HAVE_TERMIOS_H
struct termios termios, tmp;
defstr = _(_("<n>"));
else
defstr = _(" (y/n)");
- log_out(ctx, "%s%s? ", string, defstr);
+ /*
+ * If the user presses 'y' more than 8 (but less than 12) times in
+ * succession without pressing anything else, display a hint about
+ * yes-to-all mode.
+ */
+ if (yes_answers > 12)
+ yes_answers = -1;
+ else if (yes_answers > 8)
+ extra_prompt = yesall_prompt;
+ log_out(ctx, "%s%s%s? ", string, extra_prompt, defstr);
while (1) {
fflush (stdout);
if ((c = read_a_char()) == EOF)
longjmp(e2fsck_global_ctx->abort_loc, 1);
}
log_out(ctx, "%s", _("cancelled!\n"));
+ yes_answers = 0;
return 0;
}
if (strchr(short_yes, (char) c)) {
def = 1;
+ if (yes_answers >= 0)
+ yes_answers++;
break;
- }
- else if (strchr(short_no, (char) c)) {
+ } else if (strchr(short_no, (char) c)) {
def = 0;
+ yes_answers = -1;
break;
- }
- else if ((c == 27 || c == ' ' || c == '\n') && (def != -1))
+ } else if (strchr(short_yesall, (char)c)) {
+ def = 2;
+ yes_answers = -1;
+ ctx->options |= E2F_OPT_YES;
+ break;
+ } else if ((c == 27 || c == ' ' || c == '\n') && (def != -1)) {
+ yes_answers = -1;
break;
+ }
}
- if (def)
+ if (def == 2)
+ log_out(ctx, "%s", _("yes to all\n"));
+ else if (def)
log_out(ctx, "%s", _("yes\n"));
else
log_out(ctx, "%s", _("no\n"));
errcode_t retval;
const char *old_op;
unsigned int save_type;
+ int flags;
if (ctx->invalid_bitmaps) {
com_err(ctx->program_name, 0,
old_op = ehandler_operation(_("reading inode and block bitmaps"));
e2fsck_set_bitmap_type(fs, EXT2FS_BMAP64_RBTREE, "fs_bitmaps",
&save_type);
+ flags = ctx->fs->flags;
+ ctx->fs->flags |= EXT2_FLAG_IGNORE_CSUM_ERRORS;
retval = ext2fs_read_bitmaps(fs);
+ ctx->fs->flags = (flags & EXT2_FLAG_IGNORE_CSUM_ERRORS) |
+ (ctx->fs->flags & ~EXT2_FLAG_IGNORE_CSUM_ERRORS);
fs->default_bitmap_type = save_type;
ehandler_operation(old_op);
if (retval) {
return 0;
}
-#define STRIDE_LENGTH 8
-/*
- * Helper function which zeros out _num_ blocks starting at _blk_. In
- * case of an error, the details of the error is returned via _ret_blk_
- * and _ret_count_ if they are non-NULL pointers. Returns 0 on
- * success, and an error code on an error.
- *
- * As a special case, if the first argument is NULL, then it will
- * attempt to free the static zeroizing buffer. (This is to keep
- * programs that check for memory leaks happy.)
- */
-errcode_t e2fsck_zero_blocks(ext2_filsys fs, blk_t blk, int num,
- blk_t *ret_blk, int *ret_count)
-{
- int j, count;
- static char *buf;
- errcode_t retval;
-
- /* If fs is null, clean up the static buffer and return */
- if (!fs) {
- if (buf) {
- free(buf);
- buf = 0;
- }
- return 0;
- }
- /* Allocate the zeroizing buffer if necessary */
- if (!buf) {
- buf = malloc(fs->blocksize * STRIDE_LENGTH);
- if (!buf) {
- com_err("malloc", ENOMEM, "%s",
- _("while allocating zeroizing buffer"));
- exit(1);
- }
- memset(buf, 0, fs->blocksize * STRIDE_LENGTH);
- }
- /* OK, do the write loop */
- for (j = 0; j < num; j += STRIDE_LENGTH, blk += STRIDE_LENGTH) {
- count = num - j;
- if (count > STRIDE_LENGTH)
- count = STRIDE_LENGTH;
- retval = io_channel_write_blk64(fs->io, blk, count, buf);
- if (retval) {
- if (ret_count)
- *ret_count = count;
- if (ret_blk)
- *ret_blk = blk;
- return retval;
- }
- }
- return 0;
-}
-
/*
* Check to see if a filesystem is in /proc/filesystems.
* Returns 1 if found, 0 if not