Skip site navigation (1)Skip section navigation (2)
Date:      Sun,  8 Dec 2002 14:37:38 +0100 (CET)
From:      "Simon L.Nielsen" <simon@nitro.dk>
To:        FreeBSD-gnats-submit@FreeBSD.org
Subject:   bin/46096: [patch] Make atacontrol(8) give better errors
Message-ID:  <20021208133738.D9B3C10BF90@arthur.nitro.dk>

next in thread | raw e-mail | index | archive | help

>Number:         46096
>Category:       bin
>Synopsis:       [patch] Make atacontrol(8) give better errors
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Sun Dec 08 05:40:01 PST 2002
>Closed-Date:
>Last-Modified:
>Originator:     Simon L. Nielsen <simon@nitro.dk>
>Release:        FreeBSD 4.7-STABLE i386
>Organization:
>Environment:
System: FreeBSD arthur.nitro.dk 4.7-STABLE FreeBSD 4.7-STABLE #0: Sun Dec 8 01:52:44 CET 2002 root@arthur.nitro.dk:/usr/obj/usr/src/sys/ARTHUR i386

>Description:
	This is a patch to make atacontrol(8) tell the user more about what
	the problem was when running atacontrol with incorrect parameters.

	The patch also makes atacontrol use sysexists.h instead of hard-coded
	exist levels.

	Note: The patch is for current, I'm just running stable on my
	workstation.
>How-To-Repeat:
	N/A
>Fix:

--- atacontrol_useage.patch3 begins here ---
Index: atacontrol.c
===================================================================
RCS file: /home/mirror/freebsd/ncvs/src/sbin/atacontrol/atacontrol.c,v
retrieving revision 1.19
diff -u -d -r1.19 atacontrol.c
--- atacontrol.c	16 Sep 2002 08:34:08 -0000	1.19
+++ atacontrol.c	8 Dec 2002 13:14:35 -0000
@@ -37,6 +37,7 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <sysexits.h>
 
 char *
 mode2str(int mode)
@@ -83,8 +84,17 @@
 void
 usage()
 {
-	fprintf(stderr, "usage: atacontrol <command> channel [args]\n");
-	exit(1);
+	fprintf(stderr, "usage: atacontrol attach <channel>\n");
+	fprintf(stderr, "       atacontrol detach <channel>\n");
+	fprintf(stderr, "       atacontrol reinit <channel>\n");
+	fprintf(stderr, "       atacontrol create <type> [interleave] disk0 ... diskN\n");
+	fprintf(stderr, "       atacontrol delete <raid>\n");
+	fprintf(stderr, "       atacontrol status <raid> [mastermode slavemode]\n");
+	fprintf(stderr, "       atacontrol info <channel>\n");
+	fprintf(stderr, "       atacontrol cap <channel> <device>\n");
+	fprintf(stderr, "       atacontrol enclosure <channel> <device>\n");
+	fprintf(stderr, "       atacontrol list\n");
+	exit(EX_USAGE);
 }
 
 int
@@ -266,13 +276,17 @@
 		    !strcmp(argv[1], "status") ||
 		    !strcmp(argv[1], "rebuild")) {
 			if (!(sscanf(argv[2], "%d", &chan) == 1 ||
-			      sscanf(argv[2], "ar%d", &chan) == 1))
-				usage();
+			      sscanf(argv[2], "ar%d", &chan) == 1)) {
+				fprintf(stderr, "atacontrol: Invalid RAID device\n");
+				exit(EX_USAGE);
+			}
 		}
 		else {
 			if (!(sscanf(argv[2], "%d", &chan) == 1 ||
-			      sscanf(argv[2], "ata%d", &chan) == 1))
-				usage();
+			      sscanf(argv[2], "ata%d", &chan) == 1)) {
+				fprintf(stderr, "atacontrol: Invalid ATA channel\n");
+				exit(EX_USAGE);
+			}
 		}
 		iocmd.channel = chan;
 	}
@@ -328,13 +342,20 @@
 			iocmd.u.raid_setup.type = 3;
 		if (!strcmp(argv[2], "SPAN") || !strcmp(argv[2], "JBOD"))
 			iocmd.u.raid_setup.type = 4;
-		if (!iocmd.u.raid_setup.type)
-		     usage();
+		if (!iocmd.u.raid_setup.type) {
+			fprintf(stderr, "atacontrol: Invalid RAID type\n");
+			fprintf(stderr, "atacontrol: Valid RAID types : \n");
+			fprintf(stderr, "            RAID0 | stripe | RAID1 | mirror "
+						    "| RAID0+1 | SPAN | JBOD\n");
+			exit(EX_USAGE);
+		}
 		
 		if (iocmd.u.raid_setup.type & 1) {
 			if (!sscanf(argv[3], "%d",
-				    &iocmd.u.raid_setup.interleave) == 1)
-				usage();
+				    &iocmd.u.raid_setup.interleave) == 1) {
+				fprintf(stderr, "atacontrol: Invalid interleave\n");
+				exit(EX_USAGE);
+			}
 			offset = 4;
 		}
 		else
@@ -342,10 +363,20 @@
 		
 		for (disk = 0; disk < 16 && (offset + disk) < argc; disk++) {
 			if (!(sscanf(argv[offset + disk], "%d", &dev) == 1 ||
-			      sscanf(argv[offset + disk], "ad%d", &dev) == 1))
-				usage();
+			      sscanf(argv[offset + disk], "ad%d", &dev) == 1)) {
+				fprintf(stderr, "atacontrol: Invalid device %s\n",
+					argv[offset + disk]);
+				exit(EX_USAGE);
+			}
 			iocmd.u.raid_setup.disks[disk] = dev;
 		}
+
+		if(disk < 2) {
+			fprintf(stderr, "atacontrol: At least 2 disks must be "
+				"specified to create RAID\n");
+			exit(EX_USAGE);
+		}
+
 		iocmd.u.raid_setup.total_disks = disk;
 		if (ioctl(fd, IOCATA, &iocmd) < 0)
 			err(1, "ioctl(ATARAIDCREATE)");
@@ -427,5 +458,5 @@
 	}
 	else
 	    	usage();
-	exit(0);
+	exit(EX_OK);
 }
--- atacontrol_useage.patch3 ends here ---


>Release-Note:
>Audit-Trail:
>Unformatted:

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20021208133738.D9B3C10BF90>