Currently input such as "1ABC" or "1.1" is parsed (as 1). If there is trailing data on the command line, refuse to accept it. In addition this parses the integer into a C 'long', which is as close as we can get to the OCaml idea of a native int. This prevents the gross rounding error from the earlier code if the integer parameter was larger than 32 bits (on a 64 bit platform), but is still not completely free of rounding problems because the OCaml type is 31 or 63 bits. Probably we should have explicit 'int32' and 'int64' types in the OCaml code, instead of using (native) 'int'. --- mllib/getopt-c.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/mllib/getopt-c.c b/mllib/getopt-c.c index 1f129a7..afb8793 100644 --- a/mllib/getopt-c.c +++ b/mllib/getopt-c.c @@ -247,7 +247,8 @@ guestfs_int_mllib_getopt_parse (value argsv, value specsv, value anon_funv, valu actionv = Field (specv, 1); switch (Tag_val (actionv)) { - int num; + long num; + int nchars; case 0: /* Unit of (unit -> unit) */ v = Field (actionv, 0); @@ -274,7 +275,8 @@ guestfs_int_mllib_getopt_parse (value argsv, value specsv, value anon_funv, valu break; case 5: /* Int of string * (int -> unit) */ - if (sscanf (optarg, "%d", &num) != 1) { + if (sscanf (optarg, "%ld%n", &num, &nchars) < 1 + || optarg[nchars] != '\0') { fprintf (stderr, _("'%s' is not a numeric value.\n"), guestfs_int_program_name); show_error (EXIT_FAILURE); @@ -284,7 +286,8 @@ guestfs_int_mllib_getopt_parse (value argsv, value specsv, value anon_funv, valu break; case 6: /* Set_int of string * int ref */ - if (sscanf (optarg, "%d", &num) != 1) { + if (sscanf (optarg, "%ld%n", &num, &nchars) < 1 + || optarg[nchars] != '\0') { fprintf (stderr, _("'%s' is not a numeric value.\n"), guestfs_int_program_name); show_error (EXIT_FAILURE); -- 2.7.4