[Xcb] [PATCH libxcb] Introduce new funcion xcb_connect_with_auth_file().
LaƩrcio de Sousa
laerciosousa at sme-mogidascruzes.sp.gov.br
Fri Oct 17 11:23:48 PDT 2014
This patch introduces a function called xcb_connect_with_auth_file(),
which is similar to xcb_connect_to_display_with_auth_info(), but expects
an authorization file path rather than a xcb_auth_info_t struct.
Signed-off-by: Laércio de Sousa <laerciosousa at sme-mogidascruzes.sp.gov.br>
---
src/xcb.h | 21 +++++++++++++++++++++
src/xcb_auth.c | 15 +++++++++++++--
src/xcb_util.c | 27 ++++++++++++++++++++-------
src/xcbint.h | 2 +-
4 files changed, 55 insertions(+), 10 deletions(-)
diff --git a/src/xcb.h b/src/xcb.h
index 23fe74e..0314ce5 100644
--- a/src/xcb.h
+++ b/src/xcb.h
@@ -535,6 +535,27 @@ int xcb_parse_display(const char *name, char **host, int *display, int *screen);
xcb_connection_t *xcb_connect(const char *displayname, int *screenp);
/**
+ * @brief Connects to the X server, using and authorization file.
+ * @param displayname: The name of the display.
+ * @param authfile: The authorization file path.
+ * @param screenp: A pointer to a preferred screen number.
+ * @return A newly allocated xcb_connection_t structure.
+ *
+ * Connects to the X server specified by @p displayname, using the
+ * authorization file @p authfile. If @p authfile value @c NULL, uses
+ * the value of the XAUTHORITY environment variable. If a particular
+ * screen on that server is preferred, the int pointed to by @p screenp
+ * (if not @c NULL) will be set to that screen; otherwise @p screenp
+ * will be set to 0.
+ *
+ * Always returns a non-NULL pointer to a xcb_connection_t, even on failure.
+ * Callers need to use xcb_connection_has_error() to check for failure.
+ * When finished, use xcb_disconnect() to close the connection and free
+ * the structure.
+ */
+xcb_connection_t *xcb_connect_with_auth_file(const char *displayname, const char *authfile, int *screenp);
+
+/**
* @brief Connects to the X server, using an authorization information.
* @param display: The name of the display.
* @param auth: The authorization information.
diff --git a/src/xcb_auth.c b/src/xcb_auth.c
index 29e2b6f..284a582 100644
--- a/src/xcb_auth.c
+++ b/src/xcb_auth.c
@@ -34,6 +34,7 @@
#include <sys/param.h>
#include <unistd.h>
#include <stdlib.h>
+#include <stdio.h>
#ifdef __INTERIX
/* _don't_ ask. interix has INADDR_LOOPBACK in here. */
@@ -309,7 +310,7 @@ static struct sockaddr *get_peer_sock_name(int (*socket_func)(int,
return NULL;
}
-int _xcb_get_auth_info(int fd, xcb_auth_info_t *info, int display)
+int _xcb_get_auth_info(int fd, xcb_auth_info_t *info, int display, const char *authfile)
{
/* code adapted from Xlib/ConnDis.c, xtrans/Xtranssocket.c,
xtrans/Xtransutils.c */
@@ -334,7 +335,17 @@ int _xcb_get_auth_info(int fd, xcb_auth_info_t *info, int display)
gotsockname = 1;
}
- authptr = get_authptr(sockname, display);
+ if (authfile) {
+ FILE *f = fopen(authfile, "r");
+
+ if (f) {
+ authptr = XauReadAuth(f);
+ fclose(f);
+ }
+ }
+ else
+ authptr = get_authptr(sockname, display);
+
if (authptr == 0)
{
free(sockname);
diff --git a/src/xcb_util.c b/src/xcb_util.c
index ba0f108..aafb73d 100644
--- a/src/xcb_util.c
+++ b/src/xcb_util.c
@@ -475,12 +475,10 @@ static int _xcb_open_abstract(char *protocol, const char *file, size_t filelen)
}
#endif
-xcb_connection_t *xcb_connect(const char *displayname, int *screenp)
-{
- return xcb_connect_to_display_with_auth_info(displayname, NULL, screenp);
-}
-
-xcb_connection_t *xcb_connect_to_display_with_auth_info(const char *displayname, xcb_auth_info_t *auth, int *screenp)
+static xcb_connection_t *_xcb_connect_to_display_with_auth_info_or_file(const char *displayname,
+ const char *authfile,
+ xcb_auth_info_t *auth,
+ int *screenp)
{
int fd, display = 0;
char *host = NULL;
@@ -518,7 +516,7 @@ xcb_connection_t *xcb_connect_to_display_with_auth_info(const char *displayname,
goto out;
}
- if(_xcb_get_auth_info(fd, &ourauth, display))
+ if(_xcb_get_auth_info(fd, &ourauth, display, authfile))
{
c = xcb_connect_to_fd(fd, &ourauth);
free(ourauth.name);
@@ -542,3 +540,18 @@ out:
free(protocol);
return c;
}
+
+xcb_connection_t *xcb_connect(const char *displayname, int *screenp)
+{
+ return xcb_connect_to_display_with_auth_info(displayname, NULL, screenp);
+}
+
+xcb_connection_t *xcb_connect_with_auth_file(const char *displayname, const char *authfile, int *screenp)
+{
+ return _xcb_connect_to_display_with_auth_info_or_file(displayname, authfile, NULL, screenp);
+}
+
+xcb_connection_t *xcb_connect_to_display_with_auth_info(const char *displayname, xcb_auth_info_t *auth, int *screenp)
+{
+ return _xcb_connect_to_display_with_auth_info_or_file(displayname, NULL, auth, screenp);
+}
diff --git a/src/xcbint.h b/src/xcbint.h
index f89deba..01aca8c 100644
--- a/src/xcbint.h
+++ b/src/xcbint.h
@@ -218,7 +218,7 @@ int _xcb_conn_wait(xcb_connection_t *c, pthread_cond_t *cond, struct iovec **vec
/* xcb_auth.c */
-int _xcb_get_auth_info(int fd, xcb_auth_info_t *info, int display);
+int _xcb_get_auth_info(int fd, xcb_auth_info_t *info, int display, const char *authfile);
#ifdef GCC_HAS_VISIBILITY
#pragma GCC visibility pop
--
1.8.4.5
More information about the Xcb
mailing list