forked from bonsai/harakit
		
	dj(1): refactor Io_fdseek
This commit is contained in:
		
							parent
							
								
									45a880455d
								
							
						
					
					
						commit
						66f5498232
					
				
							
								
								
									
										27
									
								
								src/dj.c
									
									
									
									
									
								
							
							
						
						
									
										27
									
								
								src/dj.c
									
									
									
									
									
								
							@ -156,18 +156,15 @@ Io_fdopen(struct Io *io, char *fn){
 | 
			
		||||
	return fd;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Seeks io->seek bytes through *io's file descriptor, (counter-intuitively)
 | 
			
		||||
 * returning -1 if successful and a sysexits.h exit code if an unrecoverable
 | 
			
		||||
 * error occurred. io->buf will be cleared of useful bytes and io->seek will
 | 
			
		||||
 * be set to zero to indicate the seek occurred. */
 | 
			
		||||
static int
 | 
			
		||||
/* Seeks io->seek bytes through *io's file descriptor, subtracting the number
 | 
			
		||||
 * of sought bytes from io->seek. This procedure leaves garbage in io->buf. */
 | 
			
		||||
static void
 | 
			
		||||
Io_fdseek(struct Io *io){
 | 
			
		||||
	int (*op)(int, void *, size_t);
 | 
			
		||||
	
 | 
			
		||||
	if(!fdisstd(io->fd) && lseek(io->fd, io->seek, SEEK_SET) != -1)
 | 
			
		||||
		return -1;
 | 
			
		||||
	if(io->seek != 0
 | 
			
		||||
			|| (!fdisstd(io->fd) && lseek(io->fd, io->seek, SEEK_SET) != -1))
 | 
			
		||||
		return;
 | 
			
		||||
 | 
			
		||||
	/* repeated code to get the condition out of the loop */
 | 
			
		||||
	if(io->fl == write_flags){
 | 
			
		||||
		memset(io->buf, '\0', io->bs);
 | 
			
		||||
		/* We're going to cheat and use bufuse as the retval for write(2),
 | 
			
		||||
@ -186,12 +183,11 @@ Io_fdseek(struct Io *io){
 | 
			
		||||
				/* second chance */
 | 
			
		||||
				io->bufuse = read(io->fd, io->buf, MIN(io->bs, io->seek));
 | 
			
		||||
		}while((io->seek -= io->bufuse) > 0 && io->bufuse != 0);
 | 
			
		||||
	}else
 | 
			
		||||
		return EX_SOFTWARE;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	io->bufuse = 0;
 | 
			
		||||
 | 
			
		||||
	return -1;
 | 
			
		||||
	return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Reads io->bs bytes from *io's file descriptor into io->buf, storing the
 | 
			
		||||
@ -352,11 +348,10 @@ int main(int argc, char *argv[]){
 | 
			
		||||
			terminate(ep);
 | 
			
		||||
			return EX_OSERR;
 | 
			
		||||
		}else if(ep[i].seek > 0)
 | 
			
		||||
			switch(Io_fdseek(&ep[i])){
 | 
			
		||||
			case EX_OK:
 | 
			
		||||
				output(ep, fmt_output);
 | 
			
		||||
			Io_fdseek(&ep[i]);
 | 
			
		||||
			if(ep[i].seek > 0){
 | 
			
		||||
				terminate(ep);
 | 
			
		||||
				return EX_OK;
 | 
			
		||||
				return oserr(ep[i].fn);
 | 
			
		||||
			}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user