diff --git a/winpr/libwinpr/comm/comm.c b/winpr/libwinpr/comm/comm.c index a230199b6..29835238b 100644 --- a/winpr/libwinpr/comm/comm.c +++ b/winpr/libwinpr/comm/comm.c @@ -126,6 +126,7 @@ static const _SERIAL_IOCTL_NAME S_SERIAL_IOCTL_NAMES[] = { { IOCTL_USBPRINT_GET_1284_ID, "IOCTL_USBPRINT_GET_1284_ID" } }; + const char* _comm_serial_ioctl_name(ULONG number) { for (size_t x = 0; x < ARRAYSIZE(S_SERIAL_IOCTL_NAMES); x++) @@ -1704,3 +1705,69 @@ BOOL CommUpdateIOCount(WINPR_ATTR_UNUSED HANDLE handle, WINPR_ATTR_UNUSED BOOL c #endif return TRUE; } + +static const char* CommSerialEvFlagString(ULONG flag) +{ + switch (flag) + { + case SERIAL_EV_RXCHAR: + return "SERIAL_EV_RXCHAR"; + case SERIAL_EV_RXFLAG: + return "SERIAL_EV_RXFLAG"; + case SERIAL_EV_TXEMPTY: + return "SERIAL_EV_TXEMPTY"; + case SERIAL_EV_CTS: + return "SERIAL_EV_CTS "; + case SERIAL_EV_DSR: + return "SERIAL_EV_DSR "; + case SERIAL_EV_RLSD: + return "SERIAL_EV_RLSD"; + case SERIAL_EV_BREAK: + return "SERIAL_EV_BREAK"; + case SERIAL_EV_ERR: + return "SERIAL_EV_ERR "; + case SERIAL_EV_RING: + return "SERIAL_EV_RING"; + case SERIAL_EV_PERR: + return "SERIAL_EV_PERR"; + case SERIAL_EV_RX80FULL: + return "SERIAL_EV_RX80FULL"; + case SERIAL_EV_EVENT1: + return "SERIAL_EV_EVENT1"; + case SERIAL_EV_EVENT2: + return "SERIAL_EV_EVENT2"; + case SERIAL_EV_WINPR_WAITING: + return "SERIAL_EV_WINPR_WAITING"; + case SERIAL_EV_WINPR_STOP: + return "SERIAL_EV_WINPR_STOP"; + default: + return "SERIAL_EV_UNKNOWN"; + } +} + +const char* CommSerialEvString(ULONG status, char* buffer, size_t size) +{ + const ULONG flags[] = { SERIAL_EV_RXCHAR, SERIAL_EV_RXFLAG, SERIAL_EV_TXEMPTY, + SERIAL_EV_CTS, SERIAL_EV_DSR, SERIAL_EV_RLSD, + SERIAL_EV_BREAK, SERIAL_EV_ERR, SERIAL_EV_RING, + SERIAL_EV_PERR, SERIAL_EV_RX80FULL, SERIAL_EV_EVENT1, + SERIAL_EV_EVENT2, SERIAL_EV_WINPR_WAITING, SERIAL_EV_WINPR_STOP }; + + winpr_str_append("{", buffer, size, ""); + + const char* sep = ""; + for (size_t x = 0; x < ARRAYSIZE(flags); x++) + { + const ULONG flag = flags[x]; + if (status & flag) + { + winpr_str_append(CommSerialEvFlagString(flag), buffer, size, sep); + sep = "|"; + } + } + + char number[32] = { 0 }; + (void)_snprintf(number, sizeof(number), "}[0x%08" PRIx32 "]", status); + winpr_str_append(number, buffer, size, ""); + return buffer; +} diff --git a/winpr/libwinpr/comm/comm.h b/winpr/libwinpr/comm/comm.h index 3db4f9dc5..b2a811d55 100644 --- a/winpr/libwinpr/comm/comm.h +++ b/winpr/libwinpr/comm/comm.h @@ -120,6 +120,8 @@ BOOL CommIoCtl_int(WINPR_COMM* pComm, unsigned long int ctl, void* data, const c const char* fkt, size_t line); BOOL CommUpdateIOCount(HANDLE handle, BOOL checkSupportStatus); +const char* CommSerialEvString(ULONG status, char* buffer, size_t size); + #if defined(WINPR_HAVE_SYS_EVENTFD_H) #ifndef WITH_EVENTFD_READ_WRITE int eventfd_read(int fd, eventfd_t* value); diff --git a/winpr/libwinpr/comm/comm_ioctl.c b/winpr/libwinpr/comm/comm_ioctl.c index 3eb12cfb0..1dfe5985b 100644 --- a/winpr/libwinpr/comm/comm_ioctl.c +++ b/winpr/libwinpr/comm/comm_ioctl.c @@ -33,6 +33,8 @@ #include "comm_sercx_sys.h" #include "comm_sercx2_sys.h" +static const char* comm_ioctl_modem_status_string(ULONG status, char* buffer, size_t size); + /* NB: MS-RDPESP's recommendation: * * <2> Section 3.2.5.1.6: Windows Implementations use IOCTL constants @@ -52,6 +54,7 @@ static BOOL s_CommDeviceIoControl(HANDLE hDevice, DWORD dwIoControlCode, LPVOID DWORD nInBufferSize, LPVOID lpOutBuffer, DWORD nOutBufferSize, LPDWORD lpBytesReturned, LPOVERLAPPED lpOverlapped) { + char buffer[128] = { 0 }; WINPR_COMM* pComm = (WINPR_COMM*)hDevice; const SERIAL_DRIVER* pServerSerialDriver = NULL; @@ -375,7 +378,8 @@ static BOOL s_CommDeviceIoControl(HANDLE hDevice, DWORD dwIoControlCode, LPVOID if (!pServerSerialDriver->get_modemstatus(pComm, pRegister)) return FALSE; - CommLog_Print(WLOG_DEBUG, "modem status 0x%08" PRIx32, *pRegister); + CommLog_Print(WLOG_DEBUG, "modem status %s" PRIx32, + comm_ioctl_modem_status_string(*pRegister, buffer, sizeof(buffer))); *lpBytesReturned = sizeof(ULONG); return TRUE; } @@ -395,7 +399,8 @@ static BOOL s_CommDeviceIoControl(HANDLE hDevice, DWORD dwIoControlCode, LPVOID } const BOOL rc = pServerSerialDriver->set_wait_mask(pComm, pWaitMask); - CommLog_Print(WLOG_DEBUG, "set_wait_mask 0x%08" PRIx32 " -> %d", *pWaitMask, rc); + CommLog_Print(WLOG_DEBUG, "set_wait_mask %s -> %d", + CommSerialEvString(*pWaitMask, buffer, sizeof(buffer)), rc); return rc; } break; @@ -416,7 +421,8 @@ static BOOL s_CommDeviceIoControl(HANDLE hDevice, DWORD dwIoControlCode, LPVOID if (!pServerSerialDriver->get_wait_mask(pComm, pWaitMask)) return FALSE; - CommLog_Print(WLOG_DEBUG, "get_wait_mask 0x%08" PRIx32, *pWaitMask); + CommLog_Print(WLOG_DEBUG, "get_wait_mask %s", + CommSerialEvString(*pWaitMask, buffer, sizeof(buffer))); *lpBytesReturned = sizeof(ULONG); return TRUE; } @@ -438,7 +444,8 @@ static BOOL s_CommDeviceIoControl(HANDLE hDevice, DWORD dwIoControlCode, LPVOID const BOOL rc = pServerSerialDriver->wait_on_mask(pComm, pOutputMask); *lpBytesReturned = sizeof(ULONG); - CommLog_Print(WLOG_DEBUG, "wait_on_mask 0x%08" PRIx32 " -> %d", *pOutputMask, rc); + CommLog_Print(WLOG_DEBUG, "wait_on_mask %s -> %d", + CommSerialEvString(*pOutputMask, buffer, sizeof(buffer)), rc); return rc; } break; @@ -699,3 +706,53 @@ int comm_ioctl_tcsetattr(int fd, int optional_actions, const struct termios* ter return 0; } + +static const char* comm_ioctl_modem_flag_str(ULONG flag) +{ + switch (flag) + { + case SERIAL_MSR_DCTS: + return "SERIAL_MSR_DCTS"; + case SERIAL_MSR_DDSR: + return "SERIAL_MSR_DDSR"; + case SERIAL_MSR_TERI: + return "SERIAL_MSR_TERI"; + case SERIAL_MSR_DDCD: + return "SERIAL_MSR_DDCD"; + case SERIAL_MSR_CTS: + return "SERIAL_MSR_CTS"; + case SERIAL_MSR_DSR: + return "SERIAL_MSR_DSR"; + case SERIAL_MSR_RI: + return "SERIAL_MSR_RI"; + case SERIAL_MSR_DCD: + return "SERIAL_MSR_DCD"; + default: + return "SERIAL_MSR_UNKNOWN"; + } +} + +const char* comm_ioctl_modem_status_string(ULONG status, char* buffer, size_t size) +{ + const ULONG flags[] = { SERIAL_MSR_DCTS, SERIAL_MSR_DDSR, SERIAL_MSR_TERI, SERIAL_MSR_DDCD, + SERIAL_MSR_CTS, SERIAL_MSR_DSR, SERIAL_MSR_RI, SERIAL_MSR_DCD + + }; + winpr_str_append("{", buffer, size, ""); + + const char* sep = ""; + for (size_t x = 0; x < ARRAYSIZE(flags); x++) + { + const ULONG flag = flags[x]; + if (status & flag) + { + winpr_str_append(comm_ioctl_modem_flag_str(flag), buffer, size, sep); + sep = "|"; + } + } + + char number[32] = { 0 }; + (void)_snprintf(number, sizeof(number), "}[0x%08" PRIx32 "]", status); + winpr_str_append(number, buffer, size, ""); + return buffer; +} diff --git a/winpr/libwinpr/comm/comm_serial_sys.c b/winpr/libwinpr/comm/comm_serial_sys.c index 038642945..5d434266b 100644 --- a/winpr/libwinpr/comm/comm_serial_sys.c +++ b/winpr/libwinpr/comm/comm_serial_sys.c @@ -152,41 +152,43 @@ static const speed_t BAUD_TABLE[][3] = { { BAUD_TABLE_END, 0, 0 } }; -static const char* get_modem_flag_str(ULONG flag) +static const char* get_modem_flag_str(int flag) { + if (flag & TIOCM_LE) + return "DSR"; if (flag & TIOCM_DTR) - return "DTR (data terminal ready)"; + return "DTR"; if (flag & TIOCM_RTS) - return "RTS (request to send)"; + return "RTS"; if (flag & TIOCM_ST) - return "Secondary TXD (transmit)"; + return "Secondary TXD"; if (flag & TIOCM_SR) - return "Secondary RXD (receive)"; + return "Secondary RXD"; if (flag & TIOCM_CTS) - return "CTS (clear to send)"; + return "CTS"; if (flag & TIOCM_CAR) - return "DCD (data carrier detect)"; + return "DCD"; if (flag & TIOCM_CD) - return "CD (carrier detect)"; + return "CD"; if (flag & TIOCM_RNG) - return "RNG (ring)"; + return "RNG"; if (flag & TIOCM_RI) - return "RI (ring)"; + return "RI"; if (flag & TIOCM_DSR) return "DSR"; return "UNKNOWN"; } -static const char* get_modem_status_str(ULONG status, char* buffer, size_t size) +static const char* get_modem_status_str(int status, char* buffer, size_t size) { - const ULONG flags[] = { TIOCM_DTR, TIOCM_RTS, TIOCM_ST, TIOCM_SR, TIOCM_CTS, - TIOCM_CAR, TIOCM_CD, TIOCM_RNG, TIOCM_RI, TIOCM_DSR }; + const int flags[] = { TIOCM_LE, TIOCM_DTR, TIOCM_RTS, TIOCM_ST, TIOCM_SR, TIOCM_CTS, + TIOCM_CAR, TIOCM_CD, TIOCM_RNG, TIOCM_RI, TIOCM_DSR }; winpr_str_append("{", buffer, size, ""); const char* sep = ""; for (size_t x = 0; x < ARRAYSIZE(flags); x++) { - const ULONG flag = flags[x]; + const int flag = flags[x]; if (status & flag) { winpr_str_append(get_modem_flag_str(flag), buffer, size, sep); @@ -195,7 +197,7 @@ static const char* get_modem_status_str(ULONG status, char* buffer, size_t size) } char number[32] = { 0 }; - _snprintf(number, sizeof(number), "}[0x%08" PRIx32 "]", status); + (void)_snprintf(number, sizeof(number), "}[0x%08x]", (unsigned)status); winpr_str_append(number, buffer, size, ""); return buffer; } @@ -1015,7 +1017,12 @@ static BOOL get_raw_modemstatus(WINPR_COMM* pComm, int* pRegister) WINPR_ASSERT(pComm); WINPR_ASSERT(pRegister); - return CommIoCtl(pComm, TIOCMGET, pRegister); + const BOOL rc = CommIoCtl(pComm, TIOCMGET, pRegister); + + char buffer[128] = { 0 }; + CommLog_Print(WLOG_DEBUG, "status %s", + get_modem_status_str(*pRegister, buffer, sizeof(buffer))); + return rc; } static BOOL get_modemstatus(WINPR_COMM* pComm, ULONG* pRegister)