📄 term.c
字号:
int which;
{
if( tty_mode == -1 )
{
#ifndef HAVE_TERMIOS
if(ioctl(tty_fd, TCGETA, &tty))
#else
if(tcgetattr(tty_fd, &tty))
#endif
{
perror("Unable to sense terminal");
exit(1);
}
tty_save = tty;
tty_mode = 0;
}
tty = tty_save;
switch(which)
{
case 0: /* Normal cooked */
break;
case 1: /* CBREAK */
tty.c_lflag &= ~(ICANON|ECHO|ECHOE|ECHONL);
tty.c_lflag |= ICRNL|ISIG;
tty.c_cc[VTIME] = 0;
tty.c_cc[VMIN] = 1;
break;
case 2: /* RAW */
tty.c_oflag &= ~OPOST;
tty.c_iflag &= ~(ICRNL|IGNCR|INLCR);
tty.c_lflag &= ~(ICANON|ECHO|ECHOE|ECHONL|ICRNL|ISIG);
tty.c_cc[VTIME] = 0;
tty.c_cc[VMIN] = 1;
break;
}
#ifndef HAVE_TERMIOS
if(ioctl(tty_fd, TCSETA, &tty))
#else
if(tcsetattr(tty_fd, TCSANOW, &tty))
#endif
{
perror("Unable to change terminal mode");
}
else tty_mode = which;
}
#endif
/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
fork_writer()
{
#ifdef LOGFILE
if( lfile ) fflush(lfile);
#endif
if (wr_pid = fork())
{
if (wr_pid == -1)
{
r_line();
perror("Cannot fork writer");
exit(0);
}
return;
}
#ifdef LOGFILE
if(lfile) fclose(lfile);
lfile = 0;
#endif
signal(SIGCHLD, SIG_DFL);
write_tty();
cleanup();
}
write_tty()
{
char ch;
char was_newline = 1;
signal(SIGINT, SIG_IGN);
signal(SIGQUIT, SIG_IGN);
signal(SIGTERM, cleanup);
while (1) {
read(0, &ch, 1);
ch &= (char)0177;
if (was_newline) {
if (ch == esc[0]) {
read(0, &ch, 1);
ch &= (char)0177;
switch (ch) {
case EOT:
case '.':
case '>':
read(0, &ch, 1);
exit(0);
case '!':
/* tell reader to pause */
kill(getppid(), SIGUSR1);
do_shell();
/* wake him up again */
if( kill(getppid(), SIGUSR2) < 0 ) exit(0);
ch = '\377';
break;
default:
if(ch != esc[0])
{
fprintf(stderr, "invalid command--use\
\"~~\" to start a line with \"~\"\r\n");
}
}
}
}
if (ch == '\r' || ch == '\004' || ch == '\003' || ch == '\177')
was_newline = 1;
else
was_newline = 0;
if( ch != '\377' )
{
int i;
if( Parity )
{
ch &= 0x7F;
for(i=0; i<7; i++) if( ch & (1<<i) ) ch ^= 0x80;
}
write(line_fd, &ch, 1);
}
}
}
/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
do_shell()
{
extern char *getenv();
extern char ** environ;
register int pid, wpid;
char *shellp = (char *)0;
int status;
int (*oqsig)(), (*oisig)(), (*otsig)();
if (shellp == (char *)0)
{
shellp = getenv("SHELL");
if (shellp == (char *)0)
shellp = "/bin/sh";
}
oqsig = signal(SIGQUIT, SIG_IGN);
oisig = signal(SIGINT, SIG_IGN);
otsig = signal(SIGTERM, SIG_IGN);
set_mode(0);
if ((pid=fork()) < 0)
{
(void) signal(SIGQUIT, oqsig);
(void) signal(SIGINT, oisig);
(void) signal(SIGTERM, otsig);
set_mode(2);
fprintf(stderr, "Failed to create process\r\n");
return;
}
if (pid == 0)
{
signal(SIGQUIT, SIG_DFL);
signal(SIGINT, SIG_DFL);
signal(SIGTERM, SIG_DFL);
execle(shellp, "sh", "-i", (char *)0, environ);
/* SHELL env is buggered try default */
execle("/bin/sh", "sh", "-i", (char *)0, environ);
exit(0); /* Should do better! */
}
while ( ( (wpid=wait(&status))>=0 || errno == EINTR) && wpid!=pid)
;
set_mode(2);
(void) signal(SIGQUIT, oqsig);
(void) signal(SIGINT, oisig);
(void) signal(SIGTERM, otsig);
}
/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
#define NCHRS 4096
static char chrs[NCHRS];
int alarm_delay = 0;
jmp_buf timebuf;
int is_in = 0;
alarm_int() { if( is_in ) longjmp(timebuf, -1); }
char zmodem_buf[20];
char *zptr=zmodem_buf;
char z_request[] = "*\030B00";
char z_challange[] = "**\030B0e313233341821\r\n";
char z_charesp[] = "*\030B0331323334395b";
/* With this you become a SZModem ver 1.x
char z_challange[] = "**\030B0e534d4201053c\r\n";
char z_charesp[] = "*\030B03424d5301";
/* */
int paused = 0;
unpause_reader()
{
paused = 0;
}
pause_reader()
{
alarm(0); is_in = 0;
write(2, "Paused\r\n", 8);
signal(SIGUSR1, SIG_IGN);
signal(SIGUSR2, unpause_reader);
#ifdef LOGFILE
if( lfile ) fflush(lfile);
#endif
paused = 1;
while(paused) pause();
signal(SIGUSR2, SIG_IGN);
signal(SIGUSR1, pause_reader);
write(2, "Continue\r\n", 10);
}
read_tty()
{
register int i, n;
register char *p;
/* Child process */
signal(SIGINT, SIG_IGN);
signal(SIGQUIT, SIG_IGN);
signal(SIGTERM, cleanup);
signal(SIGUSR1, pause_reader);
#ifdef SCRIPT
if( in_script )
{
open_script(script_name);
signal(SIGINT, cleanup);
set_mode(1);
alarm_delay = 2;
}
#else
#ifdef LOGFILE
open_logfile();
#endif
#endif
for(;;)
{
if( alarm_delay )
{
signal(SIGALRM, alarm_int);
alarm(2);
if( setjmp(timebuf) == 0 )
{
is_in = 1;
n = read(line_fd, chrs, (int)NCHRS);
is_in = 0;
}
else
{
chrs[0] = 0xFF;
n = 1;
}
alarm(0);
signal(SIGALRM, SIG_DFL);
}
else
n = read(line_fd, chrs, (int)NCHRS);
if( n == 0 )
{
printf("Carrier Lost\r\n");
break;
}
if( n > 0 )
{
for(i=0;i<n;i++)
{
#ifdef SCRIPT
if( !in_script || chrs[i] != '\377' )
{
#endif
#ifdef LOGFILE
if( lfile ) fputc(chrs[i], lfile);
else if( ltptr && ltptr < ltbuf+sizeof(ltbuf) )
*ltptr++ = chrs[i];
#endif
switch(Termtype)
{
case 1: dumbch(chrs[i]&Bit_mask); break;
#ifdef CHARXLATE
case 2: outchar(chrs[i]&Bit_mask); break;
#endif
default: putchar(chrs[i]&Bit_mask); break;
}
#ifdef SCRIPT
}
if( in_script )
{
in_script = out_schar(chrs[i]);
if( !in_script )
{
close_script();
printf("\r\nScript completed\r\n");
alarm_delay = 0;
set_mode(2);
signal(SIGINT, SIG_IGN);
#ifdef LOGFILE
if( lfile == 0 ) open_logfile();
#endif
}
}
#endif
}
fflush(stdout);
/* NOTE Zmodem needs an 8 bit channel this check is 8-bit */
check_zmodem(chrs, n);
}
}
#ifdef LOGFILE
if( lfile ) fclose(lfile);
lfile = 0;
#endif
}
check_zmodem(chrs, n)
char * chrs;
int n;
{
int i;
for(i=0;i<n;i++)
{
if(chrs[i] == '*')
{
zptr = zmodem_buf;
memset(zmodem_buf, '\0', sizeof(zmodem_buf));
}
if( zptr != zmodem_buf+sizeof(zmodem_buf))
*zptr++ = chrs[i];
}
if( strncmp(zmodem_buf, z_request, sizeof(z_request)-1) == 0 )
{
write(line_fd, z_challange, sizeof(z_challange)-1);
memset(zmodem_buf, '\0', sizeof(zmodem_buf));
}
else if( strncmp(zmodem_buf, z_charesp, sizeof(z_charesp)-1) == 0 )
{
call_zmodem();
memset(zmodem_buf, '\0', sizeof(zmodem_buf));
}
}
call_zmodem()
{
int pid, wpid;
int status;
int (*oqsig)(), (*oisig)(), (*otsig)();
printf("\r\nAuto-Zmodem\r\n");
fflush(stdout);
#ifdef LOGFILE
if( lfile ) fflush(lfile);
#endif
oqsig = signal(SIGQUIT, SIG_IGN);
oisig = signal(SIGINT, SIG_IGN);
otsig = signal(SIGTERM, SIG_IGN);
signal(SIGCHLD, SIG_DFL);
set_mode(1);
if ((pid = fork()) == -1 )
{
perror("Cannot zmodem");
set_mode(2);
return;
}
if( pid == 0 )
{
signal(SIGINT, SIG_DFL);
signal(SIGQUIT, SIG_DFL);
signal(SIGTERM, SIG_DFL);
close(0);
dup(line_fd);
close(1);
dup(line_fd);
execlp("rz", "rz", (char *)0);
perror("Cannot Zmodem");
exit(1);
}
while ( ( (wpid=wait(&status))>=0 || errno == EINTR) && wpid!=pid)
if( wpid == wr_pid )
cleanup();
signal(SIGCHLD, cleanup);
set_mode(2);
(void) signal(SIGQUIT, oqsig);
(void) signal(SIGINT, oisig);
(void) signal(SIGTERM, otsig);
}
/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
dumbch(ch)
int ch;
{
static int cr_pend = 0;
if( cr_pend )
{
if( ch == '\n' ) putchar('\r');
else { putchar('^'); putchar('M'); }
cr_pend = 0;
}
if( ch == '\r' )
cr_pend = 1;
else
{
if( ch & 0x80 )
printf("M-");
if( isprint(ch&0x7F) || ch == '\n' || ch == '\b' )
putchar(ch&0x7F);
else
{
putchar('^');
putchar((ch ^ '@')&0x7F);
}
}
}
/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
uucp_check(device)
char * device;
{
FILE * fd;
char nbuf[128];
char * p;
int i;
fd = fopen("/usr/spool/uucp", "r");
if( fd == 0 ) return 1; /* No directory assume ok */
fclose(fd);
p = strrchr(device, '/');
strcpy(nbuf, "/usr/spool/uucp/LCK..");
if( p ) strcat(nbuf, p+1);
else strcat(nbuf, device);
for(p=nbuf+21; *p; p++) if( *p>='A' && *p<='Z' ) *p = *p-'A'+'a';
fd = fopen(nbuf, "r");
if( fd )
{
fscanf(fd, "%d", &i);
fclose(fd);
if( kill(i, 0) == 0 ) return 0; /* Sorry */
if( unlink(nbuf) == -1 ) return 0;
}
fd = fopen(nbuf, "w"); /* Got it! */
fprintf(fd, "%10d\n", getpid());
fclose(fd);
return 1;
}
uucp_unlock(device)
char * device;
{
FILE * fd;
char nbuf[128];
char * p;
int i;
fd = fopen("/usr/spool/uucp", "r");
if( fd == 0 ) return; /* No directory assume ok */
fclose(fd);
p = strrchr(device, '/');
strcpy(nbuf, "/usr/spool/uucp/LCK..");
if( p ) strcat(nbuf, p+1);
else strcat(nbuf, device);
for(p=nbuf+21; *p; p++) if( *p>='A' && *p<='Z' ) *p = *p-'A'+'a';
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -