1/* vi: set sw=4 ts=4: */ 2/* 3 * tune2fs: utility to modify EXT2 filesystem 4 * 5 * Busybox'ed (2009) by Vladimir Dronnikov <dronnikov@gmail.com> 6 * 7 * Licensed under GPLv2, see file LICENSE in this source tree. 8 */ 9//config:config TUNE2FS 10//config: bool "tune2fs (4.4 kb)" 11//config: default n # off: it is too limited compared to upstream version 12//config: help 13//config: tune2fs allows the system administrator to adjust various tunable 14//config: filesystem parameters on Linux ext2/ext3 filesystems. 15 16//applet:IF_TUNE2FS(APPLET_NOEXEC(tune2fs, tune2fs, BB_DIR_SBIN, BB_SUID_DROP, tune2fs)) 17 18//TODO alias to "tune2fs -L LABEL": //applet:IF_E2LABEL(APPLET_ODDNAME(e2label, tune2fs, BB_DIR_SBIN, BB_SUID_DROP, e2label)) 19 20//kbuild:lib-$(CONFIG_TUNE2FS) += tune2fs.o 21 22//usage:#define tune2fs_trivial_usage 23//usage: "[-c MAX_MOUNT_COUNT] " 24////usage: "[-e errors-behavior] [-g group] " 25//usage: "[-i DAYS] " 26////usage: "[-j] [-J journal-options] [-l] [-s sparse-flag] " 27////usage: "[-m reserved-blocks-percent] [-o [^]mount-options[,...]] " 28////usage: "[-r reserved-blocks-count] [-u user] " 29//usage: "[-C MOUNT_COUNT] " 30//usage: "[-L LABEL] " 31////usage: "[-M last-mounted-dir] [-O [^]feature[,...]] " 32////usage: "[-T last-check-time] [-U UUID] " 33//usage: "BLOCKDEV" 34//usage: 35//usage:#define tune2fs_full_usage "\n\n" 36//usage: "Adjust filesystem options on ext[23] filesystems" 37 38#include "libbb.h" 39#include <linux/fs.h> 40#include "bb_e2fs_defs.h" 41 42enum { 43 OPT_L = 1 << 0, // label 44 OPT_c = 1 << 1, // max mount count 45 OPT_i = 1 << 2, // check interval 46 OPT_C = 1 << 3, // current mount count 47}; 48 49int tune2fs_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; 50int tune2fs_main(int argc UNUSED_PARAM, char **argv) 51{ 52 unsigned opts; 53 const char *label, *str_c, *str_i, *str_C; 54 struct ext2_super_block *sb; 55 int fd; 56 57 opts = getopt32(argv, "^" "L:c:i:C:" "\0" "=1", &label, &str_c, &str_i, &str_C); 58 if (!opts) 59 bb_show_usage(); 60 argv += optind; // argv[0] -- device 61 62 // read superblock 63 fd = xopen(argv[0], O_RDWR); 64 xlseek(fd, 1024, SEEK_SET); 65 sb = xzalloc(1024); 66 xread(fd, sb, 1024); 67 68 // mangle superblock 69 //STORE_LE(sb->s_wtime, time(NULL)); - why bother? 70 71 if (opts & OPT_C) { 72 int n = xatoi_range(str_C, 1, 0xfffe); 73 STORE_LE(sb->s_mnt_count, (unsigned)n); 74 } 75 76 // set the label 77 if (opts & OPT_L) 78 safe_strncpy((char *)sb->s_volume_name, label, sizeof(sb->s_volume_name)); 79 80 if (opts & OPT_c) { 81 int n = xatoi_range(str_c, -1, 0xfffe); 82 if (n == 0) 83 n = -1; 84 STORE_LE(sb->s_max_mnt_count, (unsigned)n); 85 } 86 87 if (opts & OPT_i) { 88 unsigned n = xatou_range(str_i, 0, (unsigned)0xffffffff / (24*60*60)) * 24*60*60; 89 STORE_LE(sb->s_checkinterval, n); 90 } 91 92 // write superblock 93 xlseek(fd, 1024, SEEK_SET); 94 xwrite(fd, sb, 1024); 95 96 if (ENABLE_FEATURE_CLEAN_UP) { 97 free(sb); 98 } 99 100 xclose(fd); 101 return EXIT_SUCCESS; 102} 103