FAQ Search Today's Posts Mark Forums Read
» Video Reviews

» Linux Archive

Linux-archive is a website aiming to archive linux email lists and to make them easily accessible for linux users/developers.


» Sponsor

» Partners

» Sponsor

Go Back   Linux Archive > Redhat > Cluster Development

 
 
LinkBack Thread Tools
 
Old 06-21-2012, 01:30 PM
Andrew Price
 
Default mkfs.gfs2: Check for symlinks before reporting device contents

(Patch updated to report symlinks similar to Fabio's suggestion)

When using symlinks with mkfs.gfs2 it reports what the symlink points
to instead of the contents of the device, like so:

# ./mkfs.gfs2 -p lock_nolock /dev/vg/test
This will destroy any data on /dev/vg/test.
It appears to contain: symbolic link to `../dm-3'

This patch resolves symlinks before checking the device contents to make
the output more informative:

# ./mkfs.gfs2 -p lock_nolock /dev/vg/test
/dev/vg/test is a symlink to /dev/dm-3
This will destroy any data on /dev/dm-3.
It appears to contain: GFS2 Filesystem (blocksize 4096, lockproto lock_nolock)

Signed-off-by: Andrew Price <anprice@redhat.com>
---
gfs2/mkfs/main_mkfs.c | 35 ++++++++++++++++++++++++++++++++---
1 files changed, 32 insertions(+), 3 deletions(-)

diff --git a/gfs2/mkfs/main_mkfs.c b/gfs2/mkfs/main_mkfs.c
index e6b00a0..957b144 100644
--- a/gfs2/mkfs/main_mkfs.c
+++ b/gfs2/mkfs/main_mkfs.c
@@ -518,19 +518,46 @@ print_results(struct gfs2_sbd *sdp, uint64_t real_device_size,
printf("
");
}

+
+/**
+ * If path is a symlink, return 1 with *abspath pointing to the absolute path,
+ * otherwise return 0. Exit on errors. The caller must free the memory pointed
+ * to by *abspath.
+ */
+static int is_symlink(char *path, char **abspath)
+{
+ struct stat lnkstat;
+
+ if (lstat(path, &lnkstat) == -1) {
+ perror("Failed to lstat the device");
+ exit(EXIT_FAILURE);
+ }
+ if (!S_ISLNK(lnkstat.st_mode)) {
+ return 0;
+ }
+ *abspath = canonicalize_file_name(path);
+ if (*abspath == NULL) {
+ perror(_("Could not find the absolute path of the device"));
+ exit(EXIT_FAILURE);
+ }
+ printf( _("%s is a symlink to %s
"), path, *abspath);
+ return 1;
+}
+
/**
* main_mkfs - do everything
* @argc:
* @argv:
*
*/
-
void main_mkfs(int argc, char *argv[])
{
struct gfs2_sbd sbd, *sdp = &sbd;
int error;
int rgsize_specified = 0;
unsigned char uuid[16];
+ char *absname = NULL;
+ int islnk = 0;

memset(sdp, 0, sizeof(struct gfs2_sbd));
sdp->bsize = -1;
@@ -561,8 +588,10 @@ void main_mkfs(int argc, char *argv[])
}

if (!sdp->override) {
- printf( _("This will destroy any data on %s.
"), sdp->device_name);
- check_dev_content(sdp->device_name);
+ islnk = is_symlink(sdp->device_name, &absname);
+ printf(_("This will destroy any data on %s.
"), islnk ? absname : sdp->device_name);
+ check_dev_content(islnk ? absname : sdp->device_name);
+ free(absname);
are_you_sure();
}

--
1.7.7.6
 

Thread Tools




All times are GMT. The time now is 01:17 AM.

VBulletin, Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.
Content Relevant URLs by vBSEO ©2007, Crawlability, Inc.
Copyright 2007 - 2008, www.linux-archive.org