+ if (config->stopbits >= 0) {
+ switch (config->stopbits) {
+ /* Note: There's also ONE5STOPBITS == 1.5 (unneeded so far). */
+ case 1:
+ data->dcb.StopBits = ONESTOPBIT;
+ break;
+ case 2:
+ data->dcb.StopBits = TWOSTOPBITS;
+ break;
+ default:
+ return SP_ERR_ARG;
+ }
+ }
+
+ if (config->rts >= 0) {
+ switch (config->rts) {
+ case SP_RTS_OFF:
+ data->dcb.fRtsControl = RTS_CONTROL_DISABLE;
+ break;
+ case SP_RTS_ON:
+ data->dcb.fRtsControl = RTS_CONTROL_ENABLE;
+ break;
+ case SP_RTS_FLOW_CONTROL:
+ data->dcb.fRtsControl = RTS_CONTROL_HANDSHAKE;
+ break;
+ default:
+ return SP_ERR_ARG;
+ }
+ }
+
+ if (config->cts >= 0) {
+ switch (config->cts) {
+ case SP_CTS_IGNORE:
+ data->dcb.fOutxCtsFlow = FALSE;
+ break;
+ case SP_CTS_FLOW_CONTROL:
+ data->dcb.fOutxCtsFlow = TRUE;
+ break;
+ default:
+ return SP_ERR_ARG;
+ }
+ }
+
+ if (config->dtr >= 0) {
+ switch (config->dtr) {
+ case SP_DTR_OFF:
+ data->dcb.fDtrControl = DTR_CONTROL_DISABLE;
+ break;
+ case SP_DTR_ON:
+ data->dcb.fDtrControl = DTR_CONTROL_ENABLE;
+ break;
+ case SP_DTR_FLOW_CONTROL:
+ data->dcb.fDtrControl = DTR_CONTROL_HANDSHAKE;
+ break;
+ default:
+ return SP_ERR_ARG;
+ }
+ }
+
+ if (config->dsr >= 0) {
+ switch (config->dsr) {
+ case SP_DSR_IGNORE:
+ data->dcb.fOutxDsrFlow = FALSE;
+ break;
+ case SP_DSR_FLOW_CONTROL:
+ data->dcb.fOutxDsrFlow = TRUE;
+ break;
+ default:
+ return SP_ERR_ARG;
+ }
+ }
+
+ if (config->xon_xoff >= 0) {
+ switch (config->xon_xoff) {
+ case SP_XONXOFF_DISABLED:
+ data->dcb.fInX = FALSE;
+ data->dcb.fOutX = FALSE;
+ break;
+ case SP_XONXOFF_IN:
+ data->dcb.fInX = TRUE;
+ data->dcb.fOutX = FALSE;
+ break;
+ case SP_XONXOFF_OUT:
+ data->dcb.fInX = FALSE;
+ data->dcb.fOutX = TRUE;
+ break;
+ case SP_XONXOFF_INOUT:
+ data->dcb.fInX = TRUE;
+ data->dcb.fOutX = TRUE;
+ break;
+ default:
+ return SP_ERR_ARG;
+ }
+ }
+
+ if (!SetCommState(port->hdl, &data->dcb))
+ return SP_ERR_FAIL;
+
+#else /* !_WIN32 */
+
+ if (config->baudrate >= 0) {
+ for (i = 0; i < NUM_STD_BAUDRATES; i++) {
+ if (config->baudrate == std_baudrates[i].value) {
+ if (cfsetospeed(&data->term, std_baudrates[i].index) < 0)
+ return SP_ERR_FAIL;
+
+ if (cfsetispeed(&data->term, std_baudrates[i].index) < 0)
+ return SP_ERR_FAIL;
+ break;
+ }
+ }
+
+ /* Non-standard baud rate */
+ if (i == NUM_STD_BAUDRATES) {
+#ifdef __APPLE__
+ /* Set "dummy" baud rate */
+ if (cfsetspeed(&data->term, B9600) < 0)
+ return SP_ERR_FAIL;
+ baud_nonstd = config->baudrate;
+#else
+ return SP_ERR_ARG;