@ -1,8 +1,11 @@
# include "qemu/osdep.h"
# include "qemu/cutils.h"
# include "qapi/error.h"
# include "qapi/qmp/qdict.h"
# include "qapi/qmp/qerror.h"
# include "qom/object_interfaces.h"
# include "qemu/help_option.h"
# include "qemu/module.h"
# include "qemu/option.h"
# include "qapi/opts-visitor.h"
@ -155,6 +158,64 @@ int user_creatable_add_opts_foreach(void *opaque, QemuOpts *opts, Error **errp)
return 0 ;
}
bool user_creatable_print_help ( const char * type , QemuOpts * opts )
{
ObjectClass * klass ;
if ( is_help_option ( type ) ) {
GSList * l , * list ;
printf ( " List of user creatable objects: \n " ) ;
list = object_class_get_list_sorted ( TYPE_USER_CREATABLE , false ) ;
for ( l = list ; l ! = NULL ; l = l - > next ) {
ObjectClass * oc = OBJECT_CLASS ( l - > data ) ;
printf ( " %s \n " , object_class_get_name ( oc ) ) ;
}
g_slist_free ( list ) ;
return true ;
}
klass = object_class_by_name ( type ) ;
if ( klass & & qemu_opt_has_help_opt ( opts ) ) {
ObjectPropertyIterator iter ;
ObjectProperty * prop ;
GPtrArray * array = g_ptr_array_new ( ) ;
int i ;
object_class_property_iter_init ( & iter , klass ) ;
while ( ( prop = object_property_iter_next ( & iter ) ) ) {
GString * str ;
if ( ! prop - > set ) {
continue ;
}
str = g_string_new ( NULL ) ;
g_string_append_printf ( str , " %s=<%s> " , prop - > name , prop - > type ) ;
if ( prop - > description ) {
if ( str - > len < 24 ) {
g_string_append_printf ( str , " %*s " , 24 - ( int ) str - > len , " " ) ;
}
g_string_append_printf ( str , " - %s " , prop - > description ) ;
}
g_ptr_array_add ( array , g_string_free ( str , false ) ) ;
}
g_ptr_array_sort ( array , ( GCompareFunc ) qemu_pstrcmp0 ) ;
if ( array - > len > 0 ) {
printf ( " %s options: \n " , type ) ;
} else {
printf ( " There are no options for %s. \n " , type ) ;
}
for ( i = 0 ; i < array - > len ; i + + ) {
printf ( " %s \n " , ( char * ) array - > pdata [ i ] ) ;
}
g_ptr_array_set_free_func ( array , g_free ) ;
g_ptr_array_free ( array , true ) ;
return true ;
}
return false ;
}
void user_creatable_del ( const char * id , Error * * errp )
{