From: Andrew Price <anprice@redhat.com>
To: cluster-devel.redhat.com
Subject: [Cluster-devel] tunegfs2: Fix usage and ensure we don't try to open a null device
Date: Thu, 14 Jul 2011 11:52:12 +0100 [thread overview]
Message-ID: <4E1ECA5C.7000400@redhat.com> (raw)
In-Reply-To: <1310638990.2761.6.camel@menhir>
Hi Steve,
This looks good to me. For consistency, should we start using sysexits.h
values throughout gfs2-utils?
Andy
On 14/07/11 11:23, Steven Whitehouse wrote:
>
> This is designed to address Red Hat bz #719124 and #719126
>
> The help message is updated to include all supported options.
> Also, the return codes are now taken from sysexits.h rather
> than trying to pass negative errno values as per kernel
> code. There is not an exact error code for all potential
> events, but they are close enough I think.
>
> The code also checks that there is exactly one non-option
> argument (i.e. the device) given before attempting to open
> it.
>
> Signed-off-by: Steven Whitehouse<swhiteho@redhat.com>
> Reported-by: Nathan Straz<nstraz@redhat.com>
>
> diff --git a/gfs2/tune/main.c b/gfs2/tune/main.c
> index 48fd59f..6a0daff 100644
> --- a/gfs2/tune/main.c
> +++ b/gfs2/tune/main.c
> @@ -1,6 +1,7 @@
> #include<stdio.h>
> #include<stdlib.h>
> #include<libgen.h>
> +#include<sysexits.h>
>
> #include<sys/types.h>
> #include<sys/stat.h>
> @@ -51,8 +52,8 @@ void parse_mount_options(char *arg)
>
> static void usage(char *name)
> {
> - printf("Usage: %s -L<volume label> -U<UUID> -l -o "
> - "<mount options> <device> \n", basename(name));
> + printf("Usage: %s [-hlV] [-L<volume_label>] [-U<UUID>]\n\t"
> + "[-o<mount_options>]<device> \n", basename(name));
> }
>
> static void version(void)
> @@ -62,14 +63,14 @@ static void version(void)
>
> int main(int argc, char **argv)
> {
> - int c, status = 0;
> + int c, status;
>
> memset(tfs, 0, sizeof(struct tunegfs2));
> while((c = getopt(argc, argv, "hL:U:lo:V")) != -1) {
> switch(c) {
> case 'h':
> usage(argv[0]);
> - break;
> + return 0;
> case 'L':
> tfs->opt_label = 1;
> tfs->label = optarg;
> @@ -86,23 +87,27 @@ int main(int argc, char **argv)
> break;
> case 'V':
> version();
> - break;
> + return 0;
> default:
> fprintf(stderr, _("Invalid option.\n"));
> usage(argv[0]);
> - status = -EINVAL;
> - goto out;
> + return EX_USAGE;
> }
> }
>
> + if ((argc - optind) != 1) {
> + fprintf(stderr, _("Incorrect number of arguments\n"));
> + usage(argv[0]);
> + return EX_USAGE;
> + }
> +
> tfs->devicename = argv[optind];
> tfs->fd = open(tfs->devicename, O_RDWR);
>
> if (tfs->fd< 0) {
> fprintf(stderr, _("Unable to open device %s\n"),
> tfs->devicename);
> - status = -EIO;
> - goto out;
> + return EX_IOERR;
> }
>
> status = read_super(tfs);
> diff --git a/gfs2/tune/super.c b/gfs2/tune/super.c
> index 056e868..9d67054 100644
> --- a/gfs2/tune/super.c
> +++ b/gfs2/tune/super.c
> @@ -1,6 +1,6 @@
> #include<stdio.h>
> #include<stdlib.h>
> -
> +#include<sysexits.h>
> #include<sys/types.h>
> #include<sys/stat.h>
> #include<errno.h>
> @@ -63,7 +63,7 @@ static int str2uuid(const char *newval, char *uuid)
>
> if (strlen(newval) != 36) {
> fprintf(stderr, _("Invalid UUID specified.\n"));
> - return -EINVAL;
> + return EX_DATAERR;
> }
>
> cp = uuid;
> @@ -74,13 +74,13 @@ static int str2uuid(const char *newval, char *uuid)
> continue;
> fprintf(stderr, _("uuid %s has an invalid format."),
> newval);
> - return -EINVAL;
> + return EX_DATAERR;
> }
> if (!isxdigit(newval[i])) {
> fprintf(stderr, _("uuid %s has an invalid hex "
> "digit '%c' at offset %d.\n"),
> newval, newval[i], i + 1);
> - return -EINVAL;
> + return EX_DATAERR;
> }
> *cp = str_to_hexchar(&newval[i++]);
> cp++;
> @@ -96,13 +96,13 @@ int read_super(struct tunegfs2 *tfs)
> block = malloc(sizeof(char) * GFS2_DEFAULT_BSIZE);
> n = pread(tfs->fd, block, GFS2_DEFAULT_BSIZE, tfs->sb_start);
> if (n< 0) {
> - fprintf(stderr, _("Error reading from device"));
> - return errno;
> + perror("read_super: pread");
> + return EX_IOERR;
> }
> tfs->sb = block;
> if (be32_to_cpu(tfs->sb->sb_header.mh_magic) != GFS2_MAGIC) {
> fprintf(stderr, _("Not a GFS/GFS2 device\n"));
> - return -EINVAL;
> + return EX_IOERR;
> }
> return 0;
> }
> @@ -144,9 +144,9 @@ int write_super(const struct tunegfs2 *tfs)
> {
> int n;
> n = pwrite(tfs->fd, tfs->sb, GFS2_DEFAULT_BSIZE, tfs->sb_start);
> - if (n<0) {
> - fprintf(stderr, _("Unable to write super block\n"));
> - return -errno;
> + if (n< 0) {
> + perror("write_super: pwrite");
> + return EX_IOERR;
> }
> return 0;
> }
> @@ -164,7 +164,7 @@ int change_label(struct tunegfs2 *tfs, const char *fsname)
> }
> if (fsname_len< l) {
> fprintf(stderr, _("Label too long\n"));
> - return -E2BIG;
> + return EX_DATAERR;
> }
> memset(sb_fsname, '\0', fsname_len);
> memcpy(sb_fsname, fsname, l);
> @@ -178,7 +178,7 @@ int change_uuid(struct tunegfs2 *tfs, const char *str)
> if (be32_to_cpu(tfs->sb->sb_header.mh_magic) != GFS2_MAGIC) {
> fprintf(stderr, _("UUID can be changed for a GFS2"));
> fprintf(stderr, _(" device only\n"));
> - return -EINVAL;
> + return EX_IOERR;
> }
> status = str2uuid(str, uuid);
> if (!status)
> @@ -193,7 +193,7 @@ int change_lockproto(struct tunegfs2 *tfs, const char *lockproto)
> if (strncmp(lockproto, "lock_dlm", 8)
> && strncmp(lockproto, "lock_nolock", 11)) {
> fprintf(stderr, _("Incorrect lock protocol specified\n"));
> - return -EINVAL;
> + return EX_DATAERR;
> }
> memset(tfs->sb->sb_lockproto, '\0', GFS2_LOCKNAME_LEN);
> strncpy(tfs->sb->sb_lockproto, lockproto, l);
> @@ -220,7 +220,7 @@ int change_locktable(struct tunegfs2 *tfs, const char *locktable)
>
> if (l> GFS2_LOCKNAME_LEN - fsname_len - 1) {
> fprintf(stderr, _("Lock table name too big\n"));
> - return -E2BIG;
> + return EX_DATAERR;
> }
> memset(t_fsname, '\0', GFS2_LOCKNAME_LEN);
> strncpy(t_fsname, sb_fsname, fsname_len);
>
>
next prev parent reply other threads:[~2011-07-14 10:52 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-07-14 10:23 [Cluster-devel] tunegfs2: Fix usage and ensure we don't try to open a null device Steven Whitehouse
2011-07-14 10:52 ` Andrew Price [this message]
2011-07-14 11:18 ` Steven Whitehouse
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4E1ECA5C.7000400@redhat.com \
--to=anprice@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).