[winpr,comm] log serial status

This commit is contained in:
Armin Novak
2025-02-26 13:58:27 +01:00
parent 29841bef8e
commit 828ecd9710
4 changed files with 153 additions and 20 deletions

View File

@@ -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;
}

View File

@@ -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);

View File

@@ -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;
}

View File

@@ -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)