Module: wine Branch: refs/heads/master Commit: 5973955e4e82edb114e1559f729b0e2b41bdbf4c URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=5973955e4e82edb114e1559f...
Author: Eric Pouech eric.pouech@wanadoo.fr Date: Mon Feb 6 11:37:39 2006 +0100
ntdll: Implemented COMM IOCTL for modem status: GET_MODEMSTATUS.
---
dlls/kernel/comm.c | 53 +++++++++------------------------------------------ dlls/ntdll/serial.c | 47 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+), 44 deletions(-)
diff --git a/dlls/kernel/comm.c b/dlls/kernel/comm.c index 3a63c02..75ee11c 100644 --- a/dlls/kernel/comm.c +++ b/dlls/kernel/comm.c @@ -1801,55 +1801,20 @@ BOOL WINAPI SetCommTimeouts( * * Obtains the four control register bits if supported by the hardware. * + * PARAMS + * + * hFile [in] The communications device + * lpModemStat [out] The control register bits + * * RETURNS * * True if the communications handle was good and for hardware that * control register access, false otherwise. */ -BOOL WINAPI GetCommModemStatus( - HANDLE hFile, /* [in] The communications device. */ - LPDWORD lpModemStat) /* [out] The control register bits. */ -{ - int fd,mstat, result=FALSE; - - *lpModemStat=0; -#ifdef TIOCMGET - fd = get_comm_fd( hFile, FILE_READ_DATA ); - if(fd<0) - return FALSE; - result = ioctl(fd, TIOCMGET, &mstat); - release_comm_fd( hFile, fd ); - if (result == -1) - { - WARN("ioctl failed\n"); - return FALSE; - } -#ifdef TIOCM_CTS - if (mstat & TIOCM_CTS) - *lpModemStat |= MS_CTS_ON; -#endif -#ifdef TIOCM_DSR - if (mstat & TIOCM_DSR) - *lpModemStat |= MS_DSR_ON; -#endif -#ifdef TIOCM_RNG - if (mstat & TIOCM_RNG) - *lpModemStat |= MS_RING_ON; -#endif -#ifdef TIOCM_CAR - /*FIXME: Not really sure about RLSD UB 990810*/ - if (mstat & TIOCM_CAR) - *lpModemStat |= MS_RLSD_ON; -#endif - TRACE("%04x -> %s%s%s%s\n", mstat, - (*lpModemStat &MS_RLSD_ON)?"MS_RLSD_ON ":"", - (*lpModemStat &MS_RING_ON)?"MS_RING_ON ":"", - (*lpModemStat &MS_DSR_ON)?"MS_DSR_ON ":"", - (*lpModemStat &MS_CTS_ON)?"MS_CTS_ON ":""); - return TRUE; -#else - return FALSE; -#endif +BOOL WINAPI GetCommModemStatus(HANDLE hFile, LPDWORD lpModemStat) +{ + return DeviceIoControl(hFile, IOCTL_SERIAL_GET_MODEMSTATUS, + NULL, 0, lpModemStat, sizeof(DWORD), NULL, NULL); }
static DWORD WINAPI Comm_CheckEvents(int fd, DWORD mask, serial_irq_info *new, serial_irq_info *old, DWORD new_mstat, DWORD old_mstat) diff --git a/dlls/ntdll/serial.c b/dlls/ntdll/serial.c index b364376..115d981 100644 --- a/dlls/ntdll/serial.c +++ b/dlls/ntdll/serial.c @@ -129,6 +129,45 @@ static const char* iocode2str(DWORD ioc) } }
+static NTSTATUS get_modem_status(int fd, DWORD* lpModemStat) +{ + NTSTATUS status = STATUS_SUCCESS; + int mstat; + +#ifdef TIOCMGET + if (ioctl(fd, TIOCMGET, &mstat) == -1) + { + WARN("ioctl failed\n"); + status = FILE_GetNtStatus(); + } + else + { + *lpModemStat = 0; +#ifdef TIOCM_CTS + if (mstat & TIOCM_CTS) *lpModemStat |= MS_CTS_ON; +#endif +#ifdef TIOCM_DSR + if (mstat & TIOCM_DSR) *lpModemStat |= MS_DSR_ON; +#endif +#ifdef TIOCM_RNG + if (mstat & TIOCM_RNG) *lpModemStat |= MS_RING_ON; +#endif +#ifdef TIOCM_CAR + /* FIXME: Not really sure about RLSD UB 990810 */ + if (mstat & TIOCM_CAR) *lpModemStat |= MS_RLSD_ON; +#endif + TRACE("%04x -> %s%s%s%s\n", mstat, + (*lpModemStat & MS_RLSD_ON) ? "MS_RLSD_ON " : "", + (*lpModemStat & MS_RING_ON) ? "MS_RING_ON " : "", + (*lpModemStat & MS_DSR_ON) ? "MS_DSR_ON " : "", + (*lpModemStat & MS_CTS_ON) ? "MS_CTS_ON " : ""); + } +#else + status = STATUS_NOT_SUPPORTED; +#endif + return status; +} + static NTSTATUS get_wait_mask(HANDLE hDevice, DWORD* mask) { NTSTATUS status; @@ -199,6 +238,14 @@ NTSTATUS COMM_DeviceIoControl(HANDLE hDe
switch (dwIoControlCode) { + case IOCTL_SERIAL_GET_MODEMSTATUS: + if (lpOutBuffer && nOutBufferSize == sizeof(DWORD)) + { + if (!(status = get_modem_status(fd, (DWORD*)lpOutBuffer))) + sz = sizeof(DWORD); + } + else status = STATUS_INVALID_PARAMETER; + break; case IOCTL_SERIAL_GET_WAIT_MASK: if (lpOutBuffer && nOutBufferSize == sizeof(DWORD)) {