extern Txleft; /* number of characters in Txlbuf */ extern char *Txcq; /* pointer for storing chars to Txlbuf */ #define sendline(c) (--Txleft < 0 ? flushline((unsigned char) (c)) : \ (int) (*Txcq++ = (unsigned char) (c))) char Txlbuf[TSIZE+1]; int Txnum = TTSIZE; /* number of characters WE SHALL USE in Txlbuf */ int Txleft = TTSIZE; /* number of characters in Txlbuf */ char *Txcq = Txlbuf; /* pointer for storing chars to Txlbuf */ extern Xtimint; int flushline(c) unsigned c; { Txleft = 0; flushmoc(); --Txleft; *Txcq++ = c; return ((unsigned char) c); } /* sendline(c) { if (--Txleft >= 0) *Txcq++ = c; else { Txleft = 0; flushmoc(); --Txleft; *Txcq++ = c; } } */ void flushmoc() { #ifdef TE register unsigned char *p, *q; int n2; #endif register int n; n = Txcq - Txlbuf; Txcq=Txlbuf; Txleft = Txnum; checkport(); if (n == 0) return; if (Cdoflag) return; #ifdef TE if (Verbose > 8) { vfile("Flushmoc: %d bytes", n); for (p = (unsigned char *)Txlbuf, n2 = n; --n2 >= 0; ) { vfile("%02X ", (*p++ &0377)); } } #endif if (Xtimint) { if (setjmp(Ocalarm)) { eprintf("Flushmoc: Output Restraint RELEASED\n"); Relsxoff = TRUE; purgemo(); return; } signal(SIGALRM, ocalrm); alarm(Xtimint); } #ifdef TE if (Telnetting) { for(p = (unsigned char *)Txlbuf, q = (unsigned char *)Txlbuf2; --n >= 0; ) if ((*q++ = *p++) == IAC) { *q++ = IAC; } n = q - (unsigned char *)Txlbuf2; if ((n2 = write(rfd, Txlbuf2, n)) != n) { if (n2 < 0) { lhmargin(); eprintf("flushmoc: write(%d) returned(%d)\n", n, n2); } Cdoflag = TRUE; Carrierflg = FALSE; if (!Cdoerrno) Cdoerrno = errno; xperror("flushmoc write"); chngport(""); } alarm(0); return; } #endif if (write(rfd, Txlbuf, n) != n) { Cdoflag = TRUE; Carrierflg = FALSE; if (!Cdoerrno) Cdoerrno = errno; #ifdef TE xperror("write"); chngport(""); #endif } alarm(0); return; } /* * Wait for the modem line outbuffer to drain */ void flushmo() { fflush(stdout); checkport(); flushmoc(); if (Cdoflag || Spawning || Telnetting) return; if (setjmp(Ocalarm)) { eprintf("Flushmo: Output Flow Control Restraint RELEASED\n"); Relsxoff = TRUE; purgemo(); return; } signal(SIGALRM, ocalrm); alarm(Xtimint); #ifdef POSIX tcdrain(rfd); #else ioctl(rfd, TCSBRK, 1); #endif alarm(0); } /* Return TRUE if the modem output buffer is empty */ moempty() { flushmo(); return TRUE; } void purgemo() { if (rfd < 0) return; Txcq=Txlbuf; Txleft = Txnum; if (Spawning || Telnetting) return; clearxoff(); #ifdef POSIX tcflush(rfd, TCOFLUSH); #else ioctl(rfd, TCFLSH, 1); #endif clearxoff(); } char Xoff; /* Stub of sorts */ void clearxoff() { if (rfd < 0) return; if (Spawning || Telnetting) return; #ifdef POSIX tcflow(rfd, TCOON); #else ioctl(rfd, TCXONC, 1); #endif Xoff = FALSE; mode2(Rmode, 0L); } /* Suspend output make us wait for XON (Kermit only) */ void setxoff() { if (rfd < 0) return; if (Spawning || Telnetting) return; #ifdef POSIX tcflow(rfd, TCOOFF); #else ioctl(rfd, TCXONC, 0); #endif Xoff = TRUE; }