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
					
				
							
								
								
									
										35
									
								
								st.c
									
									
									
									
									
								
							
							
						
						
									
										35
									
								
								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,16 +942,15 @@ 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) { | ||||
| 			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)); | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| void | ||||
| @ -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 | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user