diff --git a/configure.ac b/configure.ac index 8ad331d65..570a6885c 100644 --- a/configure.ac +++ b/configure.ac @@ -1545,7 +1545,7 @@ if test "x$XQUARTZ" = xyes; then AC_CHECK_LIB([Xplugin],[xp_init],[:]) - CFLAGS="${CFLAGS} -DROOTLESS_WORKAROUND -DNO_ALLOCA -DXQUARTZ_EXPORTS_LAUNCHD_FD" + CFLAGS="${CFLAGS} -DROOTLESS_WORKAROUND -DNO_ALLOCA" fi # Support for objc in autotools is minimal and not documented. diff --git a/hw/xquartz/darwinEvents.c b/hw/xquartz/darwinEvents.c index 9b39baab4..b731c72c3 100644 --- a/hw/xquartz/darwinEvents.c +++ b/hw/xquartz/darwinEvents.c @@ -343,12 +343,16 @@ static void DarwinEventHandler(int screenNum, xEventPtr xe, DeviceIntPtr dev, in } } +#ifdef XQUARTZ_EXPORTS_LAUNCHD_FD int xquartz_launchd_fd = -1; +#endif void DarwinListenOnOpenFD(int fd) { ErrorF("DarwinListenOnOpenFD: %d\n", fd); -#if 0 +#ifdef XQUARTZ_EXPORTS_LAUNCHD_FD + xquartz_launchd_fd = fd; +#else pthread_mutex_lock(&fd_add_lock); if(fd_add_count < FD_ADD_MAX) fd_add[fd_add_count++] = fd; @@ -357,8 +361,6 @@ void DarwinListenOnOpenFD(int fd) { pthread_cond_broadcast(&fd_add_ready_cond); pthread_mutex_unlock(&fd_add_lock); -#else - xquartz_launchd_fd = fd; #endif } @@ -378,7 +380,7 @@ static void kXquartzListenOnOpenFDHandler(int screenNum, xEventPtr xe, DeviceInt for (i=0; i -#ifdef HAVE_LAUNCHD #include -#endif #include #include #include @@ -661,23 +659,22 @@ ClientAuthorized(ClientPtr client, XID auth_id; char *reason = NULL; XtransConnInfo trans_conn; -#ifdef HAVE_LAUNCHD - struct sockaddr *saddr; -#endif priv = (OsCommPtr)client->osPrivate; trans_conn = priv->trans_conn; -#ifdef HAVE_LAUNCHD - saddr = (struct sockaddr *) (trans_conn->addr); - /* Allow any client to connect without authorization on a launchd socket, - because it is securely created -- this prevents a race condition on launch */ - if (saddr->sa_len > 11 && saddr->sa_family == AF_UNIX && - !strncmp(saddr->sa_data, "/tmp/launch", 11)) goto done; +/* Make it compile for now, remove this once we have a new xtrans release and are depending on it in configure.ac */ +#ifndef TRANS_NOXAUTH +#define TRANS_NOXAUTH 0 #endif - auth_id = CheckAuthorization (proto_n, auth_proto, - string_n, auth_string, client, &reason); + /* Allow any client to connect without authorization on a launchd socket, + because it is securely created -- this prevents a race condition on launch */ + if(trans_conn->flags | TRANS_NOXAUTH) { + auth_id = (XID) 0L; + } else { + auth_id = CheckAuthorization (proto_n, auth_proto, string_n, auth_string, client, &reason); + } if (auth_id == (XID) ~0L) { @@ -725,9 +722,6 @@ ClientAuthorized(ClientPtr client, } } priv->auth_id = auth_id; -#ifdef HAVE_LAUNCHD - done: -#endif priv->conn_time = 0; #ifdef XDMCP @@ -1269,12 +1263,17 @@ MakeClientGrabPervious(ClientPtr client) #ifdef XQUARTZ /* Add a fd (from launchd) to our listeners */ -_X_EXPORT void ListenOnOpenFD(int fd) { - char port[20]; +_X_EXPORT void ListenOnOpenFD(int fd, int noxauth) { + char port[256]; XtransConnInfo ciptr; - - /* Sigh for inconsistencies. */ - sprintf (port, ":%d", atoi(display)); + + if(!strncmp(getenv("DISPLAY"), "/tmp/launch", 11)) { + /* Make the path the launchd socket if our DISPLAY is set right */ + strcpy(port, getenv("DISPLAY")); + } else { + /* Just some default so things don't break and die. */ + sprintf(port, ":%d", atoi(display)); + } /* Make our XtransConnInfo * TRANS_SOCKET_LOCAL_INDEX = 5 from Xtrans.c @@ -1285,6 +1284,9 @@ _X_EXPORT void ListenOnOpenFD(int fd) { return; } + if(noxauth) + ciptr->flags = ciptr->flags | TRANS_NOXAUTH; + /* Allocate space to store it */ ListenTransFds = (int *) xrealloc(ListenTransFds, (ListenTransCount + 1) * sizeof (int)); ListenTransConns = (XtransConnInfo *) xrealloc(ListenTransConns, (ListenTransCount + 1) * sizeof (XtransConnInfo)); @@ -1299,11 +1301,11 @@ _X_EXPORT void ListenOnOpenFD(int fd) { /* Increment the count */ ListenTransCount++; - /* This *might* be needed, but it seems to be working fine without it... */ - //ResetAuthorization(); - //ResetHosts(display); + /* This *might* not be needed... /shrug */ + ResetAuthorization(); + ResetHosts(display); #ifdef XDMCP - //XdmcpReset(); + XdmcpReset(); #endif }