⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xtranslcl.c

📁 手写识别Chinput3.0.2源代码,可以在linux下开发手写板程序
💻 C
📖 第 1 页 / 共 4 页
字号:
	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 + -