static int
init_subnetwork(nfs_client *clp)
{
- struct sockaddr_in sin = {
- .sin_family = AF_INET,
- };
static char slash32[] = "/32";
+ struct addrinfo *ai;
char *cp;
cp = strchr(clp->m_hostname, '/');
cp = slash32;
*cp = '\0';
- sin.sin_addr.s_addr = inet_addr(clp->m_hostname);
- set_addrlist_in(clp, 0, &sin);
+ ai = host_pton(clp->m_hostname);
*cp = '/';
+ if (ai == NULL) {
+ xlog(L_ERROR, "Invalid IP address %s", clp->m_hostname);
+ return false;
+ }
+ set_addrlist(clp, 0, ai->ai_addr);
+ freeaddrinfo(ai);
return init_netmask(clp, cp);
}
int
client_gettype(char *ident)
{
- char *sp;
+ struct addrinfo *ai;
+ char *sp;
if (ident[0] == '\0' || strcmp(ident, "*")==0)
return MCL_ANONYMOUS;
if (*sp == '\\' && sp[1])
sp++;
}
- /* check for N.N.N.N */
- sp = ident;
- if(!isdigit(*sp) || strtoul(sp, &sp, 10) > 255 || *sp != '.') return MCL_FQDN;
- sp++; if(!isdigit(*sp) || strtoul(sp, &sp, 10) > 255 || *sp != '.') return MCL_FQDN;
- sp++; if(!isdigit(*sp) || strtoul(sp, &sp, 10) > 255 || *sp != '.') return MCL_FQDN;
- sp++; if(!isdigit(*sp) || strtoul(sp, &sp, 10) > 255 || *sp != '\0') return MCL_FQDN;
- /* we lie here a bit. but technically N.N.N.N == N.N.N.N/32 :) */
- return MCL_SUBNETWORK;
+
+ /*
+ * Treat unadorned IP addresses as MCL_SUBNETWORK.
+ * Everything else is MCL_FQDN.
+ */
+ ai = host_pton(ident);
+ if (ai != NULL) {
+ freeaddrinfo(ai);
+ return MCL_SUBNETWORK;
+ }
+
+ return MCL_FQDN;
}