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

📄 vvmodem.c

📁 ZMODEM协议的实现
💻 C
字号:
/* *  VMODEM *  VMS support for UMODEM and vvrb/vvsb programs * *	Defined herein are some utility routines to make the UNIX *	program UMODEM run under VAX/VMS C: * *		assign_channel	Calls the VMS System Service $ASSIGN *				to assign a channel to a device. *				The routine currently has the device *				"TT" hardwired into it. *		gtty		Gets terminal characteristics, almost *				like the UNIX GTTY system call. *		raw_read	Reads characters from the terminal *				without any echoing or interpretation *				and with an optional timeout period. *		raw_write	Writes a character to the terminal *				without any interpretation. *		raw_wbuf	Writes a buffer to the terminal *				without any interpretation. *		stty		Sets terminal characteristics, almost *				like the UNIX STTY system call. * *	Some of the ideas used here were obtained from code written *	by Max Benson and Robert Bruccoleri. * *  Walter Reiher *  Harvard University *  Department of Chemistry *  12 Oxford Street *  Cambridge, MA 02138 *  March 11, 1983 * *  Modified 4-20-88 Chuck Forsberg, Omen Technology INC *  17505-V NW Sauvie IS RD Portland OR 97231 omen!caf *   Added primitives for for ZMODEM use. */#include descrip#include iodef#include rms#include ssdef#include stdio#include "vmodem.h"#define  TRUE	1#define  FALSE	0static char	tt_name[]	= "TT";static short	tt_chan		= -1;		/*  Terminal channel number  */struct	tt_io_iosb				/*  Terminal I/O IOSB  */{	short	status;	short	byte_count;	short	terminator;	short	terminator_size;};struct	tt_io_tacf				/* Terminal I/O type ahead */{	short	byte_count;	char	firstchar;	char	something;	short	whatever;};/* *	Terminator mask for PASSALL reads. *	Permits reads of all possible 8-bit characters. */int	t_mask[32] =  {	0,  0,  0,  0,  0,  0,  0,  0,  0,  0,	0,  0,  0,  0,  0,  0,  0,  0,  0,  0,	0,  0,  0,  0,  0,  0,  0,  0,  0,  0,	0,  0	};struct	terminator_mask {	short	size ;	short	unused ;	int	*mask ;}termin_mask	= { 32, 0, t_mask };/* *	ASSIGN a channel to the logical name TT, which is usually *	the terminal. */assign_channel(){	int	status;	$DESCRIPTOR(tt_descriptor, tt_name);	if (tt_chan == -1)		status	= sys$assign(&tt_descriptor, &tt_chan, 0, 0);	else		status	= SS$_NORMAL;	if (status != SS$_NORMAL || tt_chan == -1)		fatal("ASSIGN_CHANNEL:  error in SYS$ASSIGN\n");	return;}/* *	Gets terminal information from VMS. */gtty(tt_characteristics)struct	tt_info	*tt_characteristics;{	int c;	int				status;	extern unsigned Baudrate;	int speeds[] = { 2400, 50, 75, 110, 134, 150, 300, 600, 1200, 1800,	  2000, 2400, 3600, 4800, 7200, 9600, 19200 };	if (tt_chan == -1)		assign_channel();	status	= sys$qiow(0, tt_chan, IO$_SENSEMODE,	  &(tt_characteristics->dev_modes), NULL, 0,	  &(tt_characteristics->dev_characteristics), 12,	  0, 0, 0, 0);	if (status != SS$_NORMAL ||	  tt_characteristics->dev_modes.status != SS$_NORMAL)		fatal("GTTY:  sense mode QIO error return.\n");	c = tt_characteristics->dev_modes.t_speed % 17;	Baudrate = speeds[c];	return(status);}/* *	Return the number of characters waiting in TTY input buffer */rdchk(){	int		status;	struct	tt_io_iosb	iosb;	struct	tt_io_tacf typeahead;	status	= sys$qiow(0, tt_chan, IO$_SENSEMODE|IO$M_TYPEAHDCNT,	  &iosb, NULL, 0,	  &typeahead, 0,	  0, 0, 0, 0);	return(typeahead.byte_count);}/* *	Read NCHAR characters from the terminal without echoing or *	interpretation. *	If the argument SECONDS is non-zero, use that as the *	timeout period in seconds for the read. * *	Returns SS$_TIMEOUT in case of timeout or other error. *	  Otherwise, returns the number of characters read. */raw_read(nchar, charbuf, seconds)char		*charbuf;int		nchar;unsigned	seconds;{	short			function;	int			status;	struct	tt_io_iosb	iosb;	if (tt_chan == -1)		assign_channel();	function	= IO$_READVBLK | IO$M_NOECHO | IO$M_NOFILTR;	if (seconds)		status	= sys$qiow(0, tt_chan, function | IO$M_TIMED,		  &iosb, NULL, 0,		  charbuf, nchar, seconds,		  &termin_mask, NULL, 0);	else		status	= sys$qiow(0, tt_chan, function,		  &iosb, NULL, 0,		  charbuf, nchar, 0,		  &termin_mask, NULL, 0);	if (iosb.byte_count)		return iosb.byte_count;	return SS$_TIMEOUT;}/* *	Writes a character to the terminal without echoing or *	interpretation. */raw_write(c)char	c;{	int			status;	struct	tt_io_iosb	iosb;	if (tt_chan == -1)		assign_channel();	status	= sys$qiow(0, tt_chan,	  IO$_WRITEVBLK | IO$M_CANCTRLO | IO$M_NOFORMAT,	  &iosb, NULL, 0,	  &c, 1, 0, 0, 0, 0);	if (status != SS$_NORMAL || iosb.status != SS$_NORMAL)		fatal("RAW_WRITE:  write QIO error return.\n");	return;}/* *	Writes a buffer to the terminal without echoing or *	interpretation. */raw_wbuf(nchar, charbuf)char		*charbuf;int		nchar;{	int			status;	struct	tt_io_iosb	iosb;	if (tt_chan == -1)		assign_channel();	status	= sys$qiow(0, tt_chan,	  IO$_WRITEVBLK | IO$M_CANCTRLO | IO$M_NOFORMAT,	  &iosb, NULL, 0,	  charbuf, nchar, 0, 0, 0, 0);	if (status != SS$_NORMAL || iosb.status != SS$_NORMAL)		fatal("RAW_WRITE:  write QIO error return.\n");	return;}/* *  Sets terminal information from VMS. *	 Modified 12-85 Larry Farr/Chuck Forsberg to not use *	 bad parity returned by VMS 4. */stty(tt_characteristics)struct	tt_info	*tt_characteristics;{	short			*f_ptr, /* *p_ptr, */ *s_ptr;	int			status;	struct	tt_mode_iosb	iosb;	if (tt_chan == -1)		assign_channel();/* *	We do the following in order to get a full short, concatenating *	two adjacent chars: */	s_ptr	= &(tt_characteristics->dev_modes.t_speed);	/*  Speeds  */	f_ptr	= &(tt_characteristics->dev_modes.CR_fill);	/*  Fills  */	/* p_ptr	= &(tt_characteristics->dev_modes.parity_flags); */	status	= sys$qiow(0, tt_chan, IO$_SETMODE,	  &iosb, NULL, 0,	  &(tt_characteristics->dev_characteristics), 12,	  /* *s_ptr, *f_ptr, *p_ptr, 0);	*/	  *s_ptr, *f_ptr, 0, 0);	if (status != SS$_NORMAL || iosb.status != SS$_NORMAL)		printf("STTY:  set mode QIO returned %d\n", status);	return(status);}

⌨️ 快捷键说明

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