mirror of
				https://github.com/clearml/dropbear
				synced 2025-06-26 18:17:32 +00:00 
			
		
		
		
	upgrade atomicio
in order to remove K&R code in atomicio.c now, vwrite comes from atomicio.h
This commit is contained in:
		
							parent
							
								
									37a66fa5b6
								
							
						
					
					
						commit
						ecb4a6173d
					
				
							
								
								
									
										29
									
								
								atomicio.c
									
									
									
									
									
								
							
							
						
						
									
										29
									
								
								atomicio.c
									
									
									
									
									
								
							| @ -1,6 +1,8 @@ | ||||
| /* $OpenBSD: atomicio.c,v 1.17 2006/04/01 05:51:34 djm Exp $ */ | ||||
| /*
 | ||||
|  * Copied from OpenSSH 3.6.1p2. | ||||
|  * Copied from OpenSSH/OpenBSD. | ||||
|  *  | ||||
|  * Copyright (c) 2005 Anil Madhavapeddy. All rights reserved. | ||||
|  * Copyright (c) 1995,1999 Theo de Raadt.  All rights reserved. | ||||
|  * All rights reserved. | ||||
|  * | ||||
| @ -25,39 +27,32 @@ | ||||
|  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
|  */ | ||||
| 
 | ||||
| /* RCSID("OpenBSD: atomicio.c,v 1.10 2001/05/08 22:48:07 markus Exp "); */ | ||||
| #include "includes.h" | ||||
| 
 | ||||
| #include "atomicio.h" | ||||
| 
 | ||||
| /*
 | ||||
|  * ensure all of data on socket comes through. f==read || f==write | ||||
|  * ensure all of data on socket comes through. f==read || f==vwrite | ||||
|  */ | ||||
| ssize_t | ||||
| atomicio(f, fd, _s, n) | ||||
| 	ssize_t (*f) (); | ||||
| 	int fd; | ||||
| 	void *_s; | ||||
| 	size_t n; | ||||
| size_t | ||||
| atomicio(ssize_t (*f) (int, void *, size_t), int fd, void *_s, size_t n) | ||||
| { | ||||
| 	char *s = _s; | ||||
| 	ssize_t res; | ||||
| 	size_t pos = 0; | ||||
| 	ssize_t res; | ||||
| 
 | ||||
| 	while (n > pos) { | ||||
| 		res = (f) (fd, s + pos, n - pos); | ||||
| 		switch (res) { | ||||
| 		case -1: | ||||
| #ifdef EWOULDBLOCK | ||||
| 			if (errno == EINTR || errno == EAGAIN || errno == EWOULDBLOCK) | ||||
| #else | ||||
| 			if (errno == EINTR || errno == EAGAIN) | ||||
| #endif | ||||
| 				continue; | ||||
| 			/* FALLTHROUGH */ | ||||
| 			return 0; | ||||
| 		case 0: | ||||
| 			return (res); | ||||
| 			errno = EPIPE; | ||||
| 			return pos; | ||||
| 		default: | ||||
| 			pos += res; | ||||
| 			pos += (size_t)res; | ||||
| 		} | ||||
| 	} | ||||
| 	return (pos); | ||||
|  | ||||
							
								
								
									
										13
									
								
								atomicio.h
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								atomicio.h
									
									
									
									
									
								
							| @ -1,8 +1,7 @@ | ||||
| /* $OpenBSD: atomicio.h,v 1.7 2006/03/25 22:22:42 djm Exp $ */ | ||||
| 
 | ||||
| /*
 | ||||
|  * Copied from OpenSSH 3.6.1p2, required for loginrec.c | ||||
|  * | ||||
|  * $OpenBSD: atomicio.h,v 1.4 2001/06/26 06:32:46 itojun Exp $ | ||||
|  * Copied from OpenSSH/OpenBSD, required for loginrec.c | ||||
|  * | ||||
|  * Copyright (c) 1995,1999 Theo de Raadt.  All rights reserved. | ||||
|  * All rights reserved. | ||||
| @ -28,9 +27,9 @@ | ||||
|  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
|  */ | ||||
| 
 | ||||
| #include "includes.h" | ||||
| 
 | ||||
| /*
 | ||||
|  * Ensure all of data on socket comes through. f==read || f==write | ||||
|  * Ensure all of data on socket comes through. f==read || f==vwrite | ||||
|  */ | ||||
| ssize_t	atomicio(ssize_t (*)(), int, void *, size_t); | ||||
| size_t	atomicio(ssize_t (*)(int, void *, size_t), int, void *, size_t); | ||||
| 
 | ||||
| #define vwrite (ssize_t (*)(int, void *, size_t))write | ||||
|  | ||||
| @ -130,7 +130,7 @@ static buffer * agent_request(unsigned char type, buffer *data) { | ||||
| 	} | ||||
| 	buf_setpos(payload, 0); | ||||
| 
 | ||||
| 	ret = atomicio(write, fd, buf_getptr(payload, payload->len), payload->len); | ||||
| 	ret = atomicio(vwrite, fd, buf_getptr(payload, payload->len), payload->len); | ||||
| 	if ((size_t)ret != payload->len) { | ||||
| 		TRACE(("write failed fd %d for agent_request, %s", fd, strerror(errno))) | ||||
| 		goto out; | ||||
|  | ||||
| @ -706,7 +706,7 @@ utmp_write_direct(struct logininfo *li, struct utmp *ut) | ||||
| 		} | ||||
| 
 | ||||
| 		(void)lseek(fd, (off_t)(tty * sizeof(struct utmp)), SEEK_SET); | ||||
| 		if (atomicio(write, fd, ut, sizeof(*ut)) != sizeof(*ut)) | ||||
| 		if (atomicio(vwrite, fd, ut, sizeof(*ut)) != sizeof(*ut)) | ||||
| 			dropbear_log(LOG_WARNING, "utmp_write_direct: error writing %s: %s", | ||||
| 			    UTMP_FILE, strerror(errno)); | ||||
| 
 | ||||
| @ -895,7 +895,7 @@ wtmp_write(struct logininfo *li, struct utmp *ut) | ||||
| 		return 0; | ||||
| 	} | ||||
| 	if (fstat(fd, &buf) == 0) | ||||
| 		if (atomicio(write, fd, ut, sizeof(*ut)) != sizeof(*ut)) { | ||||
| 		if (atomicio(vwrite, fd, ut, sizeof(*ut)) != sizeof(*ut)) { | ||||
| 			ftruncate(fd, buf.st_size); | ||||
| 			dropbear_log(LOG_WARNING, "wtmp_write: problem writing %s: %s", | ||||
| 			    WTMP_FILE, strerror(errno)); | ||||
| @ -1062,7 +1062,7 @@ wtmpx_write(struct logininfo *li, struct utmpx *utx) | ||||
| 	} | ||||
| 
 | ||||
| 	if (fstat(fd, &buf) == 0) | ||||
| 		if (atomicio(write, fd, utx, sizeof(*utx)) != sizeof(*utx)) { | ||||
| 		if (atomicio(vwrite, fd, utx, sizeof(*utx)) != sizeof(*utx)) { | ||||
| 			ftruncate(fd, buf.st_size); | ||||
| 			dropbear_log(LOG_WARNING, "wtmpx_write: problem writing %s: %s", | ||||
| 			    WTMPX_FILE, strerror(errno)); | ||||
| @ -1351,7 +1351,7 @@ lastlog_perform_login(struct logininfo *li) | ||||
| 		return(0); | ||||
| 
 | ||||
| 	/* write the entry */ | ||||
| 	if (atomicio(write, fd, &last, sizeof(last)) != sizeof(last)) { | ||||
| 	if (atomicio(vwrite, fd, &last, sizeof(last)) != sizeof(last)) { | ||||
| 		close(fd); | ||||
| 		dropbear_log(LOG_WARNING, "lastlog_write_filemode: Error writing to %s: %s", | ||||
| 		    LASTLOG_FILE, strerror(errno)); | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user