X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/8950ac03f8fd0fb645c7d2374195ea884d091f72..fab9a9c54729984199d20b637ea8cc163c73d2e2:/socket.c diff --git a/socket.c b/socket.c index 7865e31e..81bdb399 100644 --- a/socket.c +++ b/socket.c @@ -170,34 +170,19 @@ open a socket of the specified type, port and address for incoming data ****************************************************************************/ static int open_socket_in(int type, int port, struct in_addr *address) { - struct hostent *hp; struct sockaddr_in sock; - char host_name[MAXHOSTNAMELEN]; int res; int one=1; - /* get my host name */ - if (gethostname(host_name, sizeof(host_name)) == -1) { - rprintf(FERROR,"gethostname failed\n"); - return -1; - } - - /* get host info */ - if ((hp = gethostbyname(host_name)) == 0) { - rprintf(FERROR,"gethostbyname: Unknown host %s\n",host_name); - return -1; - } - memset((char *)&sock,0,sizeof(sock)); - memcpy((char *)&sock.sin_addr,(char *)hp->h_addr, hp->h_length); sock.sin_port = htons(port); - sock.sin_family = hp->h_addrtype; + sock.sin_family = AF_INET; if (address) { sock.sin_addr = *address; } else { sock.sin_addr.s_addr = INADDR_ANY; } - res = socket(hp->h_addrtype, type, 0); + res = socket(AF_INET, type, 0); if (res == -1) { rprintf(FERROR,"socket failed: %s\n", strerror(errno)); @@ -210,6 +195,10 @@ static int open_socket_in(int type, int port, struct in_addr *address) if (bind(res, (struct sockaddr * ) &sock,sizeof(sock)) == -1) { rprintf(FERROR,"bind failed on port %d: %s\n", port, strerror(errno)); + if (errno == EACCES && port < 1024) { + rprintf(FERROR, "Note: you must be root to bind " + "to low-numbered ports"); + } close(res); return -1; } @@ -223,13 +212,14 @@ static int open_socket_in(int type, int port, struct in_addr *address) */ int is_a_socket(int fd) { - int v, l; + int v; + socklen_t l; l = sizeof(int); /* Parameters to getsockopt, setsockopt etc are very * unstandardized across platforms, so don't be surprised if - * there are compiler warnings on e.g. SCO OpenSwerver. It - * seems they all eventually get the right idea. + * there are compiler warnings on e.g. SCO OpenSwerver or AIX. + * It seems they all eventually get the right idea. * * Debian says: ``The fifth argument of getsockopt and * setsockopt is in reality an int [*] (and this is what BSD @@ -266,7 +256,7 @@ void start_accept_loop(int port, int (*fn)(int )) fd_set fds; int fd; struct sockaddr addr; - int in_addrlen = sizeof(addr); + socklen_t in_addrlen = sizeof(addr); /* close log file before the potentially very long select so file can be trimmed by another process instead of growing @@ -283,7 +273,7 @@ void start_accept_loop(int port, int (*fn)(int )) if(!FD_ISSET(s, &fds)) continue; /* See note above prototypes. */ - fd = accept(s,&addr,&in_addrlen); + fd = accept(s,&addr, &in_addrlen); if (fd == -1) continue; @@ -477,7 +467,7 @@ char *client_name(int fd) { struct sockaddr sa; struct sockaddr_in *sockin = (struct sockaddr_in *) (&sa); - int length = sizeof(sa); + socklen_t length = sizeof(sa); static char name_buf[100]; struct hostent *hp; char **p;