+ case SP_RTS_FLOW_CONTROL:
+ data->dcb.fRtsControl = RTS_CONTROL_HANDSHAKE;
+ break;
+ default:
+ return SP_ERR_ARG;
+ }
+#else
+ data->rts = rts;
+#endif
+ return SP_OK;
+}
+
+static int set_cts(struct sp_port_data *data, int cts)
+{
+#ifdef _WIN32
+ switch (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;
+ }
+#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;