#ifndef _XTRANSINT_H_
#define _XTRANSINT_H_
#ifndef XTRANSDEBUG
# ifndef __UNIXOS2__
# define XTRANSDEBUG 1
# else
# define XTRANSDEBUG 1
# endif
#endif
#ifdef WIN32
# define _WILLWINSOCK_
#endif
#include "Xtrans.h"
#ifdef XTRANSDEBUG
# include <stdio.h>
#endif
#include <errno.h>
#ifndef WIN32
# ifndef Lynx
# include <sys/socket.h>
# else
# include <socket.h>
# endif
# include <netinet/in.h>
# include <arpa/inet.h>
# ifdef __UNIXOS2__
# include <sys/ioctl.h>
# endif
# if (defined(_POSIX_SOURCE) && !defined(AIXV3) && !defined(__QNX__)) || defined(hpux) || defined(USG) || defined(SVR4) || defined(SCO)
# ifndef NEED_UTSNAME
# define NEED_UTSNAME
# endif
# include <sys/utsname.h>
# endif
# ifndef TRANS_OPEN_MAX
# ifndef X_NOT_POSIX
# ifdef _POSIX_SOURCE
# include <limits.h>
# else
# define _POSIX_SOURCE
# include <limits.h>
# undef _POSIX_SOURCE
# endif
# endif
# ifndef OPEN_MAX
# if defined(_SC_OPEN_MAX) && !defined(__UNIXOS2__)
# define OPEN_MAX (sysconf(_SC_OPEN_MAX))
# else
# ifdef SVR4
# define OPEN_MAX 256
# else
# include <sys/param.h>
# ifndef OPEN_MAX
# ifdef __OSF1__
# define OPEN_MAX 256
# else
# ifdef NOFILE
# define OPEN_MAX NOFILE
# else
# if !defined(__UNIXOS2__) && !defined(__QNX__)
# define OPEN_MAX NOFILES_MAX
# else
# define OPEN_MAX 256
# endif
# endif
# endif
# endif
# endif
# endif
# endif
# if defined(_SC_OPEN_MAX)
# define TRANS_OPEN_MAX OPEN_MAX
# else
# if OPEN_MAX > 256
# define TRANS_OPEN_MAX 256
# else
# define TRANS_OPEN_MAX OPEN_MAX
# endif
# endif
# endif
# ifdef __UNIXOS2__
# define ESET(val)
# else
# define ESET(val) errno = val
# endif
# define EGET() errno
#else
# include <limits.h>
# define ESET(val) WSASetLastError(val)
# define EGET() WSAGetLastError()
#endif
#include <stddef.h>
#ifdef X11_t
#define X_TCP_PORT 6000
#endif
struct _XtransConnInfo {
struct _Xtransport *transptr;
int index;
char *priv;
int flags;
int fd;
char *port;
int family;
char *addr;
int addrlen;
char *peeraddr;
int peeraddrlen;
};
#define XTRANS_OPEN_COTS_CLIENT 1
#define XTRANS_OPEN_COTS_SERVER 2
#define XTRANS_OPEN_CLTS_CLIENT 3
#define XTRANS_OPEN_CLTS_SERVER 4
typedef struct _Xtransport {
char *TransName;
int flags;
#ifdef TRANS_CLIENT
XtransConnInfo (*OpenCOTSClient)(
struct _Xtransport *,
char *,
char *,
char *
);
#endif
#ifdef TRANS_SERVER
char ** nolisten;
XtransConnInfo (*OpenCOTSServer)(
struct _Xtransport *,
char *,
char *,
char *
);
#endif
#ifdef TRANS_CLIENT
XtransConnInfo (*OpenCLTSClient)(
struct _Xtransport *,
char *,
char *,
char *
);
#endif
#ifdef TRANS_SERVER
XtransConnInfo (*OpenCLTSServer)(
struct _Xtransport *,
char *,
char *,
char *
);
#endif
#ifdef TRANS_REOPEN
XtransConnInfo (*ReopenCOTSServer)(
struct _Xtransport *,
int,
char *
);
XtransConnInfo (*ReopenCLTSServer)(
struct _Xtransport *,
int,
char *
);
#endif
int (*SetOption)(
XtransConnInfo,
int,
int
);
#ifdef TRANS_SERVER
# define ADDR_IN_USE_ALLOWED 1
int (*CreateListener)(
XtransConnInfo,
char *,
unsigned int
);
int (*ResetListener)(
XtransConnInfo
);
XtransConnInfo (*Accept)(
XtransConnInfo,
int *
);
#endif
#ifdef TRANS_CLIENT
int (*Connect)(
XtransConnInfo,
char *,
char *
);
#endif
int (*BytesReadable)(
XtransConnInfo,
BytesReadable_t *
);
int (*Read)(
XtransConnInfo,
char *,
int
);
int (*Write)(
XtransConnInfo,
char *,
int
);
int (*Readv)(
XtransConnInfo,
struct iovec *,
int
);
int (*Writev)(
XtransConnInfo,
struct iovec *,
int
);
int (*Disconnect)(
XtransConnInfo
);
int (*Close)(
XtransConnInfo
);
int (*CloseForCloning)(
XtransConnInfo
);
} Xtransport;
typedef struct _Xtransport_table {
Xtransport *transport;
int transport_id;
} Xtransport_table;
#define TRANS_ALIAS (1<<0)
#define TRANS_LOCAL (1<<1)
#define TRANS_DISABLED (1<<2)
#define TRANS_NOLISTEN (1<<3)
#define TRANS_NOUNLINK (1<<4)
#define TRANS_KEEPFLAGS (TRANS_NOUNLINK)
#if defined(CRAY) || (defined(SYSV) && defined(i386) && !defined(SCO325)) || defined(WIN32) || defined(__sxg__) || defined(__UNIXOS2__)
#define READV(ciptr, iov, iovcnt) TRANS(ReadV)(ciptr, iov, iovcnt)
static int TRANS(ReadV)(
XtransConnInfo,
struct iovec *,
int
);
#else
#define READV(ciptr, iov, iovcnt) readv(ciptr->fd, iov, iovcnt)
#endif
#if defined(CRAY) || (defined(SYSV) && defined(i386) && !defined(SCO325)) || defined(WIN32) || defined(__sxg__) || defined(__UNIXOS2__)
#define WRITEV(ciptr, iov, iovcnt) TRANS(WriteV)(ciptr, iov, iovcnt)
static int TRANS(WriteV)(
XtransConnInfo,
struct iovec *,
int
);
#else
#define WRITEV(ciptr, iov, iovcnt) writev(ciptr->fd, iov, iovcnt)
#endif
static int is_numeric (
char *
);
#ifdef TRANS_SERVER
static int trans_mkdir (
char *,
int
);
#endif
#if defined(XTRANSDEBUG)
#ifdef XTRANSDEBUGTIMESTAMP
#if defined(XSERV_t) && defined(TRANS_SERVER)
#define PRMSG(lvl,x,a,b,c) if (lvl <= XTRANSDEBUG){ \
int hack= 0, saveerrno=errno; \
struct timeval tp;\
gettimeofday(&tp,0); \
ErrorF(__xtransname); \
ErrorF(x+hack,a,b,c); \
ErrorF("timestamp (ms): %d\n",tp.tv_sec*1000+tp.tv_usec/1000); \
errno=saveerrno; \
} else ((void)0)
#else
#define PRMSG(lvl,x,a,b,c) if (lvl <= XTRANSDEBUG){ \
int hack= 0, saveerrno=errno; \
struct timeval tp;\
gettimeofday(&tp,0); \
fprintf(stderr, __xtransname); fflush(stderr); \
fprintf(stderr, x+hack,a,b,c); fflush(stderr); \
fprintf(stderr, "timestamp (ms): %d\n",tp.tv_sec*1000+tp.tv_usec/1000); \
fflush(stderr); \
errno=saveerrno; \
} else ((void)0)
#endif
#else
#if defined(XSERV_t) && defined(TRANS_SERVER)
#define PRMSG(lvl,x,a,b,c) if (lvl <= XTRANSDEBUG){ \
int hack= 0, saveerrno=errno; \
ErrorF(__xtransname); \
ErrorF(x+hack,a,b,c); \
errno=saveerrno; \
} else ((void)0)
#else
#define PRMSG(lvl,x,a,b,c) if (lvl <= XTRANSDEBUG){ \
int hack= 0, saveerrno=errno; \
fprintf(stderr, __xtransname); fflush(stderr); \
fprintf(stderr, x+hack,a,b,c); fflush(stderr); \
errno=saveerrno; \
} else ((void)0)
#endif
#endif
#else
#define PRMSG(lvl,x,a,b,c) ((void)0)
#endif
#endif