X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/d58911fb37252f7cf593aee482556fbbf4f75c92..add7e8fb6ba143bfb3f8aa2ac1e2c01734ab8e81:/socket.c diff --git a/socket.c b/socket.c index 23292cd5..d630fdba 100644 --- a/socket.c +++ b/socket.c @@ -1,6 +1,7 @@ /* -*- c-file-style: "linux" -*- Copyright (C) 1998-2001 by Andrew Tridgell + Copyright (C) 2001 by Martin Pool 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 @@ -134,7 +135,7 @@ int open_socket_out(char *host, int port, struct in_addr *address) hp = gethostbyname(h); if (!hp) { - rprintf(FERROR,"unknown host: %s\n", h); + rprintf(FERROR,"unknown host: \"%s\"\n", h); close(res); return -1; } @@ -443,7 +444,7 @@ char *client_addr(int fd) { struct sockaddr sa; struct sockaddr_in *sockin = (struct sockaddr_in *) (&sa); - int length = sizeof(sa); + socklen_t length = sizeof(sa); static char addr_buf[100]; static int initialised; @@ -496,7 +497,7 @@ char *client_name(int fd) hp = gethostbyname(name_buf); if (!hp) { strcpy (name_buf,def); - rprint (FERROR, "reverse name lookup for \"%s\" failed\n", + rprintf (FERROR, "reverse name lookup for \"%s\" failed\n", name_buf); } else { for (p=hp->h_addr_list;*p;p++) { @@ -525,7 +526,10 @@ struct in_addr *ip_address(const char *str) static struct in_addr ret; struct hostent *hp; - assert (str); + if (!str) { + rprintf (FERROR, "ip_address received NULL name\n"); + return NULL; + } /* try as an IP address */ if (inet_aton(str, &ret) != 0) { @@ -534,7 +538,7 @@ 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) { + if ((hp = gethostbyname (str)) == 0) { rprintf(FERROR, "gethostbyname failed for \"%s\": unknown host?\n",str); return NULL; } @@ -544,13 +548,28 @@ struct in_addr *ip_address(const char *str) return NULL; } - if (hp->h_length > sizeof(ret)) { + if (hp->h_length > sizeof ret) { rprintf(FERROR, "gethostbyname: host address for \"%s\" is too large\n", str); return NULL; } - memcpy(&ret.s_addr, hp->h_addr, hp->h_length); + if (hp->h_addrtype != AF_INET) { + rprintf (FERROR, "gethostname: host address for \"%s\" is not IPv4\n", + str); + return NULL; + } + + /* This is kind of difficult. The only field in ret is + s_addr, which is the IP address as a 32-bit int. On + UNICOS, s_addr is in fact a *bitfield* for reasons best + know to Cray. This means we can't memcpy in to it. On the + other hand, h_addr is a char*, so we can't just assign. + + Since there's meant to be only one field inside the in_addr + structure we will try just copying over the top and see how + that goes. */ + memcpy (&ret, hp->h_addr, hp->h_length); - return(&ret); + return &ret; }