ttyread: test for EOF while reading tty - st - Personal fork of st
 (HTM) git clone git://git.drkhsh.at/st.git
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit e52319cc7d153e4f59b38c4fb4c0556e118d4775
 (DIR) parent 21e0d6e8b8d20903494386e7e6f43201b3761154
 (HTM) Author: Roberto E. Vargas Caballero <k0ga@shike2.com>
       Date:   Fri, 10 Apr 2020 22:25:46 +0200
       
       ttyread: test for EOF while reading tty
       
       When a read operation returns 0 then it means that we arrived to the end of the
       file, and new reads will return 0 unless you do some other operation such as
       lseek(). This case happens with USB-232 adapters when they are unplugged.
       
       Diffstat:
         M st.c                                |      25 ++++++++++++++++---------
       
       1 file changed, 16 insertions(+), 9 deletions(-)
       ---
 (DIR) diff --git a/st.c b/st.c
       @@ -823,17 +823,24 @@ ttyread(void)
                int ret;
        
                /* append read bytes to unprocessed bytes */
       -        if ((ret = read(cmdfd, buf+buflen, LEN(buf)-buflen)) < 0)
       -                die("couldn't read from shell: %s\n", strerror(errno));
       -        buflen += ret;
       +        ret = read(cmdfd, buf+buflen, LEN(buf)-buflen);
        
       -        written = twrite(buf, buflen, 0);
       -        buflen -= written;
       -        /* keep any uncomplete utf8 char for the next call */
       -        if (buflen > 0)
       -                memmove(buf, buf + written, buflen);
       +        switch (ret) {
       +        case 0:
       +                fputs("Found EOF in input\n", stderr);
       +                exit(0);
       +        case -1:
       +                die("couldn't read from shell: %s\n", strerror(errno));
       +        default:
       +                buflen += ret;
       +                written = twrite(buf, buflen, 0);
       +                buflen -= written;
       +                /* keep any uncomplete utf8 char for the next call */
       +                if (buflen > 0)
       +                        memmove(buf, buf + written, buflen);
       +                return ret;
        
       -        return ret;
       +        }
        }
        
        void