diff --git a/aqhome/ipc2/tty_object.c b/aqhome/ipc2/tty_object.c index 03056b0..078c83e 100644 --- a/aqhome/ipc2/tty_object.c +++ b/aqhome/ipc2/tty_object.c @@ -38,6 +38,7 @@ static int _cbFlush(AQH_OBJECT *o); static int _getAttn(int fd); static int _setAttn(int fd, int val); static int _fdSetBlocking(int sk, int fl); +static int _fdFlush(int fd); //static int _msleep(long int msec); @@ -50,19 +51,13 @@ static int _fdSetBlocking(int sk, int fl); AQH_OBJECT *AQH_TtyObject_new(AQH_EVENT_LOOP *eventLoop, int fd, int fdMode) { AQH_OBJECT *o; - int rv; o=AQH_FdObject_new(eventLoop, fd, fdMode); AQH_FdObject_SetStartMsgFn(o, _cbStartMsg); AQH_FdObject_SetEndMsgFn(o, _cbEndMsg); AQH_FdObject_SetFlushFn(o, _cbFlush); - rv=tcflush(fd, TCIOFLUSH); - if (rv<0) { - if (errno!=EINTR && errno!=EWOULDBLOCK && errno!=EAGAIN) { - DBG_ERROR(AQH_LOGDOMAIN, "Error on tcflush: %s (%d)", strerror(errno), errno); - } - } + _fdFlush(fd); return o; } @@ -123,23 +118,54 @@ int _cbFlush(AQH_OBJECT *o) int fd; fd=AQH_FdObject_GetFd(o); - if (fd>=0) { - int rv; + return (fd>=0)?_fdFlush(fd):0; +} - DBG_ERROR(AQH_LOGDOMAIN, "Flushing"); - rv=tcflush(fd, TCIFLUSH); - if (rv<0) { - if (errno!=EINTR && errno!=EWOULDBLOCK && errno!=EAGAIN) { - DBG_ERROR(AQH_LOGDOMAIN, "Error on tcflush: %s (%d)", strerror(errno), errno); - return GWEN_ERROR_IO; - } + + +int _fdFlush(int fd) +{ +#if 0 + int rv; + + usleep(1000); + rv=ioctl(fd, TCFLSH, 0); // flush receive + if (rv!=0) { + if (errno!=EINTR && errno!=EWOULDBLOCK && errno!=EAGAIN) { + DBG_ERROR(AQH_LOGDOMAIN, "Error on ioctl: %s (%d)", strerror(errno), errno); + return GWEN_ERROR_IO; } } - else { - DBG_ERROR(AQH_LOGDOMAIN, "Previous error"); - return GWEN_ERROR_IO; +#else + int rv; + + usleep(1000); + rv=ioctl(fd, TCFLSH, 0); // flush receive + if (rv!=0) { + if (errno!=EINTR && errno!=EWOULDBLOCK && errno!=EAGAIN) { + DBG_ERROR(AQH_LOGDOMAIN, "Error on ioctl: %s (%d)", strerror(errno), errno); + return GWEN_ERROR_IO; + } } + for (;;) { + uint8_t buffer[32]; + + rv=read(fd, buffer, sizeof(buffer)); + if (rv==0) { + DBG_ERROR(AQH_LOGDOMAIN, "EOF met"); + return GWEN_ERROR_EOF; + } + else if (rv<0) { + if (errno!=EINTR && errno!=EWOULDBLOCK && errno!=EAGAIN) { + DBG_ERROR(AQH_LOGDOMAIN, "Error on read: %s (%d)", strerror(errno), errno); + return GWEN_ERROR_IO; + } + else + break; + } + } +#endif return 0; }