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(-)
This commit is contained in:
		
							parent
							
								
									2e38ab7afd
								
							
						
					
					
						commit
						ee3fbeb6c8
					
				
							
								
								
									
										39
									
								
								st.c
								
								
								
								
							
							
						
						
									
										39
									
								
								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,13 +942,12 @@ 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));
 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -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