From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:42965) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZUfzC-0008R3-GZ for qemu-devel@nongnu.org; Wed, 26 Aug 2015 15:03:51 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ZUfz9-0006KM-AZ for qemu-devel@nongnu.org; Wed, 26 Aug 2015 15:03:50 -0400 Received: from mx4-phx2.redhat.com ([209.132.183.25]:44036) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZUfz9-0006K8-2X for qemu-devel@nongnu.org; Wed, 26 Aug 2015 15:03:47 -0400 Date: Wed, 26 Aug 2015 15:03:43 -0400 (EDT) From: =?utf-8?Q?Marc-Andr=C3=A9?= Lureau Message-ID: <1151210754.1699404.1440615823881.JavaMail.zimbra@redhat.com> In-Reply-To: <55DE0CE3.90208@parallels.com> References: <1440583525-21632-1-git-send-email-marcandre.lureau@redhat.com> <1440583525-21632-12-git-send-email-marcandre.lureau@redhat.com> <55DE0CE3.90208@parallels.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Subject: Re: [Qemu-devel] [PATCH v3 11/12] qga: add --dump-conf option List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: "Denis V. Lunev" Cc: marcandre lureau , qemu-devel@nongnu.org, mdroth@linux.vnet.ibm.com ----- Original Message ----- > On 08/26/2015 01:05 PM, marcandre.lureau@redhat.com wrote: > > From: Marc-Andr=C3=A9 Lureau > > > > This new option allows to review the agent configuration, > > and ease the task of writing a configuration file. > > > > Signed-off-by: Marc-Andr=C3=A9 Lureau > > Reviewed-by: Michael Roth > > --- > > qga/main.c | 62 > > ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > > 1 file changed, 62 insertions(+) > > > > diff --git a/qga/main.c b/qga/main.c > > index 9193043..72dc366 100644 > > --- a/qga/main.c > > +++ b/qga/main.c > > @@ -941,6 +941,7 @@ typedef struct GAConfig { > > GList *blacklist; > > int daemonize; > > GLogLevelFlags log_level; > > + int dumpconf; > > } GAConfig; > > =20 > > static void config_load(GAConfig *config) > > @@ -1009,6 +1010,58 @@ end: > > g_clear_error(&gerr); > > } > > =20 > > +static gchar *list_join(GList *list, const gchar separator) > > +{ > > + GString *str =3D g_string_new(""); > > + > > + while (list) { > > + str =3D g_string_append(str, (gchar *)list->data); > > + list =3D g_list_next(list); > > + if (list) { > > + str =3D g_string_append_c(str, separator); > > + } > > + } > > + > > + return g_string_free(str, FALSE); > > +} > > + > > +static void config_dump(GAConfig *config) > > +{ > > + GError *error =3D NULL; > > + GKeyFile *keyfile; > > + gchar *tmp; > > + > > + keyfile =3D g_key_file_new(); > keyfile =3D=3D NULL either means error and you should > immediately return as I am not quite sure that calls > below will survive let's add an assert() there. > Thus the check below for keyfile =3D=3D NULL is extra > and could be dropped. If these functions are OK > with NULL then free will be also fine too and check > is not needed too. ok >=20 > > + g_key_file_set_boolean(keyfile, "general", "daemon", > > config->daemonize); > > + g_key_file_set_string(keyfile, "general", "method", config->method= ); > > + g_key_file_set_string(keyfile, "general", "path", > > config->channel_path); > > + if (config->log_filepath) { > > + g_key_file_set_string(keyfile, "general", "logfile", > > + config->log_filepath); > > + } > > + g_key_file_set_string(keyfile, "general", "pidfile", > > config->pid_filepath); > > +#ifdef CONFIG_FSFREEZE > > + if (config->fsfreeze_hook) { > > + g_key_file_set_string(keyfile, "general", "fsfreeze-hook", > > + config->fsfreeze_hook); > > + } > > +#endif > > + g_key_file_set_string(keyfile, "general", "statedir", > > config->state_dir); > > + g_key_file_set_boolean(keyfile, "general", "verbose", > > + config->log_level =3D=3D G_LOG_LEVEL_MASK); > > + tmp =3D list_join(config->blacklist, ','); > > + g_key_file_set_string(keyfile, "general", "blacklist", tmp); > > + g_free(tmp); > > + > > + tmp =3D g_key_file_to_data(keyfile, NULL, &error); > > + printf("%s", tmp); > > + > > + g_free(tmp); > > + if (keyfile) { > > + g_key_file_free(keyfile); > > + } > > +} > > + > > static void config_parse(GAConfig *config, int argc, char **argv) > > { > > const char *sopt =3D "hVvdm:p:l:f:F::b:s:t:D"; > > @@ -1016,6 +1069,7 @@ static void config_parse(GAConfig *config, int ar= gc, > > char **argv) > > const struct option lopt[] =3D { > > { "help", 0, NULL, 'h' }, > > { "version", 0, NULL, 'V' }, > > + { "dump-conf", 0, NULL, 'D' }, > > { "logfile", 1, NULL, 'l' }, > > { "pidfile", 1, NULL, 'f' }, > > #ifdef CONFIG_FSFREEZE > > @@ -1067,6 +1121,9 @@ static void config_parse(GAConfig *config, int ar= gc, > > char **argv) > > case 'd': > > config->daemonize =3D 1; > > break; > > + case 'D': > > + config->dumpconf =3D 1; > > + break; > > case 'b': { > > if (is_help_option(optarg)) { > > qmp_for_each_command(ga_print_cmd, NULL); > > @@ -1310,6 +1367,11 @@ int main(int argc, char **argv) > > config->state_dir); > > s->frozen =3D check_is_frozen(s); > > =20 > > + if (config->dumpconf) { > > + config_dump(config); > > + goto end; > > + } > > + > > ret =3D run_agent(s, config); > > =20 > > end: >=20 >=20