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

📄 xconnim.c

📁 早期freebsd实现
💻 C
字号:
/* * $XConsortium: XConnIM.c,v 1.18 92/07/29 13:55:35 rws Exp $ *//* * Copyright 1990, 1991 by OMRON Corporation * Copyright 1991 by the Massachusetts Institute of Technology * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that * the above copyright notice appear in all copies and that both that * copyright notice and this permission notice appear in supporting * documentation, and that the names of OMRON and MIT not be used in * advertising or publicity pertaining to distribution of the software without * specific, written prior permission.  OMRON and MIT make no representations * about the suitability of this software for any purpose.  It is provided * "as is" without express or implied warranty. * * OMRON AND MIT DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO * EVENT SHALL OMRON OR MIT BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER * TORTUOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE.  * *	Author:	Seiji Kuwari	OMRON Corporation *				kuwa@omron.co.jp *				kuwa%omron.co.jp@uunet.uu.net */				/* * This is an OS dependent file. this should work on 4.3BSD. */#include "Xlibint.h"#include "Xlibnet.h"#include "Xi18nint.h"#include "XIMlibint.h"#include <X11/Xos.h>#ifdef TCPCONN#include <sys/socket.h>#endif#ifdef	UNIXCONN#include <sys/un.h>#ifndef	XIM_UNIX_PATH#define	XIM_UNIX_PATH	"/tmp/.X11-unix/XIM"#endif	/* XIM_UNIX_PATH */#endif	/* UNIXCONN *//* * Attempts to connect to an input manager, given atom id. */Bool_XipConnectIM (im, im_atom, displaybuf)    XipIM im;    Atom im_atom;    char *displaybuf;{#ifdef STREAMSCONN    im->fd = -1;    return(False);#else    char		im_hostname[256];/* Input manager host name buffer */    Atom		actual_type;    int			actual_format;    unsigned long	nitems;    unsigned long	byte_after;    unsigned char	*prop;#ifdef	UNIXCONN    struct sockaddr_un	saddr;		/* UNIX domain socket address */#endif	/* UNIXCONN */#ifdef TCPCONN    struct sockaddr_in	saddr_in;	/* INET domain socket address */    struct hostent	*hp;    unsigned short	port;#endif    int			sd = -1;	/* File disclipter */    int			indian;    ximConnClient	client;    ximNormalReply	reply;    unsigned long	i;    unsigned short	s;    int			inet_ok = 0;    im->fd = -1;    /*     * Get a property of input manager. Format of the property is     *		char hostname[128] ( host name )     *		unsigned short portnumber    ( port number )     *		long major_version    ( major version of protocol )     *		long minor_version    ( minor version of protocol )     */    XGetWindowProperty(im->core.display, DefaultRootWindow(im->core.display),		       im_atom, 0L, 256L, 0, AnyPropertyType,		       &actual_type, &actual_format, &nitems,		       &byte_after, &prop);    bcopy((char *)prop, im_hostname, hname_size);    bcopy((char *)(prop + offset_of_portnumber), (char *)&s, portnumber_size);#ifdef TCPCONN    port = ntohs(s);#endif    bcopy((char *)(prop + offset_of_version), (char *)&i, version_size);    im->major_version = (long)ntohl(i);    bcopy((char *)(prop + offset_of_minor_version), (char *)&i, version_size);    im->minor_version = (long)ntohl(i);    Xfree((char *)prop);    if (im->major_version != XIM_MAJOR_VERSION) return(False);    if (!(im->minor_version >= XIM_MINOR_VERSION)) return(False);#ifdef TCPCONN    /*     * Attempts to open INET domain socket.     */    if (hp = gethostbyname(im_hostname)) {	bzero((char *)&saddr_in, (int)sizeof(saddr_in));	bcopy(hp->h_addr, (char *)&saddr_in.sin_addr, hp->h_length);	saddr_in.sin_family = AF_INET;	saddr_in.sin_port = htons(port);	if ((sd = socket(AF_INET, SOCK_STREAM, 0)) >= 0) {	    if (connect(sd, &saddr_in, sizeof(saddr_in)) >= 0) {		inet_ok = 1;	    } else {		close(sd);		sd = -1;	    }	}    }#endif#ifdef	UNIXCONN    /*     * Attempts to open UNIX domain socket.     */    if (inet_ok == 0) {	saddr.sun_family = AF_UNIX;	strcpy(saddr.sun_path, XIM_UNIX_PATH);	if ((sd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {	    return(False);	}	if (connect(sd, &saddr, strlen(saddr.sun_path)+sizeof(saddr.sun_family)) < 0) {	    close(sd);	    return(False);	}    }#endif	/* UNIXCONN */    if (sd == -1) return(False);    /*     * Send the display name to the input manager.      */    indian = 1;    if (*(char *) &indian) {	client.byteOrder = 'l';    } else {	client.byteOrder = 'B';    }    client.length = strlen(displaybuf);    im->fd = sd;    if ((_XipWriteToIM(im, (char *)&client, sizeof(ximConnClient)) < 0) ||	(_XipWriteToIM(im, (char *)displaybuf, (int)client.length) < 0) ||	(_XipFlushToIM(im) < 0)) {	return(False);    }    /*     * Now see, if connection was accepted.     */    if (_XipReadFromIM(im, (char *)&reply, sz_ximNormalReply) < 0) {	return(False);    }    if (reply.state != 0) {	close(sd);	return(False);    }    return(True);#endif}/* * Disconnect from the input manager. */void_XipDisconnectIM(server)    int server;{    (void) close(server);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -