mirror of
https://github.com/morgan9e/FreeRDP
synced 2026-04-15 00:44:19 +09:00
[winpr,comm] log serial status
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user