/* -*- c-file-style: "linux" -*-
Copyright (C) 1998-2001 by Andrew Tridgell <tridge@samba.org>
+ Copyright (C) 2001 by Martin Pool <mbp@samba.org>
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
hp = gethostbyname(h);
if (!hp) {
- rprintf(FERROR,"unknown host: %s\n", h);
+ rprintf(FERROR,"unknown host: \"%s\"\n", h);
close(res);
return -1;
}
{
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;
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++) {
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) {
/* 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;
}
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;
}