generator: daemon: Implement RStringList (RMountable, _) and RHashtable (RPlainString, RMountable, _).

Implement returning these two types from OCaml daemon functions.
This commit is contained in:
Richard W.M. Jones
2017-07-17 17:07:02 +01:00
parent 9af6ee0d78
commit 984d83ac57
3 changed files with 65 additions and 2 deletions

View File

@@ -151,6 +151,30 @@ guestfs_int_daemon_return_string_mountable (value retv)
}
}
/* Implement RStringList (RMountable, _). */
char **
guestfs_int_daemon_return_string_mountable_list (value retv)
{
CLEANUP_FREE_STRINGSBUF DECLARE_STRINGSBUF (ret);
value v;
char *m;
while (retv != Val_int (0)) {
v = Field (retv, 0);
m = guestfs_int_daemon_return_string_mountable (v);
if (m == NULL)
return NULL;
if (add_string_nodup (&ret, m) == -1)
return NULL;
retv = Field (retv, 1);
}
if (end_stringsbuf (&ret) == -1)
return NULL;
return take_stringsbuf (&ret); /* caller frees */
}
/* Implement RHashtable (RPlainString, RPlainString, _). */
char **
guestfs_int_daemon_return_hashtable_string_string (value retv)
@@ -202,3 +226,31 @@ guestfs_int_daemon_return_hashtable_mountable_string (value retv)
return take_stringsbuf (&ret); /* caller frees */
}
/* Implement RHashtable (RPlainString, RMountable, _). */
char **
guestfs_int_daemon_return_hashtable_string_mountable (value retv)
{
CLEANUP_FREE_STRINGSBUF DECLARE_STRINGSBUF (ret);
value sv, v, mv;
char *m;
while (retv != Val_int (0)) {
v = Field (retv, 0); /* (string, Mountable.t) */
sv = Field (v, 0); /* string */
if (add_string (&ret, String_val (sv)) == -1)
return NULL;
mv = Field (v, 1); /* Mountable.t */
m = guestfs_int_daemon_return_string_mountable (mv);
if (m == NULL)
return NULL;
if (add_string_nodup (&ret, m) == -1)
return NULL;
retv = Field (retv, 1);
}
if (end_stringsbuf (&ret) == -1)
return NULL;
return take_stringsbuf (&ret); /* caller frees */
}

View File

@@ -31,7 +31,9 @@ extern void guestfs_int_daemon_exn_to_reply_with_error (const char *func, value
extern value guestfs_int_daemon_copy_mountable (const mountable_t *mountable);
extern char **guestfs_int_daemon_return_string_list (value retv);
extern char *guestfs_int_daemon_return_string_mountable (value retv);
extern char **guestfs_int_daemon_return_string_mountable_list (value retv);
extern char **guestfs_int_daemon_return_hashtable_string_string (value retv);
extern char **guestfs_int_daemon_return_hashtable_mountable_string (value retv);
extern char **guestfs_int_daemon_return_hashtable_string_mountable (value retv);
#endif /* GUESTFSD_DAEMON_C_H */

View File

@@ -761,9 +761,13 @@ let generate_daemon_caml_stubs () =
pr " char *ret =\n";
pr " guestfs_int_daemon_return_string_mountable (retv);\n";
pr " CAMLreturnT (char *, ret); /* caller frees */\n"
| RStringList _ ->
| RStringList ((RPlainString|RDevice), _) ->
pr " char **ret = guestfs_int_daemon_return_string_list (retv);\n";
pr " CAMLreturnT (char **, ret); /* caller frees */\n"
| RStringList (RMountable, _) ->
pr " char **ret =\n";
pr " guestfs_int_daemon_return_string_mountable_list (retv);\n";
pr " CAMLreturnT (char **, ret); /* caller frees */\n"
| RStruct (_, typ) ->
pr " guestfs_int_%s *ret =\n" typ;
pr " return_%s (retv);\n" typ;
@@ -774,7 +778,8 @@ let generate_daemon_caml_stubs () =
pr " return_%s_list (retv);\n" typ;
pr " /* caller frees */\n";
pr " CAMLreturnT (guestfs_int_%s_list *, ret);\n" typ
| RHashtable (RPlainString, RPlainString, _) ->
| RHashtable (RPlainString, RPlainString, _)
| RHashtable (RPlainString, RDevice, _) ->
pr " char **ret =\n";
pr " guestfs_int_daemon_return_hashtable_string_string (retv);\n";
pr " CAMLreturnT (char **, ret); /* caller frees */\n"
@@ -782,6 +787,10 @@ let generate_daemon_caml_stubs () =
pr " char **ret =\n";
pr " guestfs_int_daemon_return_hashtable_mountable_string (retv);\n";
pr " CAMLreturnT (char **, ret); /* caller frees */\n"
| RHashtable (RPlainString, RMountable, _) ->
pr " char **ret =\n";
pr " guestfs_int_daemon_return_hashtable_string_mountable (retv);\n";
pr " CAMLreturnT (char **, ret); /* caller frees */\n"
| RHashtable _ -> assert false
| RBufferOut _ -> assert false
);