#include #include #include #include #include #include #include #include #include #include #include #include #include "eterm.h" #include "init.h" #include "inout.h" int init_parms = FALSE; int dumb = FALSE; int getopts(int argc, char **argv) { int c; opterr = 0; while ((c = getopt(argc, argv, "di")) != -1) { switch(c) { case 'd': dumb = TRUE; break; case 'i': init_parms = TRUE; break; case '?': if (isprint(optopt)) fprintf(stderr, "Unknown option '-%c'.\n", optopt); else fprintf(stderr, "Unknown option character '\\x%x'.\n", optopt); return 0; default: abort(); } } return 1; } void sigint_handler(int sig) { write_tnc(0x03); } void sigtstp_handler(int sig) { tcsetattr(STDIN_FILENO, TCSANOW, &console_old_settings); signal(sig, SIG_DFL); kill(getpid(), sig); } void sigcont_handler(int sig) { tcsetattr(STDIN_FILENO, TCSANOW, &console_settings); signal(SIGTSTP, sigtstp_handler); } void sighup_handler(int sig) { send_string("echo off", 1); usleep(300000); if (chk_incoming(tnc)) read_tnc(0); if (cap) fclose(capf); tcsetattr(tnc, TCSANOW, &tnc_old_settings); signal(sig, SIG_DFL); kill(getpid(), sig); } void quit(int retcode) { if (! dumb) { send_string("echo off", 1); usleep(300000); if (chk_incoming(tnc)) read_tnc(1); } if (cap) fclose(capf); tcsetattr(tnc, TCSANOW, &tnc_old_settings); tcsetattr(STDIN_FILENO, TCSANOW, &console_old_settings); close(tnc); printf("\n"); exit(retcode); } void init_tnc_parms(void) { send_string("deadtime 33", 1); usleep(150000); send_string("acktime 13", 1); usleep(150000); send_string("resptime 0", 1); usleep(150000); send_string("dwait 0", 1); usleep(150000); send_string("maxframe 4", 1); usleep(150000); send_string("frack 3", 1); usleep(150000); send_string("paclen 128", 1); usleep(150000); send_string("radio 2", 1); usleep(150000); send_string("mode vp", 1); usleep(150000); } void init(int argc, char **argv) { char tnc_dev[256]; char *p1 = NULL; if (! (p1 = getenv("ETERM_DEV"))) { printf("Error: Environment variable ETERM_DEV not set\n"); exit(1); } strcpy(tnc_dev, p1); if (! getopts(argc, argv)) exit(1); if ((tnc = open(tnc_dev, O_RDWR | O_NONBLOCK)) == -1) { perror("Error opening tnc device"); exit(1); } tcgetattr(tnc, &tnc_old_settings); tcgetattr(tnc, &tnc_settings); tnc_settings.c_iflag &= ~(ICRNL | IXOFF | IXON); tnc_settings.c_iflag |= IGNCR; tnc_settings.c_lflag &= ~(ECHO | ICANON | ISIG); tnc_settings.c_cflag |= CRTSCTS; /* Hardware flow control */ tnc_settings.c_cflag |= CLOCAL; /* Ignore modem status lines */ tnc_settings.c_oflag &= ~OPOST; tnc_settings.c_cc[VMIN] = 1; tnc_settings.c_cc[VTIME] = 0; cfsetispeed(&tnc_settings, B9600); cfsetospeed(&tnc_settings, B9600); tcsetattr(tnc, TCSANOW, &tnc_settings); tcgetattr(STDIN_FILENO, &console_old_settings); tcgetattr(STDIN_FILENO, &console_settings); console_settings.c_lflag &= ~(ECHO | ICANON); tcsetattr(STDIN_FILENO, TCSANOW, &console_settings); setbuf(stdout, NULL); signal(SIGINT, sigint_handler); signal(SIGTSTP, sigtstp_handler); signal(SIGCONT, sigcont_handler); signal(SIGHUP, sighup_handler); if (! dumb) { write_tnc(3); write_tnc(10); if (init_parms) init_tnc_parms(); send_string("echo on", 1); usleep(300000); if (chk_incoming(tnc)) read_tnc(1); else { printf("TNC doesn't respond, aborting...\n"); quit(1); } } } .