# st

Unnamed repository; edit this file 'description' to name the repository.

| Log | Files | Refs | README | LICENSE

    commit ee3fbeb6c8c354cf4db226a5b1583c531ea37af4
    parent 2e38ab7afdc56e3853751918f1b7705362bea01c
    Author: Roberto E. Vargas Caballero <k0ga@shike2.com>
    Date:   Sun, 28 Oct 2012 06:27:42 +0100

    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:
    Mst.c | 39++++++++++++++++++++++++++++++---------

    1 file changed, 30 insertions(+), 9 deletions(-)
    diff --git 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