JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
Applying the patch of Rafa Garcia Gallega <rafael.garcia.gallego@gmail.com> to
[st.git] / st.c
diff --git a/st.c b/st.c
index 693739e..3cd7831 100644 (file)
--- 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);
@@ -662,7 +678,7 @@ bpress(XEvent *e) {
 
 void
 selcopy(void) {
-       char *str, *ptr, *p;
+       char *str, *ptr;
        int x, y, bufsize, is_selected = 0, size;
        Glyph *gp;
 
@@ -677,11 +693,12 @@ selcopy(void) {
                        for(x = 0; x < term.col; x++) {
                                gp = &term.line[y][x];
 
-                               if(!(is_selected = selected(x, y)))
+                               if(!(is_selected = selected(x, y))
+                                               || !(gp->state & GLYPH_SET)) {
                                        continue;
-                               p = (gp->state & GLYPH_SET) ? gp->c : " ";
-                               size = utf8size(p);
-                               memcpy(ptr, p, size);
+                               }
+                               size = utf8size(gp->c);
+                               memcpy(ptr, gp->c, size);
                                ptr += size;
                        }
                        /* \n at the end of every selected line except for the last one */
@@ -878,7 +895,7 @@ execsh(void) {
 
        DEFAULT(envshell, SHELL);
        putenv("TERM="TNAME);
-       args = opt_cmd ? opt_cmd : (char*[]){envshell, "-i", NULL};
+       args = opt_cmd ? opt_cmd : (char *[]){envshell, "-i", NULL};
        execvp(args[0], args);
        exit(EXIT_FAILURE);
 }
@@ -926,13 +943,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 +1809,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