From: Michael Roth <mdroth@linux.vnet.ibm.com>
To: qemu-devel@nongnu.org
Cc: peter.maydell@linaro.org,
"Michael Roth" <mdroth@linux.vnet.ibm.com>,
"Marc-André Lureau" <marcandre.lureau@redhat.com>
Subject: [Qemu-devel] [PATCH 19/26] qga: add an optional qemu-ga.conf system configuration
Date: Tue, 1 Sep 2015 13:38:56 -0500 [thread overview]
Message-ID: <1441132743-26228-20-git-send-email-mdroth@linux.vnet.ibm.com> (raw)
In-Reply-To: <1441132743-26228-1-git-send-email-mdroth@linux.vnet.ibm.com>
From: Marc-André Lureau <marcandre.lureau@redhat.com>
Learn to configure the agent with a system configuration.
This may simplify command-line handling, especially when the blacklist
is long.
Among the other benefits, this may standardize the configuration of an
init service (instead of distro-specific init keys/files)
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Michael Roth <mdroth@linux.vnet.ibm.com>
Reviewed-by: Denis V. Lunev <den@openvz.org>
* removed unecessary keyfile != NULL prior to free
Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
---
qga/main.c | 84 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++------
1 file changed, 77 insertions(+), 7 deletions(-)
diff --git a/qga/main.c b/qga/main.c
index fc07696..cc7a910 100644
--- a/qga/main.c
+++ b/qga/main.c
@@ -56,6 +56,7 @@
#define QGA_FSFREEZE_HOOK_DEFAULT CONFIG_QEMU_CONFDIR "/fsfreeze-hook"
#endif
#define QGA_SENTINEL_BYTE 0xFF
+#define QGA_CONF_DEFAULT CONFIG_QEMU_CONFDIR G_DIR_SEPARATOR_S "qemu-ga.conf"
static struct {
const char *state_dir;
@@ -931,14 +932,78 @@ typedef struct GAConfig {
#ifdef _WIN32
const char *service;
#endif
+ gchar *bliststr; /* blacklist may point to this string */
GList *blacklist;
int daemonize;
GLogLevelFlags log_level;
} GAConfig;
-static GAConfig *config_parse(int argc, char **argv)
+static void config_load(GAConfig *config)
+{
+ GError *gerr = NULL;
+ GKeyFile *keyfile;
+
+ /* read system config */
+ keyfile = g_key_file_new();
+ if (!g_key_file_load_from_file(keyfile, QGA_CONF_DEFAULT, 0, &gerr)) {
+ goto end;
+ }
+ if (g_key_file_has_key(keyfile, "general", "daemon", NULL)) {
+ config->daemonize =
+ g_key_file_get_boolean(keyfile, "general", "daemon", &gerr);
+ }
+ if (g_key_file_has_key(keyfile, "general", "method", NULL)) {
+ config->method =
+ g_key_file_get_string(keyfile, "general", "method", &gerr);
+ }
+ if (g_key_file_has_key(keyfile, "general", "path", NULL)) {
+ config->channel_path =
+ g_key_file_get_string(keyfile, "general", "path", &gerr);
+ }
+ if (g_key_file_has_key(keyfile, "general", "logfile", NULL)) {
+ config->log_filepath =
+ g_key_file_get_string(keyfile, "general", "logfile", &gerr);
+ }
+ if (g_key_file_has_key(keyfile, "general", "pidfile", NULL)) {
+ config->pid_filepath =
+ g_key_file_get_string(keyfile, "general", "pidfile", &gerr);
+ }
+#ifdef CONFIG_FSFREEZE
+ if (g_key_file_has_key(keyfile, "general", "fsfreeze-hook", NULL)) {
+ config->fsfreeze_hook =
+ g_key_file_get_string(keyfile,
+ "general", "fsfreeze-hook", &gerr);
+ }
+#endif
+ if (g_key_file_has_key(keyfile, "general", "statedir", NULL)) {
+ config->state_dir =
+ g_key_file_get_string(keyfile, "general", "statedir", &gerr);
+ }
+ if (g_key_file_has_key(keyfile, "general", "verbose", NULL) &&
+ g_key_file_get_boolean(keyfile, "general", "verbose", &gerr)) {
+ /* enable all log levels */
+ config->log_level = G_LOG_LEVEL_MASK;
+ }
+ if (g_key_file_has_key(keyfile, "general", "blacklist", NULL)) {
+ config->bliststr =
+ g_key_file_get_string(keyfile, "general", "blacklist", &gerr);
+ config->blacklist = g_list_concat(config->blacklist,
+ split_list(config->bliststr, ","));
+ }
+
+end:
+ g_key_file_free(keyfile);
+ if (gerr &&
+ !(gerr->domain == G_FILE_ERROR && gerr->code == G_FILE_ERROR_NOENT)) {
+ g_critical("error loading configuration from path: %s, %s",
+ QGA_CONF_DEFAULT, gerr->message);
+ exit(EXIT_FAILURE);
+ }
+ g_clear_error(&gerr);
+}
+
+static void config_parse(GAConfig *config, int argc, char **argv)
{
- GAConfig *config = g_new0(GAConfig, 1);
const char *sopt = "hVvdm:p:l:f:F::b:s:t:D";
int opt_ind = 0, ch;
const struct option lopt[] = {
@@ -966,23 +1031,29 @@ static GAConfig *config_parse(int argc, char **argv)
while ((ch = getopt_long(argc, argv, sopt, lopt, &opt_ind)) != -1) {
switch (ch) {
case 'm':
+ g_free(config->method);
config->method = g_strdup(optarg);
break;
case 'p':
+ g_free(config->channel_path);
config->channel_path = g_strdup(optarg);
break;
case 'l':
+ g_free(config->log_filepath);
config->log_filepath = g_strdup(optarg);
break;
case 'f':
+ g_free(config->pid_filepath);
config->pid_filepath = g_strdup(optarg);
break;
#ifdef CONFIG_FSFREEZE
case 'F':
+ g_free(config->fsfreeze_hook);
config->fsfreeze_hook = g_strdup(optarg ?: QGA_FSFREEZE_HOOK_DEFAULT);
break;
#endif
case 't':
+ g_free(config->state_dir);
config->state_dir = g_strdup(optarg);
break;
case 'v':
@@ -1042,8 +1113,6 @@ static GAConfig *config_parse(int argc, char **argv)
exit(EXIT_FAILURE);
}
}
-
- return config;
}
static void config_free(GAConfig *config)
@@ -1053,6 +1122,7 @@ static void config_free(GAConfig *config)
g_free(config->pid_filepath);
g_free(config->state_dir);
g_free(config->channel_path);
+ g_free(config->bliststr);
#ifdef CONFIG_FSFREEZE
g_free(config->fsfreeze_hook);
#endif
@@ -1200,13 +1270,13 @@ int main(int argc, char **argv)
{
int ret = EXIT_SUCCESS;
GAState *s = g_new0(GAState, 1);
- GAConfig *config;
+ GAConfig *config = g_new0(GAConfig, 1);
module_call_init(MODULE_INIT_QAPI);
init_dfl_pathnames();
-
- config = config_parse(argc, argv);
+ config_load(config);
+ config_parse(config, argc, argv);
if (config->pid_filepath == NULL) {
config->pid_filepath = g_strdup(dfl_pathnames.pidfile);
--
1.9.1
next prev parent reply other threads:[~2015-09-01 18:40 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-09-01 18:38 [Qemu-devel] [PULL v2 00/26] qemu-ga patch queue for 2015-09-01 Michael Roth
2015-09-01 18:38 ` [Qemu-devel] [PATCH 01/26] qemu-ga: Add .msi files to .gitignore Michael Roth
2015-09-01 18:38 ` [Qemu-devel] [PATCH 02/26] qemu-ga: Two MSI related cosmetic changes Michael Roth
2015-09-01 18:38 ` [Qemu-devel] [PATCH 03/26] qemu-ga: Fixed GUID capitalization Michael Roth
2015-09-01 18:38 ` [Qemu-devel] [PATCH 04/26] qemu-ga: Minor cosmetic changes to the WXS file Michael Roth
2015-09-01 18:38 ` [Qemu-devel] [PATCH 05/26] qemu-ga: Created a separate component for each installed file in the MSI Michael Roth
2015-09-01 18:38 ` [Qemu-devel] [PATCH 06/26] qemu-ga: Prevent QEMU-GA VSS provider from being unregistered on MSI reinstall Michael Roth
2015-09-01 18:38 ` [Qemu-devel] [PATCH 07/26] qemu-ga: Fixed paths issue with MSI build Michael Roth
2015-09-01 18:38 ` [Qemu-devel] [PATCH 08/26] configure: qemu-ga: report MSI install support in summary Michael Roth
2015-09-01 18:38 ` [Qemu-devel] [PATCH 09/26] qga: misc spelling Michael Roth
2015-09-01 18:38 ` [Qemu-devel] [PATCH 10/26] qga: use exit() when parsing options Michael Roth
2015-09-01 18:38 ` [Qemu-devel] [PATCH 11/26] qga: move string split in separate function Michael Roth
2015-09-01 18:38 ` [Qemu-devel] [PATCH 12/26] qga: make split_list() return allocated strings Michael Roth
2015-09-01 18:38 ` [Qemu-devel] [PATCH 13/26] qga: rename 'path' to 'channel_path' Michael Roth
2015-09-01 18:38 ` [Qemu-devel] [PATCH 14/26] qga: copy argument strings Michael Roth
2015-09-01 18:38 ` [Qemu-devel] [PATCH 15/26] qga: move option parsing to separate function Michael Roth
2015-09-01 18:38 ` [Qemu-devel] [PATCH 16/26] qga: fill default options in main() Michael Roth
2015-09-01 18:38 ` [Qemu-devel] [PATCH 17/26] qga: move agent run in a separate function Michael Roth
2015-09-01 18:38 ` [Qemu-devel] [PATCH 18/26] qga: free a bit more Michael Roth
2015-09-01 18:38 ` Michael Roth [this message]
2015-09-01 18:38 ` [Qemu-devel] [PATCH 20/26] qga: add --dump-conf option Michael Roth
2015-09-01 18:38 ` [Qemu-devel] [PATCH 21/26] qga: start a man page Michael Roth
2015-09-01 18:38 ` [Qemu-devel] [PATCH 22/26] qemu-ga: implement win32 guest-set-user-password Michael Roth
2015-09-01 18:39 ` [Qemu-devel] [PATCH 23/26] configure: qemu-ga: move MSI installer probe after qga probe Michael Roth
2015-09-01 18:39 ` [Qemu-devel] [PATCH 24/26] configure: qemu-ga: explicitly enable qemu-ga MSI support when probed Michael Roth
2015-09-01 18:39 ` [Qemu-devel] [PATCH 25/26] build: qemu-ga: fix VSS dependencies Michael Roth
2015-09-01 18:39 ` [Qemu-devel] [PATCH 26/26] Makefile: qemu-ga: fix msi target error message Michael Roth
2015-09-03 8:50 ` [Qemu-devel] [PULL v2 00/26] qemu-ga patch queue for 2015-09-01 Peter Maydell
-- strict thread matches above, loose matches on Subject: below --
2015-09-01 17:00 [Qemu-devel] [PULL " Michael Roth
2015-09-01 17:00 ` [Qemu-devel] [PATCH 19/26] qga: add an optional qemu-ga.conf system configuration Michael Roth
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1441132743-26228-20-git-send-email-mdroth@linux.vnet.ibm.com \
--to=mdroth@linux.vnet.ibm.com \
--cc=marcandre.lureau@redhat.com \
--cc=peter.maydell@linaro.org \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).