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(-)
dev
Roberto E. Vargas Caballero 2012-10-28 06:27:42 +01:00
parent 2e38ab7afd
commit ee3fbeb6c8
1 changed files with 30 additions and 9 deletions

35
st.c
View File

@ -340,6 +340,7 @@ static int utf8encode(long *, char *);
static int utf8size(char *); static int utf8size(char *);
static int isfullutf8(char *, int); static int isfullutf8(char *, int);
static ssize_t xwrite(int, char *, size_t);
static void *xmalloc(size_t); static void *xmalloc(size_t);
static void *xrealloc(void *, size_t); static void *xrealloc(void *, size_t);
static void *xcalloc(size_t nmemb, size_t size); 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_class = NULL;
static char *opt_font = 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 * void *
xmalloc(size_t len) { xmalloc(size_t len) {
void *p = malloc(len); void *p = malloc(len);
@ -926,17 +942,16 @@ ttynew(void) {
cmdfd = m; cmdfd = m;
signal(SIGCHLD, sigchld); signal(SIGCHLD, sigchld);
if(opt_io) { if(opt_io) {
if(!strcmp(opt_io, "-")) { iofd = (!strcmp(opt_io, "-")) ?
iofd = STDOUT_FILENO; STDOUT_FILENO :
} else { open(opt_io, O_WRONLY | O_CREAT, 0666);
if((iofd = open(opt_io, O_WRONLY | O_CREAT, 0666)) < 0) { if(iofd < 0) {
fprintf(stderr, "Error opening %s:%s\n", fprintf(stderr, "Error opening %s:%s\n",
opt_io, strerror(errno)); opt_io, strerror(errno));
} }
} }
} }
} }
}
void void
dump(char c) { dump(char c) {
@ -1793,8 +1808,14 @@ tputc(char *c, int len) {
uchar ascii = *c; uchar ascii = *c;
bool control = ascii < '\x20' || ascii == 0177; bool control = ascii < '\x20' || ascii == 0177;
if(iofd != -1) if(iofd != -1) {
write(iofd, c, len); 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 * STR sequences must be checked before of anything
* because it can use some control codes as part of the sequence * because it can use some control codes as part of the sequence