From 049932c0171855aa6d55222947f4d47495b6f173 Mon Sep 17 00:00:00 2001 From: Alan Coopersmith Date: Mon, 21 Aug 2006 19:08:19 -0700 Subject: Merge Solaris named pipe transport support into LOCALCONN Also clean up #ifdefs in Xtranslcl for which transport types are supported Add "pipe" alias for named pipe transport on Solaris to match Solaris Xlib. --- Xtranslcl.c | 234 +++++++++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 183 insertions(+), 51 deletions(-) (limited to 'Xtranslcl.c') diff --git a/Xtranslcl.c b/Xtranslcl.c index 6165d36..e994fe5 100644 --- a/Xtranslcl.c +++ b/Xtranslcl.c @@ -87,7 +87,11 @@ from The Open Group. #include #endif #endif -#include +#ifdef sun +# include +#else +# include +#endif #include #include @@ -108,6 +112,26 @@ typedef unsigned short mode_t; /* POSIX needed for mode_t define in sys/types.h */ #endif +/* Types of local connections supported: + * - PTS + * - named pipes + * - ISC + * - SCO + */ +#if !defined(sun) +# define LOCAL_TRANS_PTS +#endif +#if defined(SVR4) || defined(__SVR4) +# define LOCAL_TRANS_NAMED +#endif +#if !defined(sun) && !defined(__SCO__) && !defined(__UNIXWARE__) +/* SCO doesnt use the ISC transport type - it causes problems */ +# define LOCAL_TRANS_ISC +#endif +#if defined(__SCO__) || defined(__UNIXWARE__) +# define LOCAL_TRANS_SCO +#endif + /* * These functions actually implement the local connection mechanisms. */ @@ -195,6 +219,7 @@ TRANS(FillAddrInfo)(XtransConnInfo ciptr, char *sun_path, char *peer_sun_path) +#ifdef LOCAL_TRANS_PTS /* PTS */ #if defined(SYSV) && !defined(__SCO__) && !defined(ISC) @@ -215,6 +240,7 @@ static void _dummy(int sig) { } +#endif /* LOCAL_TRANS_PTS */ #ifndef sun #define X_STREAMS_DIR "/dev/X" @@ -236,11 +262,10 @@ static void _dummy(int sig) #if defined(X11_t) #define PTSNODENAME "/dev/X/server." -#ifndef sun -#define NAMEDNODENAME "/dev/X/Nserver." -#else +#ifdef sun #define NAMEDNODENAME "/tmp/.X11-pipe/X" -#endif +#else +#define NAMEDNODENAME "/dev/X/Nserver." /* * ISC is only defined for X11 since they are there for @@ -252,14 +277,22 @@ static void _dummy(int sig) #define ISCTMPNODENAME "/tmp/.X11-unix/X%s" #define SCORNODENAME "/dev/X%1sR" #define SCOSNODENAME "/dev/X%1sS" +#endif /* !sun */ #endif #if defined(XIM_t) +#ifdef sun +#define NAMEDNODENAME "/tmp/.XIM-pipe/XIM" +#else #define PTSNODENAME "/dev/X/XIM." #define NAMEDNODENAME "/dev/X/NXIM." #define SCORNODENAME "/dev/XIM.%sR" #define SCOSNODENAME "/dev/XIM.%sS" #endif +#endif #if defined(FS_t) || defined (FONT_t) +#ifdef sun +#define NAMEDNODENAME "/tmp/.font-pipe/fs" +#else /* * USL has already defined something here. We need to check with them * and see if their choice is usable here. @@ -269,13 +302,21 @@ static void _dummy(int sig) #define SCORNODENAME "/dev/fontserver.%sR" #define SCOSNODENAME "/dev/fontserver.%sS" #endif +#endif #if defined(ICE_t) +#ifdef sun +#define NAMEDNODENAME "/tmp/.ICE-pipe/" +#else #define PTSNODENAME "/dev/X/ICE." #define NAMEDNODENAME "/dev/X/NICE." #define SCORNODENAME "/dev/ICE.%sR" #define SCOSNODENAME "/dev/ICE.%sS" #endif +#endif #if defined(TEST_t) +#ifdef sun +#define NAMEDNODENAME "/tmp/.Test-unix/test" +#endif #define PTSNODENAME "/dev/X/transtest." #define NAMEDNODENAME "/dev/X/Ntranstest." #define SCORNODENAME "/dev/transtest.%sR" @@ -284,7 +325,7 @@ static void _dummy(int sig) -#ifndef sun +#ifdef LOCAL_TRANS_PTS #ifdef TRANS_CLIENT static int @@ -630,10 +671,10 @@ TRANS(PTSAccept)(XtransConnInfo ciptr, XtransConnInfo newciptr, int *status) } #endif /* TRANS_SERVER */ -#endif /* sun */ +#endif /* LOCAL_TRANS_PTS */ -#ifdef SVR4 +#ifdef LOCAL_TRANS_NAMED /* NAMED */ @@ -647,7 +688,9 @@ TRANS(NAMEDOpenClient)(XtransConnInfo ciptr, char *port) int fd; char server_path[64]; struct stat filestat; - extern int isastream(); +# ifndef sun + extern int isastream(int); +# endif #endif PRMSG(2,"NAMEDOpenClient(%s)\n", port, 0,0 ); @@ -658,29 +701,32 @@ TRANS(NAMEDOpenClient)(XtransConnInfo ciptr, char *port) #else if ( port && *port ) { if( *port == '/' ) { /* A full pathname */ - (void) sprintf(server_path, "%s", port); + (void) snprintf(server_path, sizeof(server_path), "%s", port); } else { - (void) sprintf(server_path, "%s%s", NAMEDNODENAME, port); + (void) snprintf(server_path, sizeof(server_path), "%s%s", NAMEDNODENAME, port); } } else { - (void) sprintf(server_path, "%s%ld", NAMEDNODENAME, (long)getpid()); + (void) snprintf(server_path, sizeof(server_path), "%s%ld", NAMEDNODENAME, (long)getpid()); } - if (stat(server_path, &filestat) < 0 ) { - PRMSG(1,"NAMEDOpenClient: No device %s for NAMED connection\n", server_path, 0,0 ); + if ((fd = open(server_path, O_RDWR)) < 0) { + PRMSG(1,"NAMEDOpenClient: Cannot open %s for NAMED connection\n", server_path, 0,0 ); + return -1; + } + + if (fstat(fd, &filestat) < 0 ) { + PRMSG(1,"NAMEDOpenClient: Cannot stat %s for NAMED connection\n", server_path, 0,0 ); + (void) close(fd); return -1; } if ((filestat.st_mode & S_IFMT) != S_IFIFO) { PRMSG(1,"NAMEDOpenClient: Device %s is not a FIFO\n", server_path, 0,0 ); /* Is this really a failure? */ + (void) close(fd); return -1; } - if ((fd = open(server_path, O_RDWR)) < 0) { - PRMSG(1,"NAMEDOpenClient: Cannot open %s for NAMED connection\n", server_path, 0,0 ); - return -1; - } if (isastream(fd) <= 0) { PRMSG(1,"NAMEDOpenClient: %s is not a streams device\n", server_path, 0,0 ); @@ -737,10 +783,14 @@ TRANS(NAMEDOpenServer)(XtransConnInfo ciptr, char *port) (void) sprintf(server_path, "%s%ld", NAMEDNODENAME, (long)getpid()); } +#ifdef sun + mode = 0775; /* Solaris requires uid or gid 0 to create X pipes */ +#else #ifdef HAS_STICKY_DIR_BIT mode = 01777; #else mode = 0777; +#endif #endif if (trans_mkdir(X_STREAMS_DIR, mode) == -1) { PRMSG (1, "NAMEDOpenServer: mkdir(%s) failed, errno = %d\n", @@ -820,7 +870,7 @@ TRANS(NAMEDAccept)(XtransConnInfo ciptr, XtransConnInfo newciptr, int *status) newciptr->addrlen=ciptr->addrlen; if( (newciptr->addr=(char *)xalloc(newciptr->addrlen)) == NULL ) { PRMSG(1, - "NAMEDAccept: failed to allocate memory for peer addr\n", + "NAMEDAccept: failed to allocate memory for pipe addr\n", 0,0,0); close(str.fd); *status = TRANS_ACCEPT_BAD_MALLOC; @@ -849,11 +899,11 @@ TRANS(NAMEDAccept)(XtransConnInfo ciptr, XtransConnInfo newciptr, int *status) #endif /* TRANS_SERVER */ -#endif /* SVR4 */ +#endif /* LOCAL_TRANS_NAMED */ -#ifndef sun +#if defined(LOCAL_TRANS_ISC) || defined(LOCAL_TRANS_SCO) /* * connect_spipe is used by the SCO and ISC connection types. @@ -907,8 +957,10 @@ named_spipe(int fd, char *path) return(ret); } -/* SCO doesnt use the ISC transport type - it causes problems */ -#if !defined(__SCO__) && !defined(__UNIXWARE__) +#endif /* defined(LOCAL_TRANS_ISC) || defined(LOCAL_TRANS_SCO) */ + + +#if defined(LOCAL_TRANS_ISC) /* ISC */ @@ -1192,9 +1244,10 @@ TRANS(ISCAccept)(XtransConnInfo ciptr, XtransConnInfo newciptr, int *status) } #endif /* TRANS_SERVER */ -#endif /* !__SCO__ && !__UNIXWARE__ */ +#endif /* LOCAL_TRANS_ISC */ +#ifdef LOCAL_TRANS_SCO /* SCO */ /* @@ -1469,12 +1522,12 @@ TRANS(SCOAccept)(XtransConnInfo ciptr, XtransConnInfo newciptr, int *status) } #endif /* TRANS_SERVER */ -#endif /* sun */ +#endif /* LOCAL_TRANS_SCO */ #ifdef TRANS_REOPEN -#ifndef sun +#ifdef LOCAL_TRANS_PTS static int TRANS(PTSReopenServer)(XtransConnInfo ciptr, int fd, char *port) @@ -1512,7 +1565,9 @@ TRANS(PTSReopenServer)(XtransConnInfo ciptr, int fd, char *port) #endif /* !PTSNODENAME */ } -#endif /* !sun */ +#endif /* LOCAL_TRANS_PTS */ + +#ifdef LOCAL_TRANS_NAMED static int TRANS(NAMEDReopenServer)(XtransConnInfo ciptr, int fd, char *port) @@ -1550,8 +1605,9 @@ TRANS(NAMEDReopenServer)(XtransConnInfo ciptr, int fd, char *port) #endif /* !NAMEDNODENAME */ } -#ifndef sun -#if !defined(__SCO__) && !defined(__UNIXWARE__) +#endif /* LOCAL_TRANS_NAMED */ + +#ifdef LOCAL_TRANS_ISC static int TRANS(ISCReopenServer)(XtransConnInfo ciptr, int fd, char *port) @@ -1579,8 +1635,9 @@ TRANS(ISCReopenServer)(XtransConnInfo ciptr, int fd, char *port) #endif /* !ISCDEVNODENAME */ } -#endif /* !__SCO__ && !__UNIXWARE__ */ +#endif /* LOCAL_TRANS_ISC */ +#ifdef LOCAL_TRANS_SCO static int TRANS(SCOReopenServer)(XtransConnInfo ciptr, int fd, char *port) @@ -1614,7 +1671,7 @@ TRANS(SCOReopenServer)(XtransConnInfo ciptr, int fd, char *port) #endif /* SCORNODENAME */ } -#endif /* !sun */ +#endif /* LOCAL_TRANS_SCO */ #endif /* TRANS_REOPEN */ @@ -1687,7 +1744,7 @@ typedef struct _LOCALtrans2dev { } LOCALtrans2dev; static LOCALtrans2dev LOCALtrans2devtab[] = { -#ifndef sun +#ifdef LOCAL_TRANS_PTS {"", #ifdef TRANS_CLIENT TRANS(PTSOpenClient), @@ -1753,7 +1810,7 @@ static LOCALtrans2dev LOCALtrans2devtab[] = { TRANS(PTSAccept) #endif /* TRANS_SERVER */ }, -#else /* sun */ +#else /* !LOCAL_TRANS_PTS */ {"", #ifdef TRANS_CLIENT TRANS(NAMEDOpenClient), @@ -1797,9 +1854,9 @@ static LOCALtrans2dev LOCALtrans2devtab[] = { TRANS(NAMEDAccept) #endif /* TRANS_SERVER */ }, -#endif /* sun */ +#endif /* !LOCAL_TRANS_PTS */ -#ifdef SVR4 +#ifdef LOCAL_TRANS_NAMED {"named", #ifdef TRANS_CLIENT TRANS(NAMEDOpenClient), @@ -1821,10 +1878,33 @@ static LOCALtrans2dev LOCALtrans2devtab[] = { TRANS(NAMEDAccept) #endif /* TRANS_SERVER */ }, -#endif /* SVR4 */ -#ifndef sun -#if !defined(__SCO__) && !defined(__UNIXWARE__) +#ifdef sun /* Alias "pipe" to named, since that's what Solaris called it */ +{"pipe", +#ifdef TRANS_CLIENT + TRANS(NAMEDOpenClient), +#endif /* TRANS_CLIENT */ +#ifdef TRANS_SERVER + TRANS(NAMEDOpenServer), +#endif /* TRANS_SERVER */ +#ifdef TRANS_CLIENT + TRANS(OpenFail), +#endif /* TRANS_CLIENT */ +#ifdef TRANS_SERVER + TRANS(OpenFail), +#endif /* TRANS_SERVER */ +#ifdef TRANS_REOPEN + TRANS(NAMEDReopenServer), + TRANS(ReopenFail), +#endif +#ifdef TRANS_SERVER + TRANS(NAMEDAccept) +#endif /* TRANS_SERVER */ +}, +#endif /* sun */ +#endif /* LOCAL_TRANS_NAMED */ + +#ifdef LOCAL_TRANS_ISC {"isc", #ifdef TRANS_CLIENT TRANS(ISCOpenClient), @@ -1846,8 +1926,9 @@ static LOCALtrans2dev LOCALtrans2devtab[] = { TRANS(ISCAccept) #endif /* TRANS_SERVER */ }, -#endif /* !__SCO__ && !__UNIXWARE__ */ +#endif /* LOCAL_TRANS_ISC */ +#ifdef LOCAL_TRANS_SCO {"sco", #ifdef TRANS_CLIENT TRANS(SCOOpenClient), @@ -1869,7 +1950,7 @@ static LOCALtrans2dev LOCALtrans2devtab[] = { TRANS(SCOAccept) #endif /* TRANS_SERVER */ }, -#endif /* sun */ +#endif /* LOCAL_TRANS_SCO */ }; #define NUMTRANSPORTS (sizeof(LOCALtrans2devtab)/sizeof(LOCALtrans2dev)) @@ -1882,6 +1963,8 @@ static char *freeXLOCAL=NULL; #define DEF_XLOCAL "SCO:UNIX:PTS" #elif defined(__UNIXWARE__) #define DEF_XLOCAL "UNIX:PTS:NAMED:SCO" +#elif defined(sun) +#define DEF_XLOCAL "UNIX:NAMED" #else #define DEF_XLOCAL "UNIX:PTS:NAMED:ISC:SCO" #endif @@ -1942,7 +2025,7 @@ TRANS(LocalGetNextTransport)(void) for(i=0;i