dj(1): error reporting more of the time
This commit is contained in:
		
							parent
							
								
									bab3cdd90e
								
							
						
					
					
						commit
						691e94c0c1
					
				
							
								
								
									
										49
									
								
								src/dj.c
									
									
									
									
									
								
							
							
						
						
									
										49
									
								
								src/dj.c
									
									
									
									
									
								
							| @ -37,17 +37,18 @@ char *program_name = "dj"; | |||||||
|  * writing ends of its jockeyed "pipe". User-configurable members are noted |  * writing ends of its jockeyed "pipe". User-configurable members are noted | ||||||
|  * with their relevant options. */ |  * with their relevant options. */ | ||||||
| struct Io{ | struct Io{ | ||||||
| 	int bs;       	/* buffer size (-bB) */ | 	char *buf;	  	/* buffer */ | ||||||
|  | 	char *fn;	  	/* file name (-io) */ | ||||||
|  | 	size_t bs;    	/* buffer size (-bB) */ | ||||||
| 	size_t bufuse;	/* buffer usage */ | 	size_t bufuse;	/* buffer usage */ | ||||||
| 	char *buf;		/* buffer */ | 	size_t bytes; 	/* bytes processed */ | ||||||
| 	size_t bytes;	/* bytes processed */ | 	size_t prec;  	/* partial records processed */ | ||||||
| 	int fd;			/* file descriptor */ | 	size_t rec;   	/* records processed */ | ||||||
| 	int fl;			/* file opening flags */ | 	long seek;  	/* remaining bytes to seek/skip (-sS) */ | ||||||
| 	char *fn;		/* file name (may be stdin_name or stdout_name) (-io) */ | 	int fd;		  	/* file descriptor */ | ||||||
| 	size_t prec;	/* partial records processed */ | 	int fl;		  	/* file opening flags */ | ||||||
| 	size_t rec; 	/* records processed */ | 	char error: 1;	/* (bool) error status */ | ||||||
| 	long seek;		/* bytes to seek/skip (will be 0 after skippage) (-sS) */ | }; | ||||||
| };  |  | ||||||
| 
 | 
 | ||||||
| /* To be assigned to main:fmt and used with printio(). */ | /* To be assigned to main:fmt and used with printio(). */ | ||||||
| static char *fmt_asv   = "%d\037%d\036%d\037%d\035%d\036%d\034"; | static char *fmt_asv   = "%d\037%d\036%d\037%d\035%d\036%d\034"; | ||||||
| @ -73,8 +74,10 @@ Io_read(struct Io *io){ | |||||||
| 	assert(io->bs > 0); | 	assert(io->bs > 0); | ||||||
| 	assert(io->bufuse < io->bs); | 	assert(io->bufuse < io->bs); | ||||||
| 
 | 
 | ||||||
| 	if((t = read(io->fd, &(io->buf)[io->bufuse], io->bs - io->bufuse)) < 0) | 	if((t = read(io->fd, &(io->buf)[io->bufuse], io->bs - io->bufuse)) < 0){ | ||||||
|  | 		io->error = 1; | ||||||
| 		t = 0; | 		t = 0; | ||||||
|  | 	} | ||||||
| 
 | 
 | ||||||
| 	io->bufuse += t; | 	io->bufuse += t; | ||||||
| 	io->bytes  += t; | 	io->bytes  += t; | ||||||
| @ -93,9 +96,10 @@ Io_write(struct Io *io){ | |||||||
| 	assert(io->bufuse > 0); | 	assert(io->bufuse > 0); | ||||||
| 	assert(io->bufuse <= io->bs); | 	assert(io->bufuse <= io->bs); | ||||||
| 
 | 
 | ||||||
| 	if((t = write(io->fd, io->buf, io->bufuse)) < 0) | 	if((t = write(io->fd, io->buf, io->bufuse)) < 0){ | ||||||
|  | 		io->error = 1; | ||||||
| 		t = 0; | 		t = 0; | ||||||
| 	else if(t > 0) | 	}else if(t > 0) | ||||||
| 		memmove(io->buf, &(io->buf)[t], (io->bufuse -= t)); | 		memmove(io->buf, &(io->buf)[t], (io->bufuse -= t)); | ||||||
| 
 | 
 | ||||||
| 	io->bytes += t; | 	io->bytes += t; | ||||||
| @ -158,20 +162,21 @@ int main(int argc, char *argv[]){ | |||||||
| 	char *fmt;    /* == fmt_asv (default) or fmt_human (-H) */ | 	char *fmt;    /* == fmt_asv (default) or fmt_human (-H) */ | ||||||
| 	size_t i;     /* side of io being modified */ | 	size_t i;     /* side of io being modified */ | ||||||
| 	char noerror; /* 0=exits (default) 1=retries on partial reads or writes */ | 	char noerror; /* 0=exits (default) 1=retries on partial reads or writes */ | ||||||
| 	struct Io io[2]; | 	struct Io io[2 /* { in, out } */]; | ||||||
| 
 | 
 | ||||||
| 	/* Set defaults. */ | 	/* Set defaults. */ | ||||||
| 	align = -1; | 	align = -1; | ||||||
| 	count = 0; | 	count = 0; | ||||||
| 	fmt = fmt_asv; | 	fmt = fmt_asv; | ||||||
| 	noerror = 0; | 	noerror = 0; | ||||||
| 	for(i = 0; i < 2; ++i){ | 	for(i = 0; i < (sizeof io) / (sizeof *io); ++i){ | ||||||
| 		io[i].bs = 1024 /* 1 KiB */; /* GNU dd(1) default; POSIX says 512B */ | 		io[i].bs = 1024 /* 1 KiB */; /* GNU dd(1) default; POSIX says 512B */ | ||||||
| 		io[i].bufuse = 0; | 		io[i].bufuse = 0; | ||||||
| 		io[i].bytes = 0; | 		io[i].bytes = 0; | ||||||
| 		io[i].fd = i == 0 ? STDIN_FILENO : STDOUT_FILENO; | 		io[i].fd = i == 0 ? STDIN_FILENO : STDOUT_FILENO; | ||||||
| 		io[i].fn = i == 0 ? stdin_name   : stdout_name; | 		io[i].fn = i == 0 ? stdin_name   : stdout_name; | ||||||
| 		io[i].fl = i == 0 ? read_flags   : write_flags; | 		io[i].fl = i == 0 ? read_flags   : write_flags; | ||||||
|  | 		io[i].error = 0; | ||||||
| 		io[i].prec = 0; | 		io[i].prec = 0; | ||||||
| 		io[i].rec = 0; | 		io[i].rec = 0; | ||||||
| 		io[i].seek = 0; | 		io[i].seek = 0; | ||||||
| @ -227,10 +232,10 @@ int main(int argc, char *argv[]){ | |||||||
| 	if(argc > optind) | 	if(argc > optind) | ||||||
| 		return usage(program_name); | 		return usage(program_name); | ||||||
| 
 | 
 | ||||||
| 	for(i = 0; i < 2; ++i){ | 	for(i = 0; i < (sizeof io) / (sizeof *io); ++i){ | ||||||
| 		/* buffer allocation */ | 		/* buffer allocation */ | ||||||
| 		if((io[i].buf = malloc(io[i].bs * (sizeof *(io[i].buf)))) == NULL){ | 		if((io[i].buf = malloc(io[i].bs * (sizeof *(io[i].buf)))) == NULL){ | ||||||
| 			fprintf(stderr, "%s: Failed to allocate %d bytes\n", | 			fprintf(stderr, "%s: Failed to allocate %zd bytes\n", | ||||||
| 				program_name, io[i].bs); | 				program_name, io[i].bs); | ||||||
| 			return EX_OSERR; | 			return EX_OSERR; | ||||||
| 		} | 		} | ||||||
| @ -245,7 +250,7 @@ int main(int argc, char *argv[]){ | |||||||
| 		do{ | 		do{ | ||||||
| 			memset(io[1].buf, '\0', | 			memset(io[1].buf, '\0', | ||||||
| 				(t = io[1].bufuse = MIN(io[1].bs, io[1].seek))); | 				(t = io[1].bufuse = MIN(io[1].bs, io[1].seek))); | ||||||
| 			if(Io_write(&io[1])->bufuse == t && !noerror) | 			if(Io_write(&io[1])->bufuse == t && !noerror && !io[1].error) | ||||||
| 				Io_write(&io[1]); /* second chance */ | 				Io_write(&io[1]); /* second chance */ | ||||||
| 		}while((io[1].seek -= (t - io[1].bufuse)) > 0 && io[1].bufuse != t); | 		}while((io[1].seek -= (t - io[1].bufuse)) > 0 && io[1].bufuse != t); | ||||||
| 		io[1].bufuse = 0; | 		io[1].bufuse = 0; | ||||||
| @ -268,7 +273,7 @@ int main(int argc, char *argv[]){ | |||||||
| 				io[0].bufuse = io[0].bs - io[0].seek; | 				io[0].bufuse = io[0].bs - io[0].seek; | ||||||
| 
 | 
 | ||||||
| 			t = io[0].bufuse; | 			t = io[0].bufuse; | ||||||
| 			if(Io_read(&io[0])->bufuse == t && !noerror) | 			if(Io_read(&io[0])->bufuse == t && !noerror && io[0].error) | ||||||
| 				Io_read(&io[0]); /* second chance */ | 				Io_read(&io[0]); /* second chance */ | ||||||
| 			assert(io[0].bufuse >= t); | 			assert(io[0].bufuse >= t); | ||||||
| 			if(io[0].bufuse == t) /* that's all she wrote */ | 			if(io[0].bufuse == t) /* that's all she wrote */ | ||||||
| @ -322,7 +327,7 @@ int main(int argc, char *argv[]){ | |||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
| 			t = io[1].bufuse; | 			t = io[1].bufuse; | ||||||
| 			if(Io_write(&io[1])->bufuse == t && !noerror) | 			if(Io_write(&io[1])->bufuse == t && !noerror && !io[1].error) | ||||||
| 				Io_write(&io[1]); /* second chance */ | 				Io_write(&io[1]); /* second chance */ | ||||||
| 			assert(io[1].bufuse <= t); | 			assert(io[1].bufuse <= t); | ||||||
| 			if(io[1].bufuse == t){ /* no more love */ | 			if(io[1].bufuse == t){ /* no more love */ | ||||||
| @ -341,5 +346,9 @@ int main(int argc, char *argv[]){ | |||||||
| 
 | 
 | ||||||
| 	fprintio(stderr, fmt, io); | 	fprintio(stderr, fmt, io); | ||||||
| 
 | 
 | ||||||
|  | 	for(i = 0; i < (sizeof io) / (sizeof *io); ++i) | ||||||
|  | 		if(io[i].error) | ||||||
|  | 			return oserr(io[i].fn); | ||||||
|  | 
 | ||||||
| 	return EX_OK; | 	return EX_OK; | ||||||
| } | } | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user