- * Set hardware flow control
- */
-static void __tty_sethwf(gint fd, gint on)\r
-{\r
- struct termios tty;\r
-\r
- dbg("Enter");
-\r
- if (tcgetattr(fd, &tty))\r
- err("__tty_sethwf: tcgetattr:");\r
-\r
- if (on == 1)\r
- tty.c_cflag |= CRTSCTS;
- else\r
- tty.c_cflag &= ~CRTSCTS;
-\r
- if (tcsetattr(fd, TCSANOW, &tty))\r
- err("__tty_sethwf: tcsetattr:");\r
-}\r
-\r
-/*\r
- * Set RTS line. Sometimes dropped. Linux specific?
- */
-static gint __tty_setrts(gint fd)\r
-{\r
- gint mcs;\r
-\r
- dbg("Enter");
-\r
- if (-1 == ioctl(fd, TIOCMODG, &mcs))\r
- err("icotl: TIOCMODG");\r
-\r
- mcs |= TIOCM_RTS;\r
-\r
- if (-1 == ioctl(fd, TIOCMODS, &mcs))\r
- err("icotl: TIOCMODS");\r
-\r
- return 0;\r
-}\r
-\r
-/*\r
- * Set baudrate, parity and number of bits
- */\r
-static gboolean __tty_setparms(gint fd,\r
- gchar *baudr, gchar *par, gchar *bits, gchar *stop, gint hwf, gint swf)\r
-{\r
- gint spd = -1;\r
- gint newbaud;\r
- gint bit = bits[0];\r
- gint stop_bit = stop[0];\r
-\r
- struct termios tty;\r
- TtyOldSetting *old_setting = NULL;\r
-\r
- dbg("Enter");
-\r
- old_setting = g_try_new0(TtyOldSetting, 1);
-\r
- if (old_setting == NULL)\r
- return FALSE;\r
-\r
- old_setting->fd = fd;\r
-\r
- if (tcgetattr(fd, &tty) < 0) {\r
- g_free(old_setting);
- return FALSE;\r
- }\r
-\r
- if (tcgetattr(fd, &old_setting->termiosVal) < 0) {\r
- g_free(old_setting);
- return FALSE;\r
- }\r
-\r
- __insert_tty_oldsetting(old_setting);\r
-\r
- fflush(stdout);\r
-\r
- /* We generate mark and space parity ourself. */\r
- if (bit == '7' && (par[0] == 'M' || par[0] == 'S'))\r
- bit = '8';\r
-\r
- /* Check if 'baudr' is really a number */\r
- if ((newbaud = (atol(baudr) / 100)) == 0 && baudr[0] != '0')\r
- newbaud = -1;\r
-\r
- switch (newbaud) {
- case 0:\r
- spd = 0;\r
- break;
-\r
- case 3:\r
- spd = B300;\r
- break;
-\r
- case 6:\r
- spd = B600;\r
- break;
-\r
- case 12:\r
- spd = B1200;\r
- break;
-\r
- case 24:\r
- spd = B2400;\r
- break;
-\r
- case 48:\r
- spd = B4800;\r
- break;
-\r
- case 96:\r
- spd = B9600;\r
- break;
-\r
- case 192:\r
- spd = B19200;\r
- break;
-\r
- case 384:\r
- spd = B38400;\r
- break;
-\r
- case 576:\r
- spd = B57600;\r
- break;
-\r
- case 1152:\r
- spd = B115200;\r
- break;
-\r
- default:\r
- err("invaid baud rate");\r
- break;
- }\r
-\r
- if (spd != -1) {\r
- cfsetospeed(&tty, (speed_t) spd);
- cfsetispeed(&tty, (speed_t) spd);
- }\r
-\r
- switch (bit) {
- case '5':
- tty.c_cflag = (tty.c_cflag & ~CSIZE) | CS5;
- break;
-\r
- case '6':
- tty.c_cflag = (tty.c_cflag & ~CSIZE) | CS6;
- break;
-\r
- case '7':
- tty.c_cflag = (tty.c_cflag & ~CSIZE) | CS7;
- break;
-\r
- case '8':
- default:
- tty.c_cflag = (tty.c_cflag & ~CSIZE) | CS8;
- break;
- }\r
-\r
- switch (stop_bit) {
- case '1':
- tty.c_cflag &= ~CSTOPB;
- break;
-\r
- case '2':
- default:
- tty.c_cflag |= CSTOPB;
- break;
- }\r
-\r
- /* Set into raw, no echo mode */\r
- tty.c_iflag = IGNBRK;\r
- tty.c_lflag = 0;\r
- tty.c_oflag = 0;\r
- tty.c_cflag |= CLOCAL | CREAD;\r
- tty.c_cc[VMIN] = 1;\r
- tty.c_cc[VTIME] = 1;\r
-\r
- if (swf)\r
- tty.c_iflag |= IXON | IXOFF;
- else\r
- tty.c_iflag &= ~(IXON | IXOFF | IXANY);
-\r
- tty.c_cflag &= ~(PARENB | PARODD);\r
-\r
- if (par[0] == 'E')\r
- tty.c_cflag |= PARENB;
- else if (par[0] == 'O')\r
- tty.c_cflag |= (PARENB | PARODD);
-\r
- if (tcsetattr(fd, TCSANOW, &tty) < 0) {\r
- g_free(old_setting);
- return FALSE;
- }\r
-\r
- __tty_setrts(fd);\r
- __tty_sethwf(fd, hwf);\r
-\r
- return TRUE;\r
-}\r
-\r