[parted-devel] partprobe: add long options, and a bug fix;
ACK requested
Jim Meyering
jim at meyering.net
Mon Mar 5 14:17:48 CET 2007
GNU programs should accept --help and --version options,
if for no other reason than not to "surprise" the user,
especially ones like partprobe that try to do low-level
things with disks even when given an unrecognized option.
With the change below, partprobe --unrecognized-option will
fail immediately rather than trying to probe all partitions.
Also, there was a bug:
partprobe /dev/bad /dev/bad2 /dev/ok
would exit successfully for the above, not reflecting errors
on the first two partitions. Now it exits nonzero if process_dev
fails for any device, not just for the last one.
Here's the new --help:
$ ./partprobe --help
Usage: partprobe [OPTION] [DEVICE]...
Inform the OS of partition table changes.
-d, --no-update don't update the kernel
-s, --summary print a summary of contents
-h, --help display this help and exit
-v, --version output version information and exit
With no DEVICE, probe all partitions.
Report bugs to <bug-parted at gnu.org>.
-------------------------------------------------------------------------------
partprobe-help-version
-------------------------------------------------------------------------------
Make partprobe accept --help and --version options.
Add long options: --no-update (same as existing -d), and
--summary (same as existing -s).
* partprobe/partprobe.c
Include configmake.h, getopt.h, and NLS-related things.
(main): Rewrite option handling.
Along the way, fix a bug whereby "partprobe DEV1 DEV2 ... DEVN" would
exit successfully whenever process_dev (DEVN) returns nonzero, even
when that function fails for each of the preceding devices.
---
partprobe/partprobe.c | 127 +++++++++++++++++++++++++++++++------------------
1 files changed, 81 insertions(+), 46 deletions(-)
diff --git a/partprobe/partprobe.c b/partprobe/partprobe.c
index 9a26e9a..78257d4 100644
--- a/partprobe/partprobe.c
+++ b/partprobe/partprobe.c
@@ -31,16 +31,40 @@
#include <stdio.h>
#include <string.h>
+#include <getopt.h>
#include "closeout.h"
+#include "configmake.h"
#include "version-etc.h"
+#include <locale.h>
+#include "gettext.h"
+#if ! ENABLE_NLS
+# undef textdomain
+# define textdomain(Domainname) /* empty */
+# undef bindtextdomain
+# define bindtextdomain(Domainname, Dirname) /* empty */
+#endif
+
+#undef _
+#define _(msgid) gettext (msgid)
+
#define AUTHORS \
"<http://parted.alioth.debian.org/cgi-bin/trac.cgi/browser/AUTHORS>"
/* The official name of this program (e.g., no `g' prefix). */
#define PROGRAM_NAME "partprobe"
+static struct option const long_options[] =
+ {
+ {"no-update", no_argument, NULL, 'd'},
+ {"summary", no_argument, NULL, 's'},
+ {"help", no_argument, NULL, 'h'},
+ {"version", no_argument, NULL, 'v'},
+ {NULL, 0, NULL, 0}
+ };
+
+
char *program_name;
/* initialized to 0 according to the language lawyers */
@@ -106,70 +130,81 @@ error:
return 0;
}
-static void
-help ()
-{
- printf ("usage: %s [-d] [-h] [-s] [-v] [DEVICES...]\n\n"
- "-d don't update the kernel\n"
- "-s print a summary of contents\n"
- "-v version info\n", PROGRAM_NAME);
-}
-
-static void
-version ()
+void
+usage (int status)
{
- version_etc (stdout, PROGRAM_NAME, PACKAGE_NAME, VERSION, AUTHORS,
- (char *) NULL);
+ if (status != EXIT_SUCCESS)
+ fprintf (stderr, _("Try `%s --help' for more information.\n"),
+ program_name);
+ else
+ {
+ printf (_("Usage: %s [OPTION] [DEVICE]...\n"), PROGRAM_NAME);
+ fputs (_("\
+Inform the OS of partition table changes.\n\
+\n\
+ -d, --no-update don't update the kernel\n\
+ -s, --summary print a summary of contents\n\
+ -h, --help display this help and exit\n\
+ -v, --version output version information and exit\n\
+"), stdout);
+ fputs (_("\
+\n\
+With no DEVICE, probe all partitions.\n\
+"), stdout);
+ printf (_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT);
+ }
+ exit (status);
}
int
main (int argc, char* argv[])
{
- int dev_passed = 0;
- int i;
- PedDevice* dev;
- int status = 1;
+ int status = 0;
program_name = argv[0];
atexit (close_stdout);
- for (i = 1; i < argc; i++) {
- if (argv[i][0] != '-') {
- dev_passed = 1;
- continue;
- }
- switch (argv[i][1]) {
- case '?':
- case 'h':
- help();
- return 0;
+ int c;
+ while ((c = getopt_long (argc, argv, "dhsv", long_options, NULL)) != -1)
+ switch (c) {
+ case 'd':
+ opt_no_probe = 1;
+ break;
- case 'd': opt_no_probe = 1; break;
- case 's': opt_summary = 1; break;
+ case 's':
+ opt_summary = 1;
+ break;
- case 'v':
- version();
- return 0;
- }
- }
-
- if (dev_passed) {
- for (i = 1; i < argc; i++) {
- if (argv[i][0] == '-')
- continue;
+ case 'h':
+ usage (EXIT_SUCCESS);
+ break;
- dev = ped_device_get (argv[i]);
- if (dev)
- status &= process_dev (dev);
- else
- status = 0;
+ case 'v':
+ version_etc (stdout, PROGRAM_NAME, PACKAGE_NAME,
+ VERSION, AUTHORS, (char *) NULL);
+ exit (EXIT_SUCCESS);
+ break;
+
+ default:
+ usage (EXIT_FAILURE);
+ }
+
+ int n_dev = argc - optind;
+ if (n_dev != 0) {
+ int i;
+ for (i = optind; i < argc; i++) {
+ PedDevice *dev = ped_device_get (argv[i]);
+ if (dev == NULL || process_dev (dev) == 0)
+ status = 1;
}
} else {
ped_device_probe_all ();
+ PedDevice *dev;
for (dev = ped_device_get_next (NULL); dev;
dev = ped_device_get_next (dev))
- status &= process_dev (dev);
+ if (process_dev (dev) == 0)
+ status = 1;
}
- return !status;
+ return status;
}
More information about the parted-devel
mailing list