static int ip2addr(const char *ip, unsigned short port, ACL_SOCKADDR *saddr) { memset(saddr, 0, sizeof(ACL_SOCKADDR)); if (acl_valid_ipv4_hostaddr(ip, 0)) { saddr->sa.sa_family = AF_INET; saddr->in.sin_port = htons(port); if (inet_pton(AF_INET, ip, &saddr->in.sin_addr) == 1) { return 1; } acl_msg_error("%s(%d): invalid ip=%s", __FUNCTION__, __LINE__, ip); } #ifdef AF_INET6 else if (acl_valid_ipv6_hostaddr(ip, 0)) { saddr->sa.sa_family = AF_INET6; saddr->in6.sin6_port = htons(port); if (inet_pton(AF_INET6, ip, &saddr->in6.sin6_addr) == 1) { return 1; } acl_msg_error("%s(%d): invalid ip=%s", __FUNCTION__, __LINE__, ip); } #endif return 0; }
size_t acl_sane_pton(const char *src, struct sockaddr *dst) { int af; if (acl_valid_ipv4_hostaddr(src, 0)) { af = AF_INET; } else if (acl_valid_ipv6_hostaddr(src, 0)) { af = AF_INET6; } else if (acl_valid_unix(src)) { af = AF_UNIX; } else { return 0; } return acl_inet_pton(af, src, dst); }
int acl_valid_hostaddr(const char *addr, int gripe) { const char *myname = "acl_valid_hostaddr"; /* * Trivial cases first. */ if (*addr == 0) { if (gripe) acl_msg_warn("%s: empty address", myname); return (0); } /* * Protocol-dependent processing next. */ if (strchr(addr, ':') != 0) return (acl_valid_ipv6_hostaddr(addr, gripe)); else return (acl_valid_ipv4_hostaddr(addr, gripe)); }
int acl_valid_hostname(const char *name, int gripe) { char *myname = "acl_valid_hostname"; const char *cp; int label_length = 0; int label_count = 0; int non_numeric = 0; int ch; /* * Trivial cases first. */ if (*name == 0) { if (gripe) acl_msg_warn("%s: empty hostname", myname); return (0); } /* * Find bad characters or label lengths. Find adjacent delimiters. */ for (cp = name; (ch = *(const unsigned char *) cp) != 0; cp++) { if (ACL_ISALNUM(ch) || ch == '_') { /* grr.. */ if (label_length == 0) label_count++; label_length++; if (label_length > ACL_VALID_LABEL_LEN) { if (gripe) acl_msg_warn("%s: hostname label" " too long: %.100s", myname, name); return (0); } if (!ACL_ISDIGIT(ch)) non_numeric = 1; } else if (ch == '.') { if (label_length == 0 || cp[1] == 0) { if (gripe) acl_msg_warn("%s: misplaced delimiter:" " %.100s", myname, name); return (0); } label_length = 0; } else if (ch == '-') { label_length++; if (label_length == 1 || cp[1] == 0 || cp[1] == '.') { if (gripe) acl_msg_warn("%s: misplaced hyphen:" " %.100s", myname, name); return (0); } } #ifdef SLOPPY_VALID_HOSTNAME else if (ch == ':' && acl_valid_ipv6_hostaddr(name, ACL_DONT_GRIPE)) { non_numeric = 0; break; } #endif else { if (gripe) acl_msg_warn("%s: invalid character %d(decimal): %.100s", myname, ch, name); return (0); } } if (non_numeric == 0) { if (gripe) acl_msg_warn("%s: numeric hostname: %.100s", myname, name); #ifndef SLOPPY_VALID_HOSTNAME return (0); #endif } if (cp - name > ACL_VALID_HOSTNAME_LEN) { if (gripe) acl_msg_warn("%s: bad length %d for %.100s...", myname, (int) (cp - name), name); return (0); } return (1); }
int acl_is_ipv6(const char *ip) { return acl_valid_ipv6_hostaddr(ip, 0); }