X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=misc%2Futil.c;h=51bdb60f63a55b896b48e34a8b6c7d47d199c26e;hb=da2a5a4baede2a227d2da587eb74ceae66778fbc;hp=76392ff4608b50269d495e64764ac9c15e8fb1b7;hpb=d07b150371f4a46f2729ab2635fc8f23c9ffca58;p=tools%2Fe2fsprogs.git diff --git a/misc/util.c b/misc/util.c index 76392ff..51bdb60 100644 --- a/misc/util.c +++ b/misc/util.c @@ -1,6 +1,6 @@ /* * util.c --- helper functions used by tune2fs and mke2fs - * + * * Copyright 1995, 1996, 1997, 1998, 1999, 2000 by Theodore Ts'o. * * %Begin-Header% @@ -69,10 +69,10 @@ void proceed_question(void) fflush(stdout); fflush(stderr); - printf(_("Proceed anyway? (y,n) ")); + fputs(_("Proceed anyway? (y,n) "), stdout); buf[0] = 0; - fgets(buf, sizeof(buf), stdin); - if (strchr(short_yes, buf[0]) == 0) + if (!fgets(buf, sizeof(buf), stdin) || + strchr(short_yes, buf[0]) == 0) exit(1); } @@ -81,23 +81,29 @@ void check_plausibility(const char *device) int val; #ifdef HAVE_OPEN64 struct stat64 s; - + val = stat64(device, &s); #else struct stat s; - + val = stat(device, &s); #endif - + if(val == -1) { fprintf(stderr, _("Could not stat %s --- %s\n"), device, error_message(errno)); if (errno == ENOENT) - fprintf(stderr, _("\nThe device apparently does " - "not exist; did you specify it correctly?\n")); + fputs(_("\nThe device apparently does not exist; " + "did you specify it correctly?\n"), stderr); exit(1); } - if (!S_ISBLK(s.st_mode)) { +#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) + /* On FreeBSD, all disk devices are character specials */ + if (!S_ISBLK(s.st_mode) && !S_ISCHR(s.st_mode)) +#else + if (!S_ISBLK(s.st_mode)) +#endif + { printf(_("%s is not a block special device.\n"), device); proceed_question(); return; @@ -146,17 +152,26 @@ void check_mount(const char *device, int force, const char *type) device); return; } - if (!(mount_flags & EXT2_MF_MOUNTED)) - return; - - fprintf(stderr, _("%s is mounted; "), device); - if (force) { - fprintf(stderr, _("mke2fs forced anyway. " - "Hope /etc/mtab is incorrect.\n")); - } else { + if (mount_flags & EXT2_MF_MOUNTED) { + fprintf(stderr, _("%s is mounted; "), device); + if (force > 2) { + fputs(_("mke2fs forced anyway. Hope /etc/mtab is " + "incorrect.\n"), stderr); + return; + } + abort_mke2fs: fprintf(stderr, _("will not make a %s here!\n"), type); exit(1); } + if (mount_flags & EXT2_MF_BUSY) { + fprintf(stderr, _("%s is apparently in use by the system; "), + device); + if (force > 2) { + fputs(_("mke2fs forced anyway.\n"), stderr); + return; + } + goto abort_mke2fs; + } } void parse_journal_opts(const char *opts) @@ -168,8 +183,8 @@ void parse_journal_opts(const char *opts) len = strlen(opts); buf = malloc(len+1); if (!buf) { - fprintf(stderr, _("Couldn't allocate memory to parse " - "journal options!\n")); + fputs(_("Couldn't allocate memory to parse journal " + "options!\n"), stderr); exit(1); } strcpy(buf, opts); @@ -179,7 +194,7 @@ void parse_journal_opts(const char *opts) if (p) { *p = 0; next = p+1; - } + } arg = strchr(token, '='); if (arg) { *arg = 0; @@ -192,6 +207,10 @@ void parse_journal_opts(const char *opts) if (strcmp(token, "device") == 0) { journal_device = blkid_get_devname(NULL, arg, NULL); if (!journal_device) { + if (arg) + fprintf(stderr, _("\nCould not find " + "journal device matching %s\n"), + arg); journal_usage++; continue; } @@ -210,7 +229,7 @@ void parse_journal_opts(const char *opts) journal_usage++; } if (journal_usage) { - fprintf(stderr, _("\nBad journal options specified.\n\n" + fputs(_("\nBad journal options specified.\n\n" "Journal options are separated by commas, " "and may take an argument which\n" "\tis set off by an equals ('=') sign.\n\n" @@ -218,54 +237,48 @@ void parse_journal_opts(const char *opts) "\tsize=\n" "\tdevice=\n\n" "The journal size must be between " - "1024 and 102400 filesystem blocks.\n\n" )); + "1024 and 10240000 filesystem blocks.\n\n"), stderr); + free(buf); exit(1); } -} + free(buf); +} /* * Determine the number of journal blocks to use, either via * user-specified # of megabytes, or via some intelligently selected * defaults. - * + * * Find a reasonable journal file size (in blocks) given the number of blocks * in the filesystem. For very small filesystems, it is not reasonable to * have a journal that fills more than half of the filesystem. */ -int figure_journal_size(int size, ext2_filsys fs) +unsigned int figure_journal_size(int size, ext2_filsys fs) { - blk_t j_blocks; + int j_blocks; - if (fs->super->s_blocks_count < 2048) { - fprintf(stderr, _("\nFilesystem too small for a journal\n")); + j_blocks = ext2fs_default_journal_size(ext2fs_blocks_count(fs->super)); + if (j_blocks < 0) { + fputs(_("\nFilesystem too small for a journal\n"), stderr); return 0; } - - if (size >= 0) { + + if (size > 0) { j_blocks = size * 1024 / (fs->blocksize / 1024); - if (j_blocks < 1024 || j_blocks > 102400) { + if (j_blocks < 1024 || j_blocks > 10240000) { fprintf(stderr, _("\nThe requested journal " "size is %d blocks; it must be\n" - "between 1024 and 102400 blocks. " + "between 1024 and 10240000 blocks. " "Aborting.\n"), j_blocks); exit(1); } - if (j_blocks > fs->super->s_free_blocks_count) { - fprintf(stderr, _("\nJournal size too big " - "for filesystem.\n")); + if ((unsigned) j_blocks > ext2fs_free_blocks_count(fs->super) / 2) { + fputs(_("\nJournal size too big for filesystem.\n"), + stderr); exit(1); } - return j_blocks; } - - if (fs->super->s_blocks_count < 32768) - j_blocks = 1024; - else if (fs->super->s_blocks_count < 262144) - j_blocks = 4096; - else - j_blocks = 8192; - return j_blocks; }