+#else
+ data->cts = cts;
+#endif
+ return SP_OK;
+}
+
+static int set_dtr(struct sp_port_data *data, int dtr)
+{
+#ifdef _WIN32
+ switch (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;
+ }
+#else
+ data->dtr = dtr;
+#endif
+ return SP_OK;
+}
+
+static int set_dsr(struct sp_port_data *data, int dsr)
+{
+#ifdef _WIN32
+ switch (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;
+ }
+#else
+ data->dsr = dsr;
+#endif
+ return SP_OK;
+}
+
+static int set_xon_xoff(struct sp_port_data *data, int xon_xoff)
+{
+#ifdef _WIN32
+ switch (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;
+ }
+#else
+ data->term.c_iflag &= ~(IXON | IXOFF | IXANY);
+ switch (xon_xoff) {
+ case SP_XONXOFF_DISABLED:
+ break;
+ case SP_XONXOFF_IN:
+ data->term.c_iflag |= IXOFF;
+ break;
+ case SP_XONXOFF_OUT:
+ data->term.c_iflag |= IXON | IXANY;
+ break;
+ case SP_XONXOFF_INOUT:
+ data->term.c_iflag |= IXON | IXOFF | IXANY;
+ break;
+ default:
+ return SP_ERR_ARG;
+ }
+#endif
+ return SP_OK;
+}
+
+static int apply_config(struct sp_port *port, struct sp_port_data *data)
+{
+#ifdef _WIN32
+ if (!SetCommState(port->hdl, &data->dcb))
+ return SP_ERR_FAIL;
+#else
+ int controlbits;