diff options
author | Theodore Ts'o <tytso@mit.edu> | 2014-04-26 18:42:31 -0400 |
---|---|---|
committer | Theodore Ts'o <tytso@mit.edu> | 2014-05-04 22:22:45 -0400 |
commit | dbcd617882ee5c9da80d9257475f2594352f6698 (patch) | |
tree | 39e064f6f7fb1db2370b73de32dd4213b450466b | |
parent | f83f4132e192dee197240fdfa062128b52188d1c (diff) | |
download | e2fsprogs-dbcd617882ee5c9da80d9257475f2594352f6698.tar.gz |
mke2fs: check for pre-existing file system
Warn the system administrator if there is an existing file system on
the block device, and give the administrator an opportunity to abort
the mkfs operation.
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
-rw-r--r-- | misc/mke2fs.c | 9 | ||||
-rw-r--r-- | misc/util.c | 29 | ||||
-rw-r--r-- | misc/util.h | 1 |
3 files changed, 36 insertions, 3 deletions
diff --git a/misc/mke2fs.c b/misc/mke2fs.c index 6b099e10..97b601f9 100644 --- a/misc/mke2fs.c +++ b/misc/mke2fs.c @@ -1375,7 +1375,7 @@ out: static void PRS(int argc, char *argv[]) { - int b, c; + int b, c, flags; int cluster_size = 0; char *tmp, **cpp; int blocksize = 0; @@ -1753,8 +1753,11 @@ profile_error: profile_get_integer(profile, "options", "proceed_delay", 0, 0, &proceed_delay); - if (!check_plausibility(device_name, CREATE_FILE, - &is_device) && !force) + /* The isatty() test is so we don't break existing scripts */ + flags = CREATE_FILE; + if (isatty(0) && isatty(1)) + flags |= CHECK_FS_EXIST; + if (!check_plausibility(device_name, flags, &is_device) && !force) proceed_question(proceed_delay); check_mount(device_name, force, _("filesystem")); diff --git a/misc/util.c b/misc/util.c index afb0058c..be16ebeb 100644 --- a/misc/util.c +++ b/misc/util.c @@ -113,6 +113,9 @@ int check_plausibility(const char *device, int flags, int *ret_is_dev) int fd, is_dev = 0; ext2fs_struct_stat s; int fl = O_RDONLY; + blkid_cache cache = NULL; + char *fs_type = NULL; + char *fs_label = NULL; if (flags & CREATE_FILE) fl |= O_CREAT; @@ -148,6 +151,32 @@ int check_plausibility(const char *device, int flags, int *ret_is_dev) return 0; } + if ((flags & CHECK_FS_EXIST) && blkid_get_cache(&cache, NULL) >= 0) { + fs_type = blkid_get_tag_value(cache, "TYPE", device); + if (fs_type) + fs_label = blkid_get_tag_value(cache, "LABEL", device); + blkid_put_cache(cache); + } + + if (fs_type) { + if (fs_label) + printf(_("%s contains a %s file system " + "labelled '%s'\n"), device, fs_type, fs_label); + else + printf(_("%s contains a %s file system\n"), device, + fs_type); + free(fs_type); + free(fs_label); + return 0; + } + + /* + * We should eventually replace this with a test for the + * presence of a partition table. Unfortunately the blkid + * library doesn't test for partition tabels, and checking for + * valid GPT and MBR and possibly others isn't quite trivial. + */ + #ifdef HAVE_LINUX_MAJOR_H #ifndef MAJOR #define MAJOR(dev) ((dev)>>8) diff --git a/misc/util.h b/misc/util.h index 9de3fbf6..745568e2 100644 --- a/misc/util.h +++ b/misc/util.h @@ -20,6 +20,7 @@ extern char *journal_location_string; */ #define CHECK_BLOCK_DEV 0x0001 #define CREATE_FILE 0x0002 +#define CHECK_FS_EXIST 0x0004 #ifndef HAVE_STRCASECMP extern int strcasecmp (char *s1, char *s2); |