?? xtranslcl.c
字號:
close(fd); return -1; } return(fd);#endif /* !NAMEDNODENAME */}#endif /* TRANS_CLIENT */#ifdef TRANS_SERVERstatic intTRANS(NAMEDOpenServer)(ciptr, port)XtransConnInfo ciptr;char *port;{ int fd, pipefd[2]; char server_path[64]; struct stat sbuf; PRMSG(2,"NAMEDOpenServer(%s)\n", port, 0,0 );#if !defined(NAMEDNODENAME) PRMSG(1,"NAMEDOpenServer: Protocol is not supported by a NAMED connection\n", 0,0,0); return -1;#else if ( port && *port ) { if( *port == '/' ) { /* A full pathname */ (void) sprintf(server_path, "%s", port); } else { (void) sprintf(server_path, "%s%s", NAMEDNODENAME, port); } } else { (void) sprintf(server_path, "%s%d", NAMEDNODENAME, getpid()); } mkdir(X_STREAMS_DIR, 0777); chmod(X_STREAMS_DIR, 0777); if(stat(server_path, &sbuf) != 0) { if (errno == ENOENT) { if ((fd = creat(server_path, (mode_t)0666)) == -1) { PRMSG(1, "NAMEDOpenServer: Can't open %s\n", server_path, 0,0 ); return(-1); } close(fd); if (chmod(server_path, (mode_t)0666) < 0) { PRMSG(1, "NAMEDOpenServer: Can't open %s\n", server_path, 0,0 ); return(-1); } } else { PRMSG(1, "NAMEDOpenServer: stat on %s failed\n", server_path, 0,0 ); return(-1); } } if( pipe(pipefd) != 0) { PRMSG(1, "NAMEDOpenServer: pipe() failed, errno=%d\n",errno, 0,0 ); return(-1); } if( ioctl(pipefd[0], I_PUSH, "connld") != 0) { PRMSG(1, "NAMEDOpenServer: ioctl(I_PUSH,\"connld\") failed, errno=%d\n",errno, 0,0 ); close(pipefd[0]); close(pipefd[1]); return(-1); } if( fattach(pipefd[0], server_path) != 0) { PRMSG(1, "NAMEDOpenServer: fattach(%s) failed, errno=%d\n", server_path,errno, 0 ); close(pipefd[0]); close(pipefd[1]); return(-1); } /* * Everything looks good: fill in the XtransConnInfo structure. */ if (TRANS(FillAddrInfo) (ciptr, server_path, server_path) == 0) { PRMSG(1,"NAMEDOpenServer: failed to fill in addr info\n", 0,0,0); close(fd); return -1; } return(pipefd[1]);#endif /* !NAMEDNODENAME */}static intTRANS(NAMEDAccept)(ciptr, newciptr, status)XtransConnInfo ciptr;XtransConnInfo newciptr;int *status;{ struct strrecvfd str; PRMSG(2,"NAMEDAccept(%x->%d)\n", ciptr, ciptr->fd, 0 ); if( ioctl(ciptr->fd, I_RECVFD, &str ) < 0 ) { PRMSG(1, "NAMEDAccept: ioctl(I_RECVFD) failed, errno=%d\n", errno, 0,0 ); *status = TRANS_ACCEPT_MISC_ERROR; return(-1); } /* * Everything looks good: fill in the XtransConnInfo structure. */ newciptr->addrlen=ciptr->addrlen; if( (newciptr->addr=(char *)xalloc(newciptr->addrlen)) == NULL ) { PRMSG(1, "NAMEDAccept: failed to allocate memory for peer addr\n", 0,0,0); close(str.fd); *status = TRANS_ACCEPT_BAD_MALLOC; return -1; } memcpy(newciptr->addr,ciptr->addr,newciptr->addrlen); newciptr->peeraddrlen=newciptr->addrlen; if( (newciptr->peeraddr=(char *)xalloc(newciptr->peeraddrlen)) == NULL ) { PRMSG(1, "NAMEDAccept: failed to allocate memory for peer addr\n", 0,0,0); xfree(newciptr->addr); close(str.fd); *status = TRANS_ACCEPT_BAD_MALLOC; return -1; } memcpy(newciptr->peeraddr,newciptr->addr,newciptr->peeraddrlen); *status = 0; return str.fd;}#endif /* TRANS_SERVER */#endif /* SVR4 *//* * connect_spipe is used by both the SCO and ISC connection types. */static intconnect_spipe(fd1, fd2)int fd1, fd2;{ long temp; struct strfdinsert sbuf; sbuf.databuf.maxlen = -1; sbuf.databuf.len = -1; sbuf.databuf.buf = NULL; sbuf.ctlbuf.maxlen = sizeof(long); sbuf.ctlbuf.len = sizeof(long); sbuf.ctlbuf.buf = (caddr_t)&temp; sbuf.offset = 0; sbuf.fildes = fd2; sbuf.flags = 0; if( ioctl(fd1, I_FDINSERT, &sbuf) < 0 ) return(-1); return(0);}/* * connect_spipe is used by both the SCO and ISC connection types. */static intnamed_spipe(fd, path)int fd;char *path;{ int oldUmask, ret; struct stat sbuf; oldUmask = umask(0); (void) fstat(fd, &sbuf); ret = mknod(path, 0020666, sbuf.st_rdev); umask(oldUmask); if (ret < 0) { ret = -1; } else { ret = fd; } return(ret);}/* ISC */#ifdef TRANS_CLIENTstatic intTRANS(ISCOpenClient)(ciptr, port)XtransConnInfo ciptr;char *port;{ int fd,fds,server; char server_path[64]; char server_dev_path[64]; struct strfdinsert buf; long temp; mode_t spmode; struct stat filestat; PRMSG(2,"ISCOpenClient(%s)\n", port, 0,0 ); #if !defined(ISCDEVNODENAME) PRMSG(1,"ISCOpenClient: Protocol is not supported by a ISC connection\n", 0,0,0); return -1;#else (void) sprintf(server_path, ISCTMPNODENAME, port); (void) sprintf(server_dev_path, ISCDEVNODENAME, port); fd = fds = server = -1; if (stat(DEV_SPX, &filestat) == -1) { PRMSG(1, "ISCOpenClient: stat(%s) failed, errno=%d\n", DEV_SPX, errno, 0 ); return(-1); } spmode = (filestat.st_mode & S_IFMT); if (stat(server_path, &filestat) != -1) { if ((filestat.st_mode & S_IFMT) == spmode) { if ((server = open(server_path, O_RDWR)) < 0) { PRMSG(1,"ISCOpenClient: failed to open %s\n", server_path, 0,0 ); } } } if (server < 0) { /* try the alternate path */ if (stat(server_dev_path, &filestat) != -1) { if ((filestat.st_mode & S_IFMT) == spmode) { if ((server = open(server_dev_path, O_RDWR)) < 0) { PRMSG(1,"ISCOpenClient: failed to open %s\n", server_dev_path, 0,0 ); } } } } if (server < 0) { PRMSG(1,"ISCOpenClient: can't open either device %s or %s\n", server_path, server_dev_path, 0 ); return -1; } if ((fds = open(DEV_SPX, O_RDWR)) < 0 || (fd = open(DEV_SPX, O_RDWR)) < 0) { /* Failed to open all of the devices */ PRMSG(1,"ISCOpenClient: can't open %s\n", DEV_SPX, 0,0 ); (void) close(server); if (fds != -1) (void) close(fds); if (fd != -1) (void) close(fd); return -1; } /* make a STREAMS-pipe */ buf.databuf.maxlen = -1; buf.databuf.len = -1; buf.databuf.buf = NULL; buf.ctlbuf.maxlen = sizeof(long); buf.ctlbuf.len = sizeof(long); buf.ctlbuf.buf = (caddr_t)&temp; buf.offset = 0; buf.fildes = fd; buf.flags = 0; if (ioctl(fds, I_FDINSERT, &buf) < 0 || ioctl(server, I_SENDFD, fds) < 0) { PRMSG(1,"ISCOpenClient: ioctl(I_FDINSERT or I_SENDFD) failed\n", 0,0,0 ); (void) close(server); (void) close(fds); (void) close(fd); return -1; } /* * Everything looks good: fill in the XtransConnInfo structure. */ if (TRANS(FillAddrInfo) (ciptr, server_path, server_path) == 0) { PRMSG(1,"ISCOpenClient: failed to fill in addr info\n", 0,0,0); close(fd); return -1; } return (fd);#endif /* !ISCDEVNODENAME */}#endif /* TRANS_CLIENT */#ifdef TRANS_SERVERstatic intTRANS(ISCOpenServer)(ciptr, port)XtransConnInfo ciptr;char *port;{ int fd = -1,fds = -1; char server_path[64],server_unix_path[64]; PRMSG(2,"ISCOpenServer(%s)\n", port, 0,0 ); #if !defined(ISCDEVNODENAME) PRMSG(1,"ISCOpenServer: Protocol is not supported by a ISC connection\n", 0,0,0); return -1;#else (void) sprintf(server_path, ISCDEVNODENAME, port); (void) sprintf(server_unix_path, ISCTMPNODENAME, port); mkdir(X_STREAMS_DIR, 0777); /* "/dev/X" */ chmod(X_STREAMS_DIR, 0777); mkdir(X_ISC_DIR, 0777); /* "/dev/X/ISCCONN" */ chmod(X_ISC_DIR, 0777); unlink(server_path); if( ((fds=open(DEV_SPX, O_RDWR)) < 0) || ((fd =open(DEV_SPX, O_RDWR)) < 0)) { PRMSG(1,"ISCOpenServer: failed to open %s\n", DEV_SPX, 0,0 ); return -1; } if( (connect_spipe(fds, fd) < 0) || (named_spipe(fds, server_path) < 0)) { PRMSG(1,"ISCOpenServer: failed connect pipes\n", 0,0,0 ); close(fd); close(fds); return -1; } #if !defined(UNIXCONN) /* * If the UNIX Domain socket transport is not being used, then link this * device to the path /tmp/.X11-unix/X path. */#define X_UNIX_DIR "/tmp/.X11-unix" if (!mkdir(X_UNIX_DIR, 0777)) chmod(X_UNIX_DIR, 0777); unlink(server_unix_path); #ifdef SVR4 /* we prefer symbolic links because hard links can't cross file systems */ if( symlink(server_path, server_unix_path) < 0 ) PRMSG(1,"ISCOpenServer: failed to link %s to %s\n", server_path, server_unix_path, 0 ); /* * Don't make this failure fatal since the listener * is already established, and this just for compatability */#else#ifdef ISC40 /* catch SIGSYS on symlink for ISC40 compiled binaries running on ISC30 */ signal(SIGSYS,_dummy);#endif if( link(server_path, server_unix_path) < 0 )#ifdef ISC40 if( symlink(server_path, server_unix_path) < 0 )#endif PRMSG(1,"ISCOpenServer: failed to link %s to %s\n", server_path, server_unix_path, 0 ); /* * Don't make this failure fatal since the listener * is already established, and this just for compatability */#endif /* SVR4 */#endif /* !UNIXCONN */ /* * Everything looks good: fill in the XtransConnInfo structure. */ if (TRANS(FillAddrInfo) (ciptr, server_path, server_path) == 0) { PRMSG(1,"ISCOpenServer: failed to fill in addr info\n", 0,0,0); close(fd); return -1; } return fd;#endif /* !ISCDEVNODENAME */}static intTRANS(ISCAccept)(ciptr, newciptr, status)XtransConnInfo ciptr;XtransConnInfo newciptr;int *status;{ struct strrecvfd str; PRMSG(2,"ISCAccept(%d)\n", ciptr->fd, 0,0 ); while (ioctl(ciptr->fd, I_RECVFD, &str) < 0) { if (errno != EAGAIN) { PRMSG(1,"ISCAccept: Can't read fildes", 0,0,0 ); *status = TRANS_ACCEPT_MISC_ERROR; return(-1); } } /* * Everything looks good: fill in the XtransConnInfo structure. */ newciptr->addrlen=ciptr->addrlen; if( (newciptr->addr=(char *)xalloc(newciptr->addrlen)) == NULL ) { PRMSG(1, "ISCAccept: failed to allocate memory for peer addr\n", 0,0,0); close(str.fd); *status = TRANS_ACCEPT_BAD_MALLOC; return -1; } memcpy(newciptr->addr,ciptr->addr,newciptr->addrlen); newciptr->peeraddrlen=newciptr->addrlen; if( (newciptr->peeraddr=(char *)xalloc(newciptr->peeraddrlen)) == NULL ) { PRMSG(1, "ISCAccept: failed to allocate memory for peer addr\n", 0,0,0); xfree(newciptr->addr); close(str.fd); *status = TRANS_ACCEPT_BAD_MALLOC; return -1; } memcpy(newciptr->peeraddr,newciptr->addr,newciptr->peeraddrlen); *status = 0; return(str.fd);}#endif /* TRANS_SERVER *//* SCO */#ifdef TRANS_CLIENTstatic intTRANS(SCOOpenClient)(ciptr, port)XtransConnInfo ciptr;char *port;{ int fd, server, fl, ret; char server_path[64]; struct strbuf ctlbuf; unsigned long alarm_time; void (*savef)(); long temp; extern int getmsg(), putmsg(); PRMSG(2,"SCOOpenClient(%s)\n", port, 0,0 ); #if !defined(SCORNODENAME) PRMSG(1,"SCOOpenClient: Protocol is not supported by a SCO connection\n", 0,0,0); return -1;#else (void) sprintf(server_path, SCORNODENAME, port); if ((server = open(server_path, O_RDWR)) < 0) { PRMSG(1,"SCOOpenClient: failed to open %s\n", server_path, 0,0 ); return -1; } if ((fd = open(DEV_SPX, O_RDWR)) < 0) { PRMSG(1,"SCOOpenClient: failed to open %s\n", DEV_SPX, 0,0 ); close(server); return -1; } (void) write(server, &server, 1); ctlbuf.len = 0; ctlbuf.maxlen = sizeof(long); ctlbuf.buf = (caddr_t)&temp; fl = 0; savef = signal(SIGALRM, _dummy); alarm_time = alarm(10); ret = getmsg(server, &ctlbuf, 0, &fl); (void) alarm(alarm_time); (void) signal(SIGALRM, savef); if (ret < 0) { PRMSG(1,"SCOOpenClient: error from getmsg\n", 0,0,0 ); close(fd); close(server); return -1; } /* The msg we got via getmsg is the result of an * I_FDINSERT, so if we do a putmsg with whatever * we recieved, we're doing another I_FDINSERT ... */ (void) putmsg(fd, &ctlbuf, 0, 0); (void) fcntl(fd,F_SETFL,fcntl(fd,F_GETFL,0)|O_NDELAY); (void) close(server); /* * Everything looks good: fill in the XtransConnInfo structure. */ if (TRANS(FillAddrInfo) (ciptr, server_path, server_path) == 0) { PRMSG(1,"SCOOpenClient: failed to fill addr info\n", 0,0,0); close(fd); return -1; } return(fd);#endif /* !SCORNODENAME */}#endif /* TRANS_CLIENT */#ifdef TRANS_SERVERstatic intTRANS(SCOOpenServer)(ciptr, port)XtransConnInfo ciptr;char *port;{ char serverR_path[64]; char serverS_path[64]; int fdr = -1; int fds = -1; PRMSG(2,"SCOOpenServer(%s)\n", port, 0,0 ); #if !defined(SCORNODENAME) PRMSG(1,"SCOOpenServer: Protocol is not supported by a SCO connection\n", 0,0,0); return -1;#else (void) sprintf(serverR_path, SCORNODENAME, port); (void) sprintf(serverS_path, SCOSNODENAME, port); unlink(serverR_path); unlink(serverS_path); if ((fds = open(DEV_SPX, O_RDWR)) < 0 || (fdr = open(DEV_SPX, O_RDWR)) < 0 ) { PRMSG(2,"SCOOpenServer: failed to open %s\n", DEV_SPX, 0,0 ); return -1; } if (connect_spipe(fds, fdr) != -1 && named_spipe(fds, serverS_path) != -1 && named_spipe(fdr, serverR_path) != -1) { PRMSG(2,"SCOOpenServer: connect pipes\n", 0,0,0 ); } else { PRMSG(2,"SCOOpenServer: failed to connect pipes\n", 0,0,0 ); close(fds); close(fdr); return -1; } /* * Everything looks good: fill in the XtransConnInfo structure. */ if (TRANS(FillAddrInfo) (ciptr, serverS_path, serverR_path) == 0) { PRMSG(1,"SCOOpenServer: failed to fill in addr info\n", 0,0,0); close(fds); close(fdr); return -1; } return(fds);#endif /* !SCORNODENAME */}static intTRANS(SCOAccept)(ciptr, newciptr, status)XtransConnInfo ciptr;XtransConnInfo newciptr;int *status;{ char c; int fd; PRMSG(2,"SCOAccept(%d)\n", ciptr->fd, 0,0 ); if (read(ciptr->fd, &c, 1) < 0) { PRMSG(1,"SCOAccept: can't read from client",0,0,0); *status = TRANS_ACCEPT_MISC_ERROR; return(-1); } if( (fd = open(DEV_SPX, O_RDWR)) < 0 ) { PRMSG(1,"SCOAccept: can't open \"%s\"",DEV_SPX, 0,0 ); *status = TRANS_ACCEPT_MISC_ERROR; return(-1); } if (connect_spipe(ciptr->fd, fd) < 0) { PRMSG(1,"SCOAccept: can't connect pipes", 0,0,0 ); (void) close(fd); *status = TRANS_ACCEPT_MISC_ERROR;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -