[hackers] [st] Add error control to iofile || "Roberto E. Vargas Caballero"

From: <hg_AT_suckless.org>
Date: Sun, 28 Oct 2012 13:39:03 +0100 (CET)

changeset: 366:d3f0d0140295
user: "Roberto E. Vargas Caballero" <k0ga_AT_shike2.com>
date: Sun Oct 28 06:27:42 2012 +0100
files: st.c
description:
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(-)
diff -r ba208156a8af -r d3f0d0140295 st.c
--- a/st.c	Tue Oct 09 19:40:37 2012 +0200
+++ b/st.c	Sun Oct 28 06:27:42 2012 +0100
_AT_@ -340,6 +340,7 @@
 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);
_AT_@ -379,6 +380,21 @@
 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);
_AT_@ -926,13 +942,12 @@
 		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));
 			}
 		}
 	}
_AT_@ -1793,8 +1808,14 @@
 	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
Received on Sun Oct 28 2012 - 13:39:03 CET

This archive was generated by hypermail 2.3.0 : Sun Oct 28 2012 - 13:48:21 CET