int main() { /* using volatile variables so we can example core dumps */ struct Address *addr; char buffer[255]; int port; for (volatile unsigned int i = 0; i < sizeof(good) / sizeof(struct Test); i++) { addr = new_address(good[i].input); assert(addr != NULL); if (good[i].expected_type & TYPE_HOSTNAME && !address_is_hostname(addr)) { fprintf(stderr, "Expected %s to be a hostname\n", buffer); return 1; } if (good[i].expected_type & TYPE_SOCKADDR && !address_is_sockaddr(addr)) { fprintf(stderr, "Expected %s to be a sockaddr\n", buffer); return 1; } if (good[i].expected_type & TYPE_WILDCARD && !address_is_wildcard(addr)) { fprintf(stderr, "Expected %s to be a wildcard\n", buffer); return 1; } display_address(addr, buffer, sizeof(buffer)); if (strcmp(buffer, good[i].output)) { fprintf(stderr, "display_address(%p) returned \"%s\", expected \"%s\"\n", addr, buffer, good[i].output); return 1; } port = address_port(addr); if (good[i].port != port) { fprintf(stderr, "address_port(%p) return %d, expected %d\n", addr, port, good[i].port); return 1; } free(addr); } for (volatile unsigned int i = 0; i < sizeof(bad) / sizeof(const char *); i++) { addr = new_address(bad[i]); if (addr != NULL) { fprintf(stderr, "Accepted bad hostname \"%s\"\n", bad[i]); return 1; } } return 0; }
int accept_listener_fallback_address(struct Listener *listener, char *fallback) { if (listener->fallback_address != NULL) { err("Duplicate fallback address: %s", fallback); return 0; } struct Address *fallback_address = new_address(fallback); if (fallback_address == NULL) { err("Unable to parse fallback address: %s", fallback); return 0; } else if (address_is_sockaddr(fallback_address)) { listener->fallback_address = fallback_address; return 1; } else if (address_is_hostname(fallback_address)) { #ifndef HAVE_LIBUDNS err("Only fallback socket addresses permitted when compiled without libudns"); free(fallback_address); return 0; #else warn("Using hostname as fallback address is strongly discouraged"); listener->fallback_address = fallback_address; return 1; #endif } else if (address_is_wildcard(fallback_address)) { /* The wildcard functionality requires successfully parsing the * hostname from the client's request, if we couldn't find the * hostname and are using a fallback address it doesn't make * much sense to configure it as a wildcard. */ err("Wildcard address prohibited as fallback address"); free(fallback_address); return 0; } else { fatal("Unexpected fallback address type"); return 0; } }
int main() { /* using volatile variables so we can example core dumps */ for (volatile unsigned int i = 0; i < sizeof(good) / sizeof(struct Test); i++) { int port; char buffer[255]; struct Address *addr = new_address(good[i].input); assert(addr != NULL); assert(address_compare(addr, addr) == 0); assert(address_compare(NULL, addr) < 0); assert(address_compare(addr, NULL) > 0); assert(address_len(addr) > 0); if (good[i].expected_type & TYPE_HOSTNAME) { assert(address_is_hostname(addr)); assert(!address_is_sockaddr(addr)); assert(!address_is_wildcard(addr)); assert(address_hostname(addr) != NULL); assert(address_sa(addr) == NULL); assert(address_sa_len(addr) == 0); } else if (good[i].expected_type & TYPE_SOCKADDR) { assert(!address_is_hostname(addr)); assert(address_is_sockaddr(addr)); assert(!address_is_wildcard(addr)); assert(address_hostname(addr) == NULL); assert(address_sa(addr) != NULL); assert(address_sa_len(addr) > 0); } else if (good[i].expected_type & TYPE_WILDCARD) { assert(!address_is_hostname(addr)); assert(!address_is_sockaddr(addr)); assert(address_is_wildcard(addr)); assert(address_hostname(addr) == NULL); assert(address_sa(addr) == NULL); assert(address_sa_len(addr) == 0); } display_address(addr, buffer, sizeof(buffer)); if (strcmp(buffer, good[i].output)) { fprintf(stderr, "display_address(%p) returned \"%s\", expected \"%s\"\n", addr, buffer, good[i].output); return 1; } assert(display_address(addr, NULL, 0) == NULL); port = address_port(addr); if (good[i].port != port) { fprintf(stderr, "address_port(%p) return %d, expected %d\n", addr, port, good[i].port); return 1; } address_set_port(addr, port); if (good[i].port != port) { fprintf(stderr, "address_port(%p) return %d, expected %d\n", addr, port, good[i].port); return 1; } free(addr); } for (volatile unsigned int i = 0; i < sizeof(bad) / sizeof(const char *); i++) { struct Address *addr = new_address(bad[i]); if (addr != NULL) { fprintf(stderr, "Accepted bad hostname \"%s\"\n", bad[i]); return 1; } } assert(compare_address_strings("unix:/dev/log", "127.0.0.1") < 0); assert(compare_address_strings("unix:/dev/log", "unix:/dev/logsocket") < 0); assert(compare_address_strings("0.0.0.0", "127.0.0.1") < 0); assert(compare_address_strings("127.0.0.1", "0.0.0.0") > 0); assert(compare_address_strings("127.0.0.1", "127.0.0.1") == 0); assert(compare_address_strings("127.0.0.1:80", "127.0.0.1:81") < 0); assert(compare_address_strings("*:80", "*:81") < 0); assert(compare_address_strings("*:81", "*:80") > 0); assert(compare_address_strings("example.com", "example.net") < 0); assert(compare_address_strings("example.net", "example.com") > 0); assert(compare_address_strings("example.com", "example.com.net") < 0); assert(compare_address_strings("example.com.net", "example.com") > 0); assert(compare_address_strings("example.com", "example.com:80") < 0); assert(compare_address_strings("example.com:80", "example.com") > 0); assert(compare_address_strings(NULL, "example.com") < 0); assert(compare_address_strings("example.com", NULL) > 0); assert(compare_address_strings("example.com", "::") < 0); assert(compare_address_strings("::", "example.com") > 0); assert(compare_address_strings("0.0.0.0", "*") < 0); assert(compare_address_strings("*", "0.0.0.0") > 0); do { struct Address *addr = new_address("*"); assert(addr != NULL); assert(address_len(addr) > 0); free(addr); } while (0); return 0; }