tAdd error control to iofile - st - [fork] customized build of st, the simple t… | |
git clone git://src.adamsgaard.dk/st | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit ee3fbeb6c8c354cf4db226a5b1583c531ea37af4 | |
parent 2e38ab7afdc56e3853751918f1b7705362bea01c | |
Author: Roberto E. Vargas Caballero <[email protected]> | |
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(-) | |
--- | |
diff --git a/st.c b/st.c | |
t@@ -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); | |
t@@ -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); | |
t@@ -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, 06… | |
- 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)); | |
} | |
} | |
} | |
t@@ -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 |