X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=test%2Fx11comp.c;h=5fd064b36f3e35ef23ac8090e06ec07318f847db;hb=fbf087ea94cb5e7886ac928220112d6833269e3c;hp=71928a6138d0ba4caf4d78c8a7ed8d2b1b9736ed;hpb=bdf6880364c087dd857ea393e9f8c8dc6745244c;p=platform%2Fupstream%2Flibxkbcommon.git diff --git a/test/x11comp.c b/test/x11comp.c index 71928a6..5fd064b 100644 --- a/test/x11comp.c +++ b/test/x11comp.c @@ -21,6 +21,8 @@ * DEALINGS IN THE SOFTWARE. */ +#include "config.h" + #include #include #include @@ -39,23 +41,27 @@ main(void) struct xkb_keymap *keymap; xcb_connection_t *conn; int32_t device_id; - int pipefds[2]; int ret, status; - char displayfd[128], display[128]; + char display[512]; char *xkb_path; char *original, *dump; char *envp[] = { NULL }; - char *xvfb_argv[] = { "Xvfb", "-displayfd", displayfd, NULL }; - pid_t xvfb_pid; - char *xkbcomp_argv[] = { "xkbcomp", "-I", NULL /* xkb_path */, display, - NULL }; + char *xvfb_argv[] = { + (char *) "Xvfb", display, NULL + }; + pid_t xvfb_pid = 0; + char *xkbcomp_argv[] = { + (char *) "xkbcomp", (char *) "-I", NULL /* xkb_path */, display, NULL + }; pid_t xkbcomp_pid; + char *xhost = NULL; + int xdpy_current; + int xdpy_candidate; + /* * What all of this mess does is: - * 1. Launch Xvfb on the next available DISPLAY. Xvfb reports the - * display number to an fd passed with -displayfd once it's - * initialized. We pass a pipe there to read it. + * 1. Launch Xvfb on available DISPLAY. * 2. Make an xcb connection to this display. * 3. Launch xkbcomp to change the keymap of the new display (doing * this programmatically is major work [which we may yet do some @@ -65,30 +71,34 @@ main(void) * 6. Kill the server & clean up. */ - ret = pipe(pipefds); - assert(ret == 0); - - ret = snprintf(displayfd, sizeof(displayfd), "%d", pipefds[1]); - assert(ret >= 0 && ret < sizeof(displayfd)); - - ret = posix_spawnp(&xvfb_pid, "Xvfb", NULL, NULL, xvfb_argv, envp); + ret = xcb_parse_display(NULL, &xhost, &xdpy_current, NULL); + assert(ret != 0); + /* + * IANA assigns TCP port numbers from 6000 through 6063 to X11 + * clients. In addition, the current XCB implementaion shows + * that, when an X11 client tries to establish a TCP connetion, + * the port number needed is specified by adding 6000 to a given + * display number. So, one of reasonable ranges of xdpy_candidate + * is [0, 63]. + */ + for (xdpy_candidate = 63; xdpy_candidate >= 0; xdpy_candidate--) { + if (xdpy_candidate == xdpy_current) { + continue; + } + snprintf(display, sizeof(display), "%s:%d", xhost, xdpy_candidate); + ret = posix_spawnp(&xvfb_pid, "Xvfb", NULL, NULL, xvfb_argv, envp); + if (ret == 0) { + break; + } + } + free(xhost); if (ret != 0) { ret = SKIP_TEST; goto err_ctx; } - close(pipefds[1]); - - display[0] = ':'; - ret = read(pipefds[0], display + 1, sizeof(display) - 1); - if (ret <= 0 || 1 + ret >= sizeof(display) - 1) { - ret = SKIP_TEST; - goto err_xvfd; - } - if (display[ret] == '\n') - display[ret] = '\0'; - display[1 + ret] = '\0'; - close(pipefds[0]); + /* Wait for Xvfb fully waking up to accept a connection from a client. */ + sleep(1); conn = xcb_connect(display, NULL); if (xcb_connection_has_error(conn)) { @@ -152,7 +162,8 @@ err_dump: err_xcb: xcb_disconnect(conn); err_xvfd: - kill(xvfb_pid, SIGTERM); + if (xvfb_pid > 0) + kill(xvfb_pid, SIGTERM); err_ctx: xkb_context_unref(ctx); return ret;