+
+/**
+ 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;
+ }
+
+ /* otherwise assume it's a network name of some sort and use
+ gethostbyname */
+ if ((hp = gethostbyname(str)) == 0) {
+ 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);
+ return NULL;
+ }
+
+ 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);
+
+ return(&ret);
+}