[PATCH libXau] XauGet*AuthByAddr: add new variants which allow passing an explicit authorization file path.

LaƩrcio de Sousa laerciosousa at sme-mogidascruzes.sp.gov.br
Mon Oct 20 05:19:37 PDT 2014


It will allow extending functions like Xlib's XOpenDislay() or XCB's xcb_connect()
to allow passing an explicit authorization file path (they already allow passing
an explicit display number). This can be useful in exceptional cases where
XAUTHORITY environment variable is not set at the time a X11 client is launched.
Currently, a X11 client that needs to connect to a display with a given
authorization file needs to set XAUTHORITY itself (if not yet set) before connecting.

Signed-off-by: Laércio de Sousa <laerciosousa at sme-mogidascruzes.sp.gov.br>
---
 AuGetAddr.c                          | 38 ++++++++++++++++++++++++++++--
 AuGetBest.c                          | 36 +++++++++++++++++++++++++++--
 include/X11/Xauth.h                  | 45 ++++++++++++++++++++++++++++++++++++
 man/Xau.man                          | 20 ++++++++++++++--
 man/XauGetAuthByAddrWithFile.man     |  1 +
 man/XauGetBestAuthByAddrWithFile.man |  1 +
 6 files changed, 135 insertions(+), 6 deletions(-)
 create mode 100644 man/XauGetAuthByAddrWithFile.man
 create mode 100644 man/XauGetBestAuthByAddrWithFile.man

diff --git a/AuGetAddr.c b/AuGetAddr.c
index 6f5fe16..3aeffa4 100644
--- a/AuGetAddr.c
+++ b/AuGetAddr.c
@@ -33,7 +33,8 @@ in this Software without prior written authorization from The Open Group.
 #define binaryEqual(a, b, len) (memcmp(a, b, len) == 0)
 
 Xauth *
-XauGetAuthByAddr (
+XauGetAuthByAddrWithFile (
+_Xconst char*	auth_file,
 #if NeedWidePrototypes
 unsigned int	family,
 unsigned int	address_length,
@@ -59,7 +60,7 @@ _Xconst char*	name)
     char    *auth_name;
     Xauth   *entry;
 
-    auth_name = XauFileName ();
+    auth_name = auth_file ? auth_file : XauFileName ();
     if (!auth_name)
 	return NULL;
     if (access (auth_name, R_OK) != 0)		/* checks REAL id */
@@ -100,3 +101,36 @@ _Xconst char*	name)
     (void) fclose (auth_file);
     return entry;
 }
+
+Xauth *
+XauGetAuthByAddr (
+#if NeedWidePrototypes
+unsigned int	family,
+unsigned int	address_length,
+#else
+unsigned short	family,
+unsigned short	address_length,
+#endif
+_Xconst char*	address,
+#if NeedWidePrototypes
+unsigned int	number_length,
+#else
+unsigned short	number_length,
+#endif
+_Xconst char*	number,
+#if NeedWidePrototypes
+unsigned int	name_length,
+#else
+unsigned short	name_length,
+#endif
+_Xconst char*	name)
+{
+    XauGetAuthByAddrWithFile (NULL,
+                              family,
+                              address_length,
+                              address,
+                              number_length,
+                              number,
+                              name_length,
+                              name);
+}
diff --git a/AuGetBest.c b/AuGetBest.c
index 5556559..73ee907 100644
--- a/AuGetBest.c
+++ b/AuGetBest.c
@@ -41,7 +41,8 @@ in this Software without prior written authorization from The Open Group.
 #define binaryEqual(a, b, len) (memcmp(a, b, len) == 0)
 
 Xauth *
-XauGetBestAuthByAddr (
+XauGetBestAuthByAddrWithFile (
+    _Xconst char*	auth_file,
 #if NeedWidePrototypes
     unsigned int	family,
     unsigned int	address_length,
@@ -71,7 +72,7 @@ XauGetBestAuthByAddr (
     unsigned short	fully_qual_address_length;
 #endif
 
-    auth_name = XauFileName ();
+    auth_name = auth_file ? auth_file : XauFileName ();
     if (!auth_name)
 	return NULL;
     if (access (auth_name, R_OK) != 0)		/* checks REAL id */
@@ -161,3 +162,34 @@ XauGetBestAuthByAddr (
     (void) fclose (auth_file);
     return best;
 }
+
+Xauth *
+XauGetBestAuthByAddr (
+#if NeedWidePrototypes
+    unsigned int	family,
+    unsigned int	address_length,
+#else
+    unsigned short	family,
+    unsigned short	address_length,
+#endif
+    _Xconst char*	address,
+#if NeedWidePrototypes
+    unsigned int	number_length,
+#else
+    unsigned short	number_length,
+#endif
+    _Xconst char*	number,
+    int			types_length,
+    char**		types,
+    _Xconst int*	type_lengths)
+{
+    XauGetBestAuthByAddrWithFile (NULL,
+                                  family,
+                                  address_length,
+                                  address,
+                                  number_length,
+                                  number,
+                                  types_length,
+                                  types,
+                                  type_lengths);
+}
diff --git a/include/X11/Xauth.h b/include/X11/Xauth.h
index a707bed..c5765ff 100644
--- a/include/X11/Xauth.h
+++ b/include/X11/Xauth.h
@@ -112,6 +112,30 @@ unsigned short	/* name_length */,
 _Xconst char*	/* name */
 );
 
+Xauth *XauGetAuthByAddrWithFile(
+_Xconst char*	/* auth_file */,
+#if NeedWidePrototypes
+unsigned int	/* family */,
+unsigned int	/* address_length */,
+#else
+unsigned short	/* family */,
+unsigned short	/* address_length */,
+#endif
+_Xconst char*	/* address */,
+#if NeedWidePrototypes
+unsigned int	/* number_length */,
+#else
+unsigned short	/* number_length */,
+#endif
+_Xconst char*	/* number */,
+#if NeedWidePrototypes
+unsigned int	/* name_length */,
+#else
+unsigned short	/* name_length */,
+#endif
+_Xconst char*	/* name */
+);
+
 Xauth *XauGetBestAuthByAddr(
 #if NeedWidePrototypes
 unsigned int	/* family */,
@@ -132,6 +156,27 @@ char**		/* type_names */,
 _Xconst int*	/* type_lengths */
 );
 
+Xauth *XauGetBestAuthByAddrWithFile(
+_Xconst char*	/* auth_file */,
+#if NeedWidePrototypes
+unsigned int	/* family */,
+unsigned int	/* address_length */,
+#else
+unsigned short	/* family */,
+unsigned short	/* address_length */,
+#endif
+_Xconst char*	/* address */,
+#if NeedWidePrototypes
+unsigned int	/* number_length */,
+#else
+unsigned short	/* number_length */,
+#endif
+_Xconst char*	/* number */,
+int		/* types_length */,
+char**		/* type_names */,
+_Xconst int*	/* type_lengths */
+);
+
 void XauDisposeAuth(
 Xauth*		/* auth */
 );
diff --git a/man/Xau.man b/man/Xau.man
index d1b6603..e7060c7 100644
--- a/man/Xau.man
+++ b/man/Xau.man
@@ -56,11 +56,23 @@ Xauth *XauGetAuthByAddr (unsigned short \fIfamily\fP\^, unsigned short
 \fInumber_length\fP\^, const char *\fInumber\fP\^, unsigned short
 \fIname_length\fP\^, const char *\fIname\fP\^);
 .HP
+Xauth *XauGetAuthByAddrWithFile (const char* \fIauth_file\fP\^,
+unsigned short \fIfamily\fP\^, unsigned short \fIaddress_length\fP\^,
+const char *\fIaddress\fP\^, unsigned short \fInumber_length\fP\^,
+const char *\fInumber\fP\^, unsigned short \fIname_length\fP\^,
+const char *\fIname\fP\^);
+.HP
 Xauth *XauGetBestAuthByAddr (unsigned short \fIfamily\fP\^, unsigned short
 \fIaddress_length\fP\^, const char *\fIaddress\fP\^, unsigned short
 \fInumber_length\fP\^, const char *\fInumber\fP\^, int \fItypes_length\fP\^,
 char **\fItypes\fR\^, const int *\fItype_lengths\fR\^);
 .HP
+Xauth *XauGetBestAuthByAddrWithFile (const char* \fIauth_file\fP\^,
+unsigned short \fIfamily\fP\^, unsigned short \fIaddress_length\fP\^,
+const char *\fIaddress\fP\^, unsigned short \fInumber_length\fP\^,
+const char *\fInumber\fP\^, int \fItypes_length\fP\^, char **\fItypes\fR\^,
+const int *\fItype_lengths\fR\^);
+.HP
 int XauLockAuth (const char *\fIfile_name\fP\^, int \fIretries\fP\^, int
 \fItimeout\fP\^, long \fIdead\fP\^);
 .HP
@@ -85,7 +97,9 @@ returns 1 on success, 0 on failure.
 .PP
 \fBXauGetAuthByAddr\fP searches for an entry which matches the given network
 address/display number pair.  The entry is \fBnot\fP statically allocated
-and should be freed by calling \fIXauDisposeAuth\fP.
+and should be freed by calling \fIXauDisposeAuth\fP. It gets authorization
+file path by calling \fIXauFileName\fP, but its corresponding function
+\fBXauGetAuthByAddrWithFile\fP allows passing an explicit one.
 .PP
 \fBXauGetBestAuthByAddr\fP is similar to \fBXauGetAuthByAddr\fP, except
 that a list of acceptable authentication methods is specified.  Xau will
@@ -94,7 +108,9 @@ most secure authentication method).  The \fItypes\fP argument is an array of
 strings, one string for each authentication method.  \fItypes_length\fP
 specifies how many elements are in the \fItypes\fP array.
 \fItypes_lengths\fP is an array of integers representing the length
-of each string.
+of each string. It gets authorization file path by calling \fIXauFileName\fP,
+but its corresponding function \fBXauGetBestAuthByAddrWithFile\fP allows
+passing an explicit one.
 .PP
 \fBXauLockAuth\fP does the work necessary to synchronously update an
 authorization file.  First it makes two file names, one with ``-c'' appended
diff --git a/man/XauGetAuthByAddrWithFile.man b/man/XauGetAuthByAddrWithFile.man
new file mode 100644
index 0000000..df111d6
--- /dev/null
+++ b/man/XauGetAuthByAddrWithFile.man
@@ -0,0 +1 @@
+.so man__libmansuffix__/Xau.__libmansuffix__
diff --git a/man/XauGetBestAuthByAddrWithFile.man b/man/XauGetBestAuthByAddrWithFile.man
new file mode 100644
index 0000000..df111d6
--- /dev/null
+++ b/man/XauGetBestAuthByAddrWithFile.man
@@ -0,0 +1 @@
+.so man__libmansuffix__/Xau.__libmansuffix__
-- 
1.8.4.5



More information about the xorg-devel mailing list