Also, ...
* src/generator.ml: Add DeviceList type, and propagate that change
out to all calling/interface code.
if (matches == NULL)
return NULL; /* do_aug_match has already sent the error */
if (matches == NULL)
return NULL; /* do_aug_match has already sent the error */
- sort_strings (matches, count_strings (matches));
+ sort_strings (matches, count_strings ((void *) matches));
return matches; /* Caller frees. */
#else
reply_with_error ("%s is not available", __func__);
return matches; /* Caller frees. */
#else
reply_with_error ("%s is not available", __func__);
- r = commandv (&out, &err, argv);
+ r = commandv (&out, &err, (char **) argv);
if (r == -1) {
reply_with_error ("%s: %s", argv[0], err);
if (r == -1) {
reply_with_error ("%s: %s", argv[0], err);
#include "actions.h"
char *
#include "actions.h"
char *
-do_command (char **argv)
+do_command (char *const *argv)
{
char *out, *err;
int r;
{
char *out, *err;
int r;
-do_command_lines (char **argv)
+do_command_lines (char *const *argv)
{
char *out;
char **lines;
{
char *out;
char **lines;
char *
do_sh (const char *command)
{
char *
do_sh (const char *command)
{
- char *argv[] = { "/bin/sh", "-c", command, NULL };
+ const char *argv[] = { "/bin/sh", "-c", command, NULL };
- return do_command (argv);
+ return do_command ((char **) argv);
}
char **
do_sh_lines (const char *command)
{
}
char **
do_sh_lines (const char *command)
{
- char *argv[] = { "/bin/sh", "-c", command, NULL };
+ const char *argv[] = { "/bin/sh", "-c", command, NULL };
- return do_command_lines (argv);
+ return do_command_lines ((char **) argv);
extern int xread (int sock, void *buf, size_t len);
extern int add_string (char ***argv, int *size, int *alloc, const char *str);
extern int xread (int sock, void *buf, size_t len);
extern int add_string (char ***argv, int *size, int *alloc, const char *str);
-extern int count_strings (char * const* const argv);
+extern int count_strings (char *const *argv);
extern void sort_strings (char **argv, int len);
extern void free_strings (char **argv);
extern void free_stringslen (char **argv, int len);
extern void sort_strings (char **argv, int len);
extern void free_strings (char **argv);
extern void free_stringslen (char **argv, int len);
extern int command (char **stdoutput, char **stderror, const char *name, ...);
extern int commandr (char **stdoutput, char **stderror, const char *name, ...);
extern int commandv (char **stdoutput, char **stderror,
extern int command (char **stdoutput, char **stderror, const char *name, ...);
extern int commandr (char **stdoutput, char **stderror, const char *name, ...);
extern int commandv (char **stdoutput, char **stderror,
- char * const* const argv);
extern int commandrv (char **stdoutput, char **stderror,
extern int commandrv (char **stdoutput, char **stderror,
- char * const* const argv);
+ char const* const *argv);
extern char **split_lines (char *str);
extern char **split_lines (char *str);
-do_debug (const char *subcmd MAYBE_UNUSED, char **argv MAYBE_UNUSED)
+do_debug (const char *subcmd MAYBE_UNUSED, char *const *argv MAYBE_UNUSED)
{
#if ENABLE_DEBUG_COMMAND
int argc, i;
{
#if ENABLE_DEBUG_COMMAND
int argc, i;
-count_strings (char * const* const argv)
+count_strings (char *const *argv)
command (char **stdoutput, char **stderror, const char *name, ...)
{
va_list args;
command (char **stdoutput, char **stderror, const char *name, ...)
{
va_list args;
va_start (args, name);
while ((s = va_arg (args, char *)) != NULL) {
va_start (args, name);
while ((s = va_arg (args, char *)) != NULL) {
- p = realloc (argv, sizeof (char *) * (++i));
+ const char **p = realloc (argv, sizeof (char *) * (++i));
if (p == NULL) {
perror ("realloc");
free (argv);
if (p == NULL) {
perror ("realloc");
free (argv);
- r = commandv (stdoutput, stderror, argv);
+ r = commandv (stdoutput, stderror, (char **) argv);
/* NB: Mustn't free the strings which are on the stack. */
free (argv);
/* NB: Mustn't free the strings which are on the stack. */
free (argv);
commandr (char **stdoutput, char **stderror, const char *name, ...)
{
va_list args;
commandr (char **stdoutput, char **stderror, const char *name, ...)
{
va_list args;
va_start (args, name);
while ((s = va_arg (args, char *)) != NULL) {
va_start (args, name);
while ((s = va_arg (args, char *)) != NULL) {
- p = realloc (argv, sizeof (char *) * (++i));
+ const char **p = realloc (argv, sizeof (char *) * (++i));
if (p == NULL) {
perror ("realloc");
free (argv);
if (p == NULL) {
perror ("realloc");
free (argv);
/* Same as 'command', but passing an argv. */
int
/* Same as 'command', but passing an argv. */
int
-commandv (char **stdoutput, char **stderror, char * const* const argv)
+commandv (char **stdoutput, char **stderror, char *const *argv)
- r = commandrv (stdoutput, stderror, argv);
+ r = commandrv (stdoutput, stderror, (void *) argv);
if (r == 0)
return 0;
else
if (r == 0)
return 0;
else
-commandrv (char **stdoutput, char **stderror, char * const* const argv)
+commandrv (char **stdoutput, char **stderror, char const* const *argv)
{
int so_size = 0, se_size = 0;
int so_fd[2], se_fd[2];
{
int so_size = 0, se_size = 0;
int so_fd[2], se_fd[2];
close (so_fd[1]);
close (se_fd[1]);
close (so_fd[1]);
close (se_fd[1]);
- execvp (argv[0], argv);
+ execvp (argv[0], (void *) argv);
perror (argv[0]);
_exit (1);
}
perror (argv[0]);
_exit (1);
}
-do_vgcreate (const char *volgroup, char **physvols)
+do_vgcreate (const char *volgroup, char *const *physvols)
{
char *err;
int r, argc, i;
const char **argv;
{
char *err;
int r, argc, i;
const char **argv;
- /* Check they are devices and also do device name translation. */
- for (i = 0; physvols[i] != NULL; ++i)
- RESOLVE_DEVICE (physvols[i], return -1);
-
argc = count_strings (physvols) + 3;
argv = malloc (sizeof (char *) * (argc + 1));
if (argv == NULL) {
argc = count_strings (physvols) + 3;
argv = malloc (sizeof (char *) * (argc + 1));
if (argv == NULL) {
for (i = 3; i <= argc; ++i)
argv[i] = physvols[i-3];
for (i = 3; i <= argc; ++i)
argv[i] = physvols[i-3];
- r = commandv (NULL, &err, argv);
+ r = commandv (NULL, &err, (char **) argv);
if (r == -1) {
reply_with_error ("%s", err);
free (err);
if (r == -1) {
reply_with_error ("%s", err);
free (err);
-do_vg_activate (int activate, char **volgroups)
+do_vg_activate (int activate, char *const *volgroups)
{
char *err;
int r, i, argc;
{
char *err;
int r, i, argc;
for (i = 4; i <= argc; ++i)
argv[i] = volgroups[i-4];
for (i = 4; i <= argc; ++i)
argv[i] = volgroups[i-4];
- r = commandv (NULL, &err, argv);
+ r = commandv (NULL, &err, (char **) argv);
if (r == -1) {
reply_with_error ("vgchange: %s", err);
free (err);
if (r == -1) {
reply_with_error ("vgchange: %s", err);
free (err);
static int
sfdisk (const char *device, int n, int cyls, int heads, int sectors,
const char *extra_flag,
static int
sfdisk (const char *device, int n, int cyls, int heads, int sectors,
const char *extra_flag,
- char * const* const lines)
{
FILE *fp;
char buf[256];
{
FILE *fp;
char buf[256];
int
do_sfdisk (const char *device, int cyls, int heads, int sectors,
int
do_sfdisk (const char *device, int cyls, int heads, int sectors,
{
return sfdisk (device, 0, cyls, heads, sectors, NULL, lines);
}
{
return sfdisk (device, 0, cyls, heads, sectors, NULL, lines);
}
do_sfdisk_N (const char *device, int n, int cyls, int heads, int sectors,
const char *line)
{
do_sfdisk_N (const char *device, int n, int cyls, int heads, int sectors,
const char *line)
{
- const char *lines[2] = { line, NULL };
+ char const *const lines[2] = { line, NULL };
- return sfdisk (device, n, cyls, heads, sectors, NULL, lines);
+ return sfdisk (device, n, cyls, heads, sectors, NULL, (void *) lines);
-do_sfdiskM (const char *device, char **lines)
+do_sfdiskM (const char *device, char *const *lines)
{
return sfdisk (device, 0, 0, 0, 0, "-uM", lines);
}
{
return sfdisk (device, 0, 0, 0, 0, "-uM", lines);
}
-count_strings (char * const * const argv)
+count_strings (char *const *argv)
-print_strings (char * const * const argv)
+print_strings (char *const *argv)
-print_table (char * const * const argv)
+print_table (char *const *argv)
extern void list_builtin_commands (void);
extern void display_builtin_command (const char *cmd);
extern void free_strings (char **argv);
extern void list_builtin_commands (void);
extern void display_builtin_command (const char *cmd);
extern void free_strings (char **argv);
-extern int count_strings (char * const * const argv);
-extern void print_strings (char * const * const argv);
-extern void print_table (char * const * const argv);
+extern int count_strings (char *const *argv);
+extern void print_strings (char *const *argv);
+extern void print_table (char *const *argv);
extern int launch (guestfs_h *);
extern int is_true (const char *str);
extern char **parse_string_list (const char *str);
extern int launch (guestfs_h *);
extern int is_true (const char *str);
extern char **parse_string_list (const char *str);
| Dev_or_Path of string (* /dev device name or Pathname, cannot be NULL *)
| OptString of string (* const char *name, may be NULL *)
| StringList of string(* list of strings (each string cannot be NULL) *)
| Dev_or_Path of string (* /dev device name or Pathname, cannot be NULL *)
| OptString of string (* const char *name, may be NULL *)
| StringList of string(* list of strings (each string cannot be NULL) *)
+ | DeviceList of string(* list of Device names (each cannot be NULL) *)
| Bool of string (* boolean *)
| Int of string (* int (smallish ints, signed, <= 31 bits) *)
(* These are treated as filenames (simple string parameters) in
| Bool of string (* boolean *)
| Int of string (* int (smallish ints, signed, <= 31 bits) *)
(* These are treated as filenames (simple string parameters) in
where C<device> should usually be a partition name such
as C</dev/sda1>.");
where C<device> should usually be a partition name such
as C</dev/sda1>.");
- ("vgcreate", (RErr, [String "volgroup"; StringList "physvols"]), 40, [],
+ ("vgcreate", (RErr, [String "volgroup"; DeviceList "physvols"]), 40, [],
[InitEmpty, Always, TestOutputList (
[["sfdiskM"; "/dev/sda"; ",100 ,200 ,"];
["pvcreate"; "/dev/sda1"];
[InitEmpty, Always, TestOutputList (
[["sfdiskM"; "/dev/sda"; ",100 ,200 ,"];
["pvcreate"; "/dev/sda1"];
loop 0 xs
let name_of_argt = function
loop 0 xs
let name_of_argt = function
- | Pathname n | Device n | Dev_or_Path n | String n | OptString n | StringList n | Bool n | Int n
+ | Pathname n | Device n | Dev_or_Path n | String n | OptString n
+ | StringList n | DeviceList n | Bool n | Int n
| FileIn n | FileOut n -> n
let java_name_of_struct typ =
| FileIn n | FileOut n -> n
let java_name_of_struct typ =
function
| Pathname n | Device n | Dev_or_Path n | String n -> pr " string %s<>;\n" n
| OptString n -> pr " str *%s;\n" n
function
| Pathname n | Device n | Dev_or_Path n | String n -> pr " string %s<>;\n" n
| OptString n -> pr " str *%s;\n" n
- | StringList n -> pr " str %s<>;\n" n
+ | StringList n | DeviceList n -> pr " str %s<>;\n" n
| Bool n -> pr " bool %s;\n" n
| Int n -> pr " int %s;\n" n
| FileIn _ | FileOut _ -> ()
| Bool n -> pr " bool %s;\n" n
| Int n -> pr " int %s;\n" n
| FileIn _ | FileOut _ -> ()
pr " args.%s = (char *) %s;\n" n n
| OptString n ->
pr " args.%s = %s ? (char **) &%s : NULL;\n" n n n
pr " args.%s = (char *) %s;\n" n n
| OptString n ->
pr " args.%s = %s ? (char **) &%s : NULL;\n" n n n
+ | StringList n | DeviceList n ->
pr " args.%s.%s_val = (char **) %s;\n" n n n;
pr " for (args.%s.%s_len = 0; %s[args.%s.%s_len]; args.%s.%s_len++) ;\n" n n n n n n n;
| Bool n ->
pr " args.%s.%s_val = (char **) %s;\n" n n n;
pr " for (args.%s.%s_len = 0; %s[args.%s.%s_len]; args.%s.%s_len++) ;\n" n n n n n n n;
| Bool n ->
| Pathname n
| String n -> ()
| OptString n -> pr " char *%s;\n" n
| Pathname n
| String n -> ()
| OptString n -> pr " char *%s;\n" n
- | StringList n -> pr " char **%s;\n" n
+ | StringList n | DeviceList n -> pr " char **%s;\n" n
| Bool n -> pr " int %s;\n" n
| Int n -> pr " int %s;\n" n
| FileIn _ | FileOut _ -> ()
| Bool n -> pr " int %s;\n" n
| Int n -> pr " int %s;\n" n
| FileIn _ | FileOut _ -> ()
let pr_args n =
pr " char *%s = args.%s;\n" n n
in
let pr_args n =
pr " char *%s = args.%s;\n" n n
in
+ let pr_list_handling_code n =
+ pr " %s = realloc (args.%s.%s_val,\n" n n n;
+ pr " sizeof (char *) * (args.%s.%s_len+1));\n" n n;
+ pr " if (%s == NULL) {\n" n;
+ pr " reply_with_perror (\"realloc\");\n";
+ pr " goto done;\n";
+ pr " }\n";
+ pr " %s[args.%s.%s_len] = NULL;\n" n n n;
+ pr " args.%s.%s_val = %s;\n" n n n;
+ in
List.iter (
function
| Pathname n ->
List.iter (
function
| Pathname n ->
| String n -> pr_args n
| OptString n -> pr " %s = args.%s ? *args.%s : NULL;\n" n n n
| StringList n ->
| String n -> pr_args n
| OptString n -> pr " %s = args.%s ? *args.%s : NULL;\n" n n n
| StringList n ->
- pr " %s = realloc (args.%s.%s_val,\n" n n n;
- pr " sizeof (char *) * (args.%s.%s_len+1));\n" n n;
- pr " if (%s == NULL) {\n" n;
- pr " reply_with_perror (\"realloc\");\n";
- pr " goto done;\n";
+ pr_list_handling_code n;
+ | DeviceList n ->
+ pr_list_handling_code n;
+ pr " /* Ensure that each is a device,\n";
+ pr " * and perform device name translation. */\n";
+ pr " { int pvi; for (pvi = 0; physvols[pvi] != NULL; ++pvi)\n";
+ pr " RESOLVE_DEVICE (physvols[pvi], goto done);\n";
- pr " %s[args.%s.%s_len] = NULL;\n" n n n;
- pr " args.%s.%s_val = %s;\n" n n n;
| Bool n -> pr " %s = args.%s;\n" n n
| Int n -> pr " %s = args.%s;\n" n n
| FileIn _ | FileOut _ -> ()
| Bool n -> pr " %s = args.%s;\n" n n
| Int n -> pr " %s = args.%s;\n" n n
| FileIn _ | FileOut _ -> ()
(* this is used at least for do_equal *)
if List.exists (function Pathname _ -> true | _ -> false) (snd style) then (
(* Emit NEED_ROOT just once, even when there are two or
(* this is used at least for do_equal *)
if List.exists (function Pathname _ -> true | _ -> false) (snd style) then (
(* Emit NEED_ROOT just once, even when there are two or
fprintf (stderr, \"%%s\\n\", msg);
}
fprintf (stderr, \"%%s\\n\", msg);
}
-static void print_strings (char * const * const argv)
+/* FIXME: nearly identical code appears in fish.c */
+static void print_strings (char const *const *argv)
-static void print_table (char * const * const argv)
+static void print_table (char const *const *argv)
| Int _, _
| Bool _, _
| FileIn _, _ | FileOut _, _ -> ()
| Int _, _
| Bool _, _
| FileIn _, _ | FileOut _, _ -> ()
+ | StringList n, arg | DeviceList n, arg ->
let strs = string_split " " arg in
iteri (
fun i str ->
let strs = string_split " " arg in
iteri (
fun i str ->
pr ", %s" n
| FileIn _, arg | FileOut _, arg ->
pr ", \"%s\"" (c_quote arg)
pr ", %s" n
| FileIn _, arg | FileOut _, arg ->
pr ", \"%s\"" (c_quote arg)
+ | StringList n, _ | DeviceList n, _ ->
pr ", %s" n
| Int _, arg ->
let i =
pr ", %s" n
| Int _, arg ->
let i =
| OptString n
| FileIn n
| FileOut n -> pr " const char *%s;\n" n
| OptString n
| FileIn n
| FileOut n -> pr " const char *%s;\n" n
- | StringList n -> pr " char **%s;\n" n
+ | StringList n | DeviceList n -> pr " char *const *%s;\n" n
| Bool n -> pr " int %s;\n" n
| Int n -> pr " int %s;\n" n
) (snd style);
| Bool n -> pr " int %s;\n" n
| Int n -> pr " int %s;\n" n
) (snd style);
| FileOut name ->
pr " %s = strcmp (argv[%d], \"-\") != 0 ? argv[%d] : \"/dev/stdout\";\n"
name i i
| FileOut name ->
pr " %s = strcmp (argv[%d], \"-\") != 0 ? argv[%d] : \"/dev/stdout\";\n"
name i i
+ | StringList name | DeviceList name ->
pr " %s = parse_string_list (argv[%d]);\n" name i
| Bool name ->
pr " %s = is_true (argv[%d]) ? 1 : 0;\n" name i
pr " %s = parse_string_list (argv[%d]);\n" name i
| Bool name ->
pr " %s = is_true (argv[%d]) ? 1 : 0;\n" name i
function
| Pathname n | Device n | Dev_or_Path n | String n -> pr " %s" n
| OptString n -> pr " %s" n
function
| Pathname n | Device n | Dev_or_Path n | String n -> pr " %s" n
| OptString n -> pr " %s" n
- | StringList n -> pr " '%s ...'" n
+ | StringList n | DeviceList n -> pr " '%s ...'" n
| Bool _ -> pr " true|false"
| Int n -> pr " %s" n
| FileIn n | FileOut n -> pr " (%s|-)" n
| Bool _ -> pr " true|false"
| Int n -> pr " %s" n
| FileIn n | FileOut n -> pr " (%s|-)" n
| OptString n ->
next ();
pr "const char *%s" n
| OptString n ->
next ();
pr "const char *%s" n
+ | StringList n | DeviceList n ->
- if not in_daemon then pr "char * const* const %s" n
- else pr "char **%s" n
| Bool n -> next (); pr "int %s" n
| Int n -> next (); pr "int %s" n
| FileIn n
| Bool n -> next (); pr "int %s" n
| Int n -> next (); pr "int %s" n
| FileIn n
pr " const char *%s =\n" n;
pr " %sv != Val_int (0) ? String_val (Field (%sv, 0)) : NULL;\n"
n n
pr " const char *%s =\n" n;
pr " %sv != Val_int (0) ? String_val (Field (%sv, 0)) : NULL;\n"
n n
+ | StringList n | DeviceList n ->
pr " char **%s = ocaml_guestfs_strings_val (g, %sv);\n" n n
| Bool n ->
pr " int %s = Bool_val (%sv);\n" n n
pr " char **%s = ocaml_guestfs_strings_val (g, %sv);\n" n n
| Bool n ->
pr " int %s = Bool_val (%sv);\n" n n
+ | StringList n | DeviceList n ->
pr " ocaml_guestfs_free_strings (%s);\n" n;
| Pathname _ | Device _ | Dev_or_Path _ | String _ | OptString _ | Bool _ | Int _
| FileIn _ | FileOut _ -> ()
pr " ocaml_guestfs_free_strings (%s);\n" n;
| Pathname _ | Device _ | Dev_or_Path _ | String _ | OptString _ | Bool _ | Int _
| FileIn _ | FileOut _ -> ()
function
| Pathname _ | Device _ | Dev_or_Path _ | String _ | FileIn _ | FileOut _ -> pr "string -> "
| OptString _ -> pr "string option -> "
function
| Pathname _ | Device _ | Dev_or_Path _ | String _ | FileIn _ | FileOut _ -> pr "string -> "
| OptString _ -> pr "string option -> "
- | StringList _ -> pr "string array -> "
+ | StringList _ | DeviceList _ -> pr "string array -> "
| Bool _ -> pr "bool -> "
| Int _ -> pr "int -> "
) (snd style);
| Bool _ -> pr "bool -> "
| Int _ -> pr "int -> "
) (snd style);
* to add 1 to the ST(x) operator.
*)
pr " char *%s = SvOK(ST(%d)) ? SvPV_nolen(ST(%d)) : NULL;\n" n (i+1) (i+1)
* to add 1 to the ST(x) operator.
*)
pr " char *%s = SvOK(ST(%d)) ? SvPV_nolen(ST(%d)) : NULL;\n" n (i+1) (i+1)
- | StringList n -> pr " char **%s;\n" n
+ | StringList n | DeviceList n -> pr " char **%s;\n" n
| Bool n -> pr " int %s;\n" n
| Int n -> pr " int %s;\n" n
) (snd style);
| Bool n -> pr " int %s;\n" n
| Int n -> pr " int %s;\n" n
) (snd style);
function
| Pathname _ | Device _ | Dev_or_Path _ | String _ | OptString _ | Bool _ | Int _
| FileIn _ | FileOut _ -> ()
function
| Pathname _ | Device _ | Dev_or_Path _ | String _ | OptString _ | Bool _ | Int _
| FileIn _ | FileOut _ -> ()
- | StringList n -> pr " free (%s);\n" n
+ | StringList n | DeviceList n -> pr " free (%s);\n" n
| Pathname n | Device n | Dev_or_Path n | String n
| OptString n | Bool n | Int n | FileIn n | FileOut n ->
pr "$%s" n
| Pathname n | Device n | Dev_or_Path n | String n
| OptString n | Bool n | Int n | FileIn n | FileOut n ->
pr "$%s" n
+ | StringList n | DeviceList n ->
pr "\\@%s" n
) (snd style);
pr ");"
pr "\\@%s" n
) (snd style);
pr ");"
}
/* This list should be freed (but not the strings) after use. */
}
/* This list should be freed (but not the strings) after use. */
get_string_list (PyObject *obj)
{
int i, len;
get_string_list (PyObject *obj)
{
int i, len;
| Pathname n | Device n | Dev_or_Path n | String n | FileIn n | FileOut n ->
pr " const char *%s;\n" n
| OptString n -> pr " const char *%s;\n" n
| Pathname n | Device n | Dev_or_Path n | String n | FileIn n | FileOut n ->
pr " const char *%s;\n" n
| OptString n -> pr " const char *%s;\n" n
+ | StringList n | DeviceList n ->
pr " PyObject *py_%s;\n" n;
pr " PyObject *py_%s;\n" n;
- pr " const char **%s;\n" n
| Bool n -> pr " int %s;\n" n
| Int n -> pr " int %s;\n" n
) (snd style);
| Bool n -> pr " int %s;\n" n
| Int n -> pr " int %s;\n" n
) (snd style);
function
| Pathname _ | Device _ | Dev_or_Path _ | String _ | FileIn _ | FileOut _ -> pr "s"
| OptString _ -> pr "z"
function
| Pathname _ | Device _ | Dev_or_Path _ | String _ | FileIn _ | FileOut _ -> pr "s"
| OptString _ -> pr "z"
- | StringList _ -> pr "O"
+ | StringList _ | DeviceList _ -> pr "O"
| Bool _ -> pr "i" (* XXX Python has booleans? *)
| Int _ -> pr "i"
) (snd style);
| Bool _ -> pr "i" (* XXX Python has booleans? *)
| Int _ -> pr "i"
) (snd style);
function
| Pathname n | Device n | Dev_or_Path n | String n | FileIn n | FileOut n -> pr ", &%s" n
| OptString n -> pr ", &%s" n
function
| Pathname n | Device n | Dev_or_Path n | String n | FileIn n | FileOut n -> pr ", &%s" n
| OptString n -> pr ", &%s" n
- | StringList n -> pr ", &py_%s" n
+ | StringList n | DeviceList n -> pr ", &py_%s" n
| Bool n -> pr ", &%s" n
| Int n -> pr ", &%s" n
) (snd style);
| Bool n -> pr ", &%s" n
| Int n -> pr ", &%s" n
) (snd style);
function
| Pathname _ | Device _ | Dev_or_Path _ | String _
| FileIn _ | FileOut _ | OptString _ | Bool _ | Int _ -> ()
function
| Pathname _ | Device _ | Dev_or_Path _ | String _
| FileIn _ | FileOut _ | OptString _ | Bool _ | Int _ -> ()
+ | StringList n | DeviceList n ->
pr " %s = get_string_list (py_%s);\n" n n;
pr " if (!%s) return NULL;\n" n
) (snd style);
pr " %s = get_string_list (py_%s);\n" n n;
pr " if (!%s) return NULL;\n" n
) (snd style);
function
| Pathname _ | Device _ | Dev_or_Path _ | String _
| FileIn _ | FileOut _ | OptString _ | Bool _ | Int _ -> ()
function
| Pathname _ | Device _ | Dev_or_Path _ | String _
| FileIn _ | FileOut _ | OptString _ | Bool _ | Int _ -> ()
+ | StringList n | DeviceList n ->
pr " free (%s);\n" n
) (snd style);
pr " free (%s);\n" n
) (snd style);
pr " \"%s\", \"%s\");\n" n name
| OptString n ->
pr " const char *%s = !NIL_P (%sv) ? StringValueCStr (%sv) : NULL;\n" n n n
pr " \"%s\", \"%s\");\n" n name
| OptString n ->
pr " const char *%s = !NIL_P (%sv) ? StringValueCStr (%sv) : NULL;\n" n n n
+ | StringList n | DeviceList n ->
pr " char **%s;\n" n;
pr " Check_Type (%sv, T_ARRAY);\n" n;
pr " {\n";
pr " char **%s;\n" n;
pr " Check_Type (%sv, T_ARRAY);\n" n;
pr " {\n";
function
| Pathname _ | Device _ | Dev_or_Path _ | String _
| FileIn _ | FileOut _ | OptString _ | Bool _ | Int _ -> ()
function
| Pathname _ | Device _ | Dev_or_Path _ | String _
| FileIn _ | FileOut _ | OptString _ | Bool _ | Int _ -> ()
+ | StringList n | DeviceList n ->
pr " free (%s);\n" n
) (snd style);
pr " free (%s);\n" n
) (snd style);
| FileIn n
| FileOut n ->
pr "String %s" n
| FileIn n
| FileOut n ->
pr "String %s" n
+ | StringList n | DeviceList n ->
pr "String[] %s" n
| Bool n ->
pr "boolean %s" n
pr "String[] %s" n
| Bool n ->
pr "boolean %s" n
| FileIn n
| FileOut n ->
pr ", jstring j%s" n
| FileIn n
| FileOut n ->
pr ", jstring j%s" n
+ | StringList n | DeviceList n ->
pr ", jobjectArray j%s" n
| Bool n ->
pr ", jboolean j%s" n
pr ", jobjectArray j%s" n
| Bool n ->
pr ", jboolean j%s" n
| FileIn n
| FileOut n ->
pr " const char *%s;\n" n
| FileIn n
| FileOut n ->
pr " const char *%s;\n" n
+ | StringList n | DeviceList n ->
pr " int %s_len;\n" n;
pr " const char **%s;\n" n
| Bool n
pr " int %s_len;\n" n;
pr " const char **%s;\n" n
| Bool n
* a NULL parameter.
*)
pr " %s = j%s ? (*env)->GetStringUTFChars (env, j%s, NULL) : NULL;\n" n n n
* a NULL parameter.
*)
pr " %s = j%s ? (*env)->GetStringUTFChars (env, j%s, NULL) : NULL;\n" n n n
+ | StringList n | DeviceList n ->
pr " %s_len = (*env)->GetArrayLength (env, j%s);\n" n n;
pr " %s = guestfs_safe_malloc (g, sizeof (char *) * (%s_len+1));\n" n n;
pr " for (i = 0; i < %s_len; ++i) {\n" n;
pr " %s_len = (*env)->GetArrayLength (env, j%s);\n" n n;
pr " %s = guestfs_safe_malloc (g, sizeof (char *) * (%s_len+1));\n" n n;
pr " for (i = 0; i < %s_len; ++i) {\n" n;
| OptString n ->
pr " if (j%s)\n" n;
pr " (*env)->ReleaseStringUTFChars (env, j%s, %s);\n" n n
| OptString n ->
pr " if (j%s)\n" n;
pr " (*env)->ReleaseStringUTFChars (env, j%s, %s);\n" n n
+ | StringList n | DeviceList n ->
pr " for (i = 0; i < %s_len; ++i) {\n" n;
pr " jobject o = (*env)->GetObjectArrayElement (env, j%s, i);\n"
n;
pr " for (i = 0; i < %s_len; ++i) {\n" n;
pr " jobject o = (*env)->GetObjectArrayElement (env, j%s, i);\n"
n;
| FileOut n
| Pathname n | Device n | Dev_or_Path n | String n -> pr "withCString %s $ \\%s -> " n n
| OptString n -> pr "maybeWith withCString %s $ \\%s -> " n n
| FileOut n
| Pathname n | Device n | Dev_or_Path n | String n -> pr "withCString %s $ \\%s -> " n n
| OptString n -> pr "maybeWith withCString %s $ \\%s -> " n n
- | StringList n -> pr "withMany withCString %s $ \\%s -> withArray0 nullPtr %s $ \\%s -> " n n n n
+ | StringList n | DeviceList n -> pr "withMany withCString %s $ \\%s -> withArray0 nullPtr %s $ \\%s -> " n n n n
| Bool _ | Int _ -> ()
) (snd style);
(* Convert integer arguments. *)
| Bool _ | Int _ -> ()
) (snd style);
(* Convert integer arguments. *)
| Bool n -> sprintf "(fromBool %s)" n
| Int n -> sprintf "(fromIntegral %s)" n
| FileIn n | FileOut n
| Bool n -> sprintf "(fromBool %s)" n
| Int n -> sprintf "(fromIntegral %s)" n
| FileIn n | FileOut n
- | Pathname n | Device n | Dev_or_Path n | String n | OptString n | StringList n -> n
+ | Pathname n | Device n | Dev_or_Path n | String n | OptString n | StringList n | DeviceList n -> n
) (snd style) in
pr "withForeignPtr h (\\p -> c_%s %s)\n" name
(String.concat " " ("p" :: args));
) (snd style) in
pr "withForeignPtr h (\\p -> c_%s %s)\n" name
(String.concat " " ("p" :: args));
(match arg with
| Pathname _ | Device _ | Dev_or_Path _ | String _ -> pr "%s" string
| OptString _ -> if hs then pr "Maybe String" else pr "CString"
(match arg with
| Pathname _ | Device _ | Dev_or_Path _ | String _ -> pr "%s" string
| OptString _ -> if hs then pr "Maybe String" else pr "CString"
- | StringList _ -> if hs then pr "[String]" else pr "Ptr CString"
+ | StringList _ | DeviceList _ -> if hs then pr "[String]" else pr "Ptr CString"
| Bool _ -> pr "%s" bool
| Int _ -> pr "%s" int
| FileIn _ -> pr "%s" string
| Bool _ -> pr "%s" bool
| Int _ -> pr "%s" int
| FileIn _ -> pr "%s" string
| FileIn n
| FileOut n -> pr " printf (\"%%s\\n\", %s);\n" n
| OptString n -> pr " printf (\"%%s\\n\", %s ? %s : \"null\");\n" n n
| FileIn n
| FileOut n -> pr " printf (\"%%s\\n\", %s);\n" n
| OptString n -> pr " printf (\"%%s\\n\", %s ? %s : \"null\");\n" n n
- | StringList n -> pr " print_strings (%s);\n" n
+ | StringList n | DeviceList n -> pr " print_strings (%s);\n" n
| Bool n -> pr " printf (\"%%s\\n\", %s ? \"true\" : \"false\");\n" n
| Int n -> pr " printf (\"%%d\\n\", %s);\n" n
) (snd style);
| Bool n -> pr " printf (\"%%s\\n\", %s ? \"true\" : \"false\");\n" n
| Int n -> pr " printf (\"%%d\\n\", %s);\n" n
) (snd style);