X-Git-Url: http://git.demorecorder.com/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fxcb_util.c;h=ad9b3df7c9e693112ad9f922a3d67c7d072d7b74;hb=4b502dd696cf7f59a961bcf71c9255ae28f0765a;hp=c14d9d5dd2fee26263f93042685547beea5d0661;hpb=28d39258008fcc8ced84dc6c1dd2644e2c908c87;p=free-sw%2Fxcb%2Flibxcb diff --git a/src/xcb_util.c b/src/xcb_util.c index c14d9d5..ad9b3df 100644 --- a/src/xcb_util.c +++ b/src/xcb_util.c @@ -28,10 +28,6 @@ #include #include #include -#ifdef DNETCONN -#include -#include -#endif #include #include #include @@ -54,7 +50,11 @@ #include "xcbext.h" #include "xcbint.h" -static const int error_connection = 1; +/* must be after "xcbint.h" to get autoconf #defines */ +#if defined(HAVE_TSOL_LABEL_H) && defined(HAVE_IS_SYSTEM_LABELED) +# include +# include +#endif int xcb_popcount(uint32_t mask) { @@ -157,9 +157,6 @@ static int _xcb_open_tcp(const char *host, char *protocol, const unsigned short #ifndef _WIN32 static int _xcb_open_unix(char *protocol, const char *file); #endif /* !WIN32 */ -#ifdef DNETCONN -static int _xcb_open_decnet(const char *host, char *protocol, const unsigned short port); -#endif #ifdef HAVE_ABSTRACT_SOCKETS static int _xcb_open_abstract(char *protocol, const char *file, size_t filelen); #endif @@ -183,29 +180,31 @@ static int _xcb_open(const char *host, char *protocol, const int display) if(*host || protocol) { -#ifdef DNETCONN - /* DECnet displays have two colons, so _xcb_parse_display will have - left one at the end. However, an IPv6 address can end with *two* - colons, so only treat this as a DECnet display if host ends with - exactly one colon. */ - char *colon = strchr(host, ':'); - if(colon && *(colon+1) == '\0') - { - *colon = '\0'; - return _xcb_open_decnet(host, protocol, display); - } - else -#endif - if (protocol - || strcmp("unix",host)) { /* follow the old unix: rule */ + if (protocol + || strcmp("unix",host)) { /* follow the old unix: rule */ - /* display specifies TCP */ - unsigned short port = X_TCP_PORT + display; - return _xcb_open_tcp(host, protocol, port); - } + /* display specifies TCP */ + unsigned short port = X_TCP_PORT + display; + return _xcb_open_tcp(host, protocol, port); + } } #ifndef _WIN32 +#if defined(HAVE_TSOL_LABEL_H) && defined(HAVE_IS_SYSTEM_LABELED) + /* Check special path for Unix sockets under Solaris Trusted Extensions */ + if (is_system_labeled()) + { + struct stat sbuf; + const char *tsol_base = "/var/tsol/doors/.X11-unix/X"; + char tsol_socket[PATH_MAX]; + + snprintf(tsol_socket, sizeof(tsol_socket), "%s%d", tsol_base, display); + + if (stat(tsol_socket, &sbuf) == 0) + base = tsol_base; + } +#endif + filelen = strlen(base) + 1 + sizeof(display) * 3 + 1; file = malloc(filelen); if(file == NULL) @@ -260,45 +259,6 @@ static int _xcb_socket(int family, int type, int proto) return fd; } -#ifdef DNETCONN -static int _xcb_open_decnet(const char *host, const char *protocol, const unsigned short port) -{ - int fd; - struct sockaddr_dn addr; - struct accessdata_dn accessdata; - struct nodeent *nodeaddr = getnodebyname(host); - - if(!nodeaddr) - return -1; - if (protocol && strcmp("dnet",protocol)) - return -1; - addr.sdn_family = AF_DECnet; - - addr.sdn_add.a_len = nodeaddr->n_length; - memcpy(addr.sdn_add.a_addr, nodeaddr->n_addr, addr.sdn_add.a_len); - - addr.sdn_objnamel = sprintf((char *)addr.sdn_objname, "X$X%d", port); - if(addr.sdn_objnamel < 0) - return -1; - addr.sdn_objnum = 0; - - fd = _xcb_socket(PF_DECnet, SOCK_STREAM, 0); - if(fd == -1) - return -1; - - memset(&accessdata, 0, sizeof(accessdata)); - accessdata.acc_accl = sprintf((char*)accessdata.acc_acc, "%d", getuid()); - if(accessdata.acc_accl < 0) - return -1; - setsockopt(fd, DNPROTO_NSP, SO_CONACCESS, &accessdata, sizeof(accessdata)); - - if(connect(fd, (struct sockaddr *) &addr, sizeof(addr)) == -1) { - close(fd); - return -1; - } - return fd; -} -#endif static int _xcb_open_tcp(const char *host, char *protocol, const unsigned short port) {