os/connection: Improve abstraction for launchd secure sockets
This changes away from hard-coding the /tmp/launch-* path to now
supporting a generic <absolute path to unix socket>[.<screen>]
format for $DISPLAY.
cf-libxcb: d978a4f69b30b630f28d07f1003cf290284d24d8
Signed-off-by: Jeremy Huddleston Sequoia <jeremyhu@apple.com>
CC: Adam Jackson <ajax@kemper.freedesktop.org>
(cherry picked from commit 83d0d91106
)
This commit is contained in:
parent
663af2f17e
commit
c6c1cba397
|
@ -79,6 +79,8 @@ SOFTWARE.
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include <sys/stat.h>
|
||||||
|
|
||||||
#ifndef WIN32
|
#ifndef WIN32
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
|
|
||||||
|
@ -989,15 +991,34 @@ MakeClientGrabPervious(ClientPtr client)
|
||||||
void
|
void
|
||||||
ListenOnOpenFD(int fd, int noxauth)
|
ListenOnOpenFD(int fd, int noxauth)
|
||||||
{
|
{
|
||||||
char port[256];
|
char port[PATH_MAX];
|
||||||
XtransConnInfo ciptr;
|
XtransConnInfo ciptr;
|
||||||
const char *display_env = getenv("DISPLAY");
|
const char *display_env = getenv("DISPLAY");
|
||||||
|
|
||||||
if (display_env && (strncmp(display_env, "/tmp/launch", 11) == 0)) {
|
/* First check if display_env matches a <absolute path to unix socket>[.<screen number>] scheme (eg: launchd) */
|
||||||
/* Make the path the launchd socket if our DISPLAY is set right */
|
if (display_env && display_env[0] == '/') {
|
||||||
strcpy(port, display_env);
|
struct stat sbuf;
|
||||||
|
|
||||||
|
strlcpy(port, display_env, sizeof(port));
|
||||||
|
|
||||||
|
/* If the path exists, we don't have do do anything else.
|
||||||
|
* If it doesn't, we need to check for a .<screen number> to strip off and recheck.
|
||||||
|
*/
|
||||||
|
if (0 != stat(port, &sbuf)) {
|
||||||
|
char *dot = strrchr(port, '.');
|
||||||
|
if (dot) {
|
||||||
|
*dot = '\0';
|
||||||
|
|
||||||
|
if (0 != stat(port, &sbuf)) {
|
||||||
|
display_env = NULL;
|
||||||
}
|
}
|
||||||
else {
|
} else {
|
||||||
|
display_env = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!display_env) {
|
||||||
/* Just some default so things don't break and die. */
|
/* Just some default so things don't break and die. */
|
||||||
snprintf(port, sizeof(port), ":%d", atoi(display));
|
snprintf(port, sizeof(port), ":%d", atoi(display));
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue