aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoberto E. Vargas Caballero <k0ga@shike2.com>2012-10-28 06:27:42 +0100
committerRoberto E. Vargas Caballero <k0ga@shike2.com>2012-10-28 06:27:42 +0100
commitee3fbeb6c8c354cf4db226a5b1583c531ea37af4 (patch)
tree0964a1ab765ee2a03ca68558d8aae9c2dd82740e
parent2e38ab7afdc56e3853751918f1b7705362bea01c (diff)
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(-)
-rw-r--r--st.c39
1 files changed, 30 insertions, 9 deletions
diff --git a/st.c b/st.c
index f967d2c..e19cefd 100644
--- 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