/* File uclk5md.c Icarus Sparry, Bath University Machine-dependent parts of UCL Kermit. Modified to run on UNIX System 5 as on GEC 63 systems */ /* Revision History: 0: First attempt. 24 Oct 85 Changed sttyb to termio, deleted all code in #ifdef BSD changed stty,gtty to ioctl and altered flags */ /* The following routines are possibly machine or system dependent: it is believed that all such dependencies in the code have been grouped here. */ #include #include #include /* Variables in main file: */ extern char timflag; extern int debug, image, timoex(); extern FILE *dfp, *fp; #define CR 13 #define LF 10 struct termio cookedmode, rawmode; char ascedit(c) /* edit character for sending */ /* This filtering routine converts unix LF line-terminator to CR/LF pair iff in 7-bit mode. Returns modified char. */ char c; { if (image == 0) { /* only if 7-bit */ c &= 0x7f; if (c == LF) encode(CR); /* CR of CR/LF; */ } /* bufill() adds the LF */ return(c); } /* End of ascedit() */ char ascout(a) /* char to file coping with CR/LF */ /* This filtering routine is used to write 7-bit data to file as it is received. Not used for 8-bit data, either image or 8-prefixing. */ char a; { char ret; static char olda = 0; /* for unix, replace each CR, LF or CR/LF or LF/CR by a single LF */ if ( ( (a == CR) && (olda == LF) ) || ( (a == LF) && (olda == CR) ) ) ret = olda = 0; else { /* if not CR/LF pair */ olda = a; if (a == CR) a = LF; /* CR => LF for unix */ /* if converting for non-unix system, probably need LF => CR instead */ ret = putc(a,fp); } return (ret); } /* End of ascout() */ char filerr() /* return error-code or 0 */ /* called when EOF encountered reading or writing to data-file; if really endfile, returns 0, else system error-code. */ { char ret; ret = ferror(fp); clearerr(fp); return(ret); } /* End of filerr() */ flushinput() /* UCL 2.8 version */ /* Dump all pending input to clear stacked up NAK's. * Note that because of a bug in unix 2.8, this also flushes OUTPUT! */ { ioctl(0,TCFLSH,0); } /* End of flushinput() */ /* Routines to set terminal input into "raw" or "cooked" mode. */ static char cookedok = 0; cooktty() /* restore terminal state */ { if (cookedok != 0) /* provided made raw */ ioctl(0,TCSETAW,&cookedmode); } /* End of cooktty */ rawtty() /* set terminal raw */ { if (cookedok == 0) { /* first time only */ ioctl(0,TCGETA,&cookedmode); /* Save current mode so we can */ ioctl(0,TCGETA,&rawmode); /* restore it later */ cookedok = 1; rawmode.c_iflag = IXON|IXOFF; rawmode.c_oflag &= ~OPOST; rawmode.c_lflag = 0; rawmode.c_cc[VEOF] = 1; /* Require at least one */ } ioctl(0,TCSETAW,&rawmode); /* Put tty in raw mode */ } /* End of rawtty() */ /* end of tty cook/uncook routines */ /* UCL Input & Timeout Routines */ /* Timeouts are always accompanied by attempting to read the line. Two situations are catered for: normally, if a timeout can be set which cancels a hanging read() call, then this is done; else if a test can be made as to whether chars are available AND a sleep() call is available, these are linked to provide a timeout based on decrementing after each sleep() [this is the "Berkeley 4.2" situation]. The following code uses "#ifdef BSD42" to differentiate between "4.2" & "normal"; this has been hacked into the VAX C-compiler at UCL but can be inserted into the text elsewhere. */ char nextin() /* read next char, checking time-flag */ /* return char (or 0 if timer expired) */ { char c; static char buff[64]; static int count = 0; long lcount; /* this code if timeout cancels read() */ read (0,&c,1); if (debug > 2) fprintf(dfp," next = %xx ",((int)c)&0xff ); return(c); } /* end of nextin() */ timoset(sex) /* set timeout */ char sex; /* # of seconds */ { timflag = sex; /* only set timeout-alarms if non-4.2 code being used */ signal(SIGALRM,timoex); alarm(timflag); } /* End of timoset() */ /* The routines which action and clear timeouts, timoex() and timocan() are not system-dependent; see above. */ unbuffer() /* unbuffer output */ /* system-dependent action to write quickly to terminal */ { setbuf(stdout,0); /* UNbuffer output! */ } /* End of unbuffer() */ /* End of File */