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

📄 xdmcp.c

📁 远程桌面连接工具
💻 C
📖 第 1 页 / 共 3 页
字号:
#else /* MINIX */    char *udp_device;    int r, s_errno;    nwio_udpopt_t udpopt;    nbio_ref_t ref;    udp_device= getenv("UDP_DEVICE");    if (udp_device == NULL)    	udp_device= UDP_DEVICE;    xdmcpSocket= open(udp_device, O_RDWR);    if (xdmcpSocket != -1)    {    	udpopt.nwuo_flags= NWUO_COPY | NWUO_LP_SEL | NWUO_EN_LOC |     		NWUO_DI_BROAD | NWUO_RP_ANY | NWUO_RA_ANY | NWUO_RWDATALL |    		NWUO_DI_IPOPT;    	r= ioctl(xdmcpSocket, NWIOSUDPOPT, &udpopt);    	if (r == -1)    	{    		s_errno= errno;    		close(xdmcpSocket);    		xdmcpSocket= -1;    		errno= s_errno;    	}    	ioctl(xdmcpSocket, NWIOGUDPOPT, &udpopt);    	ErrorF("0x%x, 0x%x, 0x%x, 0x%x, 0x%x\n",     		udpopt.nwuo_flags,    		udpopt.nwuo_locport,    		udpopt.nwuo_remport,    		udpopt.nwuo_locaddr,    		udpopt.nwuo_remaddr);    }    if (xdmcpSocket != -1)    {	fcntl(xdmcpSocket, F_SETFD, fcntl(xdmcpSocket, F_GETFD) |     								FD_ASYNCHIO);	nbio_register(xdmcpSocket);	ref.ref_int= xdmcpSocket;	nbio_setcallback(xdmcpSocket, ASIO_READ, read_cb, ref);    }    if (xdmcpSocket == -1)#endif /* !MINIX */	XdmcpWarning("UDP socket creation failed");#ifdef SO_BROADCAST    else if (setsockopt(xdmcpSocket, SOL_SOCKET, SO_BROADCAST, (char *)&soopts,	sizeof(soopts)) < 0)	    XdmcpWarning("UDP set broadcast socket-option failed");#endif /* SO_BROADCAST */#endif /* STREAMSCONN */}static voidsend_query_msg(){    XdmcpHeader	header;    Bool	broadcast = FALSE;    int		i;    header.version = XDM_PROTOCOL_VERSION;    switch(state){    case XDM_QUERY:	header.opcode = (CARD16) QUERY; 	state = XDM_COLLECT_QUERY;	break;    case XDM_BROADCAST:	header.opcode = (CARD16) BROADCAST_QUERY;	state = XDM_COLLECT_BROADCAST_QUERY;	broadcast = TRUE;	break;    case XDM_INDIRECT:	header.opcode = (CARD16) INDIRECT_QUERY;	state = XDM_COLLECT_INDIRECT_QUERY;	break;    }    header.length = 1;    for (i = 0; i < AuthenticationNames.length; i++)	header.length += 2 + AuthenticationNames.data[i].length;    XdmcpWriteHeader (&buffer, &header);    XdmcpWriteARRAYofARRAY8 (&buffer, &AuthenticationNames);    if (broadcast)    {	int i;	for (i = 0; i < NumBroadcastAddresses; i++)	    XdmcpFlush (xdmcpSocket, &buffer, &BroadcastAddresses[i],			sizeof (struct sockaddr_in));    }    else    {	XdmcpFlush (xdmcpSocket, &buffer, &ManagerAddress,		    sizeof (ManagerAddress));    }}static voidrecv_willing_msg(from, fromlen, length)    struct sockaddr_in	*from;    int			fromlen;    unsigned		length;{    ARRAY8	authenticationName;    ARRAY8	hostname;    ARRAY8	status;    authenticationName.data = 0;    hostname.data = 0;    status.data = 0;    if (XdmcpReadARRAY8 (&buffer, &authenticationName) &&	XdmcpReadARRAY8 (&buffer, &hostname) &&	XdmcpReadARRAY8 (&buffer, &status))    {    	if (length == 6 + authenticationName.length +		      hostname.length + status.length)    	{	    switch (state)	    {	    case XDM_COLLECT_QUERY:	    	XdmcpSelectHost(from, fromlen, &authenticationName);	    	break;	    case XDM_COLLECT_BROADCAST_QUERY:	    case XDM_COLLECT_INDIRECT_QUERY:	    	XdmcpAddHost(from, fromlen, &authenticationName, &hostname, &status);	    	break;    	    }    	}    }    XdmcpDisposeARRAY8 (&authenticationName);    XdmcpDisposeARRAY8 (&hostname);    XdmcpDisposeARRAY8 (&status);}static voidsend_request_msg(){    XdmcpHeader	    header;    int		    length;    int		    i;    ARRAY8	    authenticationData;    header.version = XDM_PROTOCOL_VERSION;    header.opcode = (CARD16) REQUEST;    length = 2;					    /* display number */    length += 1 + 2 * ConnectionTypes.length;	    /* connection types */    length += 1;				    /* connection addresses */    for (i = 0; i < ConnectionAddresses.length; i++)	length += 2 + ConnectionAddresses.data[i].length;    authenticationData.length = 0;    authenticationData.data = 0;    if (AuthenticationFuncs)    {	(*AuthenticationFuncs->Generator) (AuthenticationData,					   &authenticationData, 					   REQUEST);    }    length += 2 + AuthenticationName->length;	    /* authentication name */    length += 2 + authenticationData.length;	    /* authentication data */    length += 1;				    /* authorization names */    for (i = 0; i < AuthorizationNames.length; i++)	length += 2 + AuthorizationNames.data[i].length;    length += 2 + ManufacturerDisplayID.length;	    /* display ID */    header.length = length;    if (!XdmcpWriteHeader (&buffer, &header))    {	XdmcpDisposeARRAY8 (&authenticationData);	return;    }    XdmcpWriteCARD16 (&buffer, DisplayNumber);    XdmcpWriteARRAY16 (&buffer, &ConnectionTypes);    XdmcpWriteARRAYofARRAY8 (&buffer, &ConnectionAddresses);    XdmcpWriteARRAY8 (&buffer, AuthenticationName);    XdmcpWriteARRAY8 (&buffer, &authenticationData);    XdmcpDisposeARRAY8 (&authenticationData);    XdmcpWriteARRAYofARRAY8 (&buffer, &AuthorizationNames);    XdmcpWriteARRAY8 (&buffer, &ManufacturerDisplayID);    if (XdmcpFlush (xdmcpSocket, &buffer, &req_sockaddr, req_socklen))	state = XDM_AWAIT_REQUEST_RESPONSE;}static voidrecv_accept_msg(length)    unsigned		length;{    CARD32  AcceptSessionID;    ARRAY8  AcceptAuthenticationName, AcceptAuthenticationData;    ARRAY8  AcceptAuthorizationName, AcceptAuthorizationData;    if (state != XDM_AWAIT_REQUEST_RESPONSE)	return;    AcceptAuthenticationName.data = 0;    AcceptAuthenticationData.data = 0;    AcceptAuthorizationName.data = 0;    AcceptAuthorizationData.data = 0;    if (XdmcpReadCARD32 (&buffer, &AcceptSessionID) &&	XdmcpReadARRAY8 (&buffer, &AcceptAuthenticationName) &&	XdmcpReadARRAY8 (&buffer, &AcceptAuthenticationData) &&	XdmcpReadARRAY8 (&buffer, &AcceptAuthorizationName) &&	XdmcpReadARRAY8 (&buffer, &AcceptAuthorizationData))    {    	if (length == 12 + AcceptAuthenticationName.length +		      	   AcceptAuthenticationData.length +		      	   AcceptAuthorizationName.length + 		      	   AcceptAuthorizationData.length)    	{	    if (!XdmcpCheckAuthentication (&AcceptAuthenticationName,				      &AcceptAuthenticationData, ACCEPT))	    {		XdmcpFatal ("Authentication Failure", &AcceptAuthenticationName);	    }	    /* permit access control manipulations from this host */	    AugmentSelf (&req_sockaddr, req_socklen);	    /* if the authorization specified in the packet fails	     * to be acceptable, enable the local addresses	     */	    if (!XdmcpAddAuthorization (&AcceptAuthorizationName,					&AcceptAuthorizationData))	    {		AddLocalHosts ();	    }	    SessionID = AcceptSessionID;    	    state = XDM_MANAGE;    	    send_packet();    	}    }    XdmcpDisposeARRAY8 (&AcceptAuthenticationName);    XdmcpDisposeARRAY8 (&AcceptAuthenticationData);    XdmcpDisposeARRAY8 (&AcceptAuthorizationName);    XdmcpDisposeARRAY8 (&AcceptAuthorizationData);}static voidrecv_decline_msg(length)    unsigned		length;{    ARRAY8  status, DeclineAuthenticationName, DeclineAuthenticationData;    status.data = 0;    DeclineAuthenticationName.data = 0;    DeclineAuthenticationData.data = 0;    if (XdmcpReadARRAY8 (&buffer, &status) &&	XdmcpReadARRAY8 (&buffer, &DeclineAuthenticationName) &&	XdmcpReadARRAY8 (&buffer, &DeclineAuthenticationData))    {    	if (length == 6 + status.length +		      	  DeclineAuthenticationName.length + 		      	  DeclineAuthenticationData.length &&	    XdmcpCheckAuthentication (&DeclineAuthenticationName,				      &DeclineAuthenticationData, DECLINE))    	{	    XdmcpFatal ("Session declined", &status);    	}    }    XdmcpDisposeARRAY8 (&status);    XdmcpDisposeARRAY8 (&DeclineAuthenticationName);    XdmcpDisposeARRAY8 (&DeclineAuthenticationData);}static voidsend_manage_msg(){    XdmcpHeader	header;    header.version = XDM_PROTOCOL_VERSION;    header.opcode = (CARD16) MANAGE;    header.length = 8 + DisplayClass.length;    if (!XdmcpWriteHeader (&buffer, &header))	return;    XdmcpWriteCARD32 (&buffer, SessionID);    XdmcpWriteCARD16 (&buffer, DisplayNumber);    XdmcpWriteARRAY8 (&buffer, &DisplayClass);    state = XDM_AWAIT_MANAGE_RESPONSE;    XdmcpFlush (xdmcpSocket, &buffer, &req_sockaddr, req_socklen);}static voidrecv_refuse_msg(length)    unsigned		length;{    CARD32  RefusedSessionID;    if (state != XDM_AWAIT_MANAGE_RESPONSE)	return;    if (length != 4)	return;    if (XdmcpReadCARD32 (&buffer, &RefusedSessionID))    {	if (RefusedSessionID == SessionID)	{    	    state = XDM_START_CONNECTION;    	    send_packet();	}    }}static voidrecv_failed_msg(length)    unsigned		length;{    CARD32  FailedSessionID;    ARRAY8  status;    if (state != XDM_AWAIT_MANAGE_RESPONSE)	return;    status.data = 0;    if (XdmcpReadCARD32 (&buffer, &FailedSessionID) &&	XdmcpReadARRAY8 (&buffer, &status))    {    	if (length == 6 + status.length &&	    SessionID == FailedSessionID)	{	    XdmcpFatal ("Session failed", &status);	}    }    XdmcpDisposeARRAY8 (&status);}static voidsend_keepalive_msg(){    XdmcpHeader	header;    header.version = XDM_PROTOCOL_VERSION;    header.opcode = (CARD16) KEEPALIVE;    header.length = 6;    XdmcpWriteHeader (&buffer, &header);    XdmcpWriteCARD16 (&buffer, DisplayNumber);    XdmcpWriteCARD32 (&buffer, SessionID);    state = XDM_AWAIT_ALIVE_RESPONSE;    XdmcpFlush (xdmcpSocket, &buffer, &req_sockaddr, req_socklen);}static voidrecv_alive_msg (length)    unsigned		length;{    CARD8   SessionRunning;    CARD32  AliveSessionID;    int	    dormancy;    if (state != XDM_AWAIT_ALIVE_RESPONSE)	return;    if (length != 5)	return;    if (XdmcpReadCARD8 (&buffer, &SessionRunning) &&	XdmcpReadCARD32 (&buffer, &AliveSessionID))    {    	if (SessionRunning && AliveSessionID == SessionID)    	{	    /* backoff dormancy period */	    state = XDM_RUN_SESSION;	    if ((GetTimeInMillis() - lastDeviceEventTime.milliseconds) >		keepaliveDormancy * 1000)	    {		keepaliveDormancy <<= 1;		if (keepaliveDormancy > XDM_MAX_DORMANCY)		    keepaliveDormancy = XDM_MAX_DORMANCY;	    }	    timeOutTime = GetTimeInMillis() + keepaliveDormancy * 1000;    	}	else    	{	    XdmcpDeadSession ("Alive respose indicates session dead");    	}    }}static XdmcpFatal (type, status)    char	*type;    ARRAY8Ptr	status;{    FatalError ("XDMCP fatal error: %s %*.*s\n", type,	   status->length, status->length, status->data);}static XdmcpWarning(str)    char *str;{    ErrorF("XDMCP warning: %s\n", str);}staticget_manager_by_name(argc, argv, i)    int	    argc, i;    char    **argv;{    struct hostent *hep;    if (i == argc)    {	ErrorF("Xserver: missing host name in command line\n");	exit(1);    }    if (!(hep = gethostbyname(argv[i])))    {	ErrorF("Xserver: unknown host: %s\n", argv[i]);	exit(1);    }#ifndef _MINIX    if (hep->h_length == sizeof (struct in_addr))#else    if (hep->h_length == sizeof (ipaddr_t))#endif    {	memmove(&ManagerAddress.sin_addr, hep->h_addr, hep->h_length);#ifdef BSD44SOCKETS	ManagerAddress.sin_len = sizeof(ManagerAddress);#endif	ManagerAddress.sin_family = AF_INET;	ManagerAddress.sin_port = htons (xdm_udp_port);    }    else    {	ErrorF ("Xserver: host on strange network %s\n", argv[i]);	exit (1);    }}#ifdef MINIXstatic char read_buffer[XDM_MAX_MSGLEN+sizeof(udp_io_hdr_t)];static int read_inprogress;static int read_size;intXdmcpFill (fd, buffer, from, fromlen)int             fd;XdmcpBufferPtr  buffer;XdmcpNetaddr    from;       /* return */int             *fromlen;   /* return */{	int r;	if (read_inprogress)		return 0;	if (read_size != 0)	{		r= read_size;		read_size= 0;		return MNX_XdmcpFill(fd, buffer, from, fromlen, read_buffer,			r);	}	r= read(fd, read_buffer, sizeof(read_buffer));	if (r > 0)	{		return MNX_XdmcpFill(fd, buffer, from, fromlen, read_buffer,			r);	}	else if (r == -1 && errno == EINPROGRESS)	{		read_inprogress= 1;		nbio_inprogress(fd, ASIO_READ, 1 /* read */, 0 /* write */,			0 /* except */);		return 0;	}	else		FatalError("XdmcpFill: read failed: %s\n",			r == 0 ? "EOF" : strerror(errno));	return 0;}static void read_cb(ref, res, err)nbio_ref_t ref;int res;int err;{	if (res <= 0)	{		FatalError("xdmcp'read_cb: read failed: %s\n",			res == 0 ? "EOF" : strerror(err));	}	read_inprogress= 0;	read_size= res;}#endif#elsestatic int xdmcp_non_empty; /* avoid complaint by ranlib */#endif /* XDMCP */

⌨️ 快捷键说明

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