From 60368d2e0bd1a81c64b1a30b0819232866ccedb4 Mon Sep 17 00:00:00 2001 From: Ralf Baechle Date: Sat, 10 Apr 1999 00:44:09 +0200 Subject: Import ax25-lib 0.0.1 from tarball --- ttyutils.c | 152 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 152 insertions(+) create mode 100644 ttyutils.c (limited to 'ttyutils.c') diff --git a/ttyutils.c b/ttyutils.c new file mode 100644 index 0000000..5b7cdcf --- /dev/null +++ b/ttyutils.c @@ -0,0 +1,152 @@ +#include +#include +#include +#include +#include +#include + +#include "pathnames.h" +#include "ttyutils.h" + +static struct speed_struct { + int user_speed; + speed_t termios_speed; +} speed_table[] = { + {300, B300}, + {600, B600}, + {1200, B1200}, + {2400, B2400}, + {4800, B4800}, + {9600, B9600}, + {19200, B19200}, + {38400, B38400}, + {-1, B0} +}; + +int tty_raw(int fd, int hwflag) +{ + struct termios term; + + if (tcgetattr(fd, &term) == -1) { + perror("tty_raw: tcgetattr"); + return FALSE; + } + + term.c_cc[VMIN] = 1; + term.c_cc[VTIME] = 0; + + term.c_iflag = IGNBRK | IGNPAR; + term.c_oflag = 0; + term.c_lflag = 0; + +#ifdef CIBAUD + term.c_cflag = (term.c_cflag & (CBAUD | CIBAUD)) | CREAD | CS8 | CLOCAL; +#else + term.c_cflag = (term.c_cflag & CBAUD) | CREAD | CS8 | CLOCAL; +#endif + + if (hwflag) + term.c_cflag |= CRTSCTS; + + if (tcsetattr(fd, TCSANOW, &term) == -1) { + perror("tty_raw: tcsetattr"); + return FALSE; + } + + return TRUE; +} + +int tty_speed(int fd, int speed) +{ + struct termios term; + struct speed_struct *s; + + for (s = speed_table; s->user_speed != -1; s++) + if (s->user_speed == speed) + break; + + if (s->user_speed == -1) { + fprintf(stderr, "tty_speed: invalid speed %d\n", speed); + return FALSE; + } + + if (tcgetattr(fd, &term) == -1) { + perror("tty_speed: tcgetattr"); + return FALSE; + } + + cfsetispeed(&term, s->termios_speed); + cfsetospeed(&term, s->termios_speed); + + if (tcsetattr(fd, TCSANOW, &term) == -1) { + perror("tty_speed: tcsetattr"); + return FALSE; + } + + return TRUE; +} + +int tty_is_locked(char *tty) +{ + char buffer[50], *s; + FILE *fp; + int pid = 0; + + if ((s = strrchr(tty, '/')) != NULL) + s++; + else + s = tty; + + sprintf(buffer, "%s/LCK..%s", LOCK_SERIAL_DIR, s); + + if ((fp = fopen(buffer, "r")) == NULL) + return FALSE; + + if (fscanf(fp, "%d", &pid) != 1) { + fclose(fp); + return FALSE; + } + + fclose(fp); + + if (kill(pid, 0) == 0) + return TRUE; + + return FALSE; +} + +int tty_lock(char *tty) +{ + char buffer[50], *s; + FILE *fp; + + if ((s = strrchr(tty, '/')) != NULL) + s++; + else + s = tty; + + sprintf(buffer, "%s/LCK..%s", LOCK_SERIAL_DIR, s); + + if ((fp = fopen(buffer, "w")) == NULL) + return FALSE; + + fprintf(fp, "%10d\n", getpid()); + + fclose(fp); + + return TRUE; +} + +int tty_unlock(char *tty) +{ + char buffer[50], *s; + + if ((s = strrchr(tty, '/')) != NULL) + s++; + else + s = tty; + + sprintf(buffer, "%s/LCK..%s", LOCK_SERIAL_DIR, s); + + return unlink(buffer) == 0; +} -- cgit v1.2.3