Annotation of 43BSDReno/contrib/isode-beta/others/X/client/XConnDis.c, revision 1.1.1.1

1.1       root        1: #include "copyright.h"
                      2: /* $XConsortium: XConnDis.c,v 11.36 88/09/16 11:09:34 jim Exp $ */
                      3: /* Copyright    Massachusetts Institute of Technology    1985, 1986    */
                      4: #define NEED_EVENTS
                      5: /*
                      6:  * THIS IS AN OS DEPENDENT FILE! It should work on 4.2BSD derived
                      7:  * systems.  VMS and System V should plan to have their own version.
                      8:  */
                      9: #include <stdio.h>
                     10: #include <X11/Xos.h>
                     11: #include "Xlibint.h"
                     12: #include <sys/socket.h>
                     13: #ifndef hpux
                     14: #include <netinet/tcp.h>
                     15: #endif
                     16: 
                     17: #ifdef hpux
                     18: #include <sys/utsname.h>
                     19: #endif
                     20: 
                     21: #ifdef UNIXCONN
                     22: #include <sys/un.h>
                     23: #ifndef X_UNIX_PATH
                     24: #define X_UNIX_PATH "/tmp/.X11-unix/X"
                     25: #endif /* X_UNIX_PATH */
                     26: #endif /* UNIXCONN */
                     27: void bcopy();
                     28: 
                     29: #ifdef ISOCONN
                     30: #include <isode/psap.h>
                     31: #include <isode/tsap.h>
                     32: #include <isode/isoservent.h>
                     33: 
                     34: #ifdef ISODEBUG
                     35: extern char *isodetcpath;
                     36: 
                     37: int isodexbug = 0;
                     38: #endif /* ISODEBUG */
                     39: #endif /* ISOCONN */
                     40: 
                     41: #ifdef ISOCONN
                     42: 
                     43: /*
                     44:  * array of fd 2 family map so we can lookup right function below...
                     45:  * Its initialised at connection setup...
                     46:  */
                     47: int fd2family[MAXSOCKS];
                     48: /*
                     49:  * Globals for storing functions appropos each fd/socket type
                     50:  * UNIX_IO (0) map to sys calls
                     51:  * ISODE_IO (1) maps to my fns...
                     52:  */
                     53: extern int read(), TReadFromServer();
                     54: int (*readfn[])() = 
                     55: {
                     56:        read, TReadFromServer
                     57: };
                     58: extern int write(), TWriteToServer();
                     59: int (*writefn[])() =
                     60: {
                     61:        write, TWriteToServer
                     62: };
                     63: extern int readv(), TReadvFromServer();
                     64: int (*readvfn[])() =
                     65: {
                     66:        readv, TReadvFromServer
                     67: };
                     68: extern writev(), TWritevToServer();
                     69: int (*writevfn[])() =
                     70: {
                     71:        writev, TWritevToServer
                     72: };
                     73: extern int UBytesReadable(), TBytesReadable();
                     74: int (*ioctlfn[])() =
                     75: {
                     76:        UBytesReadable, TBytesReadable
                     77: };
                     78: extern int close(), TDiscFromServer();
                     79: int (*closefn[])() =
                     80: {
                     81:        close, TDiscFromServer
                     82: };
                     83:        
                     84: static
                     85: int iso_conn(server)
                     86: char *server;
                     87: {
                     88:        struct TSAPconnect tcs;
                     89:        struct TSAPconnect *tc = &tcs;
                     90:        struct TSAPdisconnect tds;
                     91:        struct TSAPdisconnect *td = &tds;
                     92:        struct QOStype qo;
                     93:        struct QOStype *qos = &qo;
                     94:        AEI   aei;
                     95:        struct PSAPaddr *pa, rpa, *mpa, rmpa;
                     96:        int ret;
                     97:        char *x;
                     98:        extern char *index();
                     99: 
                    100: #ifdef ISODEBUG
                    101:        isodetcpath = ISODEPATH;
                    102: #endif /* ISODEBUG */
                    103: 
                    104: /*
                    105:  * Get their TSAP from their AEI
                    106:  */
                    107:        if ((x = index(server, ':')) != NULL) {
                    108:                *(x++) = '\0';
                    109:                aei = str2aei(server, x);
                    110:        } else {
                    111:                aei = str2aei(server, DEFAULTTSERVICE);
                    112:        }
                    113: 
                    114:        if (aei == NULLAEI) {
                    115:                fprintf(stderr, "No AEI for %s\n", server);
                    116:                return -1;
                    117:        }
                    118: 
                    119:        if ((pa = aei2addr (aei)) == NULLPA) {
                    120:                fprintf (stderr, "address translation failed");
                    121:                return -1;
                    122:        }
                    123:        rpa = *pa; /* struct copy */
                    124: /* 
                    125:  * Get my address for completeness
                    126:  */
                    127:        mpa = NULLPA;
                    128:        if (x != NULL)
                    129:                aei = str2aei(TLocalHostName(), x);
                    130:        else
                    131:                aei = str2aei(TLocalHostName(), DEFAULTTSERVICE);
                    132:        if (aei == NULLAEI) {
                    133:                fprintf (stderr, "my AEI lookup failed %s\n",
                    134:                        TLocalHostName());
                    135:                return -1;
                    136:        }
                    137:                
                    138:        if ((mpa = aei2addr (aei)) == NULLPA) {
                    139:                fprintf (stderr, "my address translation failed %s\n",
                    140:                        TLocalHostName());
                    141:                return -1;
                    142:        }
                    143: 
                    144:        rmpa = *mpa; /* struct copy */
                    145: /*
                    146:  * No Xpedited required !
                    147:  */
                    148:        tc->tc_expedited = 0;
                    149: /* 
                    150:  * Just a guess - i dont understand
                    151:  * the comment in the documentation about TSDUsizes
                    152:  */
                    153:        tc->tc_tsdusize = 16000; 
                    154:        tc->tc_cc = 0;
                    155:        qos->qos_reliability = LOW_QUALITY; /* Well this is X after all */
                    156: 
                    157:        ret = TConnRequest(&(rmpa.pa_addr.sa_addr),
                    158:                        &(rpa.pa_addr.sa_addr),
                    159:                        0, 0, NULLCP, qos, tc, td);
                    160:                        
                    161: /*
                    162:  * Should map errors to perrors somehow???
                    163:  */
                    164:        if (ret == NOTOK) {
                    165: #ifdef ISODEBUG
                    166:                if (isodexbug)
                    167:                        fprintf(stderr, "TCR Failed %s\n", 
                    168:                                TErrString(td->td_reason));
                    169: #endif /* ISODEBUG */
                    170:                return -1;
                    171:        }
                    172:        else {
                    173: #ifdef ISODEBUG
                    174:                if (isodexbug)
                    175:                        fprintf(stderr, "client: isoconn ok\n");
                    176: #endif /* ISODEBUG */
                    177:                ret = tc->tc_sd;
                    178:                return ret;
                    179:        }
                    180: }
                    181: #endif /* ISOCONN */
                    182: 
                    183: /* 
                    184:  * Attempts to connect to server, given display name. Returns file descriptor
                    185:  * (network socket) or -1 if connection fails. The expanded display name
                    186:  * of the form hostname:number.screen ("::" if DECnet) is returned in a result
                    187:  * parameter. The screen number to use is also returned.
                    188:  */
                    189: int _XConnectDisplay (display_name, expanded_name, prop_name, screen_num)
                    190:     char *display_name;
                    191:     char *expanded_name;       /* return */
                    192:     char *prop_name;           /* return */
                    193:     int *screen_num;           /* return */
                    194: 
                    195: {
                    196:        char displaybuf[256];           /* Display string buffer */     
                    197:        register char *display_ptr;     /* Display string buffer pointer */
                    198:        register char *numbuf_ptr;      /* Server number buffer pointer */
                    199:        char *screen_ptr;               /* Pointer for locating screen num */
                    200:        int display_num;                /* Display number */
                    201:        struct sockaddr_in inaddr;      /* INET socket address. */
                    202:        unsigned long hostinetaddr;     /* result of inet_addr of arpa addr */
                    203: #ifdef UNIXCONN
                    204:        struct sockaddr_un unaddr;      /* UNIX socket address. */
                    205: #endif
                    206:        struct sockaddr *addr;          /* address to connect to */
                    207:         struct hostent *host_ptr;
                    208:        int addrlen;                    /* length of address */
                    209:        extern char *getenv();
                    210:        extern struct hostent *gethostbyname();
                    211:         int fd;                                /* Network socket */
                    212:        char numberbuf[16];
                    213:        char *dot_ptr = NULL;           /* Pointer to . before screen num */
                    214: #ifdef DNETCONN
                    215:        int dnet = 0;
                    216:        char objname[20];
                    217:        extern int dnet_conn();
                    218: #endif
                    219: #ifdef ISOCONN
                    220:        int isoconn = 0;
                    221:        char isochar = 'X';
                    222:        
                    223: /*
                    224:  * ISO Host name are "host:T-Namenumber"
                    225:  * T-Name = T (for TCP) or X (for X.25) should really be
                    226:  * TP4 or TP0 whathaveyou
                    227:  */
                    228: #endif /* ISOCONN */
                    229: 
                    230:        /* 
                    231:         * Find the ':' seperator and extract the hostname and the
                    232:         * display number.
                    233:         * NOTE - if DECnet is to be used, the display name is formatted
                    234:         * as "host::number"
                    235:         */
                    236:        (void) strncpy(displaybuf, display_name, sizeof(displaybuf));
                    237:        if ((display_ptr = SearchString(displaybuf,':')) == NULL) return (-1);
                    238: #ifdef DNETCONN
                    239:        if (*(display_ptr + 1) == ':') {
                    240:            dnet++;
                    241:            *(display_ptr++) = '\0';
                    242:        }
                    243: #endif
                    244: #ifdef ISOCONN
                    245:        if ((*(display_ptr + 1) == 'X') || (*(display_ptr + 1) == 'T')) {
                    246:            isochar = *(display_ptr + 1);
                    247:            isoconn++;
                    248:            *(display_ptr++) = '\0';
                    249:        }
                    250: #endif /* ISOCONN */
                    251:        *(display_ptr++) = '\0';
                    252:  
                    253:        /* displaybuf now contains only a null-terminated host name, and
                    254:         * display_ptr points to the display number.
                    255:         * If the display number is missing there is an error. */
                    256: 
                    257:        if (*display_ptr == '\0') return(-1);
                    258: 
                    259:        /*
                    260:         * Build a string of the form <display-number>.<screen-number> in
                    261:         * numberbuf, using ".0" as the default.
                    262:         */
                    263:        screen_ptr = display_ptr;               /* points to #.#.propname */
                    264:        numbuf_ptr = numberbuf;                 /* beginning of buffer */
                    265:        while (*screen_ptr != '\0') {
                    266:            if (*screen_ptr == '.') {           /* either screen or prop */
                    267:                if (dot_ptr) {                  /* then found prop_name */
                    268:                    screen_ptr++;
                    269:                    break;
                    270:                }
                    271:                dot_ptr = numbuf_ptr;           /* found screen_num */
                    272:                *(screen_ptr++) = '\0';
                    273:                *(numbuf_ptr++) = '.';
                    274:            } else {
                    275:                *(numbuf_ptr++) = *(screen_ptr++);
                    276:            }
                    277:        }
                    278: 
                    279:        /*
                    280:         * If the spec doesn't include a screen number, add ".0" (or "0" if
                    281:         * only "." is present.)
                    282:         */
                    283:        if (dot_ptr == NULL) {                  /* no screen num or prop */
                    284:            dot_ptr = numbuf_ptr;
                    285:            *(numbuf_ptr++) = '.';
                    286:            *(numbuf_ptr++) = '0';
                    287:        } else {
                    288:            if (*(numbuf_ptr - 1) == '.')
                    289:                *(numbuf_ptr++) = '0';
                    290:        }
                    291:        *numbuf_ptr = '\0';
                    292: 
                    293:        /*
                    294:         * Return the screen number and property names in the result parameters
                    295:         */
                    296:        *screen_num = atoi(dot_ptr + 1);
                    297:        strcpy (prop_name, screen_ptr);
                    298: 
                    299:        /*
                    300:         * Convert the server number string to an integer.
                    301:         */
                    302:        display_num = atoi(display_ptr);
                    303: 
                    304:        /*
                    305:         * If the display name is missing, use current host.
                    306:         */
                    307:        if (displaybuf[0] == '\0')
                    308: #ifdef DNETCONN
                    309:            if (dnet) 
                    310:                (void) strcpy (displaybuf, "0");
                    311:             else
                    312: #endif
                    313: #ifdef UNIXCONN
                    314:                ;       /* Do nothing if UNIX DOMAIN. Will be handled below. */
                    315: #else
                    316: #ifdef hpux
                    317:            /*
                    318:             * same host name crock as in server and xinit.
                    319:             */
                    320:            {
                    321:                struct utsname name;
                    322: 
                    323:                uname(&name);
                    324:                strcpy(displaybuf, name.nodename);
                    325:            }
                    326: #else
                    327:                (void) gethostname (displaybuf, sizeof(displaybuf));
                    328: #endif /* hpux */
                    329: #endif /* UNIXCONN else TCPCONN (assumed) */
                    330: 
                    331: #ifdef DNETCONN
                    332:        if (dnet) {
                    333:            /*
                    334:             * build the target object name.
                    335:             */
                    336:            sprintf(objname, "X$X%d", display_num);
                    337:            /*
                    338:             * Attempt to open the DECnet connection, return -1 if fails.
                    339:             */
                    340:            if ((fd = dnet_conn(displaybuf, 
                    341:                   objname, SOCK_STREAM, 0, 0, 0, 0)) < 0)
                    342:                return(-1);         /* errno set by dnet_conn. */
                    343: #ifdef ISOCONN
                    344:            else
                    345:                fd2family[fd] = UNIX_IO;
                    346: #endif /* ISOCONN */
                    347:                
                    348:        } else
                    349: #endif
                    350: #ifdef ISOCONN
                    351:        if (isoconn) {
                    352:                if ((fd = iso_conn(displaybuf)) <  0)
                    353:                        return(-1);
                    354:                else
                    355:                        fd2family[fd] = ISODE_IO;
                    356:        } else
                    357: #endif 
                    358:        {
                    359: #ifdef UNIXCONN
                    360:            if ((displaybuf[0] == '\0') || 
                    361:                (strcmp("unix", displaybuf) == 0)) {
                    362:                /* Connect locally using Unix domain. */
                    363:                unaddr.sun_family = AF_UNIX;
                    364:                (void) strcpy(unaddr.sun_path, X_UNIX_PATH);
                    365:                strcat(unaddr.sun_path, display_ptr);
                    366:                addr = (struct sockaddr *) &unaddr;
                    367:                addrlen = strlen(unaddr.sun_path) + 2;
                    368:                /*
                    369:                 * Open the network connection.
                    370:                 */
                    371:                if ((fd = socket((int) addr->sa_family, SOCK_STREAM, 0)) < 0)
                    372:                    return(-1);     /* errno set by system call. */
                    373:            } else
                    374: #endif
                    375:            {
                    376:                /* Get the statistics on the specified host. */
                    377:                hostinetaddr = inet_addr (displaybuf);
                    378:                if (hostinetaddr == -1) {
                    379:                        if ((host_ptr = gethostbyname(displaybuf)) == NULL) {
                    380:                                /* No such host! */
                    381:                                errno = EINVAL;
                    382:                                return(-1);
                    383:                        }
                    384:                        /* Check the address type for an internet host. */
                    385:                        if (host_ptr->h_addrtype != AF_INET) {
                    386:                                /* Not an Internet host! */
                    387:                                errno = EPROTOTYPE;
                    388:                                return(-1);
                    389:                        }
                    390:  
                    391:                        /* Set up the socket data. */
                    392:                        inaddr.sin_family = host_ptr->h_addrtype;
                    393: #if defined(CRAY) && defined(OLDTCP)
                    394:                        /* Only Cray UNICOS3 and UNICOS4 will define this */
                    395:                        {
                    396:                                long t;
                    397:                                bcopy((char *)host_ptr->h_addr,
                    398:                                      (char *)&t,
                    399:                                      sizeof(inaddr.sin_addr));
                    400:                                inaddr.sin_addr = t;
                    401:                        }
                    402: #else
                    403:                        bcopy((char *)host_ptr->h_addr, 
                    404:                              (char *)&inaddr.sin_addr, 
                    405:                              sizeof(inaddr.sin_addr));
                    406: #endif /* CRAY and OLDTCP */
                    407:                } else {
                    408: #if defined(CRAY) && defined(OLDTCP)
                    409:                        /* Only Cray UNICOS3 and UNICOS4 will define this */
                    410:                        inaddr.sin_addr = hostinetaddr;
                    411: #else
                    412:                        inaddr.sin_addr.s_addr = hostinetaddr;
                    413: #endif /* CRAY and OLDTCP */
                    414:                        inaddr.sin_family = AF_INET;
                    415:                }
                    416:                addr = (struct sockaddr *) &inaddr;
                    417:                addrlen = sizeof (struct sockaddr_in);
                    418:                inaddr.sin_port = display_num;
                    419:                inaddr.sin_port += X_TCP_PORT;
                    420:                inaddr.sin_port = htons(inaddr.sin_port);
                    421:                /*
                    422:                 * Open the network connection.
                    423:                 */
                    424: 
                    425:                if ((fd = socket((int) addr->sa_family, SOCK_STREAM, 0)) < 0)
                    426:                    return(-1);     /* errno set by system call. */
                    427: #ifdef ISOCONN
                    428:                fd2family[fd] = UNIX_IO;
                    429: #endif /* ISOCONN */
                    430:                /* make sure to turn off TCP coalescence */
                    431: #ifdef TCP_NODELAY
                    432:                {
                    433:                int mi = 1;
                    434:                setsockopt (fd, IPPROTO_TCP, TCP_NODELAY, &mi, sizeof (int));
                    435:                }
                    436: #endif
                    437:            }
                    438:  
                    439: 
                    440:            if (connect(fd, addr, addrlen) == -1) {
                    441:                (void) close (fd);
                    442:                return(-1);         /* errno set by system call. */
                    443:            }
                    444:         }
                    445: 
                    446: #ifdef ISOCONN
                    447:        if (!isoconn) {
                    448: #endif /* ISOCONN */
                    449: /* 
                    450:  * Not required for ISO T-Service
                    451:  */
                    452:        /*
                    453:         * set it non-blocking.  This is so we can read data when blocked
                    454:         * for writing in the library.
                    455:         */
                    456: #ifdef FIOSNBIO
                    457:        {
                    458:            int arg = 1;
                    459:            ioctl(fd, FIOSNBIO, &arg);
                    460:        }
                    461: #else
                    462:        (void) fcntl(fd, F_SETFL, FNDELAY);
                    463: #endif /* FIOSNBIO */
                    464: 
                    465: #ifdef ISOCONN
                    466:        }
                    467: #endif /* ISOCONN */
                    468:        /*
                    469:         * Return the id if the connection succeeded. Rebuild the expanded
                    470:         * spec and return it in the result parameter.
                    471:         */
                    472:        display_ptr = displaybuf-1;
                    473:        while (*(++display_ptr) != '\0')
                    474:            ;
                    475:        *(display_ptr++) = ':';
                    476: #ifdef DNETCONN
                    477:        if (dnet)
                    478:            *(display_ptr++) = ':';
                    479: #endif
                    480: #ifdef ISOCONN
                    481:        if (isoconn) {
                    482:            *(display_ptr++) = isochar;
                    483:        }
                    484: #endif
                    485:        numbuf_ptr = numberbuf;
                    486:        while (*numbuf_ptr != '\0')
                    487:            *(display_ptr++) = *(numbuf_ptr++);
                    488:        if (prop_name[0] != '\0') {
                    489:            char *cp;
                    490: 
                    491:            *(display_ptr++) = '.';
                    492:            for (cp = prop_name; *cp; cp++) *(display_ptr++) = *cp;
                    493:        }
                    494:        *display_ptr = '\0';
                    495:        (void) strcpy(expanded_name, displaybuf);
                    496:        return(fd);
                    497: 
                    498: }
                    499: 
                    500: /* 
                    501:  * Disconnect from server.
                    502:  */
                    503: 
                    504: int _XDisconnectDisplay (server)
                    505: 
                    506:     int server;
                    507: 
                    508: {
                    509: #ifdef ISOCONN
                    510:     (void)CloseToServer(server);
                    511: #else /* ISOCONN */
                    512:     (void) close(server);
                    513: #endif /* ISOCONN */
                    514: }
                    515: 
                    516: #undef NULL
                    517: #define NULL ((char *) 0)
                    518: /*
                    519:  * This is an OS dependent routine which:
                    520:  * 1) returns as soon as the connection can be written on....
                    521:  * 2) if the connection can be read, must enqueue events and handle errors,
                    522:  * until the connection is writable.
                    523:  */
                    524: _XWaitForWritable(dpy)
                    525:     Display *dpy;
                    526: {
                    527:     unsigned long r_mask[MSKCNT];
                    528:     unsigned long w_mask[MSKCNT];
                    529:     int nfound;
                    530: 
                    531:     CLEARBITS(r_mask);
                    532:     CLEARBITS(w_mask);
                    533: 
                    534:     while (1) {
                    535:        BITSET(r_mask, dpy->fd);
                    536:         BITSET(w_mask, dpy->fd);
                    537: 
                    538:        do {
                    539: #ifdef ISOCONN
                    540: /* 
                    541:  * Note, we shouldnt get any connections to us as we're a client,
                    542:  * But the elements of style say we should check...
                    543:  * and of course, a TDR
                    544:  */
                    545:            int vecp;
                    546:            char *vec[4];
                    547:            struct TSAPdisconnect tds;
                    548:             struct TSAPdisconnect *td = &tds;
                    549:            nfound = TNetAccept(&vecp, vec, dpy->fd + 1, r_mask, w_mask, 
                    550:                NULL, NOTOK, td);
                    551: #ifdef ISODEBUG
                    552:            if (nfound < 0) {
                    553:                int sverrno = errno;
                    554:                fprintf(stderr, "TNetAcc err %d %s\n", errno,
                    555:                        TErrString(td->td_reason));
                    556:                errno = sverrno;
                    557:            }
                    558: #endif /* ISODEBUG */
                    559: #ifdef ISODEBUG
                    560:            if (vecp > 0) {     
                    561:                fprintf(stderr, "Weirdness, connect to a client?\n");
                    562:            }
                    563: #endif
                    564: #else /* ISOCONN */
                    565:            nfound = select (dpy->fd + 1, r_mask, w_mask, NULL, NULL);
                    566: #endif /* ISOCONN */
                    567:            if (nfound < 0 && errno != EINTR)
                    568:                (*_XIOErrorFunction)(dpy);
                    569:        } while (nfound <= 0);
                    570: 
                    571:        if (ANYSET(r_mask)) {
                    572:            char buf[BUFSIZE];
                    573:            long pend_not_register;
                    574:            register long pend;
                    575:            register xEvent *ev;
                    576: 
                    577:            /* find out how much data can be read */
                    578:            if (BytesReadable(dpy->fd, (char *) &pend_not_register) < 0)
                    579:                (*_XIOErrorFunction)(dpy);
                    580:            pend = pend_not_register;
                    581: 
                    582:            /* must read at least one xEvent; if none is pending, then
                    583:               we'll just block waiting for it */
                    584:            if (pend < SIZEOF(xEvent)) pend = SIZEOF(xEvent);
                    585:                
                    586:            /* but we won't read more than the max buffer size */
                    587:            if (pend > BUFSIZE) pend = BUFSIZE;
                    588: 
                    589:            /* round down to an integral number of XReps */
                    590:            pend = (pend / SIZEOF(xEvent)) * SIZEOF(xEvent);
                    591: 
                    592:            _XRead (dpy, buf, pend);
                    593: 
                    594:            /* no space between comma and type or else macro will die */
                    595:            STARTITERATE (ev,xEvent, buf, (pend > 0),
                    596:                          (pend -= SIZEOF(xEvent))) {
                    597:                if (ev->u.u.type == X_Error)
                    598:                    _XError (dpy, (xError *) ev);
                    599:                else            /* it's an event packet; enqueue it */
                    600:                    _XEnq (dpy, ev);
                    601:            }
                    602:            ENDITERATE
                    603:        }
                    604:        if (ANYSET(w_mask))
                    605:            return;
                    606:     }
                    607: }
                    608: 
                    609: 
                    610: _XWaitForReadable(dpy)
                    611:   Display *dpy;
                    612: {
                    613:     unsigned long r_mask[MSKCNT];
                    614:     int result;
                    615:        
                    616:     CLEARBITS(r_mask);
                    617:     do {
                    618: #ifdef ISOCONN
                    619: /* 
                    620:  * Note, we shouldnt get any connections to us as we're a client,
                    621:  * But the elements of style say we should check...
                    622:  * and of course, a TDR
                    623:  */
                    624:            int vecp;
                    625:            char *vec[4];
                    626:            struct TSAPdisconnect tds;
                    627:             struct TSAPdisconnect *td = &tds;
                    628: 
                    629:            BITSET(r_mask, dpy->fd);
                    630:            result = TNetAccept(&vecp, vec, dpy->fd + 1, r_mask, NULL, NULL, 
                    631:                                NOTOK, td);
                    632: #else /* ISOCONN */
                    633:        BITSET(r_mask, dpy->fd);
                    634:        result = select(dpy->fd + 1, r_mask, NULL, NULL, NULL);
                    635: #endif /* ISOCONN */
                    636:        if (result == -1 && errno != EINTR) (*_XIOErrorFunction)(dpy);
                    637:     } while (result <= 0);
                    638: }
                    639: 
                    640: static int padlength[4] = {0, 3, 2, 1};
                    641: 
                    642: _XSendClientPrefix (dpy, client)
                    643:      Display *dpy;
                    644:      xConnClientPrefix *client;
                    645: {
                    646:        /*
                    647:         * Authorization string stuff....  Must always transmit multiple of 4
                    648:         * bytes.
                    649:         */
                    650: 
                    651:         char *auth_proto = ""; 
                    652:        int auth_length;
                    653:        char *auth_string = "";
                    654:        int auth_strlen;
                    655:        char pad[3];
                    656:        char buffer[BUFSIZ], *bptr;
                    657: 
                    658:         int bytes=0;
                    659: 
                    660:         auth_length = strlen(auth_proto);
                    661:         auth_strlen = strlen(auth_string);
                    662:         client->nbytesAuthProto = auth_length;
                    663:        client->nbytesAuthString = auth_strlen;
                    664: 
                    665:        bytes = (SIZEOF(xConnClientPrefix) + 
                    666:                        auth_length + padlength[auth_length & 3] +
                    667:                        auth_strlen + padlength[auth_strlen & 3]);
                    668: 
                    669:        bcopy(client, buffer, SIZEOF(xConnClientPrefix));
                    670:         bptr = buffer + SIZEOF(xConnClientPrefix);
                    671:         if (auth_length)
                    672:        {
                    673:            bcopy(auth_proto, bptr, auth_length);
                    674:             bptr += auth_length;
                    675:             if (padlength[auth_length & 3])
                    676:            {
                    677:                bcopy(pad, bptr, padlength[auth_length & 3]);
                    678:                bptr += padlength[auth_length & 3];
                    679:            }
                    680:        }
                    681:         if (auth_strlen)
                    682:        {
                    683:            bcopy(auth_string, bptr, auth_strlen);
                    684:             bptr += auth_strlen;
                    685:             if (padlength[auth_strlen & 3])
                    686:            {
                    687:                bcopy(pad, bptr, padlength[auth_strlen & 3]);
                    688:                bptr += padlength[auth_strlen & 3];
                    689:            }
                    690:        }
                    691:        (void) WriteToServer(dpy->fd, buffer, bytes);
                    692:        return;
                    693: }
                    694: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.