qga: group agent init/cleanup init separate routines

This patch better separates the init/cleanup routines out into
separate functions to make the start-up procedure a bit easier to
follow. This will be useful when we eventually break out the actual
start/stop of the agent's main loop into separates routines that
can be called multiple times after the init phase.

Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
This commit is contained in:
Michael Roth 2018-10-07 14:02:17 +03:00
parent d9c85b6cc5
commit 50d5b3c465
1 changed files with 50 additions and 32 deletions

View File

@ -1211,9 +1211,21 @@ static bool check_is_frozen(GAState *s)
return false; return false;
} }
static int run_agent(GAState *s, GAConfig *config, int socket_activation) static GAState *initialize_agent(GAConfig *config)
{ {
ga_state = s; GAState *s = g_new0(GAState, 1);
g_assert(ga_state == NULL);
s->log_level = config->log_level;
s->log_file = stderr;
#ifdef CONFIG_FSFREEZE
s->fsfreeze_hook = config->fsfreeze_hook;
#endif
s->pstate_filepath = g_strdup_printf("%s/qga.state", config->state_dir);
s->state_filepath_isfrozen = g_strdup_printf("%s/qga.state.isfrozen",
config->state_dir);
s->frozen = check_is_frozen(s);
g_log_set_default_handler(ga_log, s); g_log_set_default_handler(ga_log, s);
g_log_set_fatal_mask(NULL, G_LOG_LEVEL_ERROR); g_log_set_fatal_mask(NULL, G_LOG_LEVEL_ERROR);
@ -1229,7 +1241,7 @@ static int run_agent(GAState *s, GAConfig *config, int socket_activation)
if (g_mkdir_with_parents(config->state_dir, S_IRWXU) == -1) { if (g_mkdir_with_parents(config->state_dir, S_IRWXU) == -1) {
g_critical("unable to create (an ancestor of) the state directory" g_critical("unable to create (an ancestor of) the state directory"
" '%s': %s", config->state_dir, strerror(errno)); " '%s': %s", config->state_dir, strerror(errno));
return EXIT_FAILURE; return NULL;
} }
#endif #endif
@ -1254,7 +1266,7 @@ static int run_agent(GAState *s, GAConfig *config, int socket_activation)
if (!log_file) { if (!log_file) {
g_critical("unable to open specified log file: %s", g_critical("unable to open specified log file: %s",
strerror(errno)); strerror(errno));
return EXIT_FAILURE; return NULL;
} }
s->log_file = log_file; s->log_file = log_file;
} }
@ -1265,7 +1277,7 @@ static int run_agent(GAState *s, GAConfig *config, int socket_activation)
s->pstate_filepath, s->pstate_filepath,
ga_is_frozen(s))) { ga_is_frozen(s))) {
g_critical("failed to load persistent state"); g_critical("failed to load persistent state");
return EXIT_FAILURE; return NULL;
} }
config->blacklist = ga_command_blacklist_init(config->blacklist); config->blacklist = ga_command_blacklist_init(config->blacklist);
@ -1286,12 +1298,37 @@ static int run_agent(GAState *s, GAConfig *config, int socket_activation)
#ifndef _WIN32 #ifndef _WIN32
if (!register_signal_handlers()) { if (!register_signal_handlers()) {
g_critical("failed to register signal handlers"); g_critical("failed to register signal handlers");
return EXIT_FAILURE; return NULL;
} }
#endif #endif
s->main_loop = g_main_loop_new(NULL, false); s->main_loop = g_main_loop_new(NULL, false);
ga_state = s;
return s;
}
static void cleanup_agent(GAState *s)
{
if (s->command_state) {
ga_command_state_cleanup_all(s->command_state);
ga_command_state_free(s->command_state);
json_message_parser_destroy(&s->parser);
}
if (s->channel) {
ga_channel_free(s->channel);
}
g_free(s->pstate_filepath);
g_free(s->state_filepath_isfrozen);
if (s->main_loop) {
g_main_loop_unref(s->main_loop);
}
g_free(s);
ga_state = NULL;
}
static int run_agent(GAState *s, GAConfig *config, int socket_activation)
{
if (!channel_init(ga_state, config->method, config->channel_path, if (!channel_init(ga_state, config->method, config->channel_path,
socket_activation ? FIRST_SOCKET_ACTIVATION_FD : -1)) { socket_activation ? FIRST_SOCKET_ACTIVATION_FD : -1)) {
g_critical("failed to initialize guest agent channel"); g_critical("failed to initialize guest agent channel");
@ -1315,7 +1352,7 @@ static int run_agent(GAState *s, GAConfig *config, int socket_activation)
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
int ret = EXIT_SUCCESS; int ret = EXIT_SUCCESS;
GAState *s = g_new0(GAState, 1); GAState *s;
GAConfig *config = g_new0(GAConfig, 1); GAConfig *config = g_new0(GAConfig, 1);
int socket_activation; int socket_activation;
@ -1383,44 +1420,25 @@ int main(int argc, char **argv)
} }
} }
s->log_level = config->log_level;
s->log_file = stderr;
#ifdef CONFIG_FSFREEZE
s->fsfreeze_hook = config->fsfreeze_hook;
#endif
s->pstate_filepath = g_strdup_printf("%s/qga.state", config->state_dir);
s->state_filepath_isfrozen = g_strdup_printf("%s/qga.state.isfrozen",
config->state_dir);
s->frozen = check_is_frozen(s);
if (config->dumpconf) { if (config->dumpconf) {
config_dump(config); config_dump(config);
goto end; goto end;
} }
s = initialize_agent(config);
if (!s) {
g_critical("error initializing guest agent");
goto end;
}
ret = run_agent(s, config, socket_activation); ret = run_agent(s, config, socket_activation);
cleanup_agent(s);
end: end:
if (s->command_state) {
ga_command_state_cleanup_all(s->command_state);
ga_command_state_free(s->command_state);
json_message_parser_destroy(&s->parser);
}
if (s->channel) {
ga_channel_free(s->channel);
}
g_free(s->pstate_filepath);
g_free(s->state_filepath_isfrozen);
if (config->daemonize) { if (config->daemonize) {
unlink(config->pid_filepath); unlink(config->pid_filepath);
} }
config_free(config); config_free(config);
if (s->main_loop) {
g_main_loop_unref(s->main_loop);
}
g_free(s);
return ret; return ret;
} }