summaryrefslogtreecommitdiff
path: root/misc/tune2fs.c
diff options
context:
space:
mode:
Diffstat (limited to 'misc/tune2fs.c')
-rw-r--r--misc/tune2fs.c158
1 files changed, 124 insertions, 34 deletions
diff --git a/misc/tune2fs.c b/misc/tune2fs.c
index 1576ce44..a6e24865 100644
--- a/misc/tune2fs.c
+++ b/misc/tune2fs.c
@@ -39,21 +39,29 @@
#include "ext2fs/ext2fs.h"
#include "et/com_err.h"
+#include "uuid/uuid.h"
#include "e2p/e2p.h"
#include "../version.h"
const char * program_name = "tune2fs";
char * device_name = NULL;
+char * new_label = NULL;
+char * new_last_mounted = NULL;
+char * new_UUID = NULL;
int c_flag = 0;
+int C_flag = 0;
int e_flag = 0;
int g_flag = 0;
int i_flag = 0;
int l_flag = 0;
+int L_flag = 0;
int m_flag = 0;
+int M_flag = 0;
int r_flag = 0;
int u_flag = 0;
-int max_mount_count;
+int U_flag = 0;
+int max_mount_count, mount_count;
unsigned long interval;
unsigned long reserved_ratio = 0;
unsigned long reserved_blocks = 0;
@@ -61,12 +69,30 @@ unsigned short errors;
unsigned long resgid = 0;
unsigned long resuid = 0;
+#ifndef HAVE_STRCASECMP
+static int strcasecmp (char *s1, char *s2)
+{
+ while (*s1 && *s2) {
+ int ch1 = *s1++, ch2 = *s2++;
+ if (isupper (ch1))
+ ch1 = tolower (ch1);
+ if (isupper (ch2))
+ ch2 = tolower (ch2);
+ if (ch1 != ch2)
+ return ch1 - ch2;
+ }
+ return *s1 ? 1 : *s2 ? -1 : 0;
+}
+#endif
+
static volatile void usage (void)
{
fprintf (stderr, "Usage: %s [-c max-mounts-count] [-e errors-behavior] "
"[-g group]\n"
"\t[-i interval[d|m|w]] [-l] [-m reserved-blocks-percent]\n"
- "\t[-r reserved-blocks-count] [-u user] device\n", program_name);
+ "\t[-r reserved-blocks-count] [-u user] [-C mount-count]\n"
+ "\t[-L volume-label] [-M last-mounted-dir] [-U UUID] "
+ "device\n", program_name);
exit (1);
}
@@ -76,8 +102,10 @@ void main (int argc, char ** argv)
char * tmp;
errcode_t retval;
ext2_filsys fs;
+ struct ext2fs_sb *sb;
struct group * gr;
struct passwd * pw;
+ int open_flag = 0;
fprintf (stderr, "tune2fs %s, %s for EXT2 FS %s, %s\n",
E2FSPROGS_VERSION, E2FSPROGS_DATE,
@@ -85,7 +113,7 @@ void main (int argc, char ** argv)
if (argc && *argv)
program_name = *argv;
initialize_ext2_error_table();
- while ((c = getopt (argc, argv, "c:e:g:i:lm:r:u:")) != EOF)
+ while ((c = getopt (argc, argv, "c:e:g:i:lm:r:u:C:L:M:U:")) != EOF)
switch (c)
{
case 'c':
@@ -98,6 +126,19 @@ void main (int argc, char ** argv)
usage ();
}
c_flag = 1;
+ open_flag = EXT2_FLAG_RW;
+ break;
+ case 'C':
+ mount_count = strtoul (optarg, &tmp, 0);
+ if (*tmp || mount_count > 16000)
+ {
+ com_err (program_name, 0,
+ "bad mounts count - %s",
+ optarg);
+ usage ();
+ }
+ C_flag = 1;
+ open_flag = EXT2_FLAG_RW;
break;
case 'e':
if (strcmp (optarg, "continue") == 0)
@@ -114,6 +155,7 @@ void main (int argc, char ** argv)
usage ();
}
e_flag = 1;
+ open_flag = EXT2_FLAG_RW;
break;
case 'g':
resgid = strtoul (optarg, &tmp, 0);
@@ -135,28 +177,31 @@ void main (int argc, char ** argv)
usage ();
}
g_flag = 1;
+ open_flag = EXT2_FLAG_RW;
break;
case 'i':
interval = strtoul (optarg, &tmp, 0);
- switch (*tmp)
- {
- case '\0':
- case 'd':
- case 'D': /* days */
- interval *= 86400;
- if (*tmp != '\0')
- tmp++;
- break;
- case 'm':
- case 'M': /* months! */
- interval *= 86400 * 30;
- tmp++;
- break;
- case 'w':
- case 'W': /* weeks */
- interval *= 86400 * 7;
+ switch (*tmp) {
+ case 's':
+ tmp++;
+ break;
+ case '\0':
+ case 'd':
+ case 'D': /* days */
+ interval *= 86400;
+ if (*tmp != '\0')
tmp++;
- break;
+ break;
+ case 'm':
+ case 'M': /* months! */
+ interval *= 86400 * 30;
+ tmp++;
+ break;
+ case 'w':
+ case 'W': /* weeks */
+ interval *= 86400 * 7;
+ tmp++;
+ break;
}
if (*tmp || interval > (365 * 86400))
{
@@ -165,10 +210,16 @@ void main (int argc, char ** argv)
usage ();
}
i_flag = 1;
+ open_flag = EXT2_FLAG_RW;
break;
case 'l':
l_flag = 1;
break;
+ case 'L':
+ new_label = optarg;
+ L_flag = 1;
+ open_flag = EXT2_FLAG_RW;
+ break;
case 'm':
reserved_ratio = strtoul (optarg, &tmp, 0);
if (*tmp || reserved_ratio > 50)
@@ -179,6 +230,12 @@ void main (int argc, char ** argv)
usage ();
}
m_flag = 1;
+ open_flag = EXT2_FLAG_RW;
+ break;
+ case 'M':
+ new_last_mounted = optarg;
+ M_flag = 1;
+ open_flag = EXT2_FLAG_RW;
break;
case 'r':
reserved_blocks = strtoul (optarg, &tmp, 0);
@@ -190,6 +247,7 @@ void main (int argc, char ** argv)
usage ();
}
r_flag = 1;
+ open_flag = EXT2_FLAG_RW;
break;
case 'u':
resuid = strtoul (optarg, &tmp, 0);
@@ -211,20 +269,23 @@ void main (int argc, char ** argv)
usage ();
}
u_flag = 1;
+ open_flag = EXT2_FLAG_RW;
+ break;
+ case 'U':
+ new_UUID = optarg;
+ U_flag = 1;
+ open_flag = EXT2_FLAG_RW;
break;
default:
usage ();
}
if (optind < argc - 1 || optind == argc)
usage ();
- if (!c_flag && !e_flag && !g_flag && !i_flag && !l_flag && !m_flag
- && !r_flag && !u_flag)
- usage ();
+ if (!open_flag && !l_flag)
+ usage();
device_name = argv[optind];
- retval = ext2fs_open (device_name,
- (c_flag || e_flag || g_flag || i_flag || m_flag
- || r_flag || u_flag) ? EXT2_FLAG_RW : 0,
- 0, 0, unix_io_manager, &fs);
+ retval = ext2fs_open (device_name, open_flag, 0, 0,
+ unix_io_manager, &fs);
if (retval)
{
com_err (program_name, retval, "while trying to open %s",
@@ -232,15 +293,20 @@ void main (int argc, char ** argv)
printf("Couldn't find valid filesystem superblock.\n");
exit(1);
}
+ sb = (struct ext2fs_sb *) fs->super;
- if (c_flag)
- {
+ if (c_flag) {
fs->super->s_max_mnt_count = max_mount_count;
ext2fs_mark_super_dirty(fs);
- printf ("Setting maximal mount count to %d\n", max_mount_count);
+ printf ("Setting maximal mount count to %d\n",
+ max_mount_count);
}
- if (e_flag)
- {
+ if (C_flag) {
+ fs->super->s_mnt_count = mount_count;
+ ext2fs_mark_super_dirty(fs);
+ printf ("Setting current mount count to %d\n", mount_count);
+ }
+ if (e_flag) {
fs->super->s_errors = errors;
ext2fs_mark_super_dirty(fs);
printf ("Setting error behavior to %d\n", errors);
@@ -268,7 +334,7 @@ void main (int argc, char ** argv)
fs->super->s_r_blocks_count = (fs->super->s_blocks_count / 100)
* reserved_ratio;
ext2fs_mark_super_dirty(fs);
- printf ("Setting reserved blocks percentage to %lu (%lu blocks)\n",
+ printf ("Setting reserved blocks percentage to %lu (%u blocks)\n",
reserved_ratio, fs->super->s_r_blocks_count);
}
if (r_flag)
@@ -297,6 +363,30 @@ void main (int argc, char ** argv)
"The -u option is not supported by this version -- "
"Recompile with a newer kernel");
#endif
+ if (L_flag) {
+ memset(sb->s_volume_name, 0, sizeof(sb->s_volume_name));
+ strncpy(sb->s_volume_name, new_label,
+ sizeof(sb->s_volume_name));
+ ext2fs_mark_super_dirty(fs);
+ }
+ if (M_flag) {
+ memset(sb->s_last_mounted, 0, sizeof(sb->s_last_mounted));
+ strncpy(sb->s_last_mounted, new_last_mounted,
+ sizeof(sb->s_last_mounted));
+ ext2fs_mark_super_dirty(fs);
+ }
+ if (U_flag) {
+ if (strcasecmp(new_UUID, "null") == 0) {
+ uuid_clear(sb->s_uuid);
+ } else if (strcasecmp(new_UUID, "random") == 0) {
+ uuid_generate(sb->s_uuid);
+ } else if (uuid_parse(new_UUID, sb->s_uuid)) {
+ com_err(program_name, 0, "Invalid UUID format\n");
+ exit(1);
+ }
+ ext2fs_mark_super_dirty(fs);
+ }
+
if (l_flag)
list_super (fs->super);
ext2fs_close (fs);