Since 0b69f6f72ce47a37a749b056b6d5ec64c61f11e8 "qapi: remove
qmp_unregister_command()", the command list can be declared const.
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
include/qapi/qmp/dispatch.h | 9 +++++----
monitor/misc.c | 2 +-
monitor/monitor-internal.h | 2 +-
qapi/qmp-dispatch.c | 6 +++---
qapi/qmp-registry.c | 6 +++---
qga/commands.c | 2 +-
qga/main.c | 6 +++---
7 files changed, 17 insertions(+), 16 deletions(-)
diff --git a/include/qapi/qmp/dispatch.h b/include/qapi/qmp/dispatch.h
index 9aa426a398..5a9cf82472 100644
--- a/include/qapi/qmp/dispatch.h
+++ b/include/qapi/qmp/dispatch.h
@@ -39,7 +39,8 @@ typedef QTAILQ_HEAD(QmpCommandList, QmpCommand) QmpCommandList;
void qmp_register_command(QmpCommandList *cmds, const char *name,
QmpCommandFunc *fn, QmpCommandOptions options);
-QmpCommand *qmp_find_command(QmpCommandList *cmds, const char *name);
+const QmpCommand *qmp_find_command(const QmpCommandList *cmds,
+ const char *name);
void qmp_disable_command(QmpCommandList *cmds, const char *name);
void qmp_enable_command(QmpCommandList *cmds, const char *name);
@@ -47,13 +48,13 @@ bool qmp_command_is_enabled(const QmpCommand *cmd);
const char *qmp_command_name(const QmpCommand *cmd);
bool qmp_has_success_response(const QmpCommand *cmd);
QDict *qmp_error_response(Error *err);
-QDict *qmp_dispatch(QmpCommandList *cmds, QObject *request,
+QDict *qmp_dispatch(const QmpCommandList *cmds, QObject *request,
bool allow_oob);
bool qmp_is_oob(const QDict *dict);
-typedef void (*qmp_cmd_callback_fn)(QmpCommand *cmd, void *opaque);
+typedef void (*qmp_cmd_callback_fn)(const QmpCommand *cmd, void *opaque);
-void qmp_for_each_command(QmpCommandList *cmds, qmp_cmd_callback_fn fn,
+void qmp_for_each_command(const QmpCommandList *cmds, qmp_cmd_callback_fn fn,
void *opaque);
#endif
diff --git a/monitor/misc.c b/monitor/misc.c
index 3baa15f3bf..3052bfe8f1 100644
--- a/monitor/misc.c
+++ b/monitor/misc.c
@@ -230,7 +230,7 @@ static void hmp_info_help(Monitor *mon, const QDict *qdict)
help_cmd(mon, "info");
}
-static void query_commands_cb(QmpCommand *cmd, void *opaque)
+static void query_commands_cb(const QmpCommand *cmd, void *opaque)
{
CommandInfoList *info, **list = opaque;
diff --git a/monitor/monitor-internal.h b/monitor/monitor-internal.h
index d78f5ca190..3e7dac5910 100644
--- a/monitor/monitor-internal.h
+++ b/monitor/monitor-internal.h
@@ -132,7 +132,7 @@ typedef struct {
* qmp_capabilities succeeds, we go into command mode, and
* @command becomes &qmp_commands.
*/
- QmpCommandList *commands;
+ const QmpCommandList *commands;
bool capab_offered[QMP_CAPABILITY__MAX]; /* capabilities offered */
bool capab[QMP_CAPABILITY__MAX]; /* offered and accepted */
/*
diff --git a/qapi/qmp-dispatch.c b/qapi/qmp-dispatch.c
index bc264b3c9b..857399c5fe 100644
--- a/qapi/qmp-dispatch.c
+++ b/qapi/qmp-dispatch.c
@@ -75,14 +75,14 @@ static QDict *qmp_dispatch_check_obj(const QObject *request, bool allow_oob,
return dict;
}
-static QObject *do_qmp_dispatch(QmpCommandList *cmds, QObject *request,
+static QObject *do_qmp_dispatch(const QmpCommandList *cmds, QObject *request,
bool allow_oob, Error **errp)
{
Error *local_err = NULL;
bool oob;
const char *command;
QDict *args, *dict;
- QmpCommand *cmd;
+ const QmpCommand *cmd;
QObject *ret = NULL;
dict = qmp_dispatch_check_obj(request, allow_oob, errp);
@@ -164,7 +164,7 @@ bool qmp_is_oob(const QDict *dict)
&& !qdict_haskey(dict, "execute");
}
-QDict *qmp_dispatch(QmpCommandList *cmds, QObject *request,
+QDict *qmp_dispatch(const QmpCommandList *cmds, QObject *request,
bool allow_oob)
{
Error *err = NULL;
diff --git a/qapi/qmp-registry.c b/qapi/qmp-registry.c
index ca00f74795..d0f9a1d3e3 100644
--- a/qapi/qmp-registry.c
+++ b/qapi/qmp-registry.c
@@ -27,7 +27,7 @@ void qmp_register_command(QmpCommandList *cmds, const char *name,
QTAILQ_INSERT_TAIL(cmds, cmd, node);
}
-QmpCommand *qmp_find_command(QmpCommandList *cmds, const char *name)
+const QmpCommand *qmp_find_command(const QmpCommandList *cmds, const char *name)
{
QmpCommand *cmd;
@@ -77,10 +77,10 @@ bool qmp_has_success_response(const QmpCommand *cmd)
return !(cmd->options & QCO_NO_SUCCESS_RESP);
}
-void qmp_for_each_command(QmpCommandList *cmds, qmp_cmd_callback_fn fn,
+void qmp_for_each_command(const QmpCommandList *cmds, qmp_cmd_callback_fn fn,
void *opaque)
{
- QmpCommand *cmd;
+ const QmpCommand *cmd;
QTAILQ_FOREACH(cmd, cmds, node) {
fn(cmd, opaque);
diff --git a/qga/commands.c b/qga/commands.c
index 0c7d1385c2..05e9ab6c3d 100644
--- a/qga/commands.c
+++ b/qga/commands.c
@@ -54,7 +54,7 @@ void qmp_guest_ping(Error **errp)
slog("guest-ping called");
}
-static void qmp_command_info(QmpCommand *cmd, void *opaque)
+static void qmp_command_info(const QmpCommand *cmd, void *opaque)
{
GuestAgentInfo *info = opaque;
GuestAgentCommandInfo *cmd_info;
diff --git a/qga/main.c b/qga/main.c
index c35c2a2120..f23614528e 100644
--- a/qga/main.c
+++ b/qga/main.c
@@ -359,7 +359,7 @@ static gint ga_strcmp(gconstpointer str1, gconstpointer str2)
}
/* disable commands that aren't safe for fsfreeze */
-static void ga_disable_non_whitelisted(QmpCommand *cmd, void *opaque)
+static void ga_disable_non_whitelisted(const QmpCommand *cmd, void *opaque)
{
bool whitelisted = false;
int i = 0;
@@ -378,7 +378,7 @@ static void ga_disable_non_whitelisted(QmpCommand *cmd, void *opaque)
}
/* [re-]enable all commands, except those explicitly blacklisted by user */
-static void ga_enable_non_blacklisted(QmpCommand *cmd, void *opaque)
+static void ga_enable_non_blacklisted(const QmpCommand *cmd, void *opaque)
{
GList *blacklist = opaque;
const char *name = qmp_command_name(cmd);
@@ -918,7 +918,7 @@ int64_t ga_get_fd_handle(GAState *s, Error **errp)
return handle;
}
-static void ga_print_cmd(QmpCommand *cmd, void *opaque)
+static void ga_print_cmd(const QmpCommand *cmd, void *opaque)
{
printf("%s\n", qmp_command_name(cmd));
}
--
2.24.0
On 11/8/19 4:00 PM, Marc-André Lureau wrote:
> Since 0b69f6f72ce47a37a749b056b6d5ec64c61f11e8 "qapi: remove
> qmp_unregister_command()", the command list can be declared const.
>
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> ---
> include/qapi/qmp/dispatch.h | 9 +++++----
> monitor/misc.c | 2 +-
> monitor/monitor-internal.h | 2 +-
> qapi/qmp-dispatch.c | 6 +++---
> qapi/qmp-registry.c | 6 +++---
> qga/commands.c | 2 +-
> qga/main.c | 6 +++---
> 7 files changed, 17 insertions(+), 16 deletions(-)
>
> diff --git a/include/qapi/qmp/dispatch.h b/include/qapi/qmp/dispatch.h
> index 9aa426a398..5a9cf82472 100644
> --- a/include/qapi/qmp/dispatch.h
> +++ b/include/qapi/qmp/dispatch.h
> @@ -39,7 +39,8 @@ typedef QTAILQ_HEAD(QmpCommandList, QmpCommand) QmpCommandList;
>
> void qmp_register_command(QmpCommandList *cmds, const char *name,
> QmpCommandFunc *fn, QmpCommandOptions options);
> -QmpCommand *qmp_find_command(QmpCommandList *cmds, const char *name);
> +const QmpCommand *qmp_find_command(const QmpCommandList *cmds,
> + const char *name);
> void qmp_disable_command(QmpCommandList *cmds, const char *name);
> void qmp_enable_command(QmpCommandList *cmds, const char *name);
>
> @@ -47,13 +48,13 @@ bool qmp_command_is_enabled(const QmpCommand *cmd);
> const char *qmp_command_name(const QmpCommand *cmd);
> bool qmp_has_success_response(const QmpCommand *cmd);
> QDict *qmp_error_response(Error *err);
> -QDict *qmp_dispatch(QmpCommandList *cmds, QObject *request,
> +QDict *qmp_dispatch(const QmpCommandList *cmds, QObject *request,
> bool allow_oob);
> bool qmp_is_oob(const QDict *dict);
>
> -typedef void (*qmp_cmd_callback_fn)(QmpCommand *cmd, void *opaque);
> +typedef void (*qmp_cmd_callback_fn)(const QmpCommand *cmd, void *opaque);
>
> -void qmp_for_each_command(QmpCommandList *cmds, qmp_cmd_callback_fn fn,
> +void qmp_for_each_command(const QmpCommandList *cmds, qmp_cmd_callback_fn fn,
> void *opaque);
>
> #endif
> diff --git a/monitor/misc.c b/monitor/misc.c
> index 3baa15f3bf..3052bfe8f1 100644
> --- a/monitor/misc.c
> +++ b/monitor/misc.c
> @@ -230,7 +230,7 @@ static void hmp_info_help(Monitor *mon, const QDict *qdict)
> help_cmd(mon, "info");
> }
>
> -static void query_commands_cb(QmpCommand *cmd, void *opaque)
> +static void query_commands_cb(const QmpCommand *cmd, void *opaque)
> {
> CommandInfoList *info, **list = opaque;
>
> diff --git a/monitor/monitor-internal.h b/monitor/monitor-internal.h
> index d78f5ca190..3e7dac5910 100644
> --- a/monitor/monitor-internal.h
> +++ b/monitor/monitor-internal.h
> @@ -132,7 +132,7 @@ typedef struct {
> * qmp_capabilities succeeds, we go into command mode, and
> * @command becomes &qmp_commands.
> */
> - QmpCommandList *commands;
> + const QmpCommandList *commands;
> bool capab_offered[QMP_CAPABILITY__MAX]; /* capabilities offered */
> bool capab[QMP_CAPABILITY__MAX]; /* offered and accepted */
> /*
> diff --git a/qapi/qmp-dispatch.c b/qapi/qmp-dispatch.c
> index bc264b3c9b..857399c5fe 100644
> --- a/qapi/qmp-dispatch.c
> +++ b/qapi/qmp-dispatch.c
> @@ -75,14 +75,14 @@ static QDict *qmp_dispatch_check_obj(const QObject *request, bool allow_oob,
> return dict;
> }
>
> -static QObject *do_qmp_dispatch(QmpCommandList *cmds, QObject *request,
> +static QObject *do_qmp_dispatch(const QmpCommandList *cmds, QObject *request,
> bool allow_oob, Error **errp)
> {
> Error *local_err = NULL;
> bool oob;
> const char *command;
> QDict *args, *dict;
> - QmpCommand *cmd;
> + const QmpCommand *cmd;
> QObject *ret = NULL;
>
> dict = qmp_dispatch_check_obj(request, allow_oob, errp);
> @@ -164,7 +164,7 @@ bool qmp_is_oob(const QDict *dict)
> && !qdict_haskey(dict, "execute");
> }
>
> -QDict *qmp_dispatch(QmpCommandList *cmds, QObject *request,
> +QDict *qmp_dispatch(const QmpCommandList *cmds, QObject *request,
> bool allow_oob)
> {
> Error *err = NULL;
> diff --git a/qapi/qmp-registry.c b/qapi/qmp-registry.c
> index ca00f74795..d0f9a1d3e3 100644
> --- a/qapi/qmp-registry.c
> +++ b/qapi/qmp-registry.c
> @@ -27,7 +27,7 @@ void qmp_register_command(QmpCommandList *cmds, const char *name,
> QTAILQ_INSERT_TAIL(cmds, cmd, node);
> }
>
> -QmpCommand *qmp_find_command(QmpCommandList *cmds, const char *name)
> +const QmpCommand *qmp_find_command(const QmpCommandList *cmds, const char *name)
> {
> QmpCommand *cmd;
>
> @@ -77,10 +77,10 @@ bool qmp_has_success_response(const QmpCommand *cmd)
> return !(cmd->options & QCO_NO_SUCCESS_RESP);
> }
>
> -void qmp_for_each_command(QmpCommandList *cmds, qmp_cmd_callback_fn fn,
> +void qmp_for_each_command(const QmpCommandList *cmds, qmp_cmd_callback_fn fn,
> void *opaque)
> {
> - QmpCommand *cmd;
> + const QmpCommand *cmd;
>
> QTAILQ_FOREACH(cmd, cmds, node) {
> fn(cmd, opaque);
> diff --git a/qga/commands.c b/qga/commands.c
> index 0c7d1385c2..05e9ab6c3d 100644
> --- a/qga/commands.c
> +++ b/qga/commands.c
> @@ -54,7 +54,7 @@ void qmp_guest_ping(Error **errp)
> slog("guest-ping called");
> }
>
> -static void qmp_command_info(QmpCommand *cmd, void *opaque)
> +static void qmp_command_info(const QmpCommand *cmd, void *opaque)
> {
> GuestAgentInfo *info = opaque;
> GuestAgentCommandInfo *cmd_info;
> diff --git a/qga/main.c b/qga/main.c
> index c35c2a2120..f23614528e 100644
> --- a/qga/main.c
> +++ b/qga/main.c
> @@ -359,7 +359,7 @@ static gint ga_strcmp(gconstpointer str1, gconstpointer str2)
> }
>
> /* disable commands that aren't safe for fsfreeze */
> -static void ga_disable_non_whitelisted(QmpCommand *cmd, void *opaque)
> +static void ga_disable_non_whitelisted(const QmpCommand *cmd, void *opaque)
> {
> bool whitelisted = false;
> int i = 0;
> @@ -378,7 +378,7 @@ static void ga_disable_non_whitelisted(QmpCommand *cmd, void *opaque)
> }
>
> /* [re-]enable all commands, except those explicitly blacklisted by user */
> -static void ga_enable_non_blacklisted(QmpCommand *cmd, void *opaque)
> +static void ga_enable_non_blacklisted(const QmpCommand *cmd, void *opaque)
> {
> GList *blacklist = opaque;
> const char *name = qmp_command_name(cmd);
> @@ -918,7 +918,7 @@ int64_t ga_get_fd_handle(GAState *s, Error **errp)
> return handle;
> }
>
> -static void ga_print_cmd(QmpCommand *cmd, void *opaque)
> +static void ga_print_cmd(const QmpCommand *cmd, void *opaque)
> {
> printf("%s\n", qmp_command_name(cmd));
> }
>
Reviewed-by: Damien Hedde <damien.hedde@greensocs.com>
Damien
Hi Markus,
Can you review/queue this patch?
thanks
On Fri, Nov 8, 2019 at 5:52 PM Damien Hedde <damien.hedde@greensocs.com> wrote:
>
>
>
> On 11/8/19 4:00 PM, Marc-André Lureau wrote:
> > Since 0b69f6f72ce47a37a749b056b6d5ec64c61f11e8 "qapi: remove
> > qmp_unregister_command()", the command list can be declared const.
> >
> > Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> > ---
> > include/qapi/qmp/dispatch.h | 9 +++++----
> > monitor/misc.c | 2 +-
> > monitor/monitor-internal.h | 2 +-
> > qapi/qmp-dispatch.c | 6 +++---
> > qapi/qmp-registry.c | 6 +++---
> > qga/commands.c | 2 +-
> > qga/main.c | 6 +++---
> > 7 files changed, 17 insertions(+), 16 deletions(-)
> >
> > diff --git a/include/qapi/qmp/dispatch.h b/include/qapi/qmp/dispatch.h
> > index 9aa426a398..5a9cf82472 100644
> > --- a/include/qapi/qmp/dispatch.h
> > +++ b/include/qapi/qmp/dispatch.h
> > @@ -39,7 +39,8 @@ typedef QTAILQ_HEAD(QmpCommandList, QmpCommand) QmpCommandList;
> >
> > void qmp_register_command(QmpCommandList *cmds, const char *name,
> > QmpCommandFunc *fn, QmpCommandOptions options);
> > -QmpCommand *qmp_find_command(QmpCommandList *cmds, const char *name);
> > +const QmpCommand *qmp_find_command(const QmpCommandList *cmds,
> > + const char *name);
> > void qmp_disable_command(QmpCommandList *cmds, const char *name);
> > void qmp_enable_command(QmpCommandList *cmds, const char *name);
> >
> > @@ -47,13 +48,13 @@ bool qmp_command_is_enabled(const QmpCommand *cmd);
> > const char *qmp_command_name(const QmpCommand *cmd);
> > bool qmp_has_success_response(const QmpCommand *cmd);
> > QDict *qmp_error_response(Error *err);
> > -QDict *qmp_dispatch(QmpCommandList *cmds, QObject *request,
> > +QDict *qmp_dispatch(const QmpCommandList *cmds, QObject *request,
> > bool allow_oob);
> > bool qmp_is_oob(const QDict *dict);
> >
> > -typedef void (*qmp_cmd_callback_fn)(QmpCommand *cmd, void *opaque);
> > +typedef void (*qmp_cmd_callback_fn)(const QmpCommand *cmd, void *opaque);
> >
> > -void qmp_for_each_command(QmpCommandList *cmds, qmp_cmd_callback_fn fn,
> > +void qmp_for_each_command(const QmpCommandList *cmds, qmp_cmd_callback_fn fn,
> > void *opaque);
> >
> > #endif
> > diff --git a/monitor/misc.c b/monitor/misc.c
> > index 3baa15f3bf..3052bfe8f1 100644
> > --- a/monitor/misc.c
> > +++ b/monitor/misc.c
> > @@ -230,7 +230,7 @@ static void hmp_info_help(Monitor *mon, const QDict *qdict)
> > help_cmd(mon, "info");
> > }
> >
> > -static void query_commands_cb(QmpCommand *cmd, void *opaque)
> > +static void query_commands_cb(const QmpCommand *cmd, void *opaque)
> > {
> > CommandInfoList *info, **list = opaque;
> >
> > diff --git a/monitor/monitor-internal.h b/monitor/monitor-internal.h
> > index d78f5ca190..3e7dac5910 100644
> > --- a/monitor/monitor-internal.h
> > +++ b/monitor/monitor-internal.h
> > @@ -132,7 +132,7 @@ typedef struct {
> > * qmp_capabilities succeeds, we go into command mode, and
> > * @command becomes &qmp_commands.
> > */
> > - QmpCommandList *commands;
> > + const QmpCommandList *commands;
> > bool capab_offered[QMP_CAPABILITY__MAX]; /* capabilities offered */
> > bool capab[QMP_CAPABILITY__MAX]; /* offered and accepted */
> > /*
> > diff --git a/qapi/qmp-dispatch.c b/qapi/qmp-dispatch.c
> > index bc264b3c9b..857399c5fe 100644
> > --- a/qapi/qmp-dispatch.c
> > +++ b/qapi/qmp-dispatch.c
> > @@ -75,14 +75,14 @@ static QDict *qmp_dispatch_check_obj(const QObject *request, bool allow_oob,
> > return dict;
> > }
> >
> > -static QObject *do_qmp_dispatch(QmpCommandList *cmds, QObject *request,
> > +static QObject *do_qmp_dispatch(const QmpCommandList *cmds, QObject *request,
> > bool allow_oob, Error **errp)
> > {
> > Error *local_err = NULL;
> > bool oob;
> > const char *command;
> > QDict *args, *dict;
> > - QmpCommand *cmd;
> > + const QmpCommand *cmd;
> > QObject *ret = NULL;
> >
> > dict = qmp_dispatch_check_obj(request, allow_oob, errp);
> > @@ -164,7 +164,7 @@ bool qmp_is_oob(const QDict *dict)
> > && !qdict_haskey(dict, "execute");
> > }
> >
> > -QDict *qmp_dispatch(QmpCommandList *cmds, QObject *request,
> > +QDict *qmp_dispatch(const QmpCommandList *cmds, QObject *request,
> > bool allow_oob)
> > {
> > Error *err = NULL;
> > diff --git a/qapi/qmp-registry.c b/qapi/qmp-registry.c
> > index ca00f74795..d0f9a1d3e3 100644
> > --- a/qapi/qmp-registry.c
> > +++ b/qapi/qmp-registry.c
> > @@ -27,7 +27,7 @@ void qmp_register_command(QmpCommandList *cmds, const char *name,
> > QTAILQ_INSERT_TAIL(cmds, cmd, node);
> > }
> >
> > -QmpCommand *qmp_find_command(QmpCommandList *cmds, const char *name)
> > +const QmpCommand *qmp_find_command(const QmpCommandList *cmds, const char *name)
> > {
> > QmpCommand *cmd;
> >
> > @@ -77,10 +77,10 @@ bool qmp_has_success_response(const QmpCommand *cmd)
> > return !(cmd->options & QCO_NO_SUCCESS_RESP);
> > }
> >
> > -void qmp_for_each_command(QmpCommandList *cmds, qmp_cmd_callback_fn fn,
> > +void qmp_for_each_command(const QmpCommandList *cmds, qmp_cmd_callback_fn fn,
> > void *opaque)
> > {
> > - QmpCommand *cmd;
> > + const QmpCommand *cmd;
> >
> > QTAILQ_FOREACH(cmd, cmds, node) {
> > fn(cmd, opaque);
> > diff --git a/qga/commands.c b/qga/commands.c
> > index 0c7d1385c2..05e9ab6c3d 100644
> > --- a/qga/commands.c
> > +++ b/qga/commands.c
> > @@ -54,7 +54,7 @@ void qmp_guest_ping(Error **errp)
> > slog("guest-ping called");
> > }
> >
> > -static void qmp_command_info(QmpCommand *cmd, void *opaque)
> > +static void qmp_command_info(const QmpCommand *cmd, void *opaque)
> > {
> > GuestAgentInfo *info = opaque;
> > GuestAgentCommandInfo *cmd_info;
> > diff --git a/qga/main.c b/qga/main.c
> > index c35c2a2120..f23614528e 100644
> > --- a/qga/main.c
> > +++ b/qga/main.c
> > @@ -359,7 +359,7 @@ static gint ga_strcmp(gconstpointer str1, gconstpointer str2)
> > }
> >
> > /* disable commands that aren't safe for fsfreeze */
> > -static void ga_disable_non_whitelisted(QmpCommand *cmd, void *opaque)
> > +static void ga_disable_non_whitelisted(const QmpCommand *cmd, void *opaque)
> > {
> > bool whitelisted = false;
> > int i = 0;
> > @@ -378,7 +378,7 @@ static void ga_disable_non_whitelisted(QmpCommand *cmd, void *opaque)
> > }
> >
> > /* [re-]enable all commands, except those explicitly blacklisted by user */
> > -static void ga_enable_non_blacklisted(QmpCommand *cmd, void *opaque)
> > +static void ga_enable_non_blacklisted(const QmpCommand *cmd, void *opaque)
> > {
> > GList *blacklist = opaque;
> > const char *name = qmp_command_name(cmd);
> > @@ -918,7 +918,7 @@ int64_t ga_get_fd_handle(GAState *s, Error **errp)
> > return handle;
> > }
> >
> > -static void ga_print_cmd(QmpCommand *cmd, void *opaque)
> > +static void ga_print_cmd(const QmpCommand *cmd, void *opaque)
> > {
> > printf("%s\n", qmp_command_name(cmd));
> > }
> >
>
> Reviewed-by: Damien Hedde <damien.hedde@greensocs.com>
>
> Damien
>
--
Marc-André Lureau
© 2016 - 2026 Red Hat, Inc.