qga: determine default state dir and pidfile dynamically

No effective change on POSIX, but on Win32 the defaults come from the
environment / session.

Since commit 39097daf ("qemu-ga: use key-value store to avoid recycling fd
handles after restart") we've relied on the state directory for the fd
handles' key-value store. Even though we don't support the guest-file-*
commands on win32 yet, the key-value store is written, and it's the first
use of the state directory on win32. We should have a sensible default for
its location.

Signed-off-by: Laszlo Ersek <lersek@redhat.com>
Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
This commit is contained in:
Laszlo Ersek 2013-05-18 06:31:49 +02:00 committed by Michael Roth
parent e2ea3515a9
commit c394ecb7bf
1 changed files with 26 additions and 6 deletions

View File

@ -45,16 +45,21 @@
#ifndef _WIN32 #ifndef _WIN32
#define QGA_VIRTIO_PATH_DEFAULT "/dev/virtio-ports/org.qemu.guest_agent.0" #define QGA_VIRTIO_PATH_DEFAULT "/dev/virtio-ports/org.qemu.guest_agent.0"
#define QGA_STATE_RELATIVE_DIR "run"
#else #else
#define QGA_VIRTIO_PATH_DEFAULT "\\\\.\\Global\\org.qemu.guest_agent.0" #define QGA_VIRTIO_PATH_DEFAULT "\\\\.\\Global\\org.qemu.guest_agent.0"
#define QGA_STATE_RELATIVE_DIR "qemu-ga"
#endif #endif
#define QGA_STATEDIR_DEFAULT CONFIG_QEMU_LOCALSTATEDIR "/run"
#define QGA_PIDFILE_DEFAULT QGA_STATEDIR_DEFAULT "/qemu-ga.pid"
#ifdef CONFIG_FSFREEZE #ifdef CONFIG_FSFREEZE
#define QGA_FSFREEZE_HOOK_DEFAULT CONFIG_QEMU_CONFDIR "/fsfreeze-hook" #define QGA_FSFREEZE_HOOK_DEFAULT CONFIG_QEMU_CONFDIR "/fsfreeze-hook"
#endif #endif
#define QGA_SENTINEL_BYTE 0xFF #define QGA_SENTINEL_BYTE 0xFF
static struct {
const char *state_dir;
const char *pidfile;
} dfl_pathnames;
typedef struct GAPersistentState { typedef struct GAPersistentState {
#define QGA_PSTATE_DEFAULT_FD_COUNTER 1000 #define QGA_PSTATE_DEFAULT_FD_COUNTER 1000
int64_t fd_counter; int64_t fd_counter;
@ -106,6 +111,17 @@ DWORD WINAPI service_ctrl_handler(DWORD ctrl, DWORD type, LPVOID data,
VOID WINAPI service_main(DWORD argc, TCHAR *argv[]); VOID WINAPI service_main(DWORD argc, TCHAR *argv[]);
#endif #endif
static void
init_dfl_pathnames(void)
{
g_assert(dfl_pathnames.state_dir == NULL);
g_assert(dfl_pathnames.pidfile == NULL);
dfl_pathnames.state_dir = qemu_get_local_state_pathname(
QGA_STATE_RELATIVE_DIR);
dfl_pathnames.pidfile = qemu_get_local_state_pathname(
QGA_STATE_RELATIVE_DIR G_DIR_SEPARATOR_S "qemu-ga.pid");
}
static void quit_handler(int sig) static void quit_handler(int sig)
{ {
/* if we're frozen, don't exit unless we're absolutely forced to, /* if we're frozen, don't exit unless we're absolutely forced to,
@ -198,11 +214,11 @@ static void usage(const char *cmd)
" -h, --help display this help and exit\n" " -h, --help display this help and exit\n"
"\n" "\n"
"Report bugs to <mdroth@linux.vnet.ibm.com>\n" "Report bugs to <mdroth@linux.vnet.ibm.com>\n"
, cmd, QEMU_VERSION, QGA_VIRTIO_PATH_DEFAULT, QGA_PIDFILE_DEFAULT, , cmd, QEMU_VERSION, QGA_VIRTIO_PATH_DEFAULT, dfl_pathnames.pidfile,
#ifdef CONFIG_FSFREEZE #ifdef CONFIG_FSFREEZE
QGA_FSFREEZE_HOOK_DEFAULT, QGA_FSFREEZE_HOOK_DEFAULT,
#endif #endif
QGA_STATEDIR_DEFAULT); dfl_pathnames.state_dir);
} }
static const char *ga_log_level_str(GLogLevelFlags level) static const char *ga_log_level_str(GLogLevelFlags level)
@ -908,11 +924,11 @@ 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, *path = NULL; const char *method = NULL, *path = NULL;
const char *log_filepath = NULL; const char *log_filepath = NULL;
const char *pid_filepath = QGA_PIDFILE_DEFAULT; const char *pid_filepath;
#ifdef CONFIG_FSFREEZE #ifdef CONFIG_FSFREEZE
const char *fsfreeze_hook = NULL; const char *fsfreeze_hook = NULL;
#endif #endif
const char *state_dir = QGA_STATEDIR_DEFAULT; const char *state_dir;
#ifdef _WIN32 #ifdef _WIN32
const char *service = NULL; const char *service = NULL;
#endif #endif
@ -942,6 +958,10 @@ int main(int argc, char **argv)
module_call_init(MODULE_INIT_QAPI); module_call_init(MODULE_INIT_QAPI);
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':