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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user