X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/546434f8671d3137a7bb9347395111a8043d1f59..d58911fb37252f7cf593aee482556fbbf4f75c92:/socket.c diff --git a/socket.c b/socket.c index 00a0b944..23292cd5 100644 --- a/socket.c +++ b/socket.c @@ -1,6 +1,6 @@ /* -*- c-file-style: "linux" -*- - Copyright (C) 1998-2001 by Andrew Tridgell + Copyright (C) 1998-2001 by Andrew Tridgell This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -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)); @@ -510,8 +495,9 @@ char *client_name(int fd) /* do a forward lookup as well to prevent spoofing */ hp = gethostbyname(name_buf); if (!hp) { - strcpy(name_buf,def); - rprintf(FERROR,"reverse name lookup failed\n"); + strcpy (name_buf,def); + rprint (FERROR, "reverse name lookup for \"%s\" failed\n", + name_buf); } else { for (p=hp->h_addr_list;*p;p++) { if (memcmp(*p, &sockin->sin_addr, hp->h_length) == 0) { @@ -527,15 +513,20 @@ char *client_name(int fd) return name_buf; } -/******************************************************************* -convert a string to an IP address. The string can be a name or -dotted decimal number - ******************************************************************/ +/** + Convert a string to an IP address. The string can be a name or + dotted decimal number. + + Returns a pointer to a static in_addr struct -- if you call this + more than once then you should copy it. +*/ struct in_addr *ip_address(const char *str) { static struct in_addr ret; struct hostent *hp; + assert (str); + /* try as an IP address */ if (inet_aton(str, &ret) != 0) { return &ret; @@ -544,17 +535,18 @@ struct in_addr *ip_address(const char *str) /* otherwise assume it's a network name of some sort and use gethostbyname */ if ((hp = gethostbyname(str)) == 0) { - rprintf(FERROR, "gethostbyname: Unknown host. %s\n",str); + rprintf(FERROR, "gethostbyname failed for \"%s\": unknown host?\n",str); return NULL; } if (hp->h_addr == NULL) { - rprintf(FERROR, "gethostbyname: host address is invalid for host %s\n",str); + rprintf(FERROR, "gethostbyname: host address is invalid for host \"%s\"\n",str); return NULL; } if (hp->h_length > sizeof(ret)) { - rprintf(FERROR, "gethostbyname: host address is too large\n"); + rprintf(FERROR, "gethostbyname: host address for \"%s\" is too large\n", + str); return NULL; }