Annotation of researchv9/X11/src/X.V11R1/lib/X/save/XConnDis.c, revision 1.1

1.1     ! root        1: #include "copyright.h"
        !             2: /* $Header: XConnDis.c,v 11.21 87/09/13 23:03:07 toddb Exp $ */
        !             3: /* Copyright    Massachusetts Institute of Technology    1985, 1986    */
        !             4: #define NEED_EVENTS
        !             5: #include <stdio.h>
        !             6: #include "Xlibint.h"
        !             7: #include <strings.h>
        !             8: 
        !             9: void bcopy();
        !            10: /* 
        !            11:  * Attempts to connect to server, given display name. Returns file descriptor
        !            12:  * (network socket) or -1 if connection fails. The expanded display name
        !            13:  * of the form hostname:number.screen ("::" if DECnet) is returned in a result
        !            14:  * parameter. The screen number to use is also returned.
        !            15:  */
        !            16: int _XConnectDisplay (display_name, expanded_name, screen_num)
        !            17: 
        !            18:     char *display_name;
        !            19:     char *expanded_name;       /* return */
        !            20:     int *screen_num;           /* return */
        !            21: 
        !            22: {
        !            23:        struct utsname uts;
        !            24:        char displaybuf[256];           /* Display string buffer */     
        !            25:        char ipcstring[256];            /* ipcopen string */    
        !            26:        register char *display_ptr;     /* Display string buffer pointer */
        !            27:        register char *numbuf_ptr;      /* Server number buffer pointer */
        !            28:        char *screen_ptr;               /* Pointer for locating screen num */
        !            29:        int display_num;                /* Display number */
        !            30:         int fd;                                /* Network socket */
        !            31:        int port;
        !            32:        char numberbuf[16];
        !            33:        char *dot_ptr = NULL;           /* Pointer to . before screen num */
        !            34: 
        !            35:        /* 
        !            36:         * Find the ':' seperator and extract the hostname and the
        !            37:         * display number.
        !            38:         */
        !            39:        (void) strncpy(displaybuf, display_name, sizeof(displaybuf));
        !            40:        if ((display_ptr = SearchString(displaybuf,':')) == NULL) return (-1);
        !            41:        *(display_ptr++) = '\0';
        !            42:  
        !            43:        /* displaybuf now contains only a null-terminated host name, and
        !            44:         * display_ptr points to the display number.
        !            45:         * If the display number is missing there is an error. */
        !            46: 
        !            47:        if (*display_ptr == '\0') return(-1);
        !            48: 
        !            49:        /*
        !            50:         * Build a string of the form <display-number>.<screen-number> in
        !            51:         * numberbuf, using ".0" as the default.
        !            52:         */
        !            53:        screen_ptr = display_ptr;
        !            54:        numbuf_ptr = numberbuf;
        !            55:        while (*screen_ptr != '\0') {
        !            56:            if (*screen_ptr == '.') {
        !            57:                dot_ptr = numbuf_ptr;
        !            58:                *(screen_ptr++) = '\0';
        !            59:                *(numbuf_ptr++) = '.';
        !            60:            } else {
        !            61:                *(numbuf_ptr++) = *(screen_ptr++);
        !            62:            }
        !            63:        }
        !            64: 
        !            65:        /*
        !            66:         * If the spec doesn't include a screen number, add ".0" (or "0" if
        !            67:         * only "." is present.)
        !            68:         */
        !            69:        if (dot_ptr == NULL) {
        !            70:            dot_ptr = numbuf_ptr;
        !            71:            *(numbuf_ptr++) = '.';
        !            72:            *(numbuf_ptr++) = '0';
        !            73:        } else {
        !            74:            if (*(numbuf_ptr - 1) == '.')
        !            75:                *(numbuf_ptr++) = '0';
        !            76:        }
        !            77:        *numbuf_ptr = '\0';
        !            78: 
        !            79:        /*
        !            80:         * Return the screen number in the result parameter
        !            81:         */
        !            82:        *screen_num = atoi(dot_ptr + 1);
        !            83: 
        !            84:        /*
        !            85:         * Convert the server number string to an integer.
        !            86:         */
        !            87:        display_num = atoi(display_ptr);
        !            88:         port = display_num + X_TCP_PORT;
        !            89: 
        !            90:        /*
        !            91:         * If the display name is missing, use current host.
        !            92:         */
        !            93:        if (displaybuf[0] == '\0') {
        !            94:                sprintf(ipcstring, "/cs/tcp.%d", port);
        !            95:                /*
        !            96:                 * Read in the local system name
        !            97:                 */
        !            98:                uname(&uts);
        !            99:                strcpy(displaybuf, uts.sysname);
        !           100:        } else
        !           101:                sprintf(ipcstring, "/cs/tcp!%s!tcp.%d", displaybuf, port);
        !           102:        if ((fd = ipcopen(ipcstring, "heavy")) == -1) {
        !           103:                (void) close (fd);
        !           104:                return(-1);
        !           105:        }
        !           106: 
        !           107:        /*
        !           108:         * Return the id if the connection succeeded. Rebuild the expanded
        !           109:         * spec and return it in the result parameter.
        !           110:         */
        !           111:        display_ptr = displaybuf;
        !           112:        while (*(++display_ptr) != '\0')
        !           113:            ;
        !           114:        *(display_ptr++) = ':';
        !           115:        numbuf_ptr = numberbuf;
        !           116:        while (*numbuf_ptr != '\0')
        !           117:            *(display_ptr++) = *(numbuf_ptr++);
        !           118:        *display_ptr = '\0';
        !           119:        (void) strcpy(expanded_name, displaybuf);
        !           120:        return(fd);
        !           121: 
        !           122: }
        !           123: 
        !           124: /* 
        !           125:  * Disconnect from server.
        !           126:  */
        !           127: 
        !           128: int _XDisconnectDisplay (server)
        !           129: 
        !           130:     int server;
        !           131: 
        !           132: {
        !           133:     (void) close(server);
        !           134: }
        !           135: 
        !           136: #undef NULL
        !           137: #define NULL ((char *) 0)
        !           138: /*
        !           139:  * This is an OS dependent routine which:
        !           140:  * 1) returns as soon as the connection can be written on....
        !           141:  * 2) if the connection can be read, must enqueue events and handle errors,
        !           142:  * until the connection is writable.
        !           143:  */
        !           144: _XWaitForWritable(dpy)
        !           145:     Display *dpy;
        !           146: {
        !           147:     unsigned long r_mask[MSKCNT];
        !           148:     unsigned long w_mask[MSKCNT];
        !           149:     int nfound;
        !           150: 
        !           151:     CLEARBITS(r_mask);
        !           152:     CLEARBITS(w_mask);
        !           153: 
        !           154:     while (1) {
        !           155:        BITSET(r_mask, dpy->fd);
        !           156:         BITSET(w_mask, dpy->fd);
        !           157: 
        !           158:        do {
        !           159:            nfound = select (dpy->fd + 1, r_mask, w_mask, 0x7fffffff);
        !           160:            if (nfound < 0 && errno != EINTR)
        !           161:                (*_XIOErrorFunction)(dpy);
        !           162:        } while (nfound <= 0);
        !           163: 
        !           164:        if (ANYSET(r_mask)) {
        !           165:            char buf[BUFSIZE];
        !           166:            long pend_not_register;
        !           167:            register long pend;
        !           168:            register xEvent *ev;
        !           169: 
        !           170:            /* find out how much data can be read */
        !           171:            if (BytesReadable(dpy->fd, (char *) &pend_not_register) < 0)
        !           172:                (*_XIOErrorFunction)(dpy);
        !           173:            pend = pend_not_register;
        !           174: 
        !           175:            /* must read at least one xEvent; if none is pending, then
        !           176:               we'll just block waiting for it */
        !           177:        again:
        !           178:            if (pend < sizeof(xEvent)) pend = sizeof (xEvent);
        !           179:                
        !           180:            /* but we won't read more than the max buffer size */
        !           181:            if (pend > BUFSIZE) pend = BUFSIZE;
        !           182: 
        !           183:            /* round down to an integral number of XReps */
        !           184:            pend = (pend / sizeof (xEvent)) * sizeof (xEvent);
        !           185: 
        !           186:            _XRead (dpy, buf, pend);
        !           187:            for (ev = (xEvent *) buf; pend > 0; ev++, pend -= sizeof(xEvent))
        !           188:            {
        !           189:                if (ev->u.u.type == X_Error)
        !           190:                    _XError (dpy, (xError *) ev);
        !           191:                else            /* it's an event packet; enqueue it */
        !           192:                    _XEnq (dpy, ev);
        !           193:            }
        !           194:            nap(1);
        !           195:            if (BytesReadable(dpy->fd, (char *) &pend_not_register) < 0)
        !           196:                (*_XIOErrorFunction)(dpy);
        !           197:            pend = pend_not_register;
        !           198:            if(pend != 0)
        !           199:                goto again;
        !           200:        }
        !           201:        if (ANYSET(w_mask))
        !           202:            return;
        !           203:     }
        !           204: }
        !           205: 
        !           206: 
        !           207: _XWaitForReadable(dpy)
        !           208:   Display *dpy;
        !           209: {
        !           210:     unsigned long r_mask[MSKCNT];
        !           211:     int result;
        !           212:        
        !           213:     CLEARBITS(r_mask);
        !           214:     do {
        !           215:        BITSET(r_mask, dpy->fd);
        !           216:        result = select(dpy->fd + 1, r_mask, NULL, 0x7fffffff);
        !           217:        if (result == -1 && errno != EINTR) (*_XIOErrorFunction)(dpy);
        !           218:     } while (result <= 0);
        !           219: }
        !           220: 
        !           221: static int padlength[4] = {0, 3, 2, 1};
        !           222: 
        !           223: _XSendClientPrefix (dpy, client)
        !           224:      Display *dpy;
        !           225:      xConnClientPrefix *client;
        !           226: {
        !           227:        /*
        !           228:         * Authorization string stuff....  Must always transmit multiple of 4
        !           229:         * bytes.
        !           230:         */
        !           231: 
        !           232:         char *auth_proto = ""; 
        !           233:        int auth_length;
        !           234:        char *auth_string = "";
        !           235:        int auth_strlen;
        !           236:        char pad[3];
        !           237:        char buffer[BUFSIZ], *bptr;
        !           238: 
        !           239:         int bytes=0;
        !           240: 
        !           241:         auth_length = strlen(auth_proto);
        !           242:         auth_strlen = strlen(auth_string);
        !           243:         client->nbytesAuthProto = auth_length;
        !           244:        client->nbytesAuthString = auth_strlen;
        !           245: 
        !           246:        bytes = (sizeof(xConnClientPrefix) + 
        !           247:                        auth_length + padlength[auth_length & 3] +
        !           248:                        auth_strlen + padlength[auth_strlen & 3]);
        !           249: 
        !           250:        bcopy(client, buffer, sizeof(xConnClientPrefix));
        !           251:         bptr = buffer + sizeof(xConnClientPrefix);
        !           252:         if (auth_length)
        !           253:        {
        !           254:            bcopy(auth_proto, bptr, auth_length);
        !           255:             bptr += auth_length;
        !           256:             if (padlength[auth_length & 3])
        !           257:            {
        !           258:                bcopy(pad, bptr, padlength[auth_length & 3]);
        !           259:                bptr += padlength[auth_length & 3];
        !           260:            }
        !           261:        }
        !           262:         if (auth_strlen)
        !           263:        {
        !           264:            bcopy(auth_string, bptr, auth_strlen);
        !           265:             bptr += auth_strlen;
        !           266:             if (padlength[auth_strlen & 3])
        !           267:            {
        !           268:                bcopy(pad, bptr, padlength[auth_strlen & 3]);
        !           269:                bptr += padlength[auth_strlen & 3];
        !           270:            }
        !           271:        }
        !           272:        (void) WriteToServer(dpy->fd, buffer, bytes);
        !           273:        return;
        !           274: }
        !           275: 

unix.superglobalmegacorp.com

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