Category : Files from Magazines
Archive   : PROGJRNL.ZIP
Filename : VVMODEM.C

 
Output of file : VVMODEM.C contained in archive : PROGJRNL.ZIP
/*
* 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 0

static 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);
}



  3 Responses to “Category : Files from Magazines
Archive   : PROGJRNL.ZIP
Filename : VVMODEM.C

  1. Very nice! Thank you for this wonderful archive. I wonder why I found it only now. Long live the BBS file archives!

  2. This is so awesome! 😀 I’d be cool if you could download an entire archive of this at once, though.

  3. But one thing that puzzles me is the “mtswslnkmcjklsdlsbdmMICROSOFT” string. There is an article about it here. It is definitely worth a read: http://www.os2museum.com/wp/mtswslnk/