| Summary: | libxcb-1.1: xcb_auth.c/xcb_util.c problem fix (Solaris2.6) | ||
|---|---|---|---|
| Product: | XCB | Reporter: | acni <anirkko> |
| Component: | Library | Assignee: | Jamey Sharp <jamey> |
| Status: | RESOLVED WONTFIX | QA Contact: | xcb mailing list dummy <xcb> |
| Severity: | normal | ||
| Priority: | medium | ||
| Version: | 1.0 | ||
| Hardware: | SPARC | ||
| OS: | Solaris | ||
| Whiteboard: | |||
| i915 platform: | i915 features: | ||
Changes for systems without support for IPv6 have gone in since you filed this bug, but a fallback for systems without getaddrinfo hasn't. I'd like to see a patch using autoconf to check for getaddrinfo. Anybody? Given that we didn't get a patch back then, I don't think a full ten years later we're likely to get patches in from Solaris 2.6 users. |
Use of freedesktop.org services, including Bugzilla, is subject to our Code of Conduct. How we collect and use information is described in our Privacy Policy.
Building libxcb-1.1 on Solaris2.6 also fails because on this old system, the newer getaddrinfo() / freeaddrinfo() are not available and AF_INET6 is not defined. (You may ask yourself why to bother with such an old system. Well, among others, some old hardware drivers are not available for newer OS versions). A solution seems simple enough to be worth considering: On systems which don't have getaddrinfo(), use the older gethostbyname() and exclude the AF_INET6 containing blocks (since not available on these systems, anyway). Maybe '#ifdef AF_INET6' could be used for both conditional changes without any change in 'configure' or else configure could work out if getaddrinfo() is available (#define HAS_GETADDRINFO)... When I applied the following changes to xcb_auth.c and xcb_util.c then compilation worked, but maybe someone with more experience in network programming should check and test: xcb_auth.c, line 95, switch construct in function get_authptr(): conditionally exclude the whole 'case AF_INET6:' block (10 lines) with an #ifdef AF_INET6 / #endif pair. xcb_util.c, line 201 , function _xcb_open_tcp(): conditionally replace the whole function, using some construct like #ifdef HAS_GETADDRINFO (or maybe just #ifdef AF_INET6 ?) / #else / #endif, with some alternative function similar to: ... #else /* //### for older systems, for example Solaris2.6, //### rewrite to use gethostbyname() instead of getaddrinfo() which //### was not yet available on these old systems. */ static int _xcb_open_tcp(char *host, char *protocol, const unsigned short port) { int fd = -1; struct hostent *hostent_results; struct sockaddr sock_addr; char **pAddr; char *bracket; if (protocol && strcmp("tcp",protocol)) return -1; /* DO NOT allow IPv6 addresses enclosed in brackets. */ if(host[0] == '[' && (bracket = strrchr(host, ']')) && bracket[1] == '\0') return -1; if ( NULL == (hostent_results = gethostbyname(host)) ) return -1; for(pAddr = hostent_results->h_addr_list; *pAddr; pAddr++) { fd = socket(AF_INET, SOCK_STREAM, 0); sock_addr.sa_family = AF_INET; memcpy(sock_addr.sa_data, *pAddr, hostent_results->h_length); if(fd >= 0 && connect(fd, &sock_addr, hostent_results->h_length) >= 0) break; fd = -1; } return fd; } #endif [compiles / allows libxcb to be built - but function is not tested!]