Add 'make extra-tests' rule and run extra tests.
[libguestfs.git] / generator / generator_bindtests.ml
index adc10dc..4d4795a 100644 (file)
@@ -43,10 +43,6 @@ let rec generate_bindtests () =
 #include \"guestfs-internal-actions.h\"
 #include \"guestfs_protocol.h\"
 
-#define error guestfs_error
-#define safe_calloc guestfs_safe_calloc
-#define safe_malloc guestfs_safe_malloc
-
 static void
 print_strings (char *const *argv)
 {
@@ -93,6 +89,7 @@ print_strings (char *const *argv)
       | Bool n -> pr "  printf (\"%%s\\n\", %s ? \"true\" : \"false\");\n" n
       | Int n -> pr "  printf (\"%%d\\n\", %s);\n" n
       | Int64 n -> pr "  printf (\"%%\" PRIi64 \"\\n\", %s);\n" n
+      | Pointer _ -> assert false
     ) args;
     pr "  /* Java changes stdout line buffering so we need this: */\n";
     pr "  fflush (stdout);\n";
@@ -112,11 +109,17 @@ print_strings (char *const *argv)
              pr "  return 0;\n"
          | RInt _ ->
              pr "  int r;\n";
-             pr "  sscanf (val, \"%%d\", &r);\n";
+             pr "  if (sscanf (val, \"%%d\", &r) != 1) {\n";
+             pr "    error (g, \"%%s: expecting int argument\", \"%s\");\n" name;
+             pr "    return -1;\n";
+             pr "  }\n";
              pr "  return r;\n"
          | RInt64 _ ->
              pr "  int64_t r;\n";
-             pr "  sscanf (val, \"%%\" SCNi64, &r);\n";
+             pr "  if (sscanf (val, \"%%\" SCNi64, &r) != 1) {\n";
+             pr "    error (g, \"%%s: expecting int64 argument\", \"%s\");\n" name;
+             pr "    return -1;\n";
+             pr "  }\n";
              pr "  return r;\n"
          | RBool _ ->
              pr "  return STREQ (val, \"true\");\n"
@@ -132,7 +135,10 @@ print_strings (char *const *argv)
          | RStringList _ ->
              pr "  char **strs;\n";
              pr "  int n, i;\n";
-             pr "  sscanf (val, \"%%d\", &n);\n";
+             pr "  if (sscanf (val, \"%%d\", &n) != 1) {\n";
+             pr "    error (g, \"%%s: expecting int argument\", \"%s\");\n" name;
+             pr "    return NULL;\n";
+             pr "  }\n";
              pr "  strs = safe_malloc (g, (n+1) * sizeof (char *));\n";
              pr "  for (i = 0; i < n; ++i) {\n";
              pr "    strs[i] = safe_malloc (g, 16);\n";
@@ -146,14 +152,22 @@ print_strings (char *const *argv)
              pr "  return r;\n"
          | RStructList (_, typ) ->
              pr "  struct guestfs_%s_list *r;\n" typ;
+             pr "  uint32_t len;\n";
+             pr "  if (sscanf (val, \"%%\" SCNu32, &len) != 1) {\n";
+             pr "    error (g, \"%%s: expecting uint32 argument\", \"%s\");\n" name;
+             pr "    return NULL;\n";
+             pr "  }\n";
              pr "  r = safe_calloc (g, sizeof *r, 1);\n";
-             pr "  sscanf (val, \"%%d\", &r->len);\n";
+             pr "  r->len = len;\n";
              pr "  r->val = safe_calloc (g, r->len, sizeof *r->val);\n";
              pr "  return r;\n"
          | RHashtable _ ->
              pr "  char **strs;\n";
              pr "  int n, i;\n";
-             pr "  sscanf (val, \"%%d\", &n);\n";
+             pr "  if (sscanf (val, \"%%d\", &n) != -1) {\n";
+             pr "    error (g, \"%%s: expecting int argument\", \"%s\");\n" name;
+             pr "    return NULL;\n";
+             pr "  }\n";
              pr "  strs = safe_malloc (g, (n*2+1) * sizeof (*strs));\n";
              pr "  for (i = 0; i < n; ++i) {\n";
              pr "    strs[i*2] = safe_malloc (g, 16);\n";
@@ -287,7 +301,7 @@ g = guestfs.GuestFS ()
     fun f args -> pr "g.%s (%s)\n" f (mkargs args)
   );
 
-  pr "print \"EOF\"\n"
+  pr "print (\"EOF\")\n"
 
 and generate_ruby_bindtests () =
   generate_header HashStyle GPLv2plus;