📄 vrzsz.c
字号:
#include "vmodem.h"#include ssdef#include tt2def#include ttdef#define SS_NORMAL SS$_NORMAL/* VMS structures *//* * TT_INFO structures are used for passing information about * the terminal. Used in GTTY and STTY calls. */struct tt_info ttys, ttysnew, ttystemp;/* * *//* * return 1 iff stdout and stderr are different devices * indicating this program operating with a modem on a * different line */int Fromcu; /* Were called from cu or yam */from_cu(){}cucheck(){}/* * mode(n) * 3: save old tty stat, set raw mode with flow control * 2: set XON/XOFF for sb/sz with ZMODEM or YMODEM-g * 1: save old tty stat, set raw mode * 0: restore original tty mode */mode(n){ int *iptr, parameters; static savedmodes = FALSE; vfile("mode:%d", n); if (!savedmodes) { if (gtty(&ttys) != SS$_NORMAL) death("SETMODES: error return from GTTY (1)"); if (gtty(&ttysnew) != SS$_NORMAL) death("SETMODES: error return from GTTY (2)"); savedmodes = TRUE; } /* * Set new terminal parameters. * Note: there are three bytes of terminal characteristics, * so we should make sure the fourth byte of the integer is unchanged. */ switch (n) { case 1: case 2: case 3: iptr = &(ttysnew.dev_characteristics.bcharacteristics); parameters = *iptr; parameters &= ~TT$M_ESCAPE; /* ESCAPE OFF */ parameters &= ~TT$M_HOSTSYNC; /* HOSTSYNC OFF */ parameters |= TT$M_NOECHO; /* NOECHO ON */ parameters |= TT$M_PASSALL; /* PASSALL ON */ parameters &= ~TT$M_READSYNC; /* READSYNC OFF */ parameters &= ~TT$M_TTSYNC; /* TTSYNC OFF */ parameters &= ~TT$M_WRAP; /* WRAP OFF */ parameters |= TT$M_EIGHTBIT; /* EIGHTBIT ON */ if (n == 3) { parameters |= TT$M_HOSTSYNC; /* HOSTSYNC On */ } if (n == 2) { parameters |= TT$M_TTSYNC; /* TTSYNC On */ } *iptr = parameters; if (stty(&ttysnew) != SS_NORMAL) fatal("SETMODES: error return from STTY"); break; case 0: stty(&ttys); /* Restore original modes */ /* error return to /dev/null */ break; }}/* set tty modes for vrzsz transfers */setmodes(){/* Device characteristics for VMS */}fatal(msg)char *msg;{ mode(0); /* put back normal tty modes */ printf("vrzsz: %s\n", msg); exit(SS_NORMAL);}/* Call this instead if funny modes haven't been set yet */death(msg)char *msg;{ printf("vrzsz: %s\n", msg); exit(SS_NORMAL);}#define LSIZE 64 /* Size of send & receive buffers */#ifdef BUFREADchar Rxlbuf[LSIZE+1];int Rxleft=0; /* number of characters in Rxlbuf */char *Rxcdq = Rxlbuf; /* pointer for removing chars from Rxlbuf *//* * This version of readline is reasoably well suited for * reading many characters. * * timeout is in tenths of seconds */readline(timeout)int timeout;{ register int c; extern errno; if (--Rxleft>=0) return (*Rxcdq++ & 0377);#ifdef DEBUGG eprintf("Calling read: ");#endif if ((c = timeout/10)<2) c=2; do { Rxleft = raw_read(LSIZE, Rxcdq=Rxlbuf, 1); } while (Rxleft == SS$_TIMEOUT && --c >= 0);#ifdef DEBUGG eprintf("Read returned %d bytes\n", Rxleft);#endif if (Rxleft == SS$_TIMEOUT || --Rxleft < 0) { Rxleft = 0; return TIMEOUT; } return (*Rxcdq++ & 0377);}purgeline(){ Rxleft=0;}#else /* BUFREAD *//* get a byte from data stream -- timeout if "dseconds" elapses *//* NOTE, however, that this function returns an INT, not a BYTE!!! */readline(dseconds){ int seconds; int ret, c; seconds = dseconds/10; if (seconds < 2) seconds = 2; ret = raw_read(1, &c, seconds); if (ret == SS$_TIMEOUT) return(TIMEOUT); return(c & 0377); /* return the char */}purgeline(){ int c; do { c = readline(1); } while (c != TIMEOUT);}#endif#ifdef BUFWRITEchar Txlbuf[LSIZE+1];int Txleft=LSIZE; /* number of characters in Txlbuf */char *Txcq = Txlbuf; /* pointer for removing chars from Rxlbuf */sendline(c){ if (--Txleft >= 0) *Txcq++ = c; else { Txleft = 0; flushmoc(); --Txleft; *Txcq++ = c; }}flushmoc(){ register int n; n = LSIZE - Txleft; Txcq=Txlbuf; Txleft = LSIZE; raw_wbuf(n, Txlbuf);}/* * Wait for the modem line outbuffer to drain */flushmo(){ fflush(stdout); flushmoc();}#else /* BUFWRITE *//* send a byte to data stream */sendline(data){ char dataout; dataout = data; raw_write(dataout);}flushmo() {}flushmoc() {}#endifsendbrk(){}/* End of vrzsz.c */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -