[Xcb] [PATCH libxcb 2/2] xcb_open: Improve abstraction for launchd secure sockets
Jeremy Huddleston Sequoia
jeremyhu at apple.com
Wed Apr 16 02:44:11 PDT 2014
ping.
As this only really affects darwin, I'll take the lack of response as "whatever" and push this without review if I still hear crickets tomorrow. FWIW, this patch is shipped in XQuartz-2.7.6_rc1.
--Jeremy
On Apr 5, 2014, at 21:29, Jeremy Huddleston Sequoia <jeremyhu at apple.com> wrote:
> This changes away from hard-coding the /tmp/launch-* path to now
> supporting a generic <path to unix socket>[.<screen>] format for
> $DISPLAY.
>
> Signed-off-by: Jeremy Huddleston Sequoia <jeremyhu at apple.com>
> ---
> src/xcb_util.c | 95 +++++++++++++++++++++++++++++++++++++++++++++-------------
> 1 file changed, 75 insertions(+), 20 deletions(-)
>
> diff --git a/src/xcb_util.c b/src/xcb_util.c
> index 0c5b07f..7f446a4 100644
> --- a/src/xcb_util.c
> +++ b/src/xcb_util.c
> @@ -60,6 +60,10 @@
> # include <sys/stat.h>
> #endif
>
> +#ifdef HAVE_LAUNCHD
> +#include <sys/stat.h>
> +#endif
> +
> int xcb_popcount(uint32_t mask)
> {
> uint32_t y;
> @@ -78,6 +82,59 @@ int xcb_sumof(uint8_t *list, int len)
> return s;
> }
>
> +#ifdef HAVE_LAUNCHD
> +/* Return true and parse if name matches <path to socket>[.<screen>]
> + * Upon success:
> + * host = <path to socket>
> + * protocol = "unix"
> + * display = 0
> + * screen = <screen>
> + */
> +static int _xcb_parse_display_path_to_socket(const char *name, char **host, char **protocol,
> + int *displayp, int *screenp)
> +{
> + struct stat sbuf;
> + char path[PATH_MAX];
> + int _screen = 0;
> +
> + strlcpy(path, name, sizeof(path));
> + if (0 != stat(path, &sbuf)) {
> + char *dot = strrchr(path, '.');
> + if (!dot)
> + return 0;
> + *dot = '\0';
> +
> + if (0 != stat(path, &sbuf))
> + return 0;
> +
> + _screen = atoi(dot + 1);
> + }
> +
> + if (host) {
> + *host = strdup(path);
> + if (!*host)
> + return 0;
> + }
> +
> + if (protocol) {
> + *protocol = strdup("unix");
> + if (!*protocol) {
> + if (host)
> + free(*host);
> + return 0;
> + }
> + }
> +
> + if (displayp)
> + *displayp = 0;
> +
> + if (screenp)
> + *screenp = _screen;
> +
> + return 1;
> +}
> +#endif
> +
> static int _xcb_parse_display(const char *name, char **host, char **protocol,
> int *displayp, int *screenp)
> {
> @@ -90,10 +147,11 @@ static int _xcb_parse_display(const char *name, char **host, char **protocol,
> return 0;
>
> #ifdef HAVE_LAUNCHD
> - if(strncmp(name, "/tmp/launch", 11) == 0)
> - slash = NULL;
> - else
> + /* First check for <path to socket>[.<screen>] */
> + if (_xcb_parse_display_path_to_socket(name, host, protocol, displayp, screenp))
> + return 1;
> #endif
> +
> slash = strrchr(name, '/');
>
> if (slash) {
> @@ -178,14 +236,6 @@ static int _xcb_open(const char *host, char *protocol, const int display)
> char *file = NULL;
> int actual_filelen;
>
> -#ifdef HAVE_LAUNCHD
> - if(strncmp(host, "/tmp/launch", 11) == 0) {
> - base = host;
> - host = "";
> - protocol = "unix";
> - }
> -#endif
> -
> /* If protocol or host is "unix", fall through to Unix socket code below */
> if ((!protocol || (strcmp("unix",protocol) != 0)) &&
> (*host != '\0') && (strcmp("unix",host) != 0))
> @@ -211,18 +261,23 @@ static int _xcb_open(const char *host, char *protocol, const int display)
> }
> #endif
>
> - filelen = strlen(base) + 1 + sizeof(display) * 3 + 1;
> - file = malloc(filelen);
> - if(file == NULL)
> - return -1;
> -
> - /* display specifies Unix socket */
> #ifdef HAVE_LAUNCHD
> - if(strncmp(base, "/tmp/launch", 11) == 0)
> - actual_filelen = snprintf(file, filelen, "%s:%d", base, display);
> - else
> + struct stat sbuf;
> + if (0 == stat(host, &sbuf)) {
> + file = strdup(host);
> + filelen = actual_filelen = strlen(file);
> + } else
> #endif
> + {
> + filelen = strlen(base) + 1 + sizeof(display) * 3 + 1;
> + file = malloc(filelen);
> + if(file == NULL)
> + return -1;
> +
> + /* display specifies Unix socket */
> actual_filelen = snprintf(file, filelen, "%s%d", base, display);
> + }
> +
> if(actual_filelen < 0)
> {
> free(file);
> --
> 1.9.1
>
> _______________________________________________
> Xcb mailing list
> Xcb at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/xcb
>
More information about the Xcb
mailing list