Add error control to iofile - 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 ee3fbeb6c8c354cf4db226a5b1583c531ea37af4
 (DIR) parent 2e38ab7afdc56e3853751918f1b7705362bea01c
 (HTM) Author: Roberto E. Vargas Caballero <k0ga@shike2.com>
       Date:   Sun, 28 Oct 2012 06:27:42 +0100
       
       Add error control to iofile
       
       write can write less bytes than we request, so it is necessary check the
       return value, in case of error print a message and don't continnue writing
       in the file.
       ---
        st.c |   39 ++++++++++++++++++++++++++++++---------
        1 file changed, 30 insertions(+), 9 deletions(-)
       Diffstat:
         M st.c                                |      39 ++++++++++++++++++++++++-------
       
       1 file changed, 30 insertions(+), 9 deletions(-)
       ---
 (DIR) diff --git a/st.c b/st.c
       @@ -340,6 +340,7 @@ static int utf8encode(long *, char *);
        static int utf8size(char *);
        static int isfullutf8(char *, int);
        
       +static ssize_t xwrite(int, char *, size_t);
        static void *xmalloc(size_t);
        static void *xrealloc(void *, size_t);
        static void *xcalloc(size_t nmemb, size_t size);
       @@ -379,6 +380,21 @@ static char *opt_embed = NULL;
        static char *opt_class = NULL;
        static char *opt_font = NULL;
        
       +
       +ssize_t
       +xwrite(int fd, char *s, size_t len) {
       +        size_t aux = len;
       +
       +        while(len > 0) {
       +                ssize_t r = write(fd, s, len);
       +                if(r < 0)
       +                        return r;
       +                len -= r;
       +                s += r;
       +        }
       +        return aux;
       +}
       +
        void *
        xmalloc(size_t len) {
                void *p = malloc(len);
       @@ -926,13 +942,12 @@ ttynew(void) {
                        cmdfd = m;
                        signal(SIGCHLD, sigchld);
                        if(opt_io) {
       -                        if(!strcmp(opt_io, "-")) {
       -                                iofd = STDOUT_FILENO;
       -                        } else {
       -                                if((iofd = open(opt_io, O_WRONLY | O_CREAT, 0666)) < 0) {
       -                                        fprintf(stderr, "Error opening %s:%s\n",
       -                                                opt_io, strerror(errno));
       -                                }
       +                        iofd = (!strcmp(opt_io, "-")) ?
       +                                  STDOUT_FILENO :
       +                                  open(opt_io, O_WRONLY | O_CREAT, 0666);
       +                        if(iofd < 0) {
       +                                fprintf(stderr, "Error opening %s:%s\n",
       +                                        opt_io, strerror(errno));
                                }
                        }
                }
       @@ -1793,8 +1808,14 @@ tputc(char *c, int len) {
                uchar ascii = *c;
                bool control = ascii < '\x20' || ascii == 0177;
        
       -        if(iofd != -1)
       -                write(iofd, c, len);
       +        if(iofd != -1) {
       +                if (xwrite(iofd, c, len) < 0) {
       +                        fprintf(stderr, "Error writting in %s:%s\n",
       +                                opt_io, strerror(errno));
       +                        close(iofd);
       +                        iofd = -1;
       +                }
       +        }
                /*
                 * STR sequences must be checked before of anything
                 * because it can use some control codes as part of the sequence