Annotation of 43BSDTahoe/new/X/Xlib/XOpenDisplay.c, revision 1.1

1.1     ! root        1: #include <X/mit-copyright.h>
        !             2: /* $Header: XOpenDisplay.c,v 10.12 86/12/24 09:07:53 swick Exp $ */
        !             3: /* Copyright    Massachusetts Institute of Technology    1985  */
        !             4:  
        !             5: #include "XlibInternal.h"
        !             6: #include <sys/socket.h>
        !             7: #include <strings.h>
        !             8: #include <sys/un.h>
        !             9:  
        !            10: /* 
        !            11:  * Connects to a server, creates a Display object and returns a pointer to
        !            12:  * the newly created Display back to the caller.
        !            13:  */
        !            14: Display *XOpenDisplay (display)
        !            15:        register char *display;
        !            16: {
        !            17:        register Display *dpy;          /* New Display object being created. */
        !            18:        char displaybuf[256];           /* Display string buffer. */
        !            19:        register char *displayptr;      /* Display string buffer pointer. */
        !            20:        char buf[4];                    /* place to form display string */
        !            21:        struct sockaddr_in inaddr;      /* INET socket address. */
        !            22:        struct sockaddr_un unaddr;      /* UNIX socket address. */
        !            23:        struct sockaddr *addr;          /* address to connect to */
        !            24:        int addrlen;                    /* length of address */
        !            25:        int dispnum;                    /* display number. */
        !            26:        int indian;                     /* to determine which indian. */
        !            27:        struct hostent *host_ptr;
        !            28: #ifdef DNETCONN
        !            29:        char objname[20];               /* Object name buffer */
        !            30:        int dnet = 0;                   /* flag to indicate DECnet connect */
        !            31: #endif
        !            32:  
        !            33:        register XReq *req;             /* XReq request packet pointer. */
        !            34:        XRep rep;                       /* XRep reply packet. */
        !            35:  
        !            36:        /* External declarations. */
        !            37:        extern char *getenv();
        !            38:        extern char *malloc();
        !            39:        extern struct hostent *gethostbyname();
        !            40:  
        !            41:        /*
        !            42:         * Extract the host name and display number from the display
        !            43:         * specifier string.  The display specifier string is supplied
        !            44:         * as an argument to this routine.  If it is NULL or a pointer
        !            45:         * to NULL
        !            46:         */
        !            47:        if (display == NULL || *display == '\0') {
        !            48:                strncpy (displaybuf, XDisplayName(display), sizeof(displaybuf));
        !            49:                if (*displaybuf == '\0') return (NULL);
        !            50:        }
        !            51:        else {
        !            52:                /* Display is non-NULL, copy it into the display buffer. */
        !            53:                strncpy(displaybuf, display, sizeof(displaybuf));
        !            54:        }
        !            55:        /* 
        !            56:         * Find the ':' seperator and cut out the hostname and the
        !            57:         * display number.
        !            58:         * NOTE - if DECnet is to be used, the display name is formated
        !            59:         * as "host::number"
        !            60:         */
        !            61:        if ((displayptr = index(displaybuf,':')) == NULL) return (NULL);
        !            62: #ifdef DNETCONN
        !            63:        if (*(displayptr + 1) == ':') {
        !            64:            dnet++;
        !            65:            *(displayptr++) = '\0';
        !            66:        }
        !            67: #endif
        !            68:        *(displayptr++) = '\0';
        !            69:  
        !            70:        /* displaybuf now contains only a null-terminated host name;
        !            71:         * displayptr points to the display number */
        !            72:  
        !            73:        /* If the display number is missing there is an error.
        !            74:         * Otherwise, convert string to an integer we can use */
        !            75:        if (*displayptr == '\0') return(NULL);
        !            76:        dispnum = atoi(displayptr);
        !            77:  
        !            78:        if (strcmp("unix", displaybuf) == 0) {
        !            79:            /* Connect locally using Unix domain. */
        !            80:            unaddr.sun_family = AF_UNIX;
        !            81:            strcpy(unaddr.sun_path, X_UNIX_PATH);
        !            82:            strcat(unaddr.sun_path, displayptr);
        !            83:            addr = (struct sockaddr *) &unaddr;
        !            84:            addrlen = strlen(unaddr.sun_path) + 2;
        !            85:        } else {
        !            86: #ifdef DNETCONN
        !            87:            if (!dnet) {
        !            88: #endif
        !            89:                /* If the hostname is missing default to the local host. */
        !            90:                if (displaybuf[0] == '\0')
        !            91:                    gethostname (displaybuf, sizeof (displaybuf));
        !            92:                /* Get the statistics on the specified host. */
        !            93:                if ((inaddr.sin_addr.s_addr = inet_addr(displaybuf)) == -1) {
        !            94:                        if ((host_ptr = gethostbyname(displaybuf)) == NULL) {
        !            95:                                /* No such host! */
        !            96:                                errno = EINVAL;
        !            97:                                return(NULL);
        !            98:                        }
        !            99:                        /* Check the address type for an internet host. */
        !           100:                        if (host_ptr->h_addrtype != AF_INET) {
        !           101:                                /* Not an Internet host! */
        !           102:                                errno = EPROTOTYPE;
        !           103:                                return(NULL);
        !           104:                        }
        !           105:  
        !           106:                        /* Set up the socket data. */
        !           107:                        inaddr.sin_family = host_ptr->h_addrtype;
        !           108:                        bcopy((char *)host_ptr->h_addr, 
        !           109:                              (char *)&inaddr.sin_addr, 
        !           110:                              sizeof(inaddr.sin_addr));
        !           111:                } else {
        !           112:                        inaddr.sin_family = AF_INET;
        !           113:                }
        !           114:                addr = (struct sockaddr *) &inaddr;
        !           115:                addrlen = sizeof (struct sockaddr_in);
        !           116:                inaddr.sin_port = dispnum;
        !           117:                indian = 1;
        !           118:                if (*(char *) &indian)
        !           119:                    inaddr.sin_port += X_TCP_LI_PORT;
        !           120:                else
        !           121:                    inaddr.sin_port += X_TCP_BI_PORT;
        !           122:                inaddr.sin_port = htons(inaddr.sin_port);
        !           123: #ifdef DNETCONN
        !           124:            } else {
        !           125:                /* If the nodename is missing default to the local node. */
        !           126:                if (displaybuf[0] == '\0')
        !           127:                    strcpy (displaybuf, "0");
        !           128:                /* build the target object name. */
        !           129:                sprintf (objname, "X%d", dispnum);
        !           130:            }
        !           131: #endif
        !           132:        }
        !           133:  
        !           134:        /* Malloc the new Display. */
        !           135:        if ((dpy = (Display *)malloc(sizeof(Display))) == NULL) {
        !           136:                /* Malloc call failed! */
        !           137:                errno = ENOMEM;
        !           138:                return(NULL);
        !           139:        }
        !           140:  
        !           141:        dpy->height = dpy->width = 0;
        !           142:            /* If DisplayWidth or DisplayWidth is subsequently called,
        !           143:               these will be replaced by "real" values. */
        !           144:  
        !           145:        /* Open the network socket. */
        !           146: #ifdef DNETCONN
        !           147:        if (!dnet) {
        !           148: #endif
        !           149:            if ((dpy->fd = socket(addr->sa_family, SOCK_STREAM, 0)) < 0) {
        !           150:                    /* Socket call failed! */
        !           151:                    /* errno set by system call. */
        !           152:                    free ((char *)dpy);
        !           153:                    return(NULL);
        !           154:            }
        !           155:  
        !           156:            /* Open the connection to the specified X server. */
        !           157:            if (connect(dpy->fd, addr, addrlen) == -1) {
        !           158:                    /* Connection call failed! */
        !           159:                    /* errno set by system call. */
        !           160:                    close (dpy->fd);
        !           161:                    free ((char *)dpy);
        !           162:                    return(NULL);
        !           163:            }
        !           164: #ifdef DNETCONN
        !           165:        } else {
        !           166:            if ((dpy->fd = dnet_conn(displaybuf, objname, SOCK_STREAM, 0, 0, 0, 0)) < 0) {
        !           167:                    /* connect failed! */
        !           168:                    /* errno set by dnet_conn. */
        !           169:                    free ((char *)dpy);
        !           170:                    return(NULL);
        !           171:            }
        !           172:        }
        !           173: #endif
        !           174:  
        !           175:        /* Salt away the host:display string for later use */
        !           176:        buf[0] = ':';
        !           177: #ifdef DNETCONN
        !           178:        {
        !           179:            int b = 1;
        !           180:            if (dnet) buf[b++] = ':';
        !           181:            buf[b++] = '0' + dispnum;
        !           182:            buf[b] = '\0';
        !           183:        }
        !           184: #else DNETCONN
        !           185:        buf[2] = '\0';
        !           186:        buf[1] = '0' + dispnum;
        !           187: #endif DNETCONN
        !           188:        strcat(displaybuf, buf);
        !           189:        if ((dpy->displayname = malloc(strlen(displaybuf) + 1)) == NULL) {
        !           190:                close (dpy->fd);
        !           191:                free ((char *)dpy);
        !           192:                errno = ENOMEM;
        !           193:                return(NULL);
        !           194:        }
        !           195:        strcpy (dpy->displayname, displaybuf);
        !           196:  
        !           197:        /* Set up the output buffers. */
        !           198:        if ((dpy->bufptr = dpy->buffer = malloc(BUFSIZE)) == NULL) {
        !           199:                /* Malloc call failed! */
        !           200:                close (dpy->fd);
        !           201:                free ((char *)dpy);
        !           202:                errno = ENOMEM;
        !           203:                return(NULL);
        !           204:        }
        !           205:        dpy->bufmax = dpy->buffer + BUFSIZE;
        !           206:  
        !           207:        /* Set up the input event queue and input event queue parameters. */
        !           208:        dpy->head = dpy->tail = NULL;
        !           209:        dpy->qlen = 0;
        !           210:        /* Initialize MouseMoved event squishing. */
        !           211:        dpy->squish = 1;
        !           212:  
        !           213:        _XlibCurrentDisplay = dpy;
        !           214:  
        !           215:        /* Send an X_SetUp request to the server. */
        !           216:        GetReq(X_SetUp, 0);
        !           217:  
        !           218:        /* Send X_MakePixmap requests to get black and white
        !           219:          * constant tile Pixmaps */
        !           220:         GetReq(X_MakePixmap, 0);
        !           221:        req->param.l[0] = 0;  /* no bitmap */
        !           222:        req->paramu2 = BlackPixel;
        !           223:        GetReq(X_MakePixmap, 0);
        !           224:        req->param.l[0] = 0;
        !           225:        req->paramu2 = WhitePixel;
        !           226:        
        !           227:        /* The following is needed to synchronize properly with errors,
        !           228:         * since three requests are outstanding and no replies have
        !           229:         * yet been read
        !           230:         */
        !           231:        dpy->request = 1;
        !           232:        
        !           233:        /* Get reply to X_SetUp */
        !           234:        if (!_XReply(dpy, &rep)) {
        !           235:                /* There was an error in retrieving the reply. */
        !           236:                close (dpy->fd);
        !           237:                free (dpy->buffer);
        !           238:                free ((char *)dpy);
        !           239:                return(NULL);
        !           240:        }
        !           241:  
        !           242:        /* Set the Display data returned by the X_SetUp call. */
        !           243:        dpy->root = rep.param.l[0];     /* Root window id. */
        !           244:        dpy->vnumber = rep.params2;     /* X protocol version number. */
        !           245:        dpy->dtype = rep.params3;       /* Server's display type. */
        !           246:        dpy->dplanes = rep.params4;     /* Number of display bit planes. */
        !           247:        dpy->dcells = rep.paramu5;      /* Number of display color map cell. */
        !           248:        
        !           249:        /* Get reply to MakePixmap (black) */
        !           250:        dpy->request++;
        !           251:        if (!_XReply (dpy, &rep)) {
        !           252:            close (dpy->fd);
        !           253:            free (dpy->buffer);
        !           254:            free ((char *)dpy);
        !           255:            return (NULL);
        !           256:            }
        !           257:        dpy->black = rep.param.l[0];
        !           258:  
        !           259:        /* Get reply to MakePixmap (white) */
        !           260:        dpy->request++;
        !           261:        if (!_XReply (dpy, &rep)) {
        !           262:            close (dpy->fd);
        !           263:            free (dpy->buffer);
        !           264:            free ((char *)dpy);
        !           265:            return (NULL);
        !           266:            }
        !           267:        dpy->white = rep.param.l[0];
        !           268:  
        !           269:        return(dpy);
        !           270: }

unix.superglobalmegacorp.com

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