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 <[email protected]> --- 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 _______________________________________________ [email protected]: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel
