00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050 #ifndef _XTRANSINT_H_
00051 #define _XTRANSINT_H_
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071 #ifndef __EMX__
00072 # define XTRANSDEBUG 1
00073 #else
00074 #define XTRANSDEBUG 1
00075 #endif
00076
00077 #ifdef _WIN32
00078 #define _WILLWINSOCK_
00079 #endif
00080
00081 #include "Xtrans.h"
00082
00083 #ifdef XTRANSDEBUG
00084 #include <stdio.h>
00085 #endif
00086
00087 #include <errno.h>
00088 #ifdef X_NOT_STDC_ENV
00089 extern int errno;
00090 #endif
00091
00092 #ifndef _WIN32
00093 #ifndef MINIX
00094 #ifndef Lynx
00095 #include <sys/socket.h>
00096 #else
00097 #include <socket.h>
00098 #endif
00099 #include <netinet/in.h>
00100 #include <arpa/inet.h>
00101 #endif
00102 #ifdef __EMX__
00103 #include <sys/ioctl.h>
00104 #endif
00105
00106
00107
00108
00109
00110
00111 #if (defined(_POSIX_SOURCE) && !defined(AIXV3) && !defined(__QNX__)) || defined(hpux) || defined(USG) || defined(SVR4) || defined(SCO)
00112 #ifndef NEED_UTSNAME
00113 #define NEED_UTSNAME
00114 #endif
00115 #include <sys/utsname.h>
00116 #endif
00117
00118
00119
00120
00121
00122 #ifndef TRANS_OPEN_MAX
00123
00124 #ifndef X_NOT_POSIX
00125 #ifdef _POSIX_SOURCE
00126 #include <limits.h>
00127 #else
00128 #define _POSIX_SOURCE
00129 #include <limits.h>
00130 #undef _POSIX_SOURCE
00131 #endif
00132 #endif
00133 #ifndef OPEN_MAX
00134 #ifdef __GNU__
00135 #define OPEN_MAX (sysconf(_SC_OPEN_MAX))
00136 #endif
00137 #ifdef SVR4
00138 #define OPEN_MAX 256
00139 #else
00140 #include <sys/param.h>
00141 #ifndef OPEN_MAX
00142 #if defined(__OSF1__) || defined(__osf__)
00143 #define OPEN_MAX 256
00144 #else
00145 #ifdef NOFILE
00146 #define OPEN_MAX NOFILE
00147 #else
00148 #if !defined(__EMX__) && !defined(__QNX__)
00149 #define OPEN_MAX NOFILES_MAX
00150 #else
00151 #define OPEN_MAX 256
00152 #endif
00153 #endif
00154 #endif
00155 #endif
00156 #endif
00157 #endif
00158 #ifdef __GNU__
00159 #define TRANS_OPEN_MAX OPEN_MAX
00160 #else
00161 #if OPEN_MAX > 256
00162 #define TRANS_OPEN_MAX 256
00163 #else
00164 #define TRANS_OPEN_MAX OPEN_MAX
00165 #endif
00166 #endif
00167
00168 #endif
00169
00170 #ifdef __EMX__
00171 #define ESET(val)
00172 #else
00173 #define ESET(val) errno = val
00174 #endif
00175 #define EGET() errno
00176
00177 #else
00178
00179 #include <limits.h>
00180
00181 #define ESET(val) WSASetLastError(val)
00182 #define EGET() WSAGetLastError()
00183
00184 #endif
00185
00186 #ifndef NULL
00187 #define NULL 0
00188 #endif
00189
00190 #ifdef X11_t
00191 #define X_TCP_PORT 6000
00192 #endif
00193
00194 struct _XtransConnInfo {
00195 struct _Xtransport *transptr;
00196 int index;
00197 char *priv;
00198 int flags;
00199 int fd;
00200 char *port;
00201 int family;
00202 char *addr;
00203 int addrlen;
00204 char *peeraddr;
00205 int peeraddrlen;
00206 };
00207
00208 #define XTRANS_OPEN_COTS_CLIENT 1
00209 #define XTRANS_OPEN_COTS_SERVER 2
00210 #define XTRANS_OPEN_CLTS_CLIENT 3
00211 #define XTRANS_OPEN_CLTS_SERVER 4
00212
00213
00214 typedef struct _Xtransport {
00215 char *TransName;
00216 int flags;
00217
00218 #ifdef TRANS_CLIENT
00219
00220 XtransConnInfo (*OpenCOTSClient)(
00221 struct _Xtransport *,
00222 char *,
00223 char *,
00224 char *
00225 );
00226
00227 #endif
00228
00229 #ifdef TRANS_SERVER
00230
00231 XtransConnInfo (*OpenCOTSServer)(
00232 struct _Xtransport *,
00233 char *,
00234 char *,
00235 char *
00236 );
00237
00238 #endif
00239
00240 #ifdef TRANS_CLIENT
00241
00242 XtransConnInfo (*OpenCLTSClient)(
00243 struct _Xtransport *,
00244 char *,
00245 char *,
00246 char *
00247 );
00248
00249 #endif
00250
00251 #ifdef TRANS_SERVER
00252
00253 XtransConnInfo (*OpenCLTSServer)(
00254 struct _Xtransport *,
00255 char *,
00256 char *,
00257 char *
00258 );
00259
00260 #endif
00261
00262
00263 #ifdef TRANS_REOPEN
00264
00265 XtransConnInfo (*ReopenCOTSServer)(
00266 struct _Xtransport *,
00267 int,
00268 char *
00269 );
00270
00271 XtransConnInfo (*ReopenCLTSServer)(
00272 struct _Xtransport *,
00273 int,
00274 char *
00275 );
00276
00277 #endif
00278
00279
00280 int (*SetOption)(
00281 XtransConnInfo,
00282 int,
00283 int
00284 );
00285
00286 #ifdef TRANS_SERVER
00287
00288 int (*CreateListener)(
00289 XtransConnInfo,
00290 char *
00291 );
00292
00293 int (*ResetListener)(
00294 XtransConnInfo
00295 );
00296
00297 XtransConnInfo (*Accept)(
00298 XtransConnInfo,
00299 int *
00300 );
00301
00302 #endif
00303
00304 #ifdef TRANS_CLIENT
00305
00306 int (*Connect)(
00307 XtransConnInfo,
00308 char *,
00309 char *
00310 );
00311
00312 #endif
00313
00314 int (*BytesReadable)(
00315 XtransConnInfo,
00316 BytesReadable_t *
00317 );
00318
00319 int (*Read)(
00320 XtransConnInfo,
00321 char *,
00322 int
00323 );
00324
00325 int (*Write)(
00326 XtransConnInfo,
00327 char *,
00328 int
00329 );
00330
00331 int (*Readv)(
00332 XtransConnInfo,
00333 struct iovec *,
00334 int
00335 );
00336
00337 int (*Writev)(
00338 XtransConnInfo,
00339 struct iovec *,
00340 int
00341 );
00342
00343 int (*Disconnect)(
00344 XtransConnInfo
00345 );
00346
00347 int (*Close)(
00348 XtransConnInfo
00349 );
00350
00351 int (*CloseForCloning)(
00352 XtransConnInfo
00353 );
00354
00355 } Xtransport;
00356
00357
00358 typedef struct _Xtransport_table {
00359 Xtransport *transport;
00360 int transport_id;
00361 } Xtransport_table;
00362
00363
00364
00365
00366
00367
00368 #define TRANS_ALIAS (1<<0)
00369 #define TRANS_LOCAL (1<<1)
00370 #define TRANS_DISABLED (1<<2)
00371 #define TRANS_NOLISTEN (1<<3)
00372
00373
00374
00375
00376
00377
00378
00379 #if defined(CRAY) || (defined(SYSV) && defined(i386) && !defined(SCO325)) || defined(_WIN32) || defined(__sxg__) || defined(__EMX__)
00380
00381 #define READV(ciptr, iov, iovcnt) TRANS(ReadV)(ciptr, iov, iovcnt)
00382
00383 static int TRANS(ReadV)(
00384 XtransConnInfo,
00385 struct iovec *,
00386 int
00387 );
00388
00389 #else
00390
00391 #define READV(ciptr, iov, iovcnt) readv(ciptr->fd, iov, iovcnt)
00392
00393 #endif
00394
00395
00396 #if defined(CRAY) || (defined(SYSV) && defined(i386) && !defined(SCO325)) || defined(_WIN32) || defined(__sxg__) || defined(__EMX__)
00397
00398 #define WRITEV(ciptr, iov, iovcnt) TRANS(WriteV)(ciptr, iov, iovcnt)
00399
00400 static int TRANS(WriteV)(
00401 XtransConnInfo,
00402 struct iovec *,
00403 int
00404 );
00405
00406 #else
00407
00408 #define WRITEV(ciptr, iov, iovcnt) writev(ciptr->fd, iov, iovcnt)
00409
00410 #endif
00411
00412
00413 static int is_numeric (
00414 char *
00415 );
00416
00417 #ifdef TRANS_SERVER
00418 static int trans_mkdir (
00419 char *,
00420 int
00421 );
00422 #endif
00423
00424
00425
00426
00427
00428 #if defined(XTRANSDEBUG)
00429
00430
00431
00432 #ifdef XTRANSDEBUGTIMESTAMP
00433 #if defined(XSERV_t) && defined(TRANS_SERVER)
00434
00435 #define PRMSG(lvl,x,a,b,c) if (lvl <= XTRANSDEBUG){ \
00436 int hack= 0, saveerrno=errno; \
00437 struct timeval tp;\
00438 gettimeofday(&tp,0); \
00439 ErrorF(__xtransname); \
00440 ErrorF(x+hack,a,b,c); \
00441 ErrorF("timestamp (ms): %d\n",tp.tv_sec*1000+tp.tv_usec/1000); \
00442 errno=saveerrno; \
00443 } else ((void)0)
00444 #else
00445 #define PRMSG(lvl,x,a,b,c) if (lvl <= XTRANSDEBUG){ \
00446 int hack= 0, saveerrno=errno; \
00447 struct timeval tp;\
00448 gettimeofday(&tp,0); \
00449 fprintf(stderr, __xtransname); fflush(stderr); \
00450 fprintf(stderr, x+hack,a,b,c); fflush(stderr); \
00451 fprintf(stderr, "timestamp (ms): %d\n",tp.tv_sec*1000+tp.tv_usec/1000); \
00452 fflush(stderr); \
00453 errno=saveerrno; \
00454 } else ((void)0)
00455 #endif
00456 #else
00457 #if defined(XSERV_t) && defined(TRANS_SERVER)
00458
00459 #define PRMSG(lvl,x,a,b,c) if (lvl <= XTRANSDEBUG){ \
00460 int hack= 0, saveerrno=errno; \
00461 ErrorF(__xtransname); \
00462 ErrorF(x+hack,a,b,c); \
00463 errno=saveerrno; \
00464 } else ((void)0)
00465 #else
00466 #define PRMSG(lvl,x,a,b,c) if (lvl <= XTRANSDEBUG){ \
00467 int hack= 0, saveerrno=errno; \
00468 fprintf(stderr, (const char*)(x+hack),a,b,c); fflush(stderr); \
00469 errno=saveerrno; \
00470 } else ((void)0)
00471 #endif
00472 #endif
00473 #else
00474 #define PRMSG(lvl,x,a,b,c) ((void)0)
00475 #endif
00476
00477 #endif