X-Git-Url: http://sigrok.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=serialport.c;h=eda2d19250fdcc7316b9f1f60ffa21ff4d37655f;hb=78c3db9bfb86f854df2b3c36a35f29b476e6deee;hp=30c83739a360f63031c50ba3357eb2f0a6abe668;hpb=060d1d8a7398851288caf66059b7858cdd6ee11c;p=libserialport.git diff --git a/serialport.c b/serialport.c index 30c8373..eda2d19 100644 --- a/serialport.c +++ b/serialport.c @@ -21,8 +21,6 @@ * along with this program. If not, see . */ -#include -#include "libserialport.h" #include "libserialport_internal.h" static const struct std_baudrate std_baudrates[] = { @@ -61,7 +59,7 @@ SP_API enum sp_return sp_get_port_by_name(const char *portname, struct sp_port * #ifndef NO_PORT_METADATA enum sp_return ret; #endif - int len; + size_t len; TRACE("%s, %p", portname, port_ptr); @@ -325,7 +323,7 @@ SP_PRIV struct sp_port **list_append(struct sp_port **list, const char *portname) { void *tmp; - unsigned int count; + size_t count; for (count = 0; list[count]; count++) ; @@ -490,7 +488,7 @@ SP_API enum sp_return sp_open(struct sp_port *port, enum sp_mode flags) if (flags & SP_MODE_WRITE) desired_access |= GENERIC_WRITE; - port->hdl = CreateFile(escaped_port_name, desired_access, 0, 0, + port->hdl = CreateFileA(escaped_port_name, desired_access, 0, 0, OPEN_EXISTING, flags_and_attributes, 0); free(escaped_port_name); @@ -784,7 +782,8 @@ SP_API enum sp_return sp_blocking_write(struct sp_port *port, const void *buf, RETURN_INT(0); #ifdef _WIN32 - DWORD remaining_ms, write_size, bytes_written, total_bytes_written = 0; + DWORD remaining_ms, write_size, bytes_written; + size_t remaining_bytes, total_bytes_written = 0; const uint8_t *write_ptr = (uint8_t *) buf; bool result; struct timeout timeout; @@ -807,9 +806,11 @@ SP_API enum sp_return sp_blocking_write(struct sp_port *port, const void *buf, } /* Reduce write size if it exceeds the WriteFile limit. */ - write_size = count - total_bytes_written; - if (write_size > WRITEFILE_MAX_SIZE) + remaining_bytes = count - total_bytes_written; + if (remaining_bytes > WRITEFILE_MAX_SIZE) write_size = WRITEFILE_MAX_SIZE; + else + write_size = (DWORD) remaining_bytes; /* Start write. */ @@ -839,7 +840,7 @@ SP_API enum sp_return sp_blocking_write(struct sp_port *port, const void *buf, total_bytes_written += bytes_written; } - RETURN_INT(total_bytes_written); + RETURN_INT((int) total_bytes_written); #else size_t bytes_written = 0; unsigned char *ptr = (unsigned char *) buf; @@ -913,7 +914,7 @@ SP_API enum sp_return sp_nonblocking_write(struct sp_port *port, RETURN_INT(0); #ifdef _WIN32 - DWORD buf_bytes; + size_t buf_bytes; /* Check whether previous write is complete. */ if (port->writing) { @@ -943,7 +944,7 @@ SP_API enum sp_return sp_nonblocking_write(struct sp_port *port, memcpy(port->write_buf, buf, buf_bytes); /* Start asynchronous write. */ - if (WriteFile(port->hdl, port->write_buf, buf_bytes, NULL, &port->write_ovl) == 0) { + if (WriteFile(port->hdl, port->write_buf, (DWORD) buf_bytes, NULL, &port->write_ovl) == 0) { if (GetLastError() == ERROR_IO_PENDING) { if ((port->writing = !HasOverlappedIoCompleted(&port->write_ovl))) DEBUG("Asynchronous write completed immediately"); @@ -957,7 +958,7 @@ SP_API enum sp_return sp_nonblocking_write(struct sp_port *port, DEBUG("All bytes written immediately"); - RETURN_INT(buf_bytes); + RETURN_INT((int) buf_bytes); #else /* Returns the number of bytes written, or -1 upon failure. */ ssize_t written = write(port->fd, buf, count); @@ -1015,7 +1016,7 @@ SP_API enum sp_return sp_blocking_read(struct sp_port *port, void *buf, RETURN_INT(0); #ifdef _WIN32 - DWORD bytes_read = 0; + DWORD bytes_read; /* Set timeout. */ if (port->timeouts.ReadIntervalTimeout != 0 || @@ -1029,9 +1030,9 @@ SP_API enum sp_return sp_blocking_read(struct sp_port *port, void *buf, } /* Start read. */ - if (ReadFile(port->hdl, buf, count, NULL, &port->read_ovl)) { + if (ReadFile(port->hdl, buf, (DWORD) count, NULL, &port->read_ovl)) { DEBUG("Read completed immediately"); - bytes_read = count; + bytes_read = (DWORD) count; } else if (GetLastError() == ERROR_IO_PENDING) { DEBUG("Waiting for read to complete"); if (GetOverlappedResult(port->hdl, &port->read_ovl, &bytes_read, TRUE) == 0) @@ -1043,7 +1044,7 @@ SP_API enum sp_return sp_blocking_read(struct sp_port *port, void *buf, TRY(restart_wait_if_needed(port, bytes_read)); - RETURN_INT(bytes_read); + RETURN_INT((int) bytes_read); #else size_t bytes_read = 0; @@ -1146,7 +1147,7 @@ SP_API enum sp_return sp_blocking_read_next(struct sp_port *port, void *buf, /* Loop until we have at least one byte, or timeout is reached. */ while (bytes_read == 0) { /* Start read. */ - if (ReadFile(port->hdl, buf, count, &bytes_read, &port->read_ovl)) { + if (ReadFile(port->hdl, buf, (DWORD) count, &bytes_read, &port->read_ovl)) { DEBUG("Read completed immediately"); } else if (GetLastError() == ERROR_IO_PENDING) { DEBUG("Waiting for read to complete"); @@ -1252,7 +1253,7 @@ SP_API enum sp_return sp_nonblocking_read(struct sp_port *port, void *buf, } /* Do read. */ - if (ReadFile(port->hdl, buf, count, NULL, &port->read_ovl) == 0) + if (ReadFile(port->hdl, buf, (DWORD) count, NULL, &port->read_ovl) == 0) if (GetLastError() != ERROR_IO_PENDING) RETURN_FAIL("ReadFile() failed"); @@ -1306,6 +1307,11 @@ SP_API enum sp_return sp_output_waiting(struct sp_port *port) { TRACE("%p", port); +#ifdef __CYGWIN__ + /* TIOCOUTQ is not defined in Cygwin headers */ + RETURN_ERROR(SP_ERR_SUPP, + "Getting output bytes waiting is not supported on Cygwin"); +#else CHECK_OPEN_PORT(); DEBUG_FMT("Checking output bytes waiting on port %s", port->name); @@ -1323,6 +1329,7 @@ SP_API enum sp_return sp_output_waiting(struct sp_port *port) RETURN_FAIL("TIOCOUTQ ioctl failed"); RETURN_INT(bytes_waiting); #endif +#endif } SP_API enum sp_return sp_new_event_set(struct sp_event_set **result_ptr) @@ -1837,6 +1844,7 @@ static enum sp_return set_config(struct sp_port *port, struct port_data *data, DEBUG_FMT("Setting configuration for port %s", port->name); #ifdef _WIN32 + BYTE* new_buf; TRY(await_write_completion(port)); @@ -1853,11 +1861,10 @@ static enum sp_return set_config(struct sp_port *port, struct port_data *data, /* Allocate write buffer for 50ms of data at baud rate. */ port->write_buf_size = max(config->baudrate / (8 * 20), 1); - port->write_buf = realloc(port->write_buf, - port->write_buf_size); - - if (!port->write_buf) + new_buf = realloc(port->write_buf, port->write_buf_size); + if (!new_buf) RETURN_ERROR(SP_ERR_MEM, "Allocating write buffer failed"); + port->write_buf = new_buf; } if (config->bits >= 0) @@ -2477,17 +2484,17 @@ SP_API char *sp_last_error_message(void) TRACE_VOID(); #ifdef _WIN32 - TCHAR *message; + char *message; DWORD error = GetLastError(); - DWORD length = FormatMessage( + DWORD length = FormatMessageA( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, error, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), - (LPTSTR) &message, + (LPSTR) &message, 0, NULL ); if (length >= 2 && message[length - 2] == '\r')