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

📄 serial.c

📁 rdesktop is a client for Microsoft Windows NT Terminal Server, Windows 2000 Terminal Services, Wind
💻 C
📖 第 1 页 / 共 2 页
字号:
/* -*- c-basic-offset: 8 -*-   rdesktop: A Remote Desktop Protocol client.   Copyright (C) Matthew Chapman 1999-2005      This program is free software; you can redistribute it and/or modify   it under the terms of the GNU General Public License as published by   the Free Software Foundation; either version 2 of the License, or   (at your option) any later version.      This program is distributed in the hope that it will be useful,   but WITHOUT ANY WARRANTY; without even the implied warranty of   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the   GNU General Public License for more details.   You should have received a copy of the GNU General Public License   along with this program; if not, write to the Free Software   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.*/#include <unistd.h>#include <fcntl.h>#include <termios.h>#include <strings.h>#include <sys/ioctl.h>#ifdef HAVE_SYS_MODEM_H#include <sys/modem.h>#endif#ifdef HAVE_SYS_FILIO_H#include <sys/filio.h>#endif#ifdef HAVE_SYS_STRTIO_H#include <sys/strtio.h>#endif#include "rdesktop.h"#ifdef WITH_DEBUG_SERIAL#define DEBUG_SERIAL(args) printf args;#else#define DEBUG_SERIAL(args)#endif#define FILE_DEVICE_SERIAL_PORT		0x1b#define SERIAL_SET_BAUD_RATE		1#define SERIAL_SET_QUEUE_SIZE		2#define SERIAL_SET_LINE_CONTROL		3#define SERIAL_SET_BREAK_ON		4#define SERIAL_SET_BREAK_OFF		5#define SERIAL_IMMEDIATE_CHAR		6#define SERIAL_SET_TIMEOUTS		7#define SERIAL_GET_TIMEOUTS		8#define SERIAL_SET_DTR			9#define SERIAL_CLR_DTR			10#define SERIAL_RESET_DEVICE		11#define SERIAL_SET_RTS			12#define SERIAL_CLR_RTS			13#define SERIAL_SET_XOFF			14#define SERIAL_SET_XON			15#define SERIAL_GET_WAIT_MASK		16#define SERIAL_SET_WAIT_MASK		17#define SERIAL_WAIT_ON_MASK		18#define SERIAL_PURGE			19#define SERIAL_GET_BAUD_RATE		20#define SERIAL_GET_LINE_CONTROL		21#define SERIAL_GET_CHARS		22#define SERIAL_SET_CHARS		23#define SERIAL_GET_HANDFLOW		24#define SERIAL_SET_HANDFLOW		25#define SERIAL_GET_MODEMSTATUS		26#define SERIAL_GET_COMMSTATUS		27#define SERIAL_XOFF_COUNTER		28#define SERIAL_GET_PROPERTIES		29#define SERIAL_GET_DTRRTS		30#define SERIAL_LSRMST_INSERT		31#define SERIAL_CONFIG_SIZE		32#define SERIAL_GET_COMMCONFIG		33#define SERIAL_SET_COMMCONFIG		34#define SERIAL_GET_STATS		35#define SERIAL_CLEAR_STATS		36#define SERIAL_GET_MODEM_CONTROL	37#define SERIAL_SET_MODEM_CONTROL	38#define SERIAL_SET_FIFO_CONTROL		39#define STOP_BITS_1			0#define STOP_BITS_2			2#define NO_PARITY			0#define ODD_PARITY			1#define EVEN_PARITY			2#define SERIAL_PURGE_TXABORT 0x00000001#define SERIAL_PURGE_RXABORT 0x00000002#define SERIAL_PURGE_TXCLEAR 0x00000004#define SERIAL_PURGE_RXCLEAR 0x00000008/* SERIAL_WAIT_ON_MASK */#define SERIAL_EV_RXCHAR           0x0001	/* Any Character received */#define SERIAL_EV_RXFLAG           0x0002	/* Received certain character */#define SERIAL_EV_TXEMPTY          0x0004	/* Transmitt Queue Empty */#define SERIAL_EV_CTS              0x0008	/* CTS changed state */#define SERIAL_EV_DSR              0x0010	/* DSR changed state */#define SERIAL_EV_RLSD             0x0020	/* RLSD changed state */#define SERIAL_EV_BREAK            0x0040	/* BREAK received */#define SERIAL_EV_ERR              0x0080	/* Line status error occurred */#define SERIAL_EV_RING             0x0100	/* Ring signal detected */#define SERIAL_EV_PERR             0x0200	/* Printer error occured */#define SERIAL_EV_RX80FULL         0x0400	/* Receive buffer is 80 percent full */#define SERIAL_EV_EVENT1           0x0800	/* Provider specific event 1 */#define SERIAL_EV_EVENT2           0x1000	/* Provider specific event 2 *//* Modem Status */#define SERIAL_MS_DTR 0x01#define SERIAL_MS_RTS 0x02#define SERIAL_MS_CTS 0x10#define SERIAL_MS_DSR 0x20#define SERIAL_MS_RNG 0x40#define SERIAL_MS_CAR 0x80/* Handflow */#define SERIAL_DTR_CONTROL	0x01#define SERIAL_CTS_HANDSHAKE	0x08#define SERIAL_ERROR_ABORT	0x80000000#define SERIAL_XON_HANDSHAKE	0x01#define SERIAL_XOFF_HANDSHAKE	0x02#define SERIAL_DSR_SENSITIVITY	0x40#define SERIAL_CHAR_EOF		0#define SERIAL_CHAR_ERROR	1#define SERIAL_CHAR_BREAK	2#define SERIAL_CHAR_EVENT	3#define SERIAL_CHAR_XON		4#define SERIAL_CHAR_XOFF	5#ifndef CRTSCTS#define CRTSCTS 0#endif/* FIONREAD should really do the same thing as TIOCINQ, where it is * not available */#if !defined(TIOCINQ) && defined(FIONREAD)#define TIOCINQ FIONREAD#endif#if !defined(TIOCOUTQ) && defined(FIONWRITE)#define TIOCOUTQ FIONWRITE#endifextern RDPDR_DEVICE g_rdpdr_device[];static SERIAL_DEVICE *get_serial_info(NTHANDLE handle){	int index;	for (index = 0; index < RDPDR_MAX_DEVICES; index++)	{		if (handle == g_rdpdr_device[index].handle)			return (SERIAL_DEVICE *) g_rdpdr_device[index].pdevice_data;	}	return NULL;}static BOOLget_termios(SERIAL_DEVICE * pser_inf, NTHANDLE serial_fd){	speed_t speed;	struct termios *ptermios;	ptermios = pser_inf->ptermios;	if (tcgetattr(serial_fd, ptermios) == -1)		return False;	speed = cfgetispeed(ptermios);	switch (speed)	{#ifdef B75		case B75:			pser_inf->baud_rate = 75;			break;#endif#ifdef B110		case B110:			pser_inf->baud_rate = 110;			break;#endif#ifdef B134		case B134:			pser_inf->baud_rate = 134;			break;#endif#ifdef B150		case B150:			pser_inf->baud_rate = 150;			break;#endif#ifdef B300		case B300:			pser_inf->baud_rate = 300;			break;#endif#ifdef B600		case B600:			pser_inf->baud_rate = 600;			break;#endif#ifdef B1200		case B1200:			pser_inf->baud_rate = 1200;			break;#endif#ifdef B1800		case B1800:			pser_inf->baud_rate = 1800;			break;#endif#ifdef B2400		case B2400:			pser_inf->baud_rate = 2400;			break;#endif#ifdef B4800		case B4800:			pser_inf->baud_rate = 4800;			break;#endif#ifdef B9600		case B9600:			pser_inf->baud_rate = 9600;			break;#endif#ifdef B19200		case B19200:			pser_inf->baud_rate = 19200;			break;#endif#ifdef B38400		case B38400:			pser_inf->baud_rate = 38400;			break;#endif#ifdef B57600		case B57600:			pser_inf->baud_rate = 57600;			break;#endif#ifdef B115200		case B115200:			pser_inf->baud_rate = 115200;			break;#endif#ifdef B230400		case B230400:			pser_inf->baud_rate = 230400;			break;#endif#ifdef B460800		case B460800:			pser_inf->baud_rate = 460800;			break;#endif		default:			pser_inf->baud_rate = 9600;			break;	}	speed = cfgetospeed(ptermios);	pser_inf->dtr = (speed == B0) ? 0 : 1;	pser_inf->stop_bits = (ptermios->c_cflag & CSTOPB) ? STOP_BITS_2 : STOP_BITS_1;	pser_inf->parity =		(ptermios->		 c_cflag & PARENB) ? ((ptermios->				       c_cflag & PARODD) ? ODD_PARITY : EVEN_PARITY) : NO_PARITY;	switch (ptermios->c_cflag & CSIZE)	{		case CS5:			pser_inf->word_length = 5;			break;		case CS6:			pser_inf->word_length = 6;			break;		case CS7:			pser_inf->word_length = 7;			break;		default:			pser_inf->word_length = 8;			break;	}	if (ptermios->c_cflag & CRTSCTS)	{		pser_inf->control = SERIAL_DTR_CONTROL | SERIAL_CTS_HANDSHAKE | SERIAL_ERROR_ABORT;	}	else	{		pser_inf->control = SERIAL_DTR_CONTROL | SERIAL_ERROR_ABORT;	}	pser_inf->xonoff = SERIAL_DSR_SENSITIVITY;	if (ptermios->c_iflag & IXON)		pser_inf->xonoff |= SERIAL_XON_HANDSHAKE;	if (ptermios->c_iflag & IXOFF)		pser_inf->xonoff |= SERIAL_XOFF_HANDSHAKE;	pser_inf->chars[SERIAL_CHAR_XON] = ptermios->c_cc[VSTART];	pser_inf->chars[SERIAL_CHAR_XOFF] = ptermios->c_cc[VSTOP];	pser_inf->chars[SERIAL_CHAR_EOF] = ptermios->c_cc[VEOF];	pser_inf->chars[SERIAL_CHAR_BREAK] = ptermios->c_cc[VINTR];	pser_inf->chars[SERIAL_CHAR_ERROR] = ptermios->c_cc[VKILL];	return True;}static voidset_termios(SERIAL_DEVICE * pser_inf, NTHANDLE serial_fd){	speed_t speed;	struct termios *ptermios;	ptermios = pser_inf->ptermios;	switch (pser_inf->baud_rate)	{#ifdef B75		case 75:			speed = B75;			break;#endif#ifdef B110		case 110:			speed = B110;			break;#endif#ifdef B134		case 134:			speed = B134;			break;#endif#ifdef B150		case 150:			speed = B150;			break;#endif#ifdef B300		case 300:			speed = B300;			break;#endif#ifdef B600		case 600:			speed = B600;			break;#endif#ifdef B1200		case 1200:			speed = B1200;			break;#endif#ifdef B1800		case 1800:			speed = B1800;			break;#endif#ifdef B2400		case 2400:			speed = B2400;			break;#endif#ifdef B4800		case 4800:			speed = B4800;			break;#endif#ifdef B9600		case 9600:			speed = B9600;			break;#endif#ifdef B19200		case 19200:			speed = B19200;			break;#endif#ifdef B38400		case 38400:			speed = B38400;			break;#endif#ifdef B57600		case 57600:			speed = B57600;			break;#endif#ifdef B115200		case 115200:			speed = B115200;			break;#endif#ifdef B230400		case 230400:			speed = B115200;			break;#endif#ifdef B460800		case 460800:			speed = B115200;			break;#endif		default:			speed = B9600;			break;	}#ifdef CBAUD	ptermios->c_cflag &= ~CBAUD;	ptermios->c_cflag |= speed;#else	/* on systems with separate ispeed and ospeed, we can remember the speed	   in ispeed while changing DTR with ospeed */	cfsetispeed(pser_inf->ptermios, speed);	cfsetospeed(pser_inf->ptermios, pser_inf->dtr ? speed : 0);#endif	ptermios->c_cflag &= ~(CSTOPB | PARENB | PARODD | CSIZE | CRTSCTS);	switch (pser_inf->stop_bits)	{		case STOP_BITS_2:			ptermios->c_cflag |= CSTOPB;			break;		default:			ptermios->c_cflag &= ~CSTOPB;			break;	}	switch (pser_inf->parity)	{		case EVEN_PARITY:			ptermios->c_cflag |= PARENB;			break;		case ODD_PARITY:			ptermios->c_cflag |= PARENB | PARODD;			break;		case NO_PARITY:			ptermios->c_cflag &= ~(PARENB | PARODD);			break;	}	switch (pser_inf->word_length)	{		case 5:			ptermios->c_cflag |= CS5;			break;		case 6:			ptermios->c_cflag |= CS6;			break;		case 7:			ptermios->c_cflag |= CS7;			break;		default:			ptermios->c_cflag |= CS8;			break;	}#if 0	if (pser_inf->rts)		ptermios->c_cflag |= CRTSCTS;	else		ptermios->c_cflag &= ~CRTSCTS;#endif	if (pser_inf->control & SERIAL_CTS_HANDSHAKE)	{		ptermios->c_cflag |= CRTSCTS;	}	else	{		ptermios->c_cflag &= ~CRTSCTS;	}	if (pser_inf->xonoff & SERIAL_XON_HANDSHAKE)	{		ptermios->c_iflag |= IXON | IMAXBEL;	}	if (pser_inf->xonoff & SERIAL_XOFF_HANDSHAKE)	{		ptermios->c_iflag |= IXOFF | IMAXBEL;	}	if ((pser_inf->xonoff & (SERIAL_XOFF_HANDSHAKE | SERIAL_XON_HANDSHAKE)) == 0)	{		ptermios->c_iflag &= ~IXON;		ptermios->c_iflag &= ~IXOFF;	}	ptermios->c_cc[VSTART] = pser_inf->chars[SERIAL_CHAR_XON];	ptermios->c_cc[VSTOP] = pser_inf->chars[SERIAL_CHAR_XOFF];	ptermios->c_cc[VEOF] = pser_inf->chars[SERIAL_CHAR_EOF];	ptermios->c_cc[VINTR] = pser_inf->chars[SERIAL_CHAR_BREAK];	ptermios->c_cc[VKILL] = pser_inf->chars[SERIAL_CHAR_ERROR];	tcsetattr(serial_fd, TCSANOW, ptermios);}/* Enumeration of devices from rdesktop.c        *//* returns numer of units found and initialized. *//* optarg looks like ':com1=/dev/ttyS0'           *//* when it arrives to this function.              *//* :com1=/dev/ttyS0,com2=/dev/ttyS1 */intserial_enum_devices(uint32 * id, char *optarg){	SERIAL_DEVICE *pser_inf;	char *pos = optarg;	char *pos2;	int count = 0;	/* skip the first colon */	optarg++;	while ((pos = next_arg(optarg, ',')) && *id < RDPDR_MAX_DEVICES)	{		/* Init data structures for device */		pser_inf = (SERIAL_DEVICE *) xmalloc(sizeof(SERIAL_DEVICE));		pser_inf->ptermios = (struct termios *) xmalloc(sizeof(struct termios));		memset(pser_inf->ptermios, 0, sizeof(struct termios));		pser_inf->pold_termios = (struct termios *) xmalloc(sizeof(struct termios));		memset(pser_inf->pold_termios, 0, sizeof(struct termios));		pos2 = next_arg(optarg, '=');		strcpy(g_rdpdr_device[*id].name, optarg);		toupper_str(g_rdpdr_device[*id].name);

⌨️ 快捷键说明

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