|
@@ -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
|