diff options
Diffstat (limited to 'e2fsprogs')
-rw-r--r-- | e2fsprogs/tune2fs.c | 40 |
1 files changed, 35 insertions, 5 deletions
diff --git a/e2fsprogs/tune2fs.c b/e2fsprogs/tune2fs.c index 311349fec..75e4f6bcf 100644 --- a/e2fsprogs/tune2fs.c +++ b/e2fsprogs/tune2fs.c | |||
@@ -27,24 +27,40 @@ do { \ | |||
27 | #define FETCH_LE32(field) \ | 27 | #define FETCH_LE32(field) \ |
28 | (sizeof(field) == 4 ? SWAP_LE32(field) : BUG_wrong_field_size()) | 28 | (sizeof(field) == 4 ? SWAP_LE32(field) : BUG_wrong_field_size()) |
29 | 29 | ||
30 | //usage:#define tune2fs_trivial_usage | ||
31 | //usage: "[-c MOUNT_CNT] " | ||
32 | ////usage: "[-e errors-behavior] [-g group] " | ||
33 | //usage: "[-i DAYS] " | ||
34 | ////usage: "[-j] [-J journal-options] [-l] [-s sparse-flag] " | ||
35 | ////usage: "[-m reserved-blocks-percent] [-o [^]mount-options[,...]] " | ||
36 | ////usage: "[-r reserved-blocks-count] [-u user] [-C mount-count] " | ||
37 | //usage: "[-L LABEL] " | ||
38 | ////usage: "[-M last-mounted-dir] [-O [^]feature[,...]] " | ||
39 | ////usage: "[-T last-check-time] [-U UUID] " | ||
40 | //usage: "BLOCKDEV" | ||
41 | //usage: | ||
42 | //usage:#define tune2fs_full_usage "\n\n" | ||
43 | //usage: "Adjust filesystem options on ext[23] filesystems" | ||
44 | |||
30 | enum { | 45 | enum { |
31 | OPT_L = 1 << 0, // label | 46 | OPT_L = 1 << 0, // label |
47 | OPT_c = 1 << 1, // max mount count | ||
48 | OPT_i = 1 << 2, // check interval | ||
32 | }; | 49 | }; |
33 | 50 | ||
34 | int tune2fs_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; | 51 | int tune2fs_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; |
35 | int tune2fs_main(int argc UNUSED_PARAM, char **argv) | 52 | int tune2fs_main(int argc UNUSED_PARAM, char **argv) |
36 | { | 53 | { |
37 | unsigned opts; | 54 | unsigned opts; |
38 | const char *label; | 55 | const char *label, *str_c, *str_i; |
39 | struct ext2_super_block *sb; | 56 | struct ext2_super_block *sb; |
40 | int fd; | 57 | int fd; |
41 | 58 | ||
42 | opt_complementary = "=1"; | 59 | opt_complementary = "=1"; |
43 | opts = getopt32(argv, "L:", &label); | 60 | opts = getopt32(argv, "L:c:i:", &label, &str_c, &str_i); |
44 | argv += optind; // argv[0] -- device | ||
45 | |||
46 | if (!opts) | 61 | if (!opts) |
47 | bb_show_usage(); | 62 | bb_show_usage(); |
63 | argv += optind; // argv[0] -- device | ||
48 | 64 | ||
49 | // read superblock | 65 | // read superblock |
50 | fd = xopen(argv[0], O_RDWR); | 66 | fd = xopen(argv[0], O_RDWR); |
@@ -54,9 +70,23 @@ int tune2fs_main(int argc UNUSED_PARAM, char **argv) | |||
54 | 70 | ||
55 | // mangle superblock | 71 | // mangle superblock |
56 | //STORE_LE(sb->s_wtime, time(NULL)); - why bother? | 72 | //STORE_LE(sb->s_wtime, time(NULL)); - why bother? |
73 | |||
57 | // set the label | 74 | // set the label |
58 | if (1 /*opts & OPT_L*/) | 75 | if (opts & OPT_L) |
59 | safe_strncpy((char *)sb->s_volume_name, label, sizeof(sb->s_volume_name)); | 76 | safe_strncpy((char *)sb->s_volume_name, label, sizeof(sb->s_volume_name)); |
77 | |||
78 | if (opts & OPT_c) { | ||
79 | int n = xatoi_range(str_c, -1, 0xfffe); | ||
80 | if (n == 0) | ||
81 | n = -1; | ||
82 | STORE_LE(sb->s_max_mnt_count, (unsigned)n); | ||
83 | } | ||
84 | |||
85 | if (opts & OPT_i) { | ||
86 | unsigned n = xatou_range(str_i, 0, (unsigned)0xffffffff / (24*60*60)) * 24*60*60; | ||
87 | STORE_LE(sb->s_checkinterval, n); | ||
88 | } | ||
89 | |||
60 | // write superblock | 90 | // write superblock |
61 | xlseek(fd, 1024, SEEK_SET); | 91 | xlseek(fd, 1024, SEEK_SET); |
62 | xwrite(fd, sb, 1024); | 92 | xwrite(fd, sb, 1024); |