winehq.org
Sign In
Sign Up
Sign In
Sign Up
Manage this list
×
Keyboard Shortcuts
Thread View
j
: Next unread message
k
: Previous unread message
j a
: Jump to all threads
j l
: Jump to MailingList overview
2025
July
June
May
April
March
February
January
2024
December
November
October
September
August
July
June
May
April
March
February
January
2023
December
November
October
September
August
July
June
May
April
March
February
January
2022
December
November
October
September
August
July
June
May
April
March
February
January
2021
December
November
October
September
August
July
June
May
April
March
February
January
2020
December
November
October
September
August
July
June
May
April
March
February
January
2019
December
November
October
September
August
July
June
May
April
March
February
January
2018
December
November
October
September
August
July
June
May
April
March
February
January
2017
December
November
October
September
August
July
June
May
April
March
February
January
2016
December
November
October
September
August
July
June
May
April
March
February
January
2015
December
November
October
September
August
July
June
May
April
March
February
January
2014
December
November
October
September
August
July
June
May
April
March
February
January
2013
December
November
October
September
August
July
June
May
April
March
February
January
2012
December
November
October
September
August
July
June
May
April
March
February
January
2011
December
November
October
September
August
July
June
May
April
March
February
January
2010
December
November
October
September
August
July
June
May
April
March
February
January
2009
December
November
October
September
August
July
June
May
April
March
February
January
2008
December
November
October
September
August
July
June
May
April
March
February
January
2007
December
November
October
September
August
July
June
May
April
March
February
January
2006
December
November
October
September
August
July
June
May
April
March
February
January
2005
December
November
October
September
August
July
June
May
April
March
February
January
2004
December
November
October
September
August
July
June
May
April
March
February
January
2003
December
November
October
September
August
July
June
May
April
March
February
January
2002
December
November
October
September
August
July
June
May
April
March
February
January
2001
December
November
October
September
August
July
June
May
April
March
February
List overview
wine-commits
May 2006
----- 2025 -----
July 2025
June 2025
May 2025
April 2025
March 2025
February 2025
January 2025
----- 2024 -----
December 2024
November 2024
October 2024
September 2024
August 2024
July 2024
June 2024
May 2024
April 2024
March 2024
February 2024
January 2024
----- 2023 -----
December 2023
November 2023
October 2023
September 2023
August 2023
July 2023
June 2023
May 2023
April 2023
March 2023
February 2023
January 2023
----- 2022 -----
December 2022
November 2022
October 2022
September 2022
August 2022
July 2022
June 2022
May 2022
April 2022
March 2022
February 2022
January 2022
----- 2021 -----
December 2021
November 2021
October 2021
September 2021
August 2021
July 2021
June 2021
May 2021
April 2021
March 2021
February 2021
January 2021
----- 2020 -----
December 2020
November 2020
October 2020
September 2020
August 2020
July 2020
June 2020
May 2020
April 2020
March 2020
February 2020
January 2020
----- 2019 -----
December 2019
November 2019
October 2019
September 2019
August 2019
July 2019
June 2019
May 2019
April 2019
March 2019
February 2019
January 2019
----- 2018 -----
December 2018
November 2018
October 2018
September 2018
August 2018
July 2018
June 2018
May 2018
April 2018
March 2018
February 2018
January 2018
----- 2017 -----
December 2017
November 2017
October 2017
September 2017
August 2017
July 2017
June 2017
May 2017
April 2017
March 2017
February 2017
January 2017
----- 2016 -----
December 2016
November 2016
October 2016
September 2016
August 2016
July 2016
June 2016
May 2016
April 2016
March 2016
February 2016
January 2016
----- 2015 -----
December 2015
November 2015
October 2015
September 2015
August 2015
July 2015
June 2015
May 2015
April 2015
March 2015
February 2015
January 2015
----- 2014 -----
December 2014
November 2014
October 2014
September 2014
August 2014
July 2014
June 2014
May 2014
April 2014
March 2014
February 2014
January 2014
----- 2013 -----
December 2013
November 2013
October 2013
September 2013
August 2013
July 2013
June 2013
May 2013
April 2013
March 2013
February 2013
January 2013
----- 2012 -----
December 2012
November 2012
October 2012
September 2012
August 2012
July 2012
June 2012
May 2012
April 2012
March 2012
February 2012
January 2012
----- 2011 -----
December 2011
November 2011
October 2011
September 2011
August 2011
July 2011
June 2011
May 2011
April 2011
March 2011
February 2011
January 2011
----- 2010 -----
December 2010
November 2010
October 2010
September 2010
August 2010
July 2010
June 2010
May 2010
April 2010
March 2010
February 2010
January 2010
----- 2009 -----
December 2009
November 2009
October 2009
September 2009
August 2009
July 2009
June 2009
May 2009
April 2009
March 2009
February 2009
January 2009
----- 2008 -----
December 2008
November 2008
October 2008
September 2008
August 2008
July 2008
June 2008
May 2008
April 2008
March 2008
February 2008
January 2008
----- 2007 -----
December 2007
November 2007
October 2007
September 2007
August 2007
July 2007
June 2007
May 2007
April 2007
March 2007
February 2007
January 2007
----- 2006 -----
December 2006
November 2006
October 2006
September 2006
August 2006
July 2006
June 2006
May 2006
April 2006
March 2006
February 2006
January 2006
----- 2005 -----
December 2005
November 2005
October 2005
September 2005
August 2005
July 2005
June 2005
May 2005
April 2005
March 2005
February 2005
January 2005
----- 2004 -----
December 2004
November 2004
October 2004
September 2004
August 2004
July 2004
June 2004
May 2004
April 2004
March 2004
February 2004
January 2004
----- 2003 -----
December 2003
November 2003
October 2003
September 2003
August 2003
July 2003
June 2003
May 2003
April 2003
March 2003
February 2003
January 2003
----- 2002 -----
December 2002
November 2002
October 2002
September 2002
August 2002
July 2002
June 2002
May 2002
April 2002
March 2002
February 2002
January 2002
----- 2001 -----
December 2001
November 2001
October 2001
September 2001
August 2001
July 2001
June 2001
May 2001
April 2001
March 2001
February 2001
wine-commits@winehq.org
3 participants
863 discussions
Start a n
N
ew thread
Eric Pouech : ntdll/kernel32: GetCommState & IOCTL_GET_CHARS
by Alexandre Julliard
09 May '06
09 May '06
Module: wine Branch: refs/heads/master Commit: 28cd4fae3b200a3880c9f430703cc90d8efa8c1e URL:
http://source.winehq.org/git/?p=wine.git;a=commit;h=28cd4fae3b200a3880c9f43…
Author: Eric Pouech <eric.pouech(a)wanadoo.fr> Date: Sun May 7 14:10:55 2006 +0200 ntdll/kernel32: GetCommState & IOCTL_GET_CHARS - implemented SERIAL_GET_CHARS ioctl - made use of it in kernel32.GetCommState --- dlls/kernel/comm.c | 14 +++++++++----- dlls/ntdll/serial.c | 28 ++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 5 deletions(-) diff --git a/dlls/kernel/comm.c b/dlls/kernel/comm.c index de17f34..7d8e6da 100644 --- a/dlls/kernel/comm.c +++ b/dlls/kernel/comm.c @@ -1080,6 +1080,7 @@ BOOL WINAPI GetCommState(HANDLE handle, SERIAL_BAUD_RATE sbr; SERIAL_LINE_CONTROL slc; SERIAL_HANDFLOW shf; + SERIAL_CHARS sc; TRACE("handle %p, ptr %p\n", handle, lpdcb); @@ -1094,7 +1095,9 @@ BOOL WINAPI GetCommState(HANDLE handle, !DeviceIoControl(handle, IOCTL_SERIAL_GET_LINE_CONTROL, NULL, 0, &slc, sizeof(slc), NULL, NULL) || !DeviceIoControl(handle, IOCTL_SERIAL_GET_HANDFLOW, - NULL, 0, &shf, sizeof(shf), NULL, NULL)) + NULL, 0, &shf, sizeof(shf), NULL, NULL) || + !DeviceIoControl(handle, IOCTL_SERIAL_GET_CHARS, + NULL, 0, &sc, sizeof(sc), NULL, NULL)) return FALSE; memset(lpdcb, 0, sizeof(*lpdcb)); @@ -1137,10 +1140,11 @@ BOOL WINAPI GetCommState(HANDLE handle, if (shf.FlowReplace & SERIAL_AUTO_TRANSMIT) lpdcb->fOutX = 1; if (shf.FlowReplace & SERIAL_AUTO_RECEIVE) lpdcb->fInX = 1; -/* - lpdcb->XonChar = - lpdcb->XoffChar = - */ + lpdcb->EofChar = sc.EofChar; + lpdcb->ErrorChar = sc.ErrorChar; + lpdcb->EvtChar = sc.EventChar; + lpdcb->XonChar = sc.XonChar; + lpdcb->XoffChar = sc.XoffChar; TRACE("OK\n"); dump_dcb(lpdcb); diff --git a/dlls/ntdll/serial.c b/dlls/ntdll/serial.c index 65eafd2..9b56c6b 100644 --- a/dlls/ntdll/serial.c +++ b/dlls/ntdll/serial.c @@ -319,6 +319,25 @@ #endif return status; } +static NTSTATUS get_special_chars(int fd, SERIAL_CHARS* sc) +{ + struct termios port; + + if (tcgetattr(fd, &port) == -1) + { + ERR("tcgetattr error '%s'\n", strerror(errno)); + return FILE_GetNtStatus(); + } + sc->EofChar = port.c_cc[VEOF]; + sc->ErrorChar = 0xFF; + sc->BreakChar = 0; /* FIXME */ + sc->EventChar = 0; /* FIXME */ + sc->XonChar = port.c_cc[VSTART]; + sc->XoffChar = port.c_cc[VSTOP]; + + return STATUS_SUCCESS; +} + static NTSTATUS get_status(int fd, SERIAL_STATUS* ss) { NTSTATUS status = STATUS_SUCCESS; @@ -779,6 +798,15 @@ NTSTATUS COMM_DeviceIoControl(HANDLE hDe else status = STATUS_INVALID_PARAMETER; break; + case IOCTL_SERIAL_GET_CHARS: + if (lpOutBuffer && nOutBufferSize == sizeof(SERIAL_CHARS)) + { + if (!(status = get_special_chars(fd, (SERIAL_CHARS*)lpOutBuffer))) + sz = sizeof(SERIAL_CHARS); + } + else + status = STATUS_INVALID_PARAMETER; + break; case IOCTL_SERIAL_GET_COMMSTATUS: if (lpOutBuffer && nOutBufferSize == sizeof(SERIAL_STATUS)) {
1
0
0
0
Eric Pouech : ntdll/kernel32: GetCommState & IOCTL_SERIAL_GET_HANDFLOW
by Alexandre Julliard
09 May '06
09 May '06
Module: wine Branch: refs/heads/master Commit: 48646ea82b2aa27b16c3b900a677b8c0581cf7c3 URL:
http://source.winehq.org/git/?p=wine.git;a=commit;h=48646ea82b2aa27b16c3b90…
Author: Eric Pouech <eric.pouech(a)wanadoo.fr> Date: Sun May 7 14:10:52 2006 +0200 ntdll/kernel32: GetCommState & IOCTL_SERIAL_GET_HANDFLOW - implemented SERIAL_GET_HANDFLOW ioctl - made use of it in kernel.GetCommState --- dlls/kernel/comm.c | 95 +++++++++++++++++---------------------------------- dlls/ntdll/serial.c | 57 +++++++++++++++++++++++++++++++ 2 files changed, 89 insertions(+), 63 deletions(-) diff --git a/dlls/kernel/comm.c b/dlls/kernel/comm.c index 6fa5b89..de17f34 100644 --- a/dlls/kernel/comm.c +++ b/dlls/kernel/comm.c @@ -1077,12 +1077,9 @@ BOOL WINAPI SetCommState( HANDLE handle, */ BOOL WINAPI GetCommState(HANDLE handle, LPDCB lpdcb) { - struct termios port; - int fd; - int stat = DTR_CONTROL_ENABLE | RTS_CONTROL_ENABLE; - SERIAL_BAUD_RATE sbr; SERIAL_LINE_CONTROL slc; + SERIAL_HANDFLOW shf; TRACE("handle %p, ptr %p\n", handle, lpdcb); @@ -1091,14 +1088,18 @@ BOOL WINAPI GetCommState(HANDLE handle, SetLastError(ERROR_INVALID_PARAMETER); return FALSE; } - lpdcb->DCBlength = sizeof(*lpdcb); if (!DeviceIoControl(handle, IOCTL_SERIAL_GET_BAUD_RATE, NULL, 0, &sbr, sizeof(sbr), NULL, NULL) || !DeviceIoControl(handle, IOCTL_SERIAL_GET_LINE_CONTROL, - NULL, 0, &slc, sizeof(slc), NULL, NULL)) + NULL, 0, &slc, sizeof(slc), NULL, NULL) || + !DeviceIoControl(handle, IOCTL_SERIAL_GET_HANDFLOW, + NULL, 0, &shf, sizeof(shf), NULL, NULL)) return FALSE; + memset(lpdcb, 0, sizeof(*lpdcb)); + lpdcb->DCBlength = sizeof(*lpdcb); + /* yes, they seem no never be (re)set on NT */ lpdcb->fBinary = 1; lpdcb->fParity = 0; @@ -1109,69 +1110,37 @@ BOOL WINAPI GetCommState(HANDLE handle, lpdcb->Parity = slc.Parity; lpdcb->ByteSize = slc.WordLength; - fd = get_comm_fd( handle, FILE_READ_DATA ); - if (fd < 0) return FALSE; - if (tcgetattr(fd, &port) == -1) { - int save_error=errno; - ERR("tcgetattr error '%s'\n", strerror(save_error)); - release_comm_fd( handle, fd ); - return FALSE; - } - -#ifdef TIOCMGET - if (ioctl(fd, TIOCMGET, &stat) == -1) - { - int save_error=errno; - WARN("ioctl error '%s'\n", strerror(save_error)); - stat = DTR_CONTROL_ENABLE | RTS_CONTROL_ENABLE; - } -#endif - release_comm_fd( handle, fd ); - if(port.c_iflag & INPCK) - lpdcb->fParity = TRUE; - else - lpdcb->fParity = FALSE; - - lpdcb->fNull = 0; - - /* termios does not support DTR/DSR flow control */ - lpdcb->fOutxDsrFlow = 0; - lpdcb->fDtrControl = -#ifdef TIOCM_DTR - !(stat & TIOCM_DTR) ? DTR_CONTROL_DISABLE: -#endif - DTR_CONTROL_ENABLE ; + if (shf.ControlHandShake & SERIAL_CTS_HANDSHAKE) lpdcb->fOutxCtsFlow = 1; + if (shf.ControlHandShake & SERIAL_DSR_HANDSHAKE) lpdcb->fOutxDsrFlow = 1; + switch (shf.ControlHandShake & (SERIAL_DTR_CONTROL | SERIAL_DTR_HANDSHAKE)) + { + case 0: lpdcb->fDtrControl = DTR_CONTROL_DISABLE; break; + case SERIAL_DTR_CONTROL: lpdcb->fDtrControl = DTR_CONTROL_ENABLE; break; + case SERIAL_DTR_HANDSHAKE: lpdcb->fDtrControl = DTR_CONTROL_HANDSHAKE; break; + } + switch (shf.FlowReplace & (SERIAL_RTS_CONTROL | SERIAL_RTS_HANDSHAKE)) + { + case 0: lpdcb->fRtsControl = RTS_CONTROL_DISABLE; break; + case SERIAL_RTS_CONTROL: lpdcb->fRtsControl = RTS_CONTROL_ENABLE; break; + case SERIAL_RTS_HANDSHAKE: lpdcb->fRtsControl = RTS_CONTROL_HANDSHAKE; break; + case SERIAL_RTS_CONTROL | SERIAL_RTS_HANDSHAKE: + lpdcb->fRtsControl = RTS_CONTROL_TOGGLE; break; + } + if (shf.ControlHandShake & SERIAL_DSR_SENSITIVITY) lpdcb->fDsrSensitivity = 1; + if (shf.ControlHandShake & SERIAL_ERROR_ABORT) lpdcb->fAbortOnError = 1; + if (shf.FlowReplace & SERIAL_ERROR_CHAR) lpdcb->fErrorChar = 1; + if (shf.FlowReplace & SERIAL_NULL_STRIPPING) lpdcb->fNull = 1; + if (shf.FlowReplace & SERIAL_XOFF_CONTINUE) lpdcb->fTXContinueOnXoff = 1; + lpdcb->XonLim = shf.XonLimit; + lpdcb->XoffLim = shf.XoffLimit; -#ifdef CRTSCTS + if (shf.FlowReplace & SERIAL_AUTO_TRANSMIT) lpdcb->fOutX = 1; + if (shf.FlowReplace & SERIAL_AUTO_RECEIVE) lpdcb->fInX = 1; - if (port.c_cflag & CRTSCTS) { - lpdcb->fRtsControl = RTS_CONTROL_HANDSHAKE; - lpdcb->fOutxCtsFlow = 1; - } else -#endif - { - lpdcb->fRtsControl = -#ifdef TIOCM_RTS - !(stat & TIOCM_RTS) ? RTS_CONTROL_DISABLE : -#endif - RTS_CONTROL_ENABLE ; - lpdcb->fOutxCtsFlow = 0; - } - if (port.c_iflag & IXON) - lpdcb->fInX = 1; - else - lpdcb->fInX = 0; - - if (port.c_iflag & IXOFF) - lpdcb->fOutX = 1; - else - lpdcb->fOutX = 0; /* lpdcb->XonChar = lpdcb->XoffChar = */ - lpdcb->XonLim = 10; - lpdcb->XoffLim = 10; TRACE("OK\n"); dump_dcb(lpdcb); diff --git a/dlls/ntdll/serial.c b/dlls/ntdll/serial.c index 0a6d8f1..65eafd2 100644 --- a/dlls/ntdll/serial.c +++ b/dlls/ntdll/serial.c @@ -185,6 +185,54 @@ #endif return STATUS_SUCCESS; } +static NTSTATUS get_hand_flow(int fd, SERIAL_HANDFLOW* shf) +{ + int stat; + struct termios port; + + if (tcgetattr(fd, &port) == -1) + { + ERR("tcgetattr error '%s'\n", strerror(errno)); + return FILE_GetNtStatus(); + } +#ifdef TIOCMGET + if (ioctl(fd, TIOCMGET, &stat) == -1) + { + WARN("ioctl error '%s'\n", strerror(errno)); + stat = DTR_CONTROL_ENABLE | RTS_CONTROL_ENABLE; + } +#endif + /* termios does not support DTR/DSR flow control */ + shf->ControlHandShake = 0; + shf->FlowReplace = 0; +#ifdef TIOCM_DTR + if (stat & TIOCM_DTR) +#endif + shf->ControlHandShake |= SERIAL_DTR_CONTROL; +#ifdef CRTSCTS + if (port.c_cflag & CRTSCTS) + { + shf->ControlHandShake |= SERIAL_DTR_CONTROL | SERIAL_DTR_HANDSHAKE; + shf->ControlHandShake |= SERIAL_CTS_HANDSHAKE; + } + else +#endif + { +#ifdef TIOCM_RTS + if (stat & TIOCM_RTS) +#endif + shf->ControlHandShake |= SERIAL_RTS_CONTROL; + } + if (port.c_iflag & IXON) + shf->FlowReplace |= SERIAL_AUTO_RECEIVE; + if (port.c_iflag & IXOFF) + shf->FlowReplace |= SERIAL_AUTO_TRANSMIT; + + shf->XonLimit = 10; + shf->XoffLimit = 10; + return STATUS_SUCCESS; +} + static NTSTATUS get_line_control(int fd, SERIAL_LINE_CONTROL* slc) { struct termios port; @@ -739,6 +787,15 @@ NTSTATUS COMM_DeviceIoControl(HANDLE hDe } else status = STATUS_INVALID_PARAMETER; break; + case IOCTL_SERIAL_GET_HANDFLOW: + if (lpOutBuffer && nOutBufferSize == sizeof(SERIAL_HANDFLOW)) + { + if (!(status = get_hand_flow(fd, (SERIAL_HANDFLOW*)lpOutBuffer))) + sz = sizeof(SERIAL_HANDFLOW); + } + else + status = STATUS_INVALID_PARAMETER; + break; case IOCTL_SERIAL_GET_LINE_CONTROL: if (lpOutBuffer && nOutBufferSize == sizeof(SERIAL_LINE_CONTROL)) {
1
0
0
0
Eric Pouech : ntdll/kernel32: GetCommState & SERIAL_GET_LINE_CONTROL
by Alexandre Julliard
09 May '06
09 May '06
Module: wine Branch: refs/heads/master Commit: efb3244b0aeec890e16b210b1b25e424777b8147 URL:
http://source.winehq.org/git/?p=wine.git;a=commit;h=efb3244b0aeec890e16b210…
Author: Eric Pouech <eric.pouech(a)wanadoo.fr> Date: Sun May 7 14:10:49 2006 +0200 ntdll/kernel32: GetCommState & SERIAL_GET_LINE_CONTROL - implemented SERIAL_GET_LINE_CONTROL ioctl - made use of it in kernel.GetCommState --- dlls/kernel/comm.c | 60 +++++++++------------------------------------------ dlls/ntdll/serial.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+), 50 deletions(-) diff --git a/dlls/kernel/comm.c b/dlls/kernel/comm.c index 8fd765b..6fa5b89 100644 --- a/dlls/kernel/comm.c +++ b/dlls/kernel/comm.c @@ -1082,6 +1082,7 @@ BOOL WINAPI GetCommState(HANDLE handle, int stat = DTR_CONTROL_ENABLE | RTS_CONTROL_ENABLE; SERIAL_BAUD_RATE sbr; + SERIAL_LINE_CONTROL slc; TRACE("handle %p, ptr %p\n", handle, lpdcb); @@ -1093,13 +1094,21 @@ BOOL WINAPI GetCommState(HANDLE handle, lpdcb->DCBlength = sizeof(*lpdcb); if (!DeviceIoControl(handle, IOCTL_SERIAL_GET_BAUD_RATE, - NULL, 0, &sbr, sizeof(sbr), NULL, NULL)) + NULL, 0, &sbr, sizeof(sbr), NULL, NULL) || + !DeviceIoControl(handle, IOCTL_SERIAL_GET_LINE_CONTROL, + NULL, 0, &slc, sizeof(slc), NULL, NULL)) return FALSE; + /* yes, they seem no never be (re)set on NT */ lpdcb->fBinary = 1; lpdcb->fParity = 0; lpdcb->BaudRate = sbr.BaudRate; + + lpdcb->StopBits = slc.StopBits; + lpdcb->Parity = slc.Parity; + lpdcb->ByteSize = slc.WordLength; + fd = get_comm_fd( handle, FILE_READ_DATA ); if (fd < 0) return FALSE; if (tcgetattr(fd, &port) == -1) { @@ -1118,59 +1127,10 @@ #ifdef TIOCMGET } #endif release_comm_fd( handle, fd ); - switch (port.c_cflag & CSIZE) { - case CS5: - lpdcb->ByteSize = 5; - break; - case CS6: - lpdcb->ByteSize = 6; - break; - case CS7: - lpdcb->ByteSize = 7; - break; - case CS8: - lpdcb->ByteSize = 8; - break; - default: - ERR("unknown size %x\n", port.c_cflag & CSIZE); - } - if(port.c_iflag & INPCK) lpdcb->fParity = TRUE; else lpdcb->fParity = FALSE; -#ifdef CMSPAR - switch (port.c_cflag & (PARENB | PARODD | CMSPAR)) -#else - switch (port.c_cflag & (PARENB | PARODD)) -#endif - { - case 0: - lpdcb->Parity = NOPARITY; - break; - case PARENB: - lpdcb->Parity = EVENPARITY; - break; - case (PARENB | PARODD): - lpdcb->Parity = ODDPARITY; - break; -#ifdef CMSPAR - case (PARENB | CMSPAR): - lpdcb->Parity = MARKPARITY; - break; - case (PARENB | PARODD | CMSPAR): - lpdcb->Parity = SPACEPARITY; - break; -#endif - } - - if (port.c_cflag & CSTOPB) - if(lpdcb->ByteSize == 5) - lpdcb->StopBits = ONE5STOPBITS; - else - lpdcb->StopBits = TWOSTOPBITS; - else - lpdcb->StopBits = ONESTOPBIT; lpdcb->fNull = 0; diff --git a/dlls/ntdll/serial.c b/dlls/ntdll/serial.c index c86dc66..0a6d8f1 100644 --- a/dlls/ntdll/serial.c +++ b/dlls/ntdll/serial.c @@ -185,6 +185,53 @@ #endif return STATUS_SUCCESS; } +static NTSTATUS get_line_control(int fd, SERIAL_LINE_CONTROL* slc) +{ + struct termios port; + + if (tcgetattr(fd, &port) == -1) + { + ERR("tcgetattr error '%s'\n", strerror(errno)); + return FILE_GetNtStatus(); + } + +#ifdef CMSPAR + switch (port.c_cflag & (PARENB | PARODD | CMSPAR)) +#else + switch (port.c_cflag & (PARENB | PARODD)) +#endif + { + case 0: slc->Parity = NOPARITY; break; + case PARENB: slc->Parity = EVENPARITY; break; + case PARENB|PARODD: slc->Parity = ODDPARITY; break; +#ifdef CMSPAR + case PARENB|CMSPAR: slc->Parity = MARKPARITY; break; + case PARENB|PARODD|CMSPAR: slc->Parity = SPACEPARITY; break; + break; +#endif + } + switch (port.c_cflag & CSIZE) + { + case CS5: slc->WordLength = 5; break; + case CS6: slc->WordLength = 6; break; + case CS7: slc->WordLength = 7; break; + case CS8: slc->WordLength = 8; break; + default: ERR("unknown size %x\n", port.c_cflag & CSIZE); + } + + if (port.c_cflag & CSTOPB) + { + if (slc->WordLength == 5) + slc->StopBits = ONE5STOPBITS; + else + slc->StopBits = TWOSTOPBITS; + } + else + slc->StopBits = ONESTOPBIT; + + return STATUS_SUCCESS; +} + static NTSTATUS get_modem_status(int fd, DWORD* lpModemStat) { NTSTATUS status = STATUS_SUCCESS; @@ -692,6 +739,15 @@ NTSTATUS COMM_DeviceIoControl(HANDLE hDe } else status = STATUS_INVALID_PARAMETER; break; + case IOCTL_SERIAL_GET_LINE_CONTROL: + if (lpOutBuffer && nOutBufferSize == sizeof(SERIAL_LINE_CONTROL)) + { + if (!(status = get_line_control(fd, (SERIAL_LINE_CONTROL*)lpOutBuffer))) + sz = sizeof(SERIAL_LINE_CONTROL); + } + else + status = STATUS_INVALID_PARAMETER; + break; case IOCTL_SERIAL_GET_MODEMSTATUS: if (lpOutBuffer && nOutBufferSize == sizeof(DWORD)) {
1
0
0
0
Eric Pouech : ntdll/kernel32: GetCommState & IOCTL_GET_BAUD_RATE
by Alexandre Julliard
09 May '06
09 May '06
Module: wine Branch: refs/heads/master Commit: c7016d9325d47af36282859e5aa34bf0da22c66e URL:
http://source.winehq.org/git/?p=wine.git;a=commit;h=c7016d9325d47af36282859…
Author: Eric Pouech <eric.pouech(a)wanadoo.fr> Date: Sun May 7 14:10:46 2006 +0200 ntdll/kernel32: GetCommState & IOCTL_GET_BAUD_RATE - implemented SERIAL_GET_BAUD_RATE ioctl - made use of it in kernel.GetCommState --- dlls/kernel/comm.c | 133 ++++++++++----------------------------------------- dlls/ntdll/serial.c | 67 +++++++++++++++++++++++++- 2 files changed, 93 insertions(+), 107 deletions(-) diff --git a/dlls/kernel/comm.c b/dlls/kernel/comm.c index c6ac9f7..8fd765b 100644 --- a/dlls/kernel/comm.c +++ b/dlls/kernel/comm.c @@ -1063,6 +1063,10 @@ BOOL WINAPI SetCommState( HANDLE handle, * * Fills in a device control block with information from a communications device. * + * PARAMS + * handle [in] The communications device + * lpdcb [out] The device control block + * * RETURNS * * True on success, false if the communication device handle is bad etc @@ -1071,16 +1075,31 @@ BOOL WINAPI SetCommState( HANDLE handle, * * XonChar and XoffChar are not set. */ -BOOL WINAPI GetCommState( - HANDLE handle, /* [in] The communications device. */ - LPDCB lpdcb) /* [out] The device control block. */ +BOOL WINAPI GetCommState(HANDLE handle, LPDCB lpdcb) { struct termios port; - int fd,speed; + int fd; int stat = DTR_CONTROL_ENABLE | RTS_CONTROL_ENABLE; - TRACE("handle %p, ptr %p\n", handle, lpdcb); + SERIAL_BAUD_RATE sbr; + + TRACE("handle %p, ptr %p\n", handle, lpdcb); + + if (!lpdcb) + { + SetLastError(ERROR_INVALID_PARAMETER); + return FALSE; + } + lpdcb->DCBlength = sizeof(*lpdcb); + + if (!DeviceIoControl(handle, IOCTL_SERIAL_GET_BAUD_RATE, + NULL, 0, &sbr, sizeof(sbr), NULL, NULL)) + return FALSE; + /* yes, they seem no never be (re)set on NT */ + lpdcb->fBinary = 1; + lpdcb->fParity = 0; + lpdcb->BaudRate = sbr.BaudRate; fd = get_comm_fd( handle, FILE_READ_DATA ); if (fd < 0) return FALSE; if (tcgetattr(fd, &port) == -1) { @@ -1099,85 +1118,6 @@ #ifdef TIOCMGET } #endif release_comm_fd( handle, fd ); -#ifndef __EMX__ -#ifdef CBAUD - speed= (port.c_cflag & CBAUD); -#else - speed= (cfgetospeed(&port)); -#endif - switch (speed) { - case B0: - lpdcb->BaudRate = 0; - break; - case B50: - lpdcb->BaudRate = 50; - break; - case B75: - lpdcb->BaudRate = 75; - break; - case B110: - lpdcb->BaudRate = 110; - break; - case B134: - lpdcb->BaudRate = 134; - break; - case B150: - lpdcb->BaudRate = 150; - break; - case B200: - lpdcb->BaudRate = 200; - break; - case B300: - lpdcb->BaudRate = 300; - break; - case B600: - lpdcb->BaudRate = 600; - break; - case B1200: - lpdcb->BaudRate = 1200; - break; - case B1800: - lpdcb->BaudRate = 1800; - break; - case B2400: - lpdcb->BaudRate = 2400; - break; - case B4800: - lpdcb->BaudRate = 4800; - break; - case B9600: - lpdcb->BaudRate = 9600; - break; - case B19200: - lpdcb->BaudRate = 19200; - break; - case B38400: - lpdcb->BaudRate = 38400; - break; -#ifdef B57600 - case B57600: - lpdcb->BaudRate = 57600; - break; -#endif -#ifdef B115200 - case B115200: - lpdcb->BaudRate = 115200; - break; -#endif -#ifdef B230400 - case B230400: - lpdcb->BaudRate = 230400; - break; -#endif -#ifdef B460800 - case B460800: - lpdcb->BaudRate = 460800; - break; -#endif - default: - ERR("unknown speed %x\n", speed); - } -#endif switch (port.c_cflag & CSIZE) { case CS5: lpdcb->ByteSize = 5; @@ -1233,7 +1173,6 @@ #endif lpdcb->StopBits = ONESTOPBIT; lpdcb->fNull = 0; - lpdcb->fBinary = 1; /* termios does not support DTR/DSR flow control */ lpdcb->fOutxDsrFlow = 0; @@ -1274,28 +1213,10 @@ #endif lpdcb->XonLim = 10; lpdcb->XoffLim = 10; - TRACE("OK\n"); - - TRACE("bytesize %d baudrate %ld fParity %d Parity %d stopbits %d\n", - lpdcb->ByteSize,lpdcb->BaudRate,lpdcb->fParity, lpdcb->Parity, - (lpdcb->StopBits == ONESTOPBIT)?1: - (lpdcb->StopBits == TWOSTOPBITS)?2:0); - TRACE("%s %s\n",(lpdcb->fInX)?"IXON":"~IXON", - (lpdcb->fOutX)?"IXOFF":"~IXOFF"); - TRACE("fOutxCtsFlow %d fRtsControl %d\n", lpdcb->fOutxCtsFlow, - lpdcb->fRtsControl); - TRACE("fOutxDsrFlow %d fDtrControl%d\n", lpdcb->fOutxDsrFlow, - lpdcb->fDtrControl); -#ifdef CRTSCTS - if ( lpdcb->fOutxCtsFlow || - lpdcb->fRtsControl == RTS_CONTROL_HANDSHAKE - ) - TRACE("CRTSCTS\n"); - else + TRACE("OK\n"); + dump_dcb(lpdcb); - TRACE("~CRTSCTS\n"); -#endif - return TRUE; + return TRUE; } /***************************************************************************** diff --git a/dlls/ntdll/serial.c b/dlls/ntdll/serial.c index 351b7e4..c86dc66 100644 --- a/dlls/ntdll/serial.c +++ b/dlls/ntdll/serial.c @@ -129,6 +129,62 @@ #undef X } } +static NTSTATUS get_baud_rate(int fd, SERIAL_BAUD_RATE* sbr) +{ + struct termios port; + int speed; + + if (tcgetattr(fd, &port) == -1) + { + ERR("tcgetattr error '%s'\n", strerror(errno)); + return FILE_GetNtStatus(); + } +#ifndef __EMX__ +#ifdef CBAUD + speed = port.c_cflag & CBAUD; +#else + speed = cfgetospeed(&port); +#endif + switch (speed) + { + case B0: sbr->BaudRate = 0; break; + case B50: sbr->BaudRate = 50; break; + case B75: sbr->BaudRate = 75; break; + case B110: sbr->BaudRate = 110; break; + case B134: sbr->BaudRate = 134; break; + case B150: sbr->BaudRate = 150; break; + case B200: sbr->BaudRate = 200; break; + case B300: sbr->BaudRate = 300; break; + case B600: sbr->BaudRate = 600; break; + case B1200: sbr->BaudRate = 1200; break; + case B1800: sbr->BaudRate = 1800; break; + case B2400: sbr->BaudRate = 2400; break; + case B4800: sbr->BaudRate = 4800; break; + case B9600: sbr->BaudRate = 9600; break; + case B19200: sbr->BaudRate = 19200; break; + case B38400: sbr->BaudRate = 38400; break; +#ifdef B57600 + case B57600: sbr->BaudRate = 57600; break; +#endif +#ifdef B115200 + case B115200: sbr->BaudRate = 115200; break; +#endif +#ifdef B230400 + case B230400: sbr->BaudRate = 230400; break; +#endif +#ifdef B460800 + case B460800: sbr->BaudRate = 460800; break; +#endif + default: + ERR("unknown speed %x\n", speed); + return STATUS_INVALID_PARAMETER; + } +#else + return STATUS_INVALID_PARAMETER; +#endif + return STATUS_SUCCESS; +} + static NTSTATUS get_modem_status(int fd, DWORD* lpModemStat) { NTSTATUS status = STATUS_SUCCESS; @@ -619,7 +675,16 @@ NTSTATUS COMM_DeviceIoControl(HANDLE hDe switch (dwIoControlCode) { - case IOCTL_SERIAL_GET_COMMSTATUS: + case IOCTL_SERIAL_GET_BAUD_RATE: + if (lpOutBuffer && nOutBufferSize == sizeof(SERIAL_BAUD_RATE)) + { + if (!(status = get_baud_rate(fd, (SERIAL_BAUD_RATE*)lpOutBuffer))) + sz = sizeof(SERIAL_BAUD_RATE); + } + else + status = STATUS_INVALID_PARAMETER; + break; + case IOCTL_SERIAL_GET_COMMSTATUS: if (lpOutBuffer && nOutBufferSize == sizeof(SERIAL_STATUS)) { if (!(status = get_status(fd, (SERIAL_STATUS*)lpOutBuffer)))
1
0
0
0
Eric Pouech : ntdll/kernel32: SetCommState & IOCTL_SET_CHARS
by Alexandre Julliard
09 May '06
09 May '06
Module: wine Branch: refs/heads/master Commit: a05a3435fdf425c2bafe3559b5b9427801f7d7a2 URL:
http://source.winehq.org/git/?p=wine.git;a=commit;h=a05a3435fdf425c2bafe355…
Author: Eric Pouech <eric.pouech(a)wanadoo.fr> Date: Sun May 7 14:10:43 2006 +0200 ntdll/kernel32: SetCommState & IOCTL_SET_CHARS - implemented ntdll's serial IOCTL SET_CHARS - used this IOCTL in kernel32.SetCommState --- dlls/kernel/comm.c | 55 +++++++++++++++------------------------------------ dlls/ntdll/serial.c | 34 ++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 39 deletions(-) diff --git a/dlls/kernel/comm.c b/dlls/kernel/comm.c index 58e1b13..c6ac9f7 100644 --- a/dlls/kernel/comm.c +++ b/dlls/kernel/comm.c @@ -983,13 +983,10 @@ static void dump_dcb(const DCB* lpdcb) */ BOOL WINAPI SetCommState( HANDLE handle, LPDCB lpdcb) { - struct termios port; - int fd; - BOOL ret; - SERIAL_BAUD_RATE sbr; SERIAL_LINE_CONTROL slc; SERIAL_HANDFLOW shf; + SERIAL_CHARS sc; if (lpdcb == NULL) { @@ -1040,44 +1037,24 @@ BOOL WINAPI SetCommState( HANDLE handle, shf.XonLimit = lpdcb->XonLim; shf.XoffLimit = lpdcb->XoffLim; + sc.EofChar = lpdcb->EofChar; + sc.ErrorChar = lpdcb->ErrorChar; + sc.BreakChar = 0; + sc.EventChar = lpdcb->EvtChar; + sc.XonChar = lpdcb->XonChar; + sc.XoffChar = lpdcb->XoffChar; + /* note: change DTR/RTS lines after setting the comm attributes, * so flow control does not interfere. */ - if (!DeviceIoControl(handle, IOCTL_SERIAL_SET_BAUD_RATE, - &sbr, sizeof(sbr), NULL, 0, NULL, NULL)) - return FALSE; - if (!DeviceIoControl(handle, IOCTL_SERIAL_SET_LINE_CONTROL, - &slc, sizeof(slc), NULL, 0, NULL, NULL)) - return FALSE; - - if (!DeviceIoControl(handle, IOCTL_SERIAL_SET_HANDFLOW, - &shf, sizeof(shf), NULL, 0, NULL, NULL)) - return FALSE; - - fd = get_comm_fd( handle, FILE_READ_DATA ); - if (fd < 0) return FALSE; - - if ((tcgetattr(fd,&port)) == -1) { - int save_error = errno; - release_comm_fd( handle, fd ); - ERR("tcgetattr error '%s'\n", strerror(save_error)); - return FALSE; - } - - port.c_cc[VMIN] = 0; - port.c_cc[VTIME] = 1; - - if (tcsetattr(fd,TCSANOW,&port)==-1) { /* otherwise it hangs with pending input*/ - ERR("tcsetattr error '%s'\n", strerror(errno)); - ret = FALSE; - } else { - ClearCommError(handle, NULL, NULL); - ret = TRUE; - } - - release_comm_fd( handle, fd ); - return ret; - + return (DeviceIoControl(handle, IOCTL_SERIAL_SET_BAUD_RATE, + &sbr, sizeof(sbr), NULL, 0, NULL, NULL) && + DeviceIoControl(handle, IOCTL_SERIAL_SET_LINE_CONTROL, + &slc, sizeof(slc), NULL, 0, NULL, NULL) && + DeviceIoControl(handle, IOCTL_SERIAL_SET_HANDFLOW, + &shf, sizeof(shf), NULL, 0, NULL, NULL) && + DeviceIoControl(handle, IOCTL_SERIAL_SET_CHARS, + &sc, sizeof(sc), NULL, 0, NULL, NULL)); } diff --git a/dlls/ntdll/serial.c b/dlls/ntdll/serial.c index 0225ba8..351b7e4 100644 --- a/dlls/ntdll/serial.c +++ b/dlls/ntdll/serial.c @@ -540,6 +540,34 @@ #endif return STATUS_SUCCESS; } +static NTSTATUS set_special_chars(int fd, const SERIAL_CHARS* sc) +{ + struct termios port; + + if (tcgetattr(fd, &port) == -1) + { + ERR("tcgetattr error '%s'\n", strerror(errno)); + return FILE_GetNtStatus(); + } + + port.c_cc[VMIN ] = 0; + port.c_cc[VTIME ] = 1; + + port.c_cc[VEOF ] = sc->EofChar; + /* FIXME: sc->ErrorChar is not supported */ + /* FIXME: sc->BreakChar is not supported */ + /* FIXME: sc->EventChar is not supported */ + port.c_cc[VSTART] = sc->XonChar; + port.c_cc[VSTOP ] = sc->XoffChar; + + if (tcsetattr(fd, TCSANOW, &port) == -1) + { + ERR("tcsetattr error '%s'\n", strerror(errno)); + return FILE_GetNtStatus(); + } + return STATUS_SUCCESS; +} + static NTSTATUS set_wait_mask(HANDLE hDevice, DWORD mask) { NTSTATUS status; @@ -658,6 +686,12 @@ #else status = STATUS_NOT_SUPPORTED; #endif break; + case IOCTL_SERIAL_SET_CHARS: + if (lpInBuffer && nInBufferSize == sizeof(SERIAL_CHARS)) + status = set_special_chars(fd, (const SERIAL_CHARS*)lpInBuffer); + else + status = STATUS_INVALID_PARAMETER; + break; case IOCTL_SERIAL_SET_HANDFLOW: if (lpInBuffer && nInBufferSize == sizeof(SERIAL_HANDFLOW)) status = set_handflow(fd, (const SERIAL_HANDFLOW*)lpInBuffer);
1
0
0
0
Eric Pouech : ntdll/kernel32: SetCommState & IOCTL_SET_HANDFLOW
by Alexandre Julliard
09 May '06
09 May '06
Module: wine Branch: refs/heads/master Commit: b68203ea90464eddddf43ef6521303b2b1da32e8 URL:
http://source.winehq.org/git/?p=wine.git;a=commit;h=b68203ea90464eddddf43ef…
Author: Eric Pouech <eric.pouech(a)wanadoo.fr> Date: Sun May 7 14:10:39 2006 +0200 ntdll/kernel32: SetCommState & IOCTL_SET_HANDFLOW - implemented ntdll's serial IOCTL SET_HANDFLOW - used this IOCTL in kernel32.SetCommState --- dlls/kernel/comm.c | 85 ++++++++++++++++++++++++++------------------------- dlls/ntdll/serial.c | 80 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 124 insertions(+), 41 deletions(-) diff --git a/dlls/kernel/comm.c b/dlls/kernel/comm.c index f9aeb2a..58e1b13 100644 --- a/dlls/kernel/comm.c +++ b/dlls/kernel/comm.c @@ -989,6 +989,7 @@ BOOL WINAPI SetCommState( HANDLE handle, SERIAL_BAUD_RATE sbr; SERIAL_LINE_CONTROL slc; + SERIAL_HANDFLOW shf; if (lpdcb == NULL) { @@ -1003,6 +1004,45 @@ BOOL WINAPI SetCommState( HANDLE handle, slc.Parity = lpdcb->Parity; slc.WordLength = lpdcb->ByteSize; + shf.ControlHandShake = 0; + shf.FlowReplace = 0; + if (lpdcb->fOutxCtsFlow) shf.ControlHandShake |= SERIAL_CTS_HANDSHAKE; + if (lpdcb->fOutxDsrFlow) shf.ControlHandShake |= SERIAL_DSR_HANDSHAKE; + switch (lpdcb->fDtrControl) + { + case DTR_CONTROL_DISABLE: break; + case DTR_CONTROL_ENABLE: shf.ControlHandShake |= SERIAL_DTR_CONTROL; break; + case DTR_CONTROL_HANDSHAKE: shf.ControlHandShake |= SERIAL_DTR_HANDSHAKE;break; + default: + SetLastError(ERROR_INVALID_PARAMETER); + return FALSE; + } + switch (lpdcb->fDtrControl) + { + case RTS_CONTROL_DISABLE: break; + case RTS_CONTROL_ENABLE: shf.FlowReplace |= SERIAL_RTS_CONTROL; break; + case RTS_CONTROL_HANDSHAKE: shf.FlowReplace |= SERIAL_RTS_HANDSHAKE; break; + case RTS_CONTROL_TOGGLE: shf.FlowReplace |= SERIAL_RTS_CONTROL | + SERIAL_RTS_HANDSHAKE; break; + default: + SetLastError(ERROR_INVALID_PARAMETER); + return FALSE; + } + if (lpdcb->fDsrSensitivity) shf.ControlHandShake |= SERIAL_DSR_SENSITIVITY; + if (lpdcb->fAbortOnError) shf.ControlHandShake |= SERIAL_ERROR_ABORT; + + if (lpdcb->fErrorChar) shf.FlowReplace |= SERIAL_ERROR_CHAR; + if (lpdcb->fNull) shf.FlowReplace |= SERIAL_NULL_STRIPPING; + if (lpdcb->fTXContinueOnXoff) shf.FlowReplace |= SERIAL_XOFF_CONTINUE; + if (lpdcb->fOutX) shf.FlowReplace |= SERIAL_AUTO_TRANSMIT; + if (lpdcb->fInX) shf.FlowReplace |= SERIAL_AUTO_RECEIVE; + + shf.XonLimit = lpdcb->XonLim; + shf.XoffLimit = lpdcb->XoffLim; + + /* note: change DTR/RTS lines after setting the comm attributes, + * so flow control does not interfere. + */ if (!DeviceIoControl(handle, IOCTL_SERIAL_SET_BAUD_RATE, &sbr, sizeof(sbr), NULL, 0, NULL, NULL)) return FALSE; @@ -1010,6 +1050,10 @@ BOOL WINAPI SetCommState( HANDLE handle, &slc, sizeof(slc), NULL, 0, NULL, NULL)) return FALSE; + if (!DeviceIoControl(handle, IOCTL_SERIAL_SET_HANDFLOW, + &shf, sizeof(shf), NULL, 0, NULL, NULL)) + return FALSE; + fd = get_comm_fd( handle, FILE_READ_DATA ); if (fd < 0) return FALSE; @@ -1023,25 +1067,6 @@ BOOL WINAPI SetCommState( HANDLE handle, port.c_cc[VMIN] = 0; port.c_cc[VTIME] = 1; -#ifdef CRTSCTS - if ( lpdcb->fOutxCtsFlow || - lpdcb->fRtsControl == RTS_CONTROL_HANDSHAKE - ) - { - port.c_cflag |= CRTSCTS; - TRACE("CRTSCTS\n"); - } -#endif - - if (lpdcb->fInX) - port.c_iflag |= IXON; - else - port.c_iflag &= ~IXON; - if (lpdcb->fOutX) - port.c_iflag |= IXOFF; - else - port.c_iflag &= ~IXOFF; - if (tcsetattr(fd,TCSANOW,&port)==-1) { /* otherwise it hangs with pending input*/ ERR("tcsetattr error '%s'\n", strerror(errno)); ret = FALSE; @@ -1050,28 +1075,6 @@ #endif ret = TRUE; } - /* note: change DTR/RTS lines after setting the comm attributes, - * so flow control does not interfere. */ -#ifdef TIOCM_DTR - if (lpdcb->fDtrControl == DTR_CONTROL_HANDSHAKE) - { - WARN("DSR/DTR flow control not supported\n"); - } else if(lpdcb->fDtrControl == DTR_CONTROL_DISABLE) - COMM_WhackModem(fd, ~TIOCM_DTR, 0); - else - COMM_WhackModem(fd, 0, TIOCM_DTR); -#endif -#ifdef TIOCM_RTS - if(!lpdcb->fOutxCtsFlow ) - { - if(lpdcb->fRtsControl == RTS_CONTROL_DISABLE) - COMM_WhackModem(fd, ~TIOCM_RTS, 0); - else - COMM_WhackModem(fd, 0, TIOCM_RTS); - } -#endif - if(lpdcb->fRtsControl == RTS_CONTROL_TOGGLE) - FIXME("RTS_CONTROL_TOGGLE is not supported.\n"); release_comm_fd( handle, fd ); return ret; diff --git a/dlls/ntdll/serial.c b/dlls/ntdll/serial.c index 678b4fd..0225ba8 100644 --- a/dlls/ntdll/serial.c +++ b/dlls/ntdll/serial.c @@ -360,6 +360,80 @@ #endif return STATUS_SUCCESS; } +static int whack_modem(int fd, unsigned int andy, unsigned int orrie) +{ +#ifdef TIOCMGET + unsigned int mstat, okay; + okay = ioctl(fd, TIOCMGET, &mstat); + if (okay) return okay; + if (andy) mstat &= andy; + mstat |= orrie; + return ioctl(fd, TIOCMSET, &mstat); +#else + return 0; +#endif +} + +static NTSTATUS set_handflow(int fd, const SERIAL_HANDFLOW* shf) +{ + struct termios port; + + if ((shf->FlowReplace & (SERIAL_RTS_CONTROL | SERIAL_RTS_HANDSHAKE)) == + (SERIAL_RTS_CONTROL | SERIAL_RTS_HANDSHAKE)) + return STATUS_NOT_SUPPORTED; + + if (tcgetattr(fd, &port) == -1) + { + ERR("tcgetattr error '%s'\n", strerror(errno)); + return FILE_GetNtStatus(); + } + +#ifdef CRTSCTS + if ((shf->ControlHandShake & SERIAL_CTS_HANDSHAKE) || + (shf->FlowReplace & SERIAL_RTS_HANDSHAKE)) + { + port.c_cflag |= CRTSCTS; + TRACE("CRTSCTS\n"); + } + else + port.c_cflag &= ~CRTSCTS; +#endif +#ifdef TIOCM_DTR + if (shf->ControlHandShake & SERIAL_DTR_HANDSHAKE) + { + WARN("DSR/DTR flow control not supported\n"); + } else if (shf->ControlHandShake & SERIAL_DTR_CONTROL) + whack_modem(fd, ~TIOCM_DTR, 0); + else + whack_modem(fd, 0, TIOCM_DTR); +#endif +#ifdef TIOCM_RTS + if (!(shf->ControlHandShake & SERIAL_DSR_HANDSHAKE)) + { + if ((shf->FlowReplace & (SERIAL_RTS_CONTROL|SERIAL_RTS_HANDSHAKE)) == 0) + whack_modem(fd, ~TIOCM_RTS, 0); + else + whack_modem(fd, 0, TIOCM_RTS); + } +#endif + + if (shf->FlowReplace & SERIAL_AUTO_RECEIVE) + port.c_iflag |= IXON; + else + port.c_iflag &= ~IXON; + if (shf->FlowReplace & SERIAL_AUTO_TRANSMIT) + port.c_iflag |= IXOFF; + else + port.c_iflag &= ~IXOFF; + if (tcsetattr(fd, TCSANOW, &port) == -1) + { + ERR("tcsetattr error '%s'\n", strerror(errno)); + return FILE_GetNtStatus(); + } + + return STATUS_SUCCESS; +} + static NTSTATUS set_line_control(int fd, const SERIAL_LINE_CONTROL* slc) { struct termios port; @@ -584,6 +658,12 @@ #else status = STATUS_NOT_SUPPORTED; #endif break; + case IOCTL_SERIAL_SET_HANDFLOW: + if (lpInBuffer && nInBufferSize == sizeof(SERIAL_HANDFLOW)) + status = set_handflow(fd, (const SERIAL_HANDFLOW*)lpInBuffer); + else + status = STATUS_INVALID_PARAMETER; + break; case IOCTL_SERIAL_SET_LINE_CONTROL: if (lpInBuffer && nInBufferSize == sizeof(SERIAL_LINE_CONTROL)) status = set_line_control(fd, (const SERIAL_LINE_CONTROL*)lpInBuffer);
1
0
0
0
Eric Pouech : ntdll/kernel32: SetCommState & IOCTL_SET_LINE_CONTROL
by Alexandre Julliard
09 May '06
09 May '06
Module: wine Branch: refs/heads/master Commit: 65f137c56ce51eacc709571714aee683c2ac9f90 URL:
http://source.winehq.org/git/?p=wine.git;a=commit;h=65f137c56ce51eacc709571…
Author: Eric Pouech <eric.pouech(a)wanadoo.fr> Date: Sun May 7 14:10:36 2006 +0200 ntdll/kernel32: SetCommState & IOCTL_SET_LINE_CONTROL - implemented ntdll's serial IOCTL SET_LINE_CONTROL - used this IOCTL in kernel32.SetCommState --- dlls/kernel/comm.c | 122 +++++---------------------------------------------- dlls/ntdll/serial.c | 112 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 124 insertions(+), 110 deletions(-) diff --git a/dlls/kernel/comm.c b/dlls/kernel/comm.c index a641567..f9aeb2a 100644 --- a/dlls/kernel/comm.c +++ b/dlls/kernel/comm.c @@ -984,11 +984,12 @@ static void dump_dcb(const DCB* lpdcb) BOOL WINAPI SetCommState( HANDLE handle, LPDCB lpdcb) { struct termios port; - int fd, bytesize, stopbits; + int fd; BOOL ret; - SERIAL_BAUD_RATE sbr; - + SERIAL_BAUD_RATE sbr; + SERIAL_LINE_CONTROL slc; + if (lpdcb == NULL) { SetLastError(ERROR_INVALID_PARAMETER); @@ -997,9 +998,17 @@ BOOL WINAPI SetCommState( HANDLE handle, dump_dcb(lpdcb); sbr.BaudRate = lpdcb->BaudRate; + + slc.StopBits = lpdcb->StopBits; + slc.Parity = lpdcb->Parity; + slc.WordLength = lpdcb->ByteSize; + if (!DeviceIoControl(handle, IOCTL_SERIAL_SET_BAUD_RATE, &sbr, sizeof(sbr), NULL, 0, NULL, NULL)) return FALSE; + if (!DeviceIoControl(handle, IOCTL_SERIAL_SET_LINE_CONTROL, + &slc, sizeof(slc), NULL, 0, NULL, NULL)) + return FALSE; fd = get_comm_fd( handle, FILE_READ_DATA ); if (fd < 0) return FALSE; @@ -1014,113 +1023,6 @@ BOOL WINAPI SetCommState( HANDLE handle, port.c_cc[VMIN] = 0; port.c_cc[VTIME] = 1; -#ifdef IMAXBEL - port.c_iflag &= ~(ISTRIP|BRKINT|IGNCR|ICRNL|INLCR|PARMRK|IMAXBEL); -#else - port.c_iflag &= ~(ISTRIP|BRKINT|IGNCR|ICRNL|INLCR|PARMRK); -#endif - port.c_iflag |= (IGNBRK); - - port.c_oflag &= ~(OPOST); - - port.c_cflag &= ~(HUPCL); - port.c_cflag |= CLOCAL | CREAD; - - port.c_lflag &= ~(ICANON|ECHO|ISIG); - port.c_lflag |= NOFLSH; - - bytesize=lpdcb->ByteSize; - stopbits=lpdcb->StopBits; - -#ifdef CMSPAR - port.c_cflag &= ~(PARENB | PARODD | CMSPAR); -#else - port.c_cflag &= ~(PARENB | PARODD); -#endif - if (lpdcb->fParity) - port.c_iflag |= INPCK; - else - port.c_iflag &= ~INPCK; - switch (lpdcb->Parity) { - case NOPARITY: - break; - case ODDPARITY: - port.c_cflag |= (PARENB | PARODD); - break; - case EVENPARITY: - port.c_cflag |= PARENB; - break; -#ifdef CMSPAR - /* Linux defines mark/space (stick) parity */ - case MARKPARITY: - port.c_cflag |= (PARENB | CMSPAR); - break; - case SPACEPARITY: - port.c_cflag |= (PARENB | PARODD | CMSPAR); - break; -#else - /* try the POSIX way */ - case MARKPARITY: - if( stopbits == ONESTOPBIT) { - stopbits = TWOSTOPBITS; - port.c_iflag &= ~INPCK; - } else { - release_comm_fd( handle, fd ); - ERR("Cannot set MARK Parity\n"); - return FALSE; - } - break; - case SPACEPARITY: - if( bytesize < 8) { - bytesize +=1; - port.c_iflag &= ~INPCK; - } else { - release_comm_fd( handle, fd ); - ERR("Cannot set SPACE Parity\n"); - return FALSE; - } - break; -#endif - default: - release_comm_fd( handle, fd ); - ERR("Parity\n"); - return FALSE; - } - - - port.c_cflag &= ~CSIZE; - switch (bytesize) { - case 5: - port.c_cflag |= CS5; - break; - case 6: - port.c_cflag |= CS6; - break; - case 7: - port.c_cflag |= CS7; - break; - case 8: - port.c_cflag |= CS8; - break; - default: - release_comm_fd( handle, fd ); - ERR("ByteSize\n"); - return FALSE; - } - - switch (stopbits) { - case ONESTOPBIT: - port.c_cflag &= ~CSTOPB; - break; - case ONE5STOPBITS: /* will be selected if bytesize is 5 */ - case TWOSTOPBITS: - port.c_cflag |= CSTOPB; - break; - default: - release_comm_fd( handle, fd ); - ERR("StopBits\n"); - return FALSE; - } #ifdef CRTSCTS if ( lpdcb->fOutxCtsFlow || lpdcb->fRtsControl == RTS_CONTROL_HANDSHAKE diff --git a/dlls/ntdll/serial.c b/dlls/ntdll/serial.c index 0a7e56a..678b4fd 100644 --- a/dlls/ntdll/serial.c +++ b/dlls/ntdll/serial.c @@ -360,6 +360,112 @@ #endif return STATUS_SUCCESS; } +static NTSTATUS set_line_control(int fd, const SERIAL_LINE_CONTROL* slc) +{ + struct termios port; + unsigned bytesize, stopbits; + + if (tcgetattr(fd, &port) == -1) + { + ERR("tcgetattr error '%s'\n", strerror(errno)); + return FILE_GetNtStatus(); + } + +#ifdef IMAXBEL + port.c_iflag &= ~(ISTRIP|BRKINT|IGNCR|ICRNL|INLCR|PARMRK|IMAXBEL); +#else + port.c_iflag &= ~(ISTRIP|BRKINT|IGNCR|ICRNL|INLCR|PARMRK); +#endif + port.c_iflag |= IGNBRK | INPCK; + + port.c_oflag &= ~(OPOST); + + port.c_cflag &= ~(HUPCL); + port.c_cflag |= CLOCAL | CREAD; + + port.c_lflag &= ~(ICANON|ECHO|ISIG); + port.c_lflag |= NOFLSH; + + bytesize = slc->WordLength; + stopbits = slc->StopBits; + +#ifdef CMSPAR + port.c_cflag &= ~(PARENB | PARODD | CMSPAR); +#else + port.c_cflag &= ~(PARENB | PARODD); +#endif + + switch (slc->Parity) + { + case NOPARITY: port.c_iflag &= ~INPCK; break; + case ODDPARITY: port.c_cflag |= PARENB | PARODD; break; + case EVENPARITY: port.c_cflag |= PARENB; break; +#ifdef CMSPAR + /* Linux defines mark/space (stick) parity */ + case MARKPARITY: port.c_cflag |= PARENB | CMSPAR; break; + case SPACEPARITY: port.c_cflag |= PARENB | PARODD | CMSPAR; break; +#else + /* try the POSIX way */ + case MARKPARITY: + if (slc->StopBits == ONESTOPBIT) + { + stopbits = TWOSTOPBITS; + port.c_iflag &= ~INPCK; + } + else + { + ERR("Cannot set MARK Parity\n"); + return STATUS_NOT_SUPPORTED; + } + break; + case SPACEPARITY: + if (slc->WordLength < 8) + { + bytesize +=1; + port.c_iflag &= ~INPCK; + } + else + { + ERR("Cannot set SPACE Parity\n"); + return STATUS_NOT_SUPPORTED; + } + break; +#endif + default: + ERR("Parity\n"); + return STATUS_NOT_SUPPORTED; + } + + port.c_cflag &= ~CSIZE; + switch (bytesize) + { + case 5: port.c_cflag |= CS5; break; + case 6: port.c_cflag |= CS6; break; + case 7: port.c_cflag |= CS7; break; + case 8: port.c_cflag |= CS8; break; + default: + ERR("ByteSize\n"); + return STATUS_NOT_SUPPORTED; + } + + switch (stopbits) + { + case ONESTOPBIT: port.c_cflag &= ~CSTOPB; break; + case ONE5STOPBITS: /* will be selected if bytesize is 5 */ + case TWOSTOPBITS: port.c_cflag |= CSTOPB; break; + default: + ERR("StopBits\n"); + return STATUS_NOT_SUPPORTED; + } + /* otherwise it hangs with pending input*/ + if (tcsetattr(fd, TCSANOW, &port) == -1) + { + ERR("tcsetattr error '%s'\n", strerror(errno)); + return FILE_GetNtStatus(); + } + return STATUS_SUCCESS; +} + static NTSTATUS set_wait_mask(HANDLE hDevice, DWORD mask) { NTSTATUS status; @@ -478,6 +584,12 @@ #else status = STATUS_NOT_SUPPORTED; #endif break; + case IOCTL_SERIAL_SET_LINE_CONTROL: + if (lpInBuffer && nInBufferSize == sizeof(SERIAL_LINE_CONTROL)) + status = set_line_control(fd, (const SERIAL_LINE_CONTROL*)lpInBuffer); + else + status = STATUS_INVALID_PARAMETER; + break; case IOCTL_SERIAL_SET_WAIT_MASK: if (lpInBuffer && nInBufferSize == sizeof(DWORD)) {
1
0
0
0
Eric Pouech : ntdll/kernel32: SetCommState & IOCTL_SET_BAUD_RATE
by Alexandre Julliard
09 May '06
09 May '06
Module: wine Branch: refs/heads/master Commit: 631ec30f78413d208b067c2ef194ec6c8c662d4e URL:
http://source.winehq.org/git/?p=wine.git;a=commit;h=631ec30f78413d208b067c2…
Author: Eric Pouech <eric.pouech(a)wanadoo.fr> Date: Sun May 7 14:10:32 2006 +0200 ntdll/kernel32: SetCommState & IOCTL_SET_BAUD_RATE - created dump_dcb to print out DCB information - implemented ntdll's serial IOCTL SET_BAUD_RATE - used this IOCTL in kernel32.SetCommState --- dlls/kernel/comm.c | 245 +++++++-------------------------------------------- dlls/ntdll/serial.c | 140 +++++++++++++++++++++++++++++ 2 files changed, 174 insertions(+), 211 deletions(-) Diff:
http://source.winehq.org/git/?p=wine.git;a=commitdiff;h=631ec30f78413d208b0…
1
0
0
0
Stefan Dösinger : wined3d: Implement IWineD3DSurface:: SetColorKey.
by Alexandre Julliard
09 May '06
09 May '06
Module: wine Branch: refs/heads/master Commit: 9b29fb68605c0cc74a8012ce6f879f904c0117d4 URL:
http://source.winehq.org/git/?p=wine.git;a=commit;h=9b29fb68605c0cc74a8012c…
Author: Stefan Dösinger <stefan(a)codeweavers.com> Date: Tue May 9 19:37:38 2006 +0200 wined3d: Implement IWineD3DSurface::SetColorKey. --- dlls/wined3d/surface.c | 85 +++++++++++++++++++++++++++++++++++++++- dlls/wined3d/wined3d_private.h | 8 ++++ 2 files changed, 91 insertions(+), 2 deletions(-) diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c index e6fc8cc..497b22a 100644 --- a/dlls/wined3d/surface.c +++ b/dlls/wined3d/surface.c @@ -1739,8 +1739,89 @@ HRESULT WINAPI IWineD3DSurfaceImpl_SetPa } HRESULT WINAPI IWineD3DSurfaceImpl_SetColorKey(IWineD3DSurface *iface, DWORD Flags, DDCOLORKEY *CKey) { - FIXME("This is unimplemented for now(d3d7 merge)\n"); - return WINED3DERR_INVALIDCALL; + IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *) iface; + BOOL dirtify = FALSE; + TRACE("(%p)->(%08lx,%p)\n", This, Flags, CKey); + + if ((Flags & DDCKEY_COLORSPACE) != 0) { + FIXME(" colorkey value not supported (%08lx) !\n", Flags); + return DDERR_INVALIDPARAMS; + } + + /* Dirtify the surface, but only if a key was changed */ + if(CKey) { + switch (Flags & ~DDCKEY_COLORSPACE) { + case DDCKEY_DESTBLT: + if(!(This->CKeyFlags & DDSD_CKDESTBLT)) { + dirtify = TRUE; + } else { + dirtify = memcmp(&This->DestBltCKey, CKey, sizeof(*CKey) ) != 0; + } + This->DestBltCKey = *CKey; + This->CKeyFlags |= DDSD_CKDESTBLT; + break; + + case DDCKEY_DESTOVERLAY: + if(!(This->CKeyFlags & DDSD_CKDESTOVERLAY)) { + dirtify = TRUE; + } else { + dirtify = memcmp(&This->DestOverlayCKey, CKey, sizeof(*CKey)) != 0; + } + This->DestOverlayCKey = *CKey; + This->CKeyFlags |= DDSD_CKDESTOVERLAY; + break; + + case DDCKEY_SRCOVERLAY: + if(!(This->CKeyFlags & DDSD_CKSRCOVERLAY)) { + dirtify = TRUE; + } else { + dirtify = memcmp(&This->SrcOverlayCKey, CKey, sizeof(*CKey)) != 0; + } + This->SrcOverlayCKey = *CKey; + This->CKeyFlags |= DDSD_CKSRCOVERLAY; + break; + + case DDCKEY_SRCBLT: + if(!(This->CKeyFlags & DDSD_CKSRCBLT)) { + dirtify = TRUE; + } else { + dirtify = memcmp(&This->SrcBltCKey, CKey, sizeof(*CKey)) != 0; + } + This->SrcBltCKey = *CKey; + This->CKeyFlags |= DDSD_CKSRCBLT; + break; + } + } + else { + switch (Flags & ~DDCKEY_COLORSPACE) { + case DDCKEY_DESTBLT: + dirtify = This->CKeyFlags & DDSD_CKDESTBLT; + This->CKeyFlags &= ~DDSD_CKDESTBLT; + break; + + case DDCKEY_DESTOVERLAY: + dirtify = This->CKeyFlags & DDSD_CKDESTOVERLAY; + This->CKeyFlags &= ~DDSD_CKDESTOVERLAY; + break; + + case DDCKEY_SRCOVERLAY: + dirtify = This->CKeyFlags & DDSD_CKSRCOVERLAY; + This->CKeyFlags &= ~DDSD_CKSRCOVERLAY; + break; + + case DDCKEY_SRCBLT: + dirtify = This->CKeyFlags & DDSD_CKSRCBLT; + This->CKeyFlags &= ~DDSD_CKSRCBLT; + break; + } + } + + if(dirtify) { + TRACE("Color key changed, dirtifing surface\n"); + This->Flags |= SFLAG_DIRTY; + } + + return WINED3D_OK; } HRESULT WINAPI IWineD3DSurfaceImpl_PrivateSetup(IWineD3DSurface *iface) { diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index efdafd1..389d475 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -835,6 +835,14 @@ #endif /* For GetDC */ wineD3DSurface_DIB dib; HDC hDC; + + /* Color keys for DDraw */ + DDCOLORKEY DestBltCKey; + DDCOLORKEY DestOverlayCKey; + DDCOLORKEY SrcOverlayCKey; + DDCOLORKEY SrcBltCKey; + DWORD CKeyFlags; + }; extern const IWineD3DSurfaceVtbl IWineD3DSurface_Vtbl;
1
0
0
0
Stefan Dösinger : wined3d: Implement IWineD3DSurface:: IsLost and Restore.
by Alexandre Julliard
09 May '06
09 May '06
Module: wine Branch: refs/heads/master Commit: 08dc9e003de52c7e2e187dec1abd0d025e227419 URL:
http://source.winehq.org/git/?p=wine.git;a=commit;h=08dc9e003de52c7e2e187de…
Author: Stefan Dösinger <stefan(a)codeweavers.com> Date: Tue May 9 18:47:28 2006 +0200 wined3d: Implement IWineD3DSurface::IsLost and Restore. --- dlls/wined3d/surface.c | 14 ++++++++++---- dlls/wined3d/wined3d_private.h | 1 + 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c index bb5d070..e6fc8cc 100644 --- a/dlls/wined3d/surface.c +++ b/dlls/wined3d/surface.c @@ -1698,13 +1698,19 @@ HRESULT WINAPI IWineD3DSurfaceImpl_GetFl } HRESULT WINAPI IWineD3DSurfaceImpl_IsLost(IWineD3DSurface *iface) { - FIXME("This is unimplemented for now(d3d7 merge)\n"); - return WINED3DERR_INVALIDCALL; + IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *) iface; + TRACE("(%p)\n", This); + + return This->Flags & SFLAG_LOST ? DDERR_SURFACELOST : WINED3D_OK; } HRESULT WINAPI IWineD3DSurfaceImpl_Restore(IWineD3DSurface *iface) { - FIXME("This is unimplemented for now(d3d7 merge)\n"); - return WINED3DERR_INVALIDCALL; + IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *) iface; + TRACE("(%p)\n", This); + + /* So far we don't lose anything :) */ + This->Flags &= ~SFLAG_LOST; + return WINED3D_OK; } HRESULT WINAPI IWineD3DSurfaceImpl_BltFast(IWineD3DSurface *iface, DWORD dstx, DWORD dsty, IWineD3DSurface *Source, RECT *rsrc, DWORD trans) { diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index 980ad32..efdafd1 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -855,6 +855,7 @@ #define SFLAG_DYNLOCK 0x0800 /* Surf #define SFLAG_DYNCHANGE 0x1800 /* Surface contents are changed very often, implies DYNLOCK */ #define SFLAG_DCINUSE 0x2000 /* Set between GetDC and ReleaseDC calls */ #define SFLAG_NEWDC 0x4000 /* To inform LockRect about a new dc */ +#define SFLAG_LOST 0x8000 /* Surface lost flag for DDraw */ /* In some conditions the surface memory must not be freed: * SFLAG_OVERSIZE: Not all data can be kept in GL
1
0
0
0
← Newer
1
...
60
61
62
63
64
65
66
...
87
Older →
Jump to page:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
Results per page:
10
25
50
100
200