excellent shrinkage patch by Tito
diff --git a/e2fsprogs/tune2fs.c b/e2fsprogs/tune2fs.c
index b78b013..ccbbc78 100644
--- a/e2fsprogs/tune2fs.c
+++ b/e2fsprogs/tune2fs.c
@@ -50,7 +50,7 @@
#include "util.h"
#include "blkid/blkid.h"
-static char * device_name;
+static char * device_name = NULL;
static char * new_label, *new_last_mounted, *new_UUID;
static char * io_options;
static int c_flag, C_flag, e_flag, f_flag, g_flag, i_flag, l_flag, L_flag;
@@ -66,7 +66,7 @@
static char *mntopts_cmd;
static int journal_size, journal_flags;
-static char *journal_device;
+static char *journal_device = NULL;
static const char *please_fsck = "Please run e2fsck on the filesystem\n";
@@ -188,26 +188,36 @@
struct ext2_inode inode;
errcode_t retval;
ino_t ino = fs->super->s_journal_inum;
+ char *msg = "to read";
+ char *s = "journal inode";
retval = ext2fs_read_inode(fs, ino, &inode);
- if (retval)
- bb_error_msg_and_die("Failed to read journal inode");
+ if (retval)
+ goto REMOVE_JOURNAL_INODE_ERROR;
if (ino == EXT2_JOURNAL_INO) {
retval = ext2fs_read_bitmaps(fs);
- if (retval)
- bb_error_msg_and_die("Failed to read bitmaps");
+ if (retval) {
+ msg = "to read bitmaps";
+ s = "";
+ goto REMOVE_JOURNAL_INODE_ERROR;
+ }
retval = ext2fs_block_iterate(fs, ino, 0, NULL,
release_blocks_proc, NULL);
- if (retval)
- bb_error_msg_and_die("Failed clearing journal inode");
+ if (retval) {
+ msg = "clearing";
+ goto REMOVE_JOURNAL_INODE_ERROR;
+ }
memset(&inode, 0, sizeof(inode));
ext2fs_mark_bb_dirty(fs);
fs->flags &= ~EXT2_FLAG_SUPER_ONLY;
} else
inode.i_flags &= ~EXT2_IMMUTABLE_FL;
retval = ext2fs_write_inode(fs, ino, &inode);
- if (retval)
- bb_error_msg_and_die("Failed writing journal inode");
+ if (retval) {
+ msg = "writing";
+REMOVE_JOURNAL_INODE_ERROR:
+ bb_error_msg_and_die("Failed %s %s", msg, s);
+ }
fs->super->s_journal_inum = 0;
ext2fs_mark_super_dirty(fs);
}
@@ -269,8 +279,8 @@
EXT3_FEATURE_INCOMPAT_RECOVER) {
bb_error_msg_and_die(
"The needs_recovery flag is set. "
- "Please run e2fsck before clearing\n"
- "the has_journal flag.");
+ "%s before clearing the has_journal flag.",
+ please_fsck);
}
if (sb->s_journal_inum) {
remove_journal_inode(fs);
@@ -317,48 +327,14 @@
*/
static void add_journal(ext2_filsys fs)
{
- unsigned long journal_blocks;
- errcode_t retval;
- ext2_filsys jfs;
- io_manager io_ptr;
-
if (fs->super->s_feature_compat &
EXT3_FEATURE_COMPAT_HAS_JOURNAL) {
- bb_error_msg("The filesystem already has a journal");
- goto err;
+ bb_error_msg_and_die("The filesystem already has a journal");
}
if (journal_device) {
- check_plausibility(journal_device);
- check_mount(journal_device, 0, "journal");
- io_ptr = unix_io_manager;
- retval = ext2fs_open(journal_device, EXT2_FLAG_RW|
- EXT2_FLAG_JOURNAL_DEV_OK, 0,
- fs->blocksize, io_ptr, &jfs);
- if (retval) {
- bb_error_msg("Failed to open journal on %s", journal_device);
- goto err;
- }
- printf("Creating journal on device %s: ", journal_device);
- fflush(stdout);
-
- retval = ext2fs_add_journal_device(fs, jfs);
- ext2fs_close(jfs);
- if (retval) {
- bb_error_msg("Failed to add filesystem to journal on %s", journal_device);
- goto err;
- }
- puts("done");
+ make_journal_device(journal_device, fs, 0, 0);
} else if (journal_size) {
- fputs("Creating journal inode: ", stdout);
- fflush(stdout);
- journal_blocks = figure_journal_size(journal_size, fs);
-
- retval = ext2fs_add_journal_inode(fs, journal_blocks,
- journal_flags);
- if (retval)
- bb_error_msg_and_die("Failed to create journal file");
- else
- puts("done");
+ make_journal_blocks(fs, journal_size, journal_flags, 0);
/*
* If the filesystem wasn't mounted, we need to force
* the block group descriptors out.
@@ -368,11 +344,18 @@
}
print_check_message(fs);
return;
+}
-err:
- if (journal_device)
- free(journal_device);
- exit(1);
+/*
+ * Busybox stuff
+ */
+static char * x_blkid_get_devname(const char *token)
+{
+ char * dev_name;
+
+ if (!(dev_name = blkid_get_devname(NULL, token, NULL)))
+ bb_error_msg_and_die("Unable to resolve '%s'", token);
+ return dev_name;
}
#ifdef CONFIG_E2LABEL
@@ -383,9 +366,7 @@
io_options = strchr(argv[1], '?');
if (io_options)
*io_options++ = 0;
- device_name = blkid_get_devname(NULL, argv[1], NULL);
- if (!device_name)
- bb_error_msg_and_die("Unable to resolve '%s'", argv[1]);
+ device_name = x_blkid_get_devname(argv[1]);
if (argc == 3) {
open_flag = EXT2_FLAG_RW | EXT2_FLAG_JOURNAL_DEV_OK;
L_flag = 1;
@@ -393,6 +374,8 @@
} else
print_label++;
}
+#else
+#define parse_e2label_options(x,y)
#endif
static time_t parse_time(char *str)
@@ -425,17 +408,14 @@
{
int c;
char * tmp;
- struct group * gr;
- struct passwd * pw;
printf("tune2fs %s (%s)\n", E2FSPROGS_VERSION, E2FSPROGS_DATE);
while ((c = getopt(argc, argv, "c:e:fg:i:jlm:o:r:s:u:C:J:L:M:O:T:U:")) != EOF)
switch (c)
{
case 'c':
- max_mount_count = strtol (optarg, &tmp, 0);
- if (*tmp || max_mount_count > 16000) {
- bb_error_msg_and_die("bad mounts count - %s", optarg);
+ if (safe_strtoi(optarg, &max_mount_count) || max_mount_count > 16000) {
+ goto MOUNTS_COUNT_ERROR;
}
if (max_mount_count == 0)
max_mount_count = -1;
@@ -443,8 +423,8 @@
open_flag = EXT2_FLAG_RW;
break;
case 'C':
- mount_count = strtoul (optarg, &tmp, 0);
- if (*tmp || mount_count > 16000) {
+ if (safe_strtoi(optarg, &mount_count) || mount_count > 16000) {
+MOUNTS_COUNT_ERROR:
bb_error_msg_and_die("bad mounts count - %s", optarg);
}
C_flag = 1;
@@ -467,19 +447,8 @@
f_flag = 1;
break;
case 'g':
- resgid = strtoul (optarg, &tmp, 0);
- if (*tmp) {
- gr = getgrnam (optarg);
- if (gr == NULL)
- tmp = optarg;
- else {
- resgid = gr->gr_gid;
- *tmp =0;
- }
- }
- if (*tmp) {
- bb_error_msg_and_die("bad gid/group name - %s", optarg);
- }
+ if (safe_strtoul(optarg, &resgid))
+ resgid = bb_xgetgrnam(optarg);
g_flag = 1;
open_flag = EXT2_FLAG_RW;
break;
@@ -532,8 +501,7 @@
EXT2_FLAG_JOURNAL_DEV_OK;
break;
case 'm':
- reserved_ratio = strtoul (optarg, &tmp, 0);
- if (*tmp || reserved_ratio > 50) {
+ if(safe_strtoul(optarg, &reserved_ratio) || reserved_ratio > 50) {
bb_error_msg_and_die("bad reserved block ratio - %s", optarg);
}
m_flag = 1;
@@ -560,8 +528,7 @@
open_flag = EXT2_FLAG_RW;
break;
case 'r':
- reserved_blocks = strtoul (optarg, &tmp, 0);
- if (*tmp) {
+ if(safe_strtoul(optarg, &reserved_blocks)) {
bb_error_msg_and_die("bad reserved blocks count - %s", optarg);
}
r_flag = 1;
@@ -577,19 +544,8 @@
open_flag = EXT2_FLAG_RW;
break;
case 'u':
- resuid = strtoul (optarg, &tmp, 0);
- if (*tmp) {
- pw = getpwnam (optarg);
- if (pw == NULL)
- tmp = optarg;
- else {
- resuid = pw->pw_uid;
- *tmp = 0;
- }
- }
- if (*tmp) {
- bb_error_msg_and_die("bad uid/user name - %s", optarg);
- }
+ if (safe_strtoul(optarg, &resuid))
+ resuid = bb_xgetpwnam(optarg);
u_flag = 1;
open_flag = EXT2_FLAG_RW;
break;
@@ -609,48 +565,45 @@
io_options = strchr(argv[optind], '?');
if (io_options)
*io_options++ = 0;
- device_name = blkid_get_devname(NULL, argv[optind], NULL);
- if (!device_name)
- bb_error_msg_and_die("Unable to resolve '%s'", argv[optind]);
+ device_name = x_blkid_get_devname(argv[optind]);
}
#ifdef CONFIG_FINDFS
static attribute_noreturn void do_findfs(int argc, char **argv)
{
- char *dev;
-
if ((argc != 2) ||
(strncmp(argv[1], "LABEL=", 6) && strncmp(argv[1], "UUID=", 5)))
bb_show_usage();
- dev = blkid_get_devname(NULL, argv[1], NULL);
- if (!dev)
- bb_error_msg_and_die("Unable to resolve '%s'", argv[1]);
- puts(dev);
+ device_name = x_blkid_get_devname(argv[1]);
+ puts(device_name);
exit(0);
}
+#else
+#define do_findfs(x, y)
#endif
+static void clean_up(void)
+{
+ if (ENABLE_FEATURE_CLEAN_UP && device_name) free(device_name);
+ if (ENABLE_FEATURE_CLEAN_UP && journal_device) free(journal_device);
+}
+
int tune2fs_main(int argc, char **argv)
{
errcode_t retval;
ext2_filsys fs;
struct ext2_super_block *sb;
io_manager io_ptr;
-#if defined(CONFIG_FINDFS) || defined(CONFIG_E2LABEL)
- char *program_name = basename(argv[0]);
-#endif
-#ifdef CONFIG_FINDFS
- if (strcmp(program_name, "findfs") == 0)
- do_findfs(argc, argv);
-#endif
-
-#ifdef CONFIG_E2LABEL
- if (strcmp(program_name, "e2label") == 0)
+ if (ENABLE_FEATURE_CLEAN_UP)
+ atexit(clean_up);
+
+ if (ENABLE_FINDFS && (bb_applet_name[0] == 'f')) /* findfs */
+ do_findfs(argc, argv); /* no return */
+ else if (ENABLE_E2LABEL && (bb_applet_name[0] == 'e')) /* e2label */
parse_e2label_options(argc, argv);
else
-#endif
- parse_tune2fs_options(argc, argv);
+ parse_tune2fs_options(argc, argv); /* tune2fs */
io_ptr = unix_io_manager;
retval = ext2fs_open2(device_name, io_options, open_flag,
@@ -662,7 +615,7 @@
/* For e2label emulation */
printf("%.*s\n", (int) sizeof(sb->s_volume_name),
sb->s_volume_name);
- exit(0);
+ return 0;
}
retval = ext2fs_check_if_mounted(device_name, &mount_flags);
if (retval)