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
parent
2e38ab7afd
commit
ee3fbeb6c8
35
st.c
35
st.c
|
@ -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,16 +942,15 @@ 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
|
||||||
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue