st

fork of suckless's simple terminal
Index Commits Files Refs README LICENSE
commit ee3fbeb6c8c354cf4db226a5b1583c531ea37af4
parent 2e38ab7afdc56e3853751918f1b7705362bea01c
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:
Mst.c | 39++++++++++++++++++++++++++++++---------
1 file changed, 30 insertions(+), 9 deletions(-)
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