X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/c46ded46212c2ea55e43ec661b5a724718a63ec2..b5f9e67d57f4e507dcb339a838c959244951f25f:/socket.c diff --git a/socket.c b/socket.c index 674e3d7f..6fd4e365 100644 --- a/socket.c +++ b/socket.c @@ -54,6 +54,8 @@ int open_socket_out(char *host, int port) return -1; } + set_nonblocking(res); + return res; } @@ -110,9 +112,9 @@ determine if a file descriptor is in fact a socket ****************************************************************************/ int is_a_socket(int fd) { - int v,l; - l = sizeof(int); - return(getsockopt(fd, SOL_SOCKET, SO_TYPE, (char *)&v, &l) == 0); + int v,l; + l = sizeof(int); + return(getsockopt(fd, SOL_SOCKET, SO_TYPE, (char *)&v, &l) == 0); } @@ -123,12 +125,12 @@ void start_accept_loop(int port, int (*fn)(int )) /* open an incoming socket */ s = open_socket_in(SOCK_STREAM, port); if (s == -1) - exit_cleanup(1); + exit_cleanup(RERR_SOCKETIO); /* ready to listen */ if (listen(s, 5) == -1) { close(s); - exit_cleanup(1); + exit_cleanup(RERR_SOCKETIO); } @@ -165,6 +167,8 @@ void start_accept_loop(int port, int (*fn)(int )) if (fork()==0) { close(s); + set_nonblocking(fd); + _exit(fn(fd)); } @@ -316,13 +320,17 @@ char *client_addr(int fd) struct sockaddr_in *sockin = (struct sockaddr_in *) (&sa); int length = sizeof(sa); static char addr_buf[100]; + static int initialised; + + if (initialised) return addr_buf; + + initialised = 1; if (getpeername(fd, &sa, &length)) { - exit_cleanup(1); + exit_cleanup(RERR_SOCKETIO); } - + strlcpy(addr_buf,(char *)inet_ntoa(sockin->sin_addr), sizeof(addr_buf)-1); - return addr_buf; } @@ -339,11 +347,16 @@ char *client_name(int fd) struct hostent *hp; char **p; char *def = "UNKNOWN"; + static int initialised; + + if (initialised) return name_buf; + + initialised = 1; strcpy(name_buf,def); if (getpeername(fd, &sa, &length)) { - exit_cleanup(1); + exit_cleanup(RERR_SOCKETIO); } /* Look up the remote host name. */