- if (!SetCommState(hdl, &dcb)) {
- sr_err("Failed to set comm state on port %s (fd %d): %d.",
- serial->port, serial->fd, GetLastError());
- return SR_ERR;
- }
-#else
- struct termios term;
- speed_t baud;
- int ret, controlbits;
-
- if (tcgetattr(serial->fd, &term) < 0) {
- sr_err("tcgetattr() error on port %s (fd %d): %s.",
- serial->port, serial->fd, strerror(errno));
- return SR_ERR;
- }
-
- switch (baudrate) {
- case 50:
- baud = B50;
- break;
- case 75:
- baud = B75;
- break;
- case 110:
- baud = B110;
- break;
- case 134:
- baud = B134;
- break;
- case 150:
- baud = B150;
- break;
- case 200:
- baud = B200;
- break;
- case 300:
- baud = B300;
- break;
- case 600:
- baud = B600;
- break;
- case 1200:
- baud = B1200;
- break;
- case 1800:
- baud = B1800;
- break;
- case 2400:
- baud = B2400;
- break;
- case 4800:
- baud = B4800;
- break;
- case 9600:
- baud = B9600;
- break;
- case 19200:
- baud = B19200;
- break;
- case 38400:
- baud = B38400;
- break;
- case 57600:
- baud = B57600;
- break;
- case 115200:
- baud = B115200;
- break;
- case 230400:
- baud = B230400;
- break;
-#ifndef __APPLE__
- case 460800:
- baud = B460800;
- break;
-#endif
- default:
- sr_err("Unsupported baudrate: %d.", baudrate);
- return SR_ERR;
- }
-
- sr_spew("Configuring output baudrate to %d (%d).", baudrate, baud);
- if (cfsetospeed(&term, baud) < 0) {
- sr_err("cfsetospeed() error: %s.", strerror(errno));
- return SR_ERR;
- }
-
- sr_spew("Configuring input baudrate to %d (%d).", baudrate, baud);
- if (cfsetispeed(&term, baud) < 0) {
- sr_err("cfsetispeed() error: %s.", strerror(errno));
- return SR_ERR;
- }
-
- sr_spew("Configuring %d data bits.", bits);
- term.c_cflag &= ~CSIZE;
- switch (bits) {
- case 8:
- term.c_cflag |= CS8;
- break;
- case 7:
- term.c_cflag |= CS7;
- break;
- default:
- sr_err("Unsupported data bits number %d.", bits);
- return SR_ERR;
- }
-
- sr_spew("Configuring %d stop bits.", stopbits);
- term.c_cflag &= ~CSTOPB;
- switch (stopbits) {
- case 1:
- term.c_cflag &= ~CSTOPB;
- break;
- case 2:
- term.c_cflag |= CSTOPB;
- break;
- default:
- sr_err("Unsupported stopbits number %d.", stopbits);
- return SR_ERR;
- }
-
- term.c_iflag &= ~(IXON | IXOFF);
- term.c_cflag &= ~CRTSCTS;
- switch (flowcontrol) {
- case 0:
- /* No flow control. */
- sr_spew("Configuring no flow control.");
- break;
- case 1:
- sr_spew("Configuring RTS/CTS flow control.");
- term.c_cflag |= CRTSCTS;
- break;
- case 2:
- sr_spew("Configuring XON/XOFF flow control.");
- term.c_iflag |= IXON | IXOFF;
- break;
- default:
- sr_err("Unsupported flow control setting %d.", flowcontrol);
- return SR_ERR;
- }
-
- term.c_iflag &= ~IGNPAR;
- term.c_cflag &= ~(PARODD | PARENB);
- switch (parity) {
- case SERIAL_PARITY_NONE:
- sr_spew("Configuring no parity.");
- term.c_iflag |= IGNPAR;
- break;
- case SERIAL_PARITY_EVEN:
- sr_spew("Configuring even parity.");
- term.c_cflag |= PARENB;
- break;
- case SERIAL_PARITY_ODD:
- sr_spew("Configuring odd parity.");
- term.c_cflag |= PARENB | PARODD;
- break;
- default:
- sr_err("Unsupported parity setting %d.", parity);
- return SR_ERR;
- }
-
- /* Do not translate carriage return to newline on input. */
- term.c_iflag &= ~(ICRNL);
-
- /* Disable canonical mode, and don't echo input characters. */
- term.c_lflag &= ~(ICANON | ECHO);
-
- /* Write the configured settings. */
- if (tcsetattr(serial->fd, TCSADRAIN, &term) < 0) {
- sr_err("tcsetattr() error: %s.", strerror(errno));