summaryrefslogtreecommitdiff
path: root/src/mod_proxy_core_address.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mod_proxy_core_address.c')
-rw-r--r--src/mod_proxy_core_address.c210
1 files changed, 0 insertions, 210 deletions
diff --git a/src/mod_proxy_core_address.c b/src/mod_proxy_core_address.c
deleted file mode 100644
index 0978c9d1..00000000
--- a/src/mod_proxy_core_address.c
+++ /dev/null
@@ -1,210 +0,0 @@
-#include <stdlib.h>
-#include <string.h>
-
-#include "log.h"
-#include "sys-socket.h"
-#include "mod_proxy_core_address.h"
-
-static proxy_address *proxy_address_init(void) {
- proxy_address *address;
-
- address = calloc(1, sizeof(*address));
-
- address->name = buffer_init();
- address->used = 0;
-
- return address;
-}
-
-static void proxy_address_free(proxy_address *address) {
- if (!address) return;
-
- buffer_free(address->name);
-
- free(address);
-}
-
-
-proxy_address_pool *proxy_address_pool_init(void) {
- proxy_address_pool *address_pool;
-
- address_pool = calloc(1, sizeof(*address_pool));
-
- return address_pool;
-}
-
-void proxy_address_pool_free(proxy_address_pool *address_pool) {
- if (!address_pool) return;
-
- ARRAY_STATIC_FREE(address_pool, proxy_address, element, proxy_address_free(element));
-
- free(address_pool);
-}
-
-void proxy_address_pool_add(proxy_address_pool *address_pool, proxy_address *address) {
- size_t i;
-
- /* check if this address is already known */
-
- for (i = 0; i < address_pool->used; i++) {
- proxy_address *pool_address = address_pool->ptr[i];
-
- if (buffer_is_equal(address->name, pool_address->name)) {
- /* TRACE("%s is already in the address-pool", SAFE_BUF_STR(address->name)); */
-
- proxy_address_free(address);
-
- return;
- }
- }
-
- /* TRACE("adding %s to the address-pool", SAFE_BUF_STR(address->name)); */
-
- ARRAY_STATIC_PREPARE_APPEND(address_pool);
-
- address_pool->ptr[address_pool->used++] = address;
-}
-
-int proxy_address_pool_add_string(proxy_address_pool *address_pool, buffer *name) {
- struct addrinfo *res = NULL, pref, *cur;
- int ret;
- buffer *hostname = NULL, *port = NULL;
- char *colon;
-
- pref.ai_flags = 0;
- pref.ai_family = PF_UNSPEC;
- pref.ai_socktype = SOCK_STREAM;
- pref.ai_protocol = 0;
- pref.ai_addrlen = 0;
- pref.ai_addr = NULL;
- pref.ai_canonname = NULL;
- pref.ai_next = NULL;
-
- /* check the address style
- *
- * unix:/tmp/socket
- * www.example.org
- * www.example.org:80
- * 127.0.0.1
- * 127.0.0.1:80
- * [::1]:80
- * [::1]
- */
-
- if (buffer_is_empty(name)) return -1;
-
- if (0 == strncmp(BUF_STR(name), "unix:", 5)) {
- /* a unix domain socket */
-#ifdef HAVE_SYS_UN_H
- proxy_address *a = proxy_address_init();
-
- /* setup AF_UNIX sockaddr */
- a->addr.un.sun_family = AF_UNIX;
- strcpy(a->addr.un.sun_path, BUF_STR(name) + 5);
- a->addrlen = sizeof(a->addr.un);
-/*
-#ifdef SUN_LEN
- a->addrlen = SUN_LEN(&(a->addr.un));
-#else
- a->addrlen = (name->used - 5) + sizeof(a->addr.un.sun_family);
-#endif
-*/
-
- a->state = PROXY_ADDRESS_STATE_ACTIVE;
- buffer_copy_string_buffer(a->name, name);
-
- proxy_address_pool_add(address_pool, a);
- return 0;
-#else
- ERROR("unix: scheme is not supported for %s", SAFE_BUF_STR(name));
- return -1;
-#endif
- } else if (name->ptr[0] == '[') {
- if (name->ptr[name->used - 1] == ']') {
- /* no port-number attached */
-
- hostname = buffer_init();
- buffer_copy_string_len(hostname, BUF_STR(name) + 1, name->used - 3);
- port = buffer_init_string("80");
- } else if (NULL != (colon = strrchr(BUF_STR(name), ':'))) {
- /* with port number */
-
- hostname = buffer_init();
- buffer_copy_string_len(hostname, BUF_STR(name) + 1, colon - BUF_STR(name) - 2);
- port = buffer_init();
- buffer_copy_string(port, colon + 1);
-
- } else {
- ERROR("this is neither [<ipv6-address>] nor [<ipv6-address>]:<port>: %s", SAFE_BUF_STR(name));
-
- return -1;
- }
- } else if (name->ptr[name->used - 1] != ']' &&
- NULL != (colon = strrchr(BUF_STR(name), ':'))) {
-
- hostname = buffer_init();
- buffer_copy_string_len(hostname, BUF_STR(name), colon - BUF_STR(name));
- port = buffer_init();
- buffer_copy_string(port, colon + 1);
- } else {
- /* no colon, just a IPv4 address or a domain name */
-
- hostname = buffer_init_string(BUF_STR(name));
- port = buffer_init_string("80");
- }
-
- /* TRACE("resolving %s on port %s", SAFE_BUF_STR(hostname), SAFE_BUF_STR(port)); */
-
- if (0 != (ret = getaddrinfo(BUF_STR(hostname), BUF_STR(port), &pref, &res))) {
- ERROR("getaddrinfo failed: %s", gai_strerror(ret));
-
- buffer_free(hostname);
- buffer_free(port);
-
- return -1;
- }
-
- buffer_free(hostname);
- buffer_free(port);
-
- for (cur = res; cur; cur = cur->ai_next) {
- proxy_address *a = proxy_address_init();
-
- memcpy(&(a->addr), cur->ai_addr, cur->ai_addrlen);
- a->addrlen = cur->ai_addrlen;
-
- a->state = PROXY_ADDRESS_STATE_ACTIVE;
- buffer_prepare_copy(a->name, 128);
-
- switch (cur->ai_family) {
-#ifdef HAVE_IPV6
- case AF_INET6:
- a->name->ptr[0] = '[';
- inet_ntop(cur->ai_family, &(a->addr.ipv6.sin6_addr), a->name->ptr + 1, a->name->size - 2);
- a->name->used = strlen(a->name->ptr) + 1;
- buffer_append_string_len(a->name, CONST_STR_LEN("]:"));
- buffer_append_long(a->name, ntohs(a->addr.ipv6.sin6_port));
- break;
-#endif
- case AF_INET:
- inet_ntop(cur->ai_family, &(a->addr.ipv4.sin_addr), a->name->ptr, a->name->size - 1);
- a->name->used = strlen(a->name->ptr) + 1;
-
- buffer_append_string_len(a->name, CONST_STR_LEN(":"));
- buffer_append_long(a->name, ntohs(a->addr.ipv4.sin_port));
- break;
- default:
- ERROR("unknown address-family: %d", cur->ai_family);
- return -1;
- }
-
-
- proxy_address_pool_add(address_pool, a);
- }
-
- freeaddrinfo(res);
-
- return 0;
-}
-
-