On Mon, Jul 11, 2016 at 06:03:39PM +0200, Pino Toscano wrote:
diff --git a/mllib/getopt-c.c b/mllib/getopt-c.c new file mode 100644 index 0000000..e5e832c --- /dev/null +++ b/mllib/getopt-c.c +static void +do_call1 (value funv, value paramv) +{ + CAMLparam2 (funv, paramv); + CAMLlocal1 (rv); + + rv = caml_callback_exn (funv, paramv); + + if (Is_exception_result (rv)) + fprintf (stderr, + "libguestfs: uncaught OCaml exception in getopt callback: %s",
Does this need \n?
+ case 0: + if (STREQ (longopts[option_index].name, "help")) { + show_help (specsv, usage_msgv); + } + /* specv_index set already -- nothing to do. */ + break; + + case 'h': + show_help (specsv, usage_msgv); + break;
Is this right? Several commands (eg. virt-df) take a -h option which isn't for help. The new code seems to be GC-safe as far as I can tell.
+let parse_argv argv specs ?anon_fun usage_msg = + (* Sanity check the input *) + let validate_key key = + if String.length key == 0 || key == "-" || key == "--" + || key.[0] != '-' then + raise (Invalid_argument (sprintf "invalid option key: '%s'" key))
Whereever you've written 'raise (Invalid_argument ...)' you can replace it with 'invalid_arg ...'.
+ let specs = specs @ [ + (* Handled internally by getopt_parse. *) + [ "-h"; "-help"; "--help" ], Unit (fun () -> ()), s_"Display brief help";
As above. Also I think it would be worth adding a check that we don't have duplicate options in the list. Personally I'd still like to see the L/S stuff, but this is certainly a great improvement on what we have currently. Thanks, Rich. -- Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones Read my programming and virtualization blog: http://rwmj.wordpress.com virt-df lists disk usage of guests without needing to install any software inside the virtual machine. Supports Linux and Windows. http://people.redhat.com/~rjones/virt-df/