mirror of https://github.com/xemu-project/xemu.git
qga: copy argument strings
Following patch will return allocated strings, so we must correctly initialize alloc & free them. The nice side effect is that we no longer have to check for "fixed_state_dir" to call ga_install_service() with a NULL state dir. The default values are set after parsing the command line options. 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> Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
This commit is contained in:
parent
44de156ca7
commit
2e38d9903b
57
qga/main.c
57
qga/main.c
|
@ -939,13 +939,13 @@ static GList *split_list(const gchar *str, const gchar *delim)
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
const char *sopt = "hVvdm:p:l:f:F::b:s:t:";
|
const char *sopt = "hVvdm:p:l:f:F::b:s:t:";
|
||||||
const char *method = NULL, *channel_path = NULL;
|
char *method = NULL, *channel_path = NULL;
|
||||||
const char *log_filepath = NULL;
|
char *log_filepath = NULL;
|
||||||
const char *pid_filepath;
|
char *pid_filepath = NULL;
|
||||||
#ifdef CONFIG_FSFREEZE
|
#ifdef CONFIG_FSFREEZE
|
||||||
const char *fsfreeze_hook = NULL;
|
char *fsfreeze_hook = NULL;
|
||||||
#endif
|
#endif
|
||||||
const char *state_dir;
|
char *state_dir = NULL;
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
const char *service = NULL;
|
const char *service = NULL;
|
||||||
#endif
|
#endif
|
||||||
|
@ -976,31 +976,28 @@ int main(int argc, char **argv)
|
||||||
module_call_init(MODULE_INIT_QAPI);
|
module_call_init(MODULE_INIT_QAPI);
|
||||||
|
|
||||||
init_dfl_pathnames();
|
init_dfl_pathnames();
|
||||||
pid_filepath = dfl_pathnames.pidfile;
|
|
||||||
state_dir = dfl_pathnames.state_dir;
|
|
||||||
|
|
||||||
while ((ch = getopt_long(argc, argv, sopt, lopt, &opt_ind)) != -1) {
|
while ((ch = getopt_long(argc, argv, sopt, lopt, &opt_ind)) != -1) {
|
||||||
switch (ch) {
|
switch (ch) {
|
||||||
case 'm':
|
case 'm':
|
||||||
method = optarg;
|
method = g_strdup(optarg);
|
||||||
break;
|
break;
|
||||||
case 'p':
|
case 'p':
|
||||||
channel_path = optarg;
|
channel_path = g_strdup(optarg);
|
||||||
break;
|
break;
|
||||||
case 'l':
|
case 'l':
|
||||||
log_filepath = optarg;
|
log_filepath = g_strdup(optarg);
|
||||||
break;
|
break;
|
||||||
case 'f':
|
case 'f':
|
||||||
pid_filepath = optarg;
|
pid_filepath = g_strdup(optarg);
|
||||||
break;
|
break;
|
||||||
#ifdef CONFIG_FSFREEZE
|
#ifdef CONFIG_FSFREEZE
|
||||||
case 'F':
|
case 'F':
|
||||||
fsfreeze_hook = optarg ? optarg : QGA_FSFREEZE_HOOK_DEFAULT;
|
fsfreeze_hook = g_strdup(optarg ?: QGA_FSFREEZE_HOOK_DEFAULT);
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
case 't':
|
case 't':
|
||||||
state_dir = optarg;
|
state_dir = g_strdup(optarg);
|
||||||
break;
|
break;
|
||||||
case 'v':
|
case 'v':
|
||||||
/* enable all log levels */
|
/* enable all log levels */
|
||||||
log_level = G_LOG_LEVEL_MASK;
|
log_level = G_LOG_LEVEL_MASK;
|
||||||
|
@ -1023,20 +1020,10 @@ int main(int argc, char **argv)
|
||||||
case 's':
|
case 's':
|
||||||
service = optarg;
|
service = optarg;
|
||||||
if (strcmp(service, "install") == 0) {
|
if (strcmp(service, "install") == 0) {
|
||||||
const char *fixed_state_dir;
|
|
||||||
|
|
||||||
/* If the user passed the "-t" option, we save that state dir
|
|
||||||
* in the service. Otherwise we let the service fetch the state
|
|
||||||
* dir from the environment when it starts.
|
|
||||||
*/
|
|
||||||
fixed_state_dir = (state_dir == dfl_pathnames.state_dir) ?
|
|
||||||
NULL :
|
|
||||||
state_dir;
|
|
||||||
if (ga_install_vss_provider()) {
|
if (ga_install_vss_provider()) {
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
if (ga_install_service(channel_path, log_filepath,
|
if (ga_install_service(channel_path, log_filepath, state_dir)) {
|
||||||
fixed_state_dir)) {
|
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
exit(EXIT_SUCCESS);
|
exit(EXIT_SUCCESS);
|
||||||
|
@ -1067,6 +1054,14 @@ int main(int argc, char **argv)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (pid_filepath == NULL) {
|
||||||
|
pid_filepath = g_strdup(dfl_pathnames.pidfile);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (state_dir == NULL) {
|
||||||
|
state_dir = g_strdup(dfl_pathnames.state_dir);
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
/* On win32 the state directory is application specific (be it the default
|
/* On win32 the state directory is application specific (be it the default
|
||||||
* or a user override). We got past the command line parsing; let's create
|
* or a user override). We got past the command line parsing; let's create
|
||||||
|
@ -1210,5 +1205,15 @@ out_bad:
|
||||||
if (daemonize) {
|
if (daemonize) {
|
||||||
unlink(pid_filepath);
|
unlink(pid_filepath);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
g_free(method);
|
||||||
|
g_free(log_filepath);
|
||||||
|
g_free(pid_filepath);
|
||||||
|
g_free(state_dir);
|
||||||
|
g_free(channel_path);
|
||||||
|
#ifdef CONFIG_FSFREEZE
|
||||||
|
g_free(fsfreeze_hook);
|
||||||
|
#endif
|
||||||
|
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue