summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHans de Goede <hdegoede@redhat.com>2011-03-17 16:14:39 +0100
committerHans de Goede <hdegoede@redhat.com>2011-03-17 19:19:12 +0100
commit1cfccc9f642bee2b27890b12574ee62d39fccdef (patch)
treef650df7e5726da0a0972cfd78e9285f6d23438ec
parentad0b8e043e9c53a02a24fdfcdc50ce7481cf894d (diff)
vdagent: Add daemonizing support, daemonize by default
gnome-session will wait for autostartup "apps" marked with X-GNOME-Autostart-Phase=Initialization to signal they've completed starting or do an exit 0, before continuing with the next startup phase. Since we were doing neither, it would wait for a timeout until continueing causing a noticable delay before gdm showing the greeter, and after login. By daemonizing immediately after startup we avoid this delay without needing to go talk XSMP or something similar.
-rw-r--r--vdagent.c60
1 files changed, 49 insertions, 11 deletions
diff --git a/vdagent.c b/vdagent.c
index de60627..233fd2c 100644
--- a/vdagent.c
+++ b/vdagent.c
@@ -37,6 +37,7 @@
static int verbose = 0;
static struct vdagent_x11 *x11 = NULL;
+static struct udscs_connection *client = NULL;
static FILE *logfile = NULL;
static int quit = 0;
@@ -73,7 +74,8 @@ static void usage(FILE *fp)
"vdagent -- spice agent xorg client\n"
"options:\n"
" -h print this text\n"
- " -d log debug messages\n");
+ " -d log debug messages\n"
+ " -x don't daemonize (and log to logfile)\n");
}
static void quit_handler(int sig)
@@ -81,21 +83,46 @@ static void quit_handler(int sig)
quit = 1;
}
+void daemonize(void)
+{
+ int x, retval = 0;
+
+ /* detach from terminal */
+ switch (fork()) {
+ case 0:
+ close(0); close(1); close(2);
+ setsid();
+ x = open("/dev/null", O_RDWR); dup(x); dup(x);
+ break;
+ case -1:
+ fprintf(logfile, "fork: %s\n", strerror(errno));
+ retval = 1;
+ default:
+ udscs_destroy_connection(&client);
+ if (logfile != stderr)
+ fclose(logfile);
+ exit(retval);
+ }
+}
+
int main(int argc, char *argv[])
{
- struct udscs_connection *client = NULL;
fd_set readfds, writefds;
int c, n, nfds, x11_fd, retval = 0;
+ int do_daemonize = 1;
char *home, filename[1024];
struct sigaction act;
for (;;) {
- if (-1 == (c = getopt(argc, argv, "-dh")))
+ if (-1 == (c = getopt(argc, argv, "-dxh")))
break;
switch (c) {
case 'd':
verbose++;
break;
+ case 'x':
+ do_daemonize = 0;
+ break;
case 'h':
usage(stdout);
return 0;
@@ -113,31 +140,41 @@ int main(int argc, char *argv[])
sigaction(SIGTERM, &act, NULL);
sigaction(SIGQUIT, &act, NULL);
+ logfile = stderr;
home = getenv("HOME");
if (home) {
snprintf(filename, sizeof(filename), "%s/.spice-vdagent", home);
n = mkdir(filename, 0755);
snprintf(filename, sizeof(filename), "%s/.spice-vdagent/log", home);
- logfile = fopen(filename, "w");
- if (!logfile) {
- fprintf(stderr, "Error opening %s: %s\n", filename,
- strerror(errno));
- logfile = stderr;
+ if (do_daemonize) {
+ logfile = fopen(filename, "w");
+ if (!logfile) {
+ fprintf(stderr, "Error opening %s: %s\n", filename,
+ strerror(errno));
+ logfile = stderr;
+ }
}
} else {
fprintf(stderr, "Could not get home directory, logging to stderr\n");
- logfile = stderr;
}
client = udscs_connect(VDAGENTD_SOCKET, daemon_read_complete, NULL,
vdagentd_messages, VDAGENTD_NO_MESSAGES,
verbose? logfile:NULL, logfile);
- if (!client)
+ if (!client) {
+ if (logfile != stderr)
+ fclose(logfile);
return 1;
+ }
+
+ if (do_daemonize)
+ daemonize();
x11 = vdagent_x11_create(client, logfile, verbose);
if (!x11) {
udscs_destroy_connection(&client);
+ if (logfile != stderr)
+ fclose(logfile);
return 1;
}
@@ -168,7 +205,8 @@ int main(int argc, char *argv[])
vdagent_x11_destroy(x11);
udscs_destroy_connection(&client);
- fclose(logfile);
+ if (logfile != stderr)
+ fclose(logfile);
return retval;
}