Commit b1ace449 authored by Alexandre Julliard's avatar Alexandre Julliard

ntdll: Always set VTIME to 0 to avoid blocking, don't try to set it from the comm timeouts.

parent 28206822
...@@ -664,6 +664,10 @@ static NTSTATUS set_line_control(int fd, const SERIAL_LINE_CONTROL* slc) ...@@ -664,6 +664,10 @@ static NTSTATUS set_line_control(int fd, const SERIAL_LINE_CONTROL* slc)
port.c_cflag &= ~(PARENB | PARODD); port.c_cflag &= ~(PARENB | PARODD);
#endif #endif
/* make sure that reads don't block */
port.c_cc[VMIN] = 0;
port.c_cc[VTIME] = 0;
switch (slc->Parity) switch (slc->Parity)
{ {
case NOPARITY: port.c_iflag &= ~INPCK; break; case NOPARITY: port.c_iflag &= ~INPCK; break;
...@@ -751,9 +755,6 @@ static NTSTATUS set_special_chars(int fd, const SERIAL_CHARS* sc) ...@@ -751,9 +755,6 @@ static NTSTATUS set_special_chars(int fd, const SERIAL_CHARS* sc)
return FILE_GetNtStatus(); return FILE_GetNtStatus();
} }
port.c_cc[VMIN ] = 0;
port.c_cc[VTIME ] = 1;
port.c_cc[VEOF ] = sc->EofChar; port.c_cc[VEOF ] = sc->EofChar;
/* FIXME: sc->ErrorChar is not supported */ /* FIXME: sc->ErrorChar is not supported */
/* FIXME: sc->BreakChar is not supported */ /* FIXME: sc->BreakChar is not supported */
...@@ -769,11 +770,9 @@ static NTSTATUS set_special_chars(int fd, const SERIAL_CHARS* sc) ...@@ -769,11 +770,9 @@ static NTSTATUS set_special_chars(int fd, const SERIAL_CHARS* sc)
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
static NTSTATUS set_timeouts(HANDLE handle, int fd, const SERIAL_TIMEOUTS* st) static NTSTATUS set_timeouts(HANDLE handle, const SERIAL_TIMEOUTS* st)
{ {
NTSTATUS status; NTSTATUS status;
struct termios port;
unsigned int ux_timeout;
SERVER_START_REQ( set_serial_info ) SERVER_START_REQ( set_serial_info )
{ {
...@@ -787,31 +786,7 @@ static NTSTATUS set_timeouts(HANDLE handle, int fd, const SERIAL_TIMEOUTS* st) ...@@ -787,31 +786,7 @@ static NTSTATUS set_timeouts(HANDLE handle, int fd, const SERIAL_TIMEOUTS* st)
status = wine_server_call( req ); status = wine_server_call( req );
} }
SERVER_END_REQ; SERVER_END_REQ;
if (status) return status; return status;
if (tcgetattr(fd, &port) == -1)
{
FIXME("tcgetattr on fd %d failed (%s)!\n", fd, strerror(errno));
return FILE_GetNtStatus();
}
/* VTIME is in 1/10 seconds */
if (st->ReadIntervalTimeout == 0) /* 0 means no timeout */
ux_timeout = 0;
else
{
ux_timeout = (st->ReadIntervalTimeout + 99) / 100;
if (ux_timeout == 0)
ux_timeout = 1; /* must be at least some timeout */
}
port.c_cc[VTIME] = ux_timeout;
if (tcsetattr(fd, 0, &port) == -1)
{
FIXME("tcsetattr on fd %d failed (%s)!\n", fd, strerror(errno));
return FILE_GetNtStatus();
}
return STATUS_SUCCESS;
} }
static NTSTATUS set_wait_mask(HANDLE hDevice, DWORD mask) static NTSTATUS set_wait_mask(HANDLE hDevice, DWORD mask)
...@@ -1132,7 +1107,8 @@ static inline NTSTATUS io_control(HANDLE hDevice, ...@@ -1132,7 +1107,8 @@ static inline NTSTATUS io_control(HANDLE hDevice,
piosb->Information = 0; piosb->Information = 0;
if (dwIoControlCode != IOCTL_SERIAL_GET_TIMEOUTS) if (dwIoControlCode != IOCTL_SERIAL_GET_TIMEOUTS &&
dwIoControlCode != IOCTL_SERIAL_SET_TIMEOUTS)
if ((status = server_get_unix_fd( hDevice, access, &fd, &needs_close, NULL, NULL ))) if ((status = server_get_unix_fd( hDevice, access, &fd, &needs_close, NULL, NULL )))
goto error; goto error;
...@@ -1307,7 +1283,7 @@ static inline NTSTATUS io_control(HANDLE hDevice, ...@@ -1307,7 +1283,7 @@ static inline NTSTATUS io_control(HANDLE hDevice,
break; break;
case IOCTL_SERIAL_SET_TIMEOUTS: case IOCTL_SERIAL_SET_TIMEOUTS:
if (lpInBuffer && nInBufferSize == sizeof(SERIAL_TIMEOUTS)) if (lpInBuffer && nInBufferSize == sizeof(SERIAL_TIMEOUTS))
status = set_timeouts(hDevice, fd, (const SERIAL_TIMEOUTS*)lpInBuffer); status = set_timeouts(hDevice, (const SERIAL_TIMEOUTS*)lpInBuffer);
else else
status = STATUS_INVALID_PARAMETER; status = STATUS_INVALID_PARAMETER;
break; break;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment