X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=support%2Fserial.c;h=7968fbb30d059ea5eb844be5a9ade5d775df3d7c;hb=e7622f2f4a9062916adeb8a00f1410cd6f367eb6;hp=cfa6ce1672ff106e12623678f81562a8a3a4eb3e;hpb=1dae9b68281fc771df70d35ea15d67a32dd6c7fb;p=mono.git diff --git a/support/serial.c b/support/serial.c index cfa6ce1672f..7968fbb30d0 100644 --- a/support/serial.c +++ b/support/serial.c @@ -66,16 +66,14 @@ open_serial (char* devfile) int fd; fd = open (devfile, O_RDWR | O_NOCTTY | O_NONBLOCK); - if (fd == -1) - return -1; - return fd; } -void +int close_serial (int unix_fd) { - close (unix_fd); + // Linus writes: do not retry close after EINTR + return close (unix_fd); } guint32 @@ -91,38 +89,35 @@ read_serial (int fd, guchar *buffer, int offset, int count) int write_serial (int fd, guchar *buffer, int offset, int count, int timeout) { - struct timeval tmval; - fd_set writefs; + struct pollfd pinfo; guint32 n; - n = count - offset; + pinfo.fd = fd; + pinfo.events = POLLOUT; + pinfo.revents = POLLOUT; + + n = count; - FD_SET(fd, &writefs); - tmval.tv_sec = timeout / 1000; - tmval.tv_usec = (timeout - tmval.tv_sec) * 1000; - while (n > 0) { size_t t; - if (timeout > 0) - { - if (select(fd+1, NULL, &writefs, NULL, &tmval) <= 0 && errno != EINTR) - { + if (timeout != 0) { + int c; + + while ((c = poll (&pinfo, 1, timeout)) == -1 && errno == EINTR) + ; + if (c == -1) return -1; - } } - t = write(fd, buffer + offset, count); - - if (timeout > 0) - { - if (select(fd+1, NULL, &writefs, NULL, &tmval) <= 0 && errno != EINTR) - { - return -1; - } - } + do { + t = write (fd, buffer + offset, n); + } while (t == -1 && errno == EINTR); + if (t < 0) + return -1; + offset += t; n -= t; } @@ -130,10 +125,10 @@ write_serial (int fd, guchar *buffer, int offset, int count, int timeout) return 0; } -void +int discard_buffer (int fd, gboolean input) { - tcflush(fd, input ? TCIFLUSH : TCOFLUSH); + return tcflush(fd, input ? TCIFLUSH : TCOFLUSH); } gint32 @@ -153,7 +148,9 @@ set_attributes (int fd, int baud_rate, MonoParity parity, int dataBits, MonoStop { struct termios newtio; - tcgetattr (fd, &newtio); + if (tcgetattr (fd, &newtio) == -1) + return FALSE; + newtio.c_cflag |= (CLOCAL | CREAD); newtio.c_lflag &= ~(ICANON | ECHO | ECHOE | ECHOK | ECHONL | ISIG | IEXTEN ); newtio.c_oflag &= ~(OPOST); @@ -162,6 +159,17 @@ set_attributes (int fd, int baud_rate, MonoParity parity, int dataBits, MonoStop /* setup baudrate */ switch (baud_rate) { +/*Some values are not defined on OSX and *BSD */ +#if defined(B921600) + case 921600: + baud_rate = B921600; + break; +#endif +#if defined(B460800) + case 460800: + baud_rate = B460800; + break; +#endif case 230400: baud_rate = B230400; break; @@ -272,6 +280,7 @@ set_attributes (int fd, int baud_rate, MonoParity parity, int dataBits, MonoStop case Even: /* Even */ newtio.c_cflag &= ~(PARODD); + newtio.c_cflag |= (PARENB); break; case Mark: /* Mark */ @@ -399,6 +408,12 @@ set_signal (int fd, MonoSerialSignal signal, gboolean value) return 1; } +int +breakprop (int fd) +{ + return tcsendbreak (fd, 0); +} + gboolean poll_serial (int fd, gint32 *error, int timeout) {