From 8e34bf364ae518503642d28bdd43661090ae21bd Mon Sep 17 00:00:00 2001 From: Marc-André Lureau Date: Fri, 2 Oct 2015 14:58:14 +0200 Subject: qga: add QGA_CONF environment variable MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Having a environment variable allows to override default configuration path, useful for testing. Note that this can't easily be an argument, since loading config is done before parsing the arguments. Signed-off-by: Marc-André Lureau Reviewed-by: Michael Roth Signed-off-by: Michael Roth --- qga/main.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'qga/main.c') diff --git a/qga/main.c b/qga/main.c index d8e063a4a3..18e1e1dc57 100644 --- a/qga/main.c +++ b/qga/main.c @@ -945,10 +945,11 @@ static void config_load(GAConfig *config) { GError *gerr = NULL; GKeyFile *keyfile; + const char *conf = g_getenv("QGA_CONF") ?: QGA_CONF_DEFAULT; /* read system config */ keyfile = g_key_file_new(); - if (!g_key_file_load_from_file(keyfile, QGA_CONF_DEFAULT, 0, &gerr)) { + if (!g_key_file_load_from_file(keyfile, conf, 0, &gerr)) { goto end; } if (g_key_file_has_key(keyfile, "general", "daemon", NULL)) { -- cgit 1.4.1 From 6eaeae37a5fdd0a1ef88ed9ab4b807669ffc0e2d Mon Sep 17 00:00:00 2001 From: Marc-André Lureau Date: Fri, 2 Oct 2015 14:58:15 +0200 Subject: qga: do not override configuration verbosity MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Move the default verbosity settings before loading the configuration file, or it will overwrite it. Found thanks to writing qga tests :) Signed-off-by: Marc-André Lureau Reviewed-by: Michael Roth Signed-off-by: Michael Roth --- qga/main.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'qga/main.c') diff --git a/qga/main.c b/qga/main.c index 18e1e1dc57..aa6a063446 100644 --- a/qga/main.c +++ b/qga/main.c @@ -1083,8 +1083,6 @@ static void config_parse(GAConfig *config, int argc, char **argv) { NULL, 0, NULL, 0 } }; - config->log_level = G_LOG_LEVEL_ERROR | G_LOG_LEVEL_CRITICAL; - while ((ch = getopt_long(argc, argv, sopt, lopt, &opt_ind)) != -1) { switch (ch) { case 'm': @@ -1332,6 +1330,8 @@ int main(int argc, char **argv) GAState *s = g_new0(GAState, 1); GAConfig *config = g_new0(GAConfig, 1); + config->log_level = G_LOG_LEVEL_ERROR | G_LOG_LEVEL_CRITICAL; + module_call_init(MODULE_INIT_QAPI); init_dfl_pathnames(); -- cgit 1.4.1 From 4005b4732e40d3d583510db89ee204b834022d20 Mon Sep 17 00:00:00 2001 From: "Denis V. Lunev" Date: Tue, 13 Oct 2015 18:41:21 +0300 Subject: qga: handle possible SIGPIPE in guest-file-write qemu-ga should not exit on guest-file-write to pipe without read end but proper error code should be returned. The behavior of the spawned process should be default thus SIGPIPE processing should be reset to default after fork() but before exec(). Signed-off-by: Denis V. Lunev Signed-off-by: Yuri Pudgorodskiy Reviewed-by: Michael Roth Signed-off-by: Denis V. Lunev Signed-off-by: Michael Roth --- qga/commands.c | 18 +++++++++++++++++- qga/main.c | 6 ++++++ 2 files changed, 23 insertions(+), 1 deletion(-) (limited to 'qga/main.c') diff --git a/qga/commands.c b/qga/commands.c index ced72d503e..68e8cfab18 100644 --- a/qga/commands.c +++ b/qga/commands.c @@ -225,6 +225,22 @@ static void guest_exec_child_watch(GPid pid, gint status, gpointer data) g_spawn_close_pid(pid); } +/** Reset ignored signals back to default. */ +static void guest_exec_task_setup(gpointer data) +{ +#if !defined(G_OS_WIN32) + struct sigaction sigact; + + memset(&sigact, 0, sizeof(struct sigaction)); + sigact.sa_handler = SIG_DFL; + + if (sigaction(SIGPIPE, &sigact, NULL) != 0) { + slog("sigaction() failed to reset child process's SIGPIPE: %s", + strerror(errno)); + } +#endif +} + GuestExec *qmp_guest_exec(const char *path, bool has_arg, strList *arg, bool has_env, strList *env, @@ -250,7 +266,7 @@ GuestExec *qmp_guest_exec(const char *path, G_SPAWN_SEARCH_PATH | G_SPAWN_DO_NOT_REAP_CHILD | G_SPAWN_STDOUT_TO_DEV_NULL | G_SPAWN_STDERR_TO_DEV_NULL, - NULL, NULL, &pid, NULL, NULL, NULL, &gerr); + guest_exec_task_setup, NULL, &pid, NULL, NULL, NULL, &gerr); if (!ret) { error_setg(err, QERR_QGA_COMMAND_FAILED, gerr->message); g_error_free(gerr); diff --git a/qga/main.c b/qga/main.c index aa6a063446..068169fcbc 100644 --- a/qga/main.c +++ b/qga/main.c @@ -161,6 +161,12 @@ static gboolean register_signal_handlers(void) g_error("error configuring signal handler: %s", strerror(errno)); } + sigact.sa_handler = SIG_IGN; + if (sigaction(SIGPIPE, &sigact, NULL) != 0) { + g_error("error configuring SIGPIPE signal handler: %s", + strerror(errno)); + } + return true; } -- cgit 1.4.1