aboutsummarylogtreecommitdiffstats
path: root/st.c
diff options
context:
space:
mode:
authorRoberto E. Vargas Caballero2012-10-28 06:27:42 +0100
committerRoberto E. Vargas Caballero2012-10-28 06:27:42 +0100
commit9667fabaa05d3ecdc572aee02706ea1989a54cc6 (patch)
treed0b309eb5c78c57d2fd211339fece083787153b5 /st.c
parentb4c50bea37e587ba13f19417e961027535eff9ac (diff)
downloadaur-9667fabaa05d3ecdc572aee02706ea1989a54cc6.tar.gz
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 (limited to 'st.c')
-rw-r--r--st.c39
1 files changed, 30 insertions, 9 deletions
diff --git a/st.c b/st.c
index f967d2c0aba4..e19cefd949c6 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