[pkg-fso-commits] [SCM] Automatic Display Manager branch, bug540201, updated. debian/0.6-1-39-g86710bf

Enrico Zini enrico at enricozini.org
Wed Jul 6 09:15:54 UTC 2011


The following commit has been merged in the bug540201 branch:
commit 86710bf7ab97b185e0731756aa717f212633540f
Author: Enrico Zini <enrico at enricozini.org>
Date:   Wed Jul 6 11:15:51 2011 +0200

    Also set server name when parsing x server command line

diff --git a/configure.ac b/configure.ac
index 4333027..5721300 100644
--- a/configure.ac
+++ b/configure.ac
@@ -9,13 +9,13 @@ AC_CONFIG_MACRO_DIR([m4])
 dnl AC_GNU_SOURCE
 dnl AM_MAINTAINER_MODE
 
-dnl We use C99
-AC_PROG_CC_C99
-
 dnl Checks for programs.
 AC_PROG_CC
 AC_ISC_POSIX
 
+dnl We use C99
+AC_PROG_CC_C99
+
 dnl Checks for header files.
 AC_HEADER_STDC
 
diff --git a/dm.c b/dm.c
index e2482f0..6318e1a 100644
--- a/dm.c
+++ b/dm.c
@@ -138,9 +138,17 @@ int nodm_display_manager_parse_xcmdline(struct nodm_display_manager* s, const ch
     // Server name
     if (in_arg < toks->we_wordc &&
            toks->we_wordv[in_arg][0] == ':' && isdigit(toks->we_wordv[in_arg][1]))
-        argv[argc++] = toks->we_wordv[in_arg++];
+    {
+        argv[argc] = toks->we_wordv[in_arg++];
+        s->srv.name = argv[argc];
+        ++argc;
+    }
     else
-        argv[argc++] = ":0";
+    {
+        argv[argc] = ":0";
+        s->srv.name = argv[argc];
+        ++argc;
+    }
 
     // Copy other args
     while (in_arg < toks->we_wordc)
@@ -164,3 +172,9 @@ cleanup:
 
     return return_code;
 }
+
+void nodm_display_manager_dump_status(struct nodm_display_manager* dm)
+{
+    nodm_xserver_dump_status(&dm->srv);
+    nodm_xsession_dump_status(&dm->session);
+}
diff --git a/dm.h b/dm.h
index 593e395..9bdd197 100644
--- a/dm.h
+++ b/dm.h
@@ -64,5 +64,7 @@ int nodm_display_manager_stop(struct nodm_display_manager* dm);
  */
 int nodm_display_manager_parse_xcmdline(struct nodm_display_manager* dm, const char* xcmdline);
 
+/// Dump all internal status to stderr
+void nodm_display_manager_dump_status(struct nodm_display_manager* dm);
 
 #endif
diff --git a/log.c b/log.c
index 4d55046..8b84453 100644
--- a/log.c
+++ b/log.c
@@ -31,6 +31,7 @@ void log_config_init(struct log_config* conf)
     conf->log_to_syslog = true;
     conf->log_to_stderr = true;
     conf->info_to_stderr = false;
+    conf->verbose = false;
 }
 
 void log_start(const struct log_config* conf)
@@ -47,6 +48,29 @@ void log_end()
         closelog();
 }
 
+void log_verbose(const char* fmt, ...)
+{
+    if (!config->verbose) return;
+
+    va_list ap;
+
+    if (config->info_to_stderr)
+    {
+        fprintf(stderr, "%s:", config->program_name);
+        va_start(ap, fmt);
+        vfprintf(stderr, fmt, ap);
+        va_end(ap);
+        fputc('\n', stderr);
+    }
+
+    if (config->log_to_syslog)
+    {
+        va_start(ap, fmt);
+        vsyslog(LOG_WARNING, fmt, ap);
+        va_end(ap);
+    }
+}
+
 void log_info(const char* fmt, ...)
 {
     va_list ap;
diff --git a/log.h b/log.h
index fc91274..5638228 100644
--- a/log.h
+++ b/log.h
@@ -37,6 +37,9 @@ struct log_config
 
     /// Also log info messages to stderr
     bool info_to_stderr;
+
+    /// Log verbose messages
+    bool verbose;
 };
 
 /**
@@ -61,7 +64,10 @@ void log_start(const struct log_config* conf);
  */
 void log_end();
 
-/// Log a message about the normal progress of things
+/// Log a message about the trivial normal progress of things
+void log_verbose(const char* fmt, ...);
+
+/// Log a message about the relevant normal progress of things
 void log_info(const char* fmt, ...);
 
 /// Log a warning message
diff --git a/test-internals.c b/test-internals.c
index f82a2d8..1ddadb5 100644
--- a/test-internals.c
+++ b/test-internals.c
@@ -28,7 +28,7 @@
 
 int main(int argc, char* argv[])
 {
-    test_start("test-internals");
+    test_start("test-internals", false);
 
     // Test getenv_with_default
     setenv("FOO", "foo", 1);
@@ -43,6 +43,7 @@ int main(int argc, char* argv[])
     ensure_equals(s.srv.argv[0], "/usr/bin/X");
     ensure_equals(s.srv.argv[1], ":0");
     ensure_equals(s.srv.argv[2], NULL);
+    ensure_equals(s.srv.name, ":0");
     nodm_display_manager_cleanup(&s);
 
     nodm_display_manager_init(&s);
@@ -51,6 +52,7 @@ int main(int argc, char* argv[])
     ensure_equals(s.srv.argv[1], ":0");
     ensure_equals(s.srv.argv[2], "foo");
     ensure_equals(s.srv.argv[3], NULL);
+    ensure_equals(s.srv.name, ":0");
     nodm_display_manager_cleanup(&s);
 
     nodm_display_manager_init(&s);
@@ -58,6 +60,7 @@ int main(int argc, char* argv[])
     ensure_equals(s.srv.argv[0], "/usr/bin/Xnest");
     ensure_equals(s.srv.argv[1], ":0");
     ensure_equals(s.srv.argv[2], NULL);
+    ensure_equals(s.srv.name, ":0");
     nodm_display_manager_cleanup(&s);
 
     nodm_display_manager_init(&s);
@@ -65,6 +68,7 @@ int main(int argc, char* argv[])
     ensure_equals(s.srv.argv[0], "/usr/bin/X");
     ensure_equals(s.srv.argv[1], ":1");
     ensure_equals(s.srv.argv[2], NULL);
+    ensure_equals(s.srv.name, ":1");
     nodm_display_manager_cleanup(&s);
 
     nodm_display_manager_init(&s);
@@ -72,6 +76,7 @@ int main(int argc, char* argv[])
     ensure_equals(s.srv.argv[0], "/usr/bin/Xnest");
     ensure_equals(s.srv.argv[1], ":1");
     ensure_equals(s.srv.argv[2], NULL);
+    ensure_equals(s.srv.name, ":1");
     nodm_display_manager_cleanup(&s);
 
     nodm_display_manager_init(&s);
@@ -80,6 +85,7 @@ int main(int argc, char* argv[])
     ensure_equals(s.srv.argv[1], ":0");
     ensure_equals(s.srv.argv[2], "foo");
     ensure_equals(s.srv.argv[3], NULL);
+    ensure_equals(s.srv.name, ":0");
     nodm_display_manager_cleanup(&s);
 
     nodm_display_manager_init(&s);
@@ -88,6 +94,7 @@ int main(int argc, char* argv[])
     ensure_equals(s.srv.argv[1], ":1");
     ensure_equals(s.srv.argv[2], "foo");
     ensure_equals(s.srv.argv[3], NULL);
+    ensure_equals(s.srv.name, ":1");
     nodm_display_manager_cleanup(&s);
 
     nodm_display_manager_init(&s);
@@ -96,6 +103,7 @@ int main(int argc, char* argv[])
     ensure_equals(s.srv.argv[1], ":1");
     ensure_equals(s.srv.argv[2], "foo");
     ensure_equals(s.srv.argv[3], NULL);
+    ensure_equals(s.srv.name, ":1");
     nodm_display_manager_cleanup(&s);
 
     test_ok();
diff --git a/test-xsession.c b/test-xsession.c
index cfe9f86..b96977a 100644
--- a/test-xsession.c
+++ b/test-xsession.c
@@ -32,11 +32,7 @@ int test_session(struct nodm_xsession_child* s)
 
 int main(int argc, char* argv[])
 {
-    test_start("test-xsession");
-
-    //const char* xcmdline = "/usr/bin/Xnest :1";
-    setenv("NODM_SESSION", "/bin/true", 1);
-    setenv("NODM_USER", getenv_with_default("USER", "root"), 1);
+    test_start("test-xsession", false);
 
     struct nodm_display_manager dm;
     nodm_display_manager_init(&dm);
@@ -48,6 +44,8 @@ int main(int argc, char* argv[])
     dm.session.conf_run_as[0] = 0;
     dm.session.child_body = test_session;
 
+    //nodm_display_manager_dump_status(&dm);
+
     ensure_succeeds(nodm_display_manager_start(&dm));
 
     ensure_succeeds(nodm_display_manager_wait(&dm));
diff --git a/test-xstart.c b/test-xstart.c
index c75ee2a..ee207c6 100644
--- a/test-xstart.c
+++ b/test-xstart.c
@@ -26,7 +26,7 @@
 
 int main(int argc, char* argv[])
 {
-    test_start("test-xstart");
+    test_start("test-xstart", false);
 
     struct nodm_xserver srv;
     nodm_xserver_init(&srv);
diff --git a/test.c b/test.c
index 94996ea..3d70d3f 100644
--- a/test.c
+++ b/test.c
@@ -23,13 +23,14 @@
 #include <string.h>
 #include <stdio.h>
 
-void test_start(const char* testname)
+void test_start(const char* testname, bool verbose)
 {
     static struct log_config cfg;
     cfg.program_name = testname,
     cfg.log_to_syslog = false,
     cfg.log_to_stderr = true,
-    cfg.info_to_stderr = true,
+    cfg.info_to_stderr = verbose,
+    cfg.verbose = verbose,
     log_start(&cfg);
 }
 
diff --git a/test.h b/test.h
index 30b7d41..42e3939 100644
--- a/test.h
+++ b/test.h
@@ -23,9 +23,10 @@
 
 #include "log.h"
 #include <stdlib.h>
+#include <stdbool.h>
 
 /// Setup the logging system for a test script
-void test_start(const char* testname);
+void test_start(const char* testname, bool verbose);
 
 /// exit() the program reporting a test failure
 void test_fail() __attribute__((noreturn));
diff --git a/xserver.c b/xserver.c
index e4752f9..19ea745 100644
--- a/xserver.c
+++ b/xserver.c
@@ -201,6 +201,8 @@ static int xserver_start(struct nodm_xserver* srv, unsigned timeout_sec)
         }
     }
 
+    log_verbose("X is ready to accept connections");
+
     // Set the DISPLAY env var
     if (setenv("DISPLAY", srv->name, 1) == -1)
     {
@@ -239,6 +241,14 @@ static int xopendisplay_error_handler(Display* dpy)
     exit(E_XLIB_ERROR);
 }
 
+/*
+static int x_error_handler(Display* dpy, XErrorEvent* e)
+{
+    log_err("X error");
+    return 0;
+}
+*/
+
 /**
  * Connect to the X server
  *
@@ -249,11 +259,16 @@ static int xopendisplay_error_handler(Display* dpy)
  */
 static int xserver_connect(struct nodm_xserver* srv)
 {
+    //XSetErrorHandler(x_error_handler);
+
     XSetIOErrorHandler(xopendisplay_error_handler);
     srv->dpy = XOpenDisplay(srv->name);
     XSetIOErrorHandler((int (*)(Display *))0);
 
-    // Remove close-on-exec and register to close at the next fork, why? We'll find
+    if (srv->dpy == NULL)
+        log_err("could not connect to X server on \"%s\"", srv->name);
+
+    // from xdm: remove close-on-exec and register to close at the next fork, why? We'll find out
     // RegisterCloseOnFork (ConnectionNumber (d->dpy));
     // fcntl (ConnectionNumber (d->dpy), F_SETFD, 0);
     return srv->dpy == NULL ? E_X_SERVER_CONNECT : E_SUCCESS;
@@ -392,3 +407,15 @@ int nodm_xserver_stop(struct nodm_xserver* srv)
     return res2;
 }
 
+void nodm_xserver_dump_status(struct nodm_xserver* srv)
+{
+    fprintf(stderr, "xserver start timeout: %d\n", srv->conf_timeout);
+    fprintf(stderr, "xserver command line:");
+    for (const char** s = srv->argv; *s; ++s)
+        fprintf(stderr, " %s", *s);
+    fputc('\n', stderr);
+    fprintf(stderr, "xserver name: %s\n", srv->name);
+    fprintf(stderr, "xserver window path: %s\n", srv->windowpath);
+    fprintf(stderr, "xserver PID: %d\n", (int)srv->pid);
+    fprintf(stderr, "xserver connected: %s\n", (srv->dpy != NULL) ? "yes" : "no");
+}
diff --git a/xserver.h b/xserver.h
index aae2975..70162ca 100644
--- a/xserver.h
+++ b/xserver.h
@@ -53,4 +53,7 @@ int nodm_xserver_start(struct nodm_xserver* srv);
 /// Stop the X server
 int nodm_xserver_stop(struct nodm_xserver* srv);
 
+/// Dump all internal status to stderr
+void nodm_xserver_dump_status(struct nodm_xserver* srv);
+
 #endif
diff --git a/xsession.c b/xsession.c
index 3348df5..8a8ccf8 100644
--- a/xsession.c
+++ b/xsession.c
@@ -133,3 +133,13 @@ int nodm_xsession_stop(struct nodm_xsession* s)
     s->pid = -1;
     return E_SUCCESS;
 }
+
+void nodm_xsession_dump_status(struct nodm_xsession* s)
+{
+    fprintf(stderr, "xsession command: %s\n", s->conf_session_command);
+    fprintf(stderr, "xsession user: %s\n", s->conf_run_as);
+    fprintf(stderr, "xsession use PAM: %s\n", s->conf_use_pam ? "yes" : "no");
+    fprintf(stderr, "xsession cleanup ~/.xsession-errors: %s\n", s->conf_cleanup_xse ? "yes" : "no");
+    fprintf(stderr, "xsession pid: %d\n", (int)s->pid);
+    fprintf(stderr, "xsession body overridden by test: %s\n", (s->child_body != NULL) ? "yes" : "no");
+}
diff --git a/xsession.h b/xsession.h
index a39dd54..4950795 100644
--- a/xsession.h
+++ b/xsession.h
@@ -62,4 +62,7 @@ int nodm_xsession_start(struct nodm_xsession* s, const struct nodm_xserver* srv)
 /// Stop the X session
 int nodm_xsession_stop(struct nodm_xsession* s);
 
+/// Dump all internal status to stderr
+void nodm_xsession_dump_status(struct nodm_xsession* s);
+
 #endif

-- 
Automatic Display Manager



More information about the pkg-fso-commits mailing list