END_TEST START_TEST(create_from_str_1_test) { dpl_addrlist_t *addrlist; dpl_addr_t *addrp = NULL; dpl_status_t r; char *s, ident[INET_ADDRSTRLEN]; /* create the addrlist */ addrlist = dpl_addrlist_create_from_str("4244", "192.168.1.1"); dpl_assert_ptr_not_null(addrlist); /* verify length */ dpl_assert_int_eq(1, dpl_addrlist_count(addrlist)); /* verify getting elements by index */ r = dpl_addrlist_get_nth(addrlist, 0, &addrp); dpl_assert_int_eq(DPL_SUCCESS, r); dpl_assert_ptr_not_null(addrp); dpl_assert_str_eq(addrp->host, "192.168.1.1"); dpl_assert_str_eq(addrp->portstr, "4244"); dpl_assert_ptr_not_null(addrp->h); dpl_assert_int_eq(addrp->h->h_addrtype, AF_INET); inet_ntop(addrp->h->h_addrtype, addrp->h->h_addr, ident, sizeof(ident)); dpl_assert_str_eq(ident, "192.168.1.1"); dpl_assert_int_eq(addrp->port, 4244); /* indexes wrap modulo the count */ r = dpl_addrlist_get_nth(addrlist, 1, &addrp); dpl_assert_ptr_not_null(addrp); dpl_assert_str_eq(addrp->host, "192.168.1.1"); dpl_assert_str_eq(addrp->portstr, "4244"); dpl_assert_ptr_not_null(addrp->h); dpl_assert_int_eq(addrp->h->h_addrtype, AF_INET); inet_ntop(addrp->h->h_addrtype, addrp->h->h_addr, ident, sizeof(ident)); dpl_assert_str_eq(ident, "192.168.1.1"); dpl_assert_int_eq(addrp->port, 4244); r = dpl_addrlist_get_nth(addrlist, 347, &addrp); dpl_assert_ptr_not_null(addrp); dpl_assert_str_eq(addrp->host, "192.168.1.1"); dpl_assert_str_eq(addrp->portstr, "4244"); dpl_assert_ptr_not_null(addrp->h); dpl_assert_int_eq(addrp->h->h_addrtype, AF_INET); inet_ntop(addrp->h->h_addrtype, addrp->h->h_addr, ident, sizeof(ident)); dpl_assert_str_eq(ident, "192.168.1.1"); dpl_assert_int_eq(addrp->port, 4244); /* verify the string form of the addrlist */ s = dpl_addrlist_get(addrlist); dpl_assert_str_eq(s, "192.168.1.1:4244"); free(s); dpl_addrlist_free(addrlist); }
END_TEST /* Passing addrlist=null to various functions fails cleanly */ START_TEST(null_test) { char *s; /* dpl_addrlist_get() has an odd return for this corner case, but whatever */ s = dpl_addrlist_get(NULL); dpl_assert_str_eq(s, ""); free(s); dpl_assert_int_eq(0, dpl_addrlist_count(NULL)); dpl_addrlist_free(NULL); dpl_assert_int_eq(DPL_FAILURE, dpl_addrlist_blacklist(NULL, "192.168.1.32", "80", 30)); dpl_assert_int_eq(DPL_FAILURE, dpl_addrlist_unblacklist(NULL, "192.168.1.32", "80")); dpl_assert_int_eq(DPL_FAILURE, dpl_addrlist_set_from_str(NULL, "192.168.1.32")); dpl_assert_ptr_null(dpl_addrlist_create_from_str(NULL, NULL)); dpl_addrlist_lock(NULL); dpl_addrlist_unlock(NULL); dpl_assert_int_eq(DPL_ENOENT, dpl_addrlist_get_nth(NULL, 1, &s, &s, NULL, NULL)); dpl_assert_int_eq(DPL_FAILURE, dpl_addrlist_add(NULL, "192.168.1.32", "80")); }
END_TEST START_TEST(create_from_str_1_test) { dpl_addrlist_t *addrlist; char *hoststr = NULL; char *portstr = NULL; struct in_addr ipaddr; u_short port; dpl_status_t r; char *s; /* create the addrlist */ addrlist = dpl_addrlist_create_from_str("4244", "192.168.1.1"); dpl_assert_ptr_not_null(addrlist); /* verify length */ dpl_assert_int_eq(1, dpl_addrlist_count(addrlist)); /* verify getting elements by index */ hoststr = portstr = NULL; memset(&ipaddr, 0, sizeof(ipaddr)); port = 0; r = dpl_addrlist_get_nth(addrlist, 0, &hoststr, &portstr, &ipaddr, &port); dpl_assert_int_eq(DPL_SUCCESS, r); dpl_assert_str_eq(hoststr, "192.168.1.1"); dpl_assert_str_eq(portstr, "4244"); dpl_assert_str_eq(inet_ntoa(ipaddr), "192.168.1.1"); dpl_assert_int_eq(port, 4244); /* indexes wrap modulo the count */ hoststr = portstr = NULL; memset(&ipaddr, 0, sizeof(ipaddr)); port = 0; r = dpl_addrlist_get_nth(addrlist, 1, &hoststr, &portstr, &ipaddr, &port); dpl_assert_int_eq(DPL_SUCCESS, r); dpl_assert_str_eq(hoststr, "192.168.1.1"); dpl_assert_str_eq(portstr, "4244"); dpl_assert_str_eq(inet_ntoa(ipaddr), "192.168.1.1"); dpl_assert_int_eq(port, 4244); hoststr = portstr = NULL; memset(&ipaddr, 0, sizeof(ipaddr)); port = 0; r = dpl_addrlist_get_nth(addrlist, 347, &hoststr, &portstr, &ipaddr, &port); dpl_assert_int_eq(DPL_SUCCESS, r); dpl_assert_str_eq(hoststr, "192.168.1.1"); dpl_assert_str_eq(portstr, "4244"); dpl_assert_str_eq(inet_ntoa(ipaddr), "192.168.1.1"); dpl_assert_int_eq(port, 4244); /* verify the string form of the addrlist */ s = dpl_addrlist_get(addrlist); dpl_assert_str_eq(s, "192.168.1.1:4244"); free(s); dpl_addrlist_free(addrlist); }
END_TEST START_TEST(create_from_str_3_test) { dpl_addrlist_t *addrlist; char *hoststr = NULL; char *portstr = NULL; struct in_addr ipaddr; u_short port; dpl_status_t r; int i; char *s; int port_position[3] = { 0, 0, 0 }; int port_counts[3] = { 0, 0, 0 }; char expstr[256] = ""; /* create the addrlist */ addrlist = dpl_addrlist_create_from_str("4244", "192.168.1.1:4242,192.168.1.2:4243,192.168.1.3"); dpl_assert_ptr_not_null(addrlist); /* verify length */ dpl_assert_int_eq(3, dpl_addrlist_count(addrlist)); /* verify getting elements by index */ /* indexes wrap modulo the count */ for (i = 0 ; i < 12 ; i++) { hoststr = portstr = NULL; memset(&ipaddr, 0, sizeof(ipaddr)); port = 0; r = dpl_addrlist_get_nth(addrlist, i, &hoststr, &portstr, &ipaddr, &port); dpl_assert_int_eq(DPL_SUCCESS, r); fail_unless(port >= 4242, NULL); fail_unless(port <= 4244, NULL); if (port == 4242) { dpl_assert_str_eq(hoststr, "192.168.1.1"); dpl_assert_str_eq(portstr, "4242"); dpl_assert_str_eq(inet_ntoa(ipaddr), "192.168.1.1"); port_counts[0]++; } else if (port == 4243) { dpl_assert_str_eq(hoststr, "192.168.1.2"); dpl_assert_str_eq(portstr, "4243"); dpl_assert_str_eq(inet_ntoa(ipaddr), "192.168.1.2"); port_counts[1]++; } else /* 4244 */ { dpl_assert_str_eq(hoststr, "192.168.1.3"); dpl_assert_str_eq(portstr, "4244"); dpl_assert_str_eq(inet_ntoa(ipaddr), "192.168.1.3"); port_counts[2]++; } if (port_position[i % 3]) dpl_assert_int_eq(port_position[i % 3], port); else port_position[i % 3] = port; } dpl_assert_int_eq(port_counts[0], 4); dpl_assert_int_eq(port_counts[1], 4); dpl_assert_int_eq(port_counts[2], 4); /* verify the string form of the addrlist */ /* this is tough because the list is randomised internally */ for (i = 0 ; i < 3 ; i++) { if (i) strcat(expstr, ","); if (port_position[i] == 4242) strcat(expstr, "192.168.1.1:4242"); else if (port_position[i] == 4243) strcat(expstr, "192.168.1.2:4243"); else if (port_position[i] == 4244) strcat(expstr, "192.168.1.3:4244"); } s = dpl_addrlist_get(addrlist); dpl_assert_str_eq(s, expstr); free(s); dpl_addrlist_free(addrlist); }
END_TEST START_TEST(create_from_str_3_test) { dpl_addrlist_t *addrlist; dpl_addr_t *addrp = NULL; dpl_status_t r; int i; char *s, ident[INET_ADDRSTRLEN]; int port_position[3] = { 0, 0, 0 }; int port_counts[3] = { 0, 0, 0 }; char expstr[256] = ""; /* create the addrlist */ addrlist = dpl_addrlist_create_from_str("4244", "192.168.1.1:4242,192.168.1.2:4243,192.168.1.3"); dpl_assert_ptr_not_null(addrlist); /* verify length */ dpl_assert_int_eq(3, dpl_addrlist_count(addrlist)); /* verify getting elements by index */ /* indexes wrap modulo the count */ for (i = 0; i < 12; i++) { r = dpl_addrlist_get_nth(addrlist, i, &addrp); dpl_assert_int_eq(DPL_SUCCESS, r); dpl_assert_ptr_not_null(addrp); dpl_assert_ptr_not_null(addrp->h); fail_unless(addrp->port >= 4242, NULL); fail_unless(addrp->port <= 4244, NULL); inet_ntop(addrp->h->h_addrtype, addrp->h->h_addr, ident, sizeof(ident)); if (addrp->port == 4242) { dpl_assert_str_eq(addrp->host, "192.168.1.1"); dpl_assert_str_eq(addrp->portstr, "4242"); dpl_assert_str_eq(ident, "192.168.1.1"); port_counts[0]++; } else if (addrp->port == 4243) { dpl_assert_str_eq(addrp->host, "192.168.1.2"); dpl_assert_str_eq(addrp->portstr, "4243"); dpl_assert_str_eq(ident, "192.168.1.2"); port_counts[1]++; } else /* 4244 */ { dpl_assert_str_eq(addrp->host, "192.168.1.3"); dpl_assert_str_eq(addrp->portstr, "4244"); dpl_assert_str_eq(ident, "192.168.1.3"); port_counts[2]++; } if (port_position[i % 3]) dpl_assert_int_eq(port_position[i % 3], addrp->port); else port_position[i % 3] = addrp->port; } dpl_assert_int_eq(port_counts[0], 4); dpl_assert_int_eq(port_counts[1], 4); dpl_assert_int_eq(port_counts[2], 4); /* verify the string form of the addrlist */ /* this is tough because the list is randomised internally */ for (i = 0 ; i < 3 ; i++) { if (i) strcat(expstr, ","); if (port_position[i] == 4242) strcat(expstr, "192.168.1.1:4242"); else if (port_position[i] == 4243) strcat(expstr, "192.168.1.2:4243"); else if (port_position[i] == 4244) strcat(expstr, "192.168.1.3:4244"); } s = dpl_addrlist_get(addrlist); dpl_assert_str_eq(s, expstr); free(s); dpl_addrlist_free(addrlist); }
static int conf_cb_func(void *cb_arg, const char *var, char *value) { dpl_ctx_t *ctx = (dpl_ctx_t *) cb_arg; char path[1024]; DPRINTF("%s %s\n", var, value); if (!strcmp(var, "")) return 0; else if (!strcmp(var, "use_https")) { if (!strcasecmp(value, "true")) ctx->use_https = 1; else if (!strcasecmp(value, "false")) ctx->use_https = 0; else { fprintf(stderr, "invalid value '%s'\n", var); return -1; } } else if (!strcmp(var, "host")) { if (NULL != ctx->addrlist) { fprintf(stderr, "address list already defined\n"); return -1; } ctx->addrlist = dpl_addrlist_create_from_str(ctx->use_https ? "443" : "80", value); if (NULL == ctx->addrlist) { fprintf(stderr, "error parsing address list\n"); return -1; } } else if (!strcmp(var, "port")) { fprintf(stderr, "Warning: the 'port' option in configuration file is ignored.\n"); fprintf(stderr, "The port(s) must be specified in the hostname(s).\n"); fprintf(stderr, "If nothing is specified, 80 is used (or 443 for https).\n"); } else if (!strcmp(var, "blacklist_expiretime")) { ctx->blacklist_expiretime = atoi(value); } else if (! strcmp(var, "header_size")) { ctx->header_size = strtoul(value, NULL, 0); } else if (!strcmp(var, "base_path")) { int value_len = strlen(value); if (strcmp(value, "/")) { if (value_len >= 1 && value[value_len-1] == '/') { fprintf(stderr, "base_path must not end by a delimiter\n"); return -1; } } ctx->base_path = strdup(value); if (NULL == ctx->base_path) return -1; } else if (!strcmp(var, "access_key")) { ctx->access_key = strdup(value); if (NULL == ctx->access_key) return -1; } else if (!strcmp(var, "secret_key")) { ctx->secret_key = strdup(value); if (NULL == ctx->secret_key) return -1; } else if (!strcmp(var, "ssl_cert_file")) { if (value[0] != '/') { snprintf(path, sizeof (path), "%s/%s", ctx->droplet_dir, value); ctx->ssl_cert_file = strdup(path); } else ctx->ssl_cert_file = strdup(value); if (NULL == ctx->ssl_cert_file) return -1; } else if (!strcmp(var, "ssl_key_file")) { if (value[0] != '/') { snprintf(path, sizeof (path), "%s/%s", ctx->droplet_dir, value); ctx->ssl_key_file = strdup(path); } else ctx->ssl_key_file = strdup(value); if (NULL == ctx->ssl_key_file) return -1; } else if (!strcmp(var, "ssl_password")) { ctx->ssl_password = strdup(value); if (NULL == ctx->ssl_password) return -1; } else if (!strcmp(var, "ssl_ca_list")) { ctx->ssl_ca_list = strdup(value); if (NULL == ctx->ssl_ca_list) return -1; } else if (!strcmp(var, "pricing")) { ctx->pricing = strdup(value); if (NULL == ctx->pricing) return -1; } else if (!strcmp(var, "pricing_dir")) { ctx->pricing_dir = strdup(value); if (NULL == ctx->pricing_dir) return -1; } else if (!strcmp(var, "read_buf_size")) { ctx->read_buf_size = strtoul(value, NULL, 0); } else if (!strcmp(var, "encrypt_key")) { ctx->encrypt_key = strdup(value); if (NULL == ctx->encrypt_key) return -1; } else if (!strcmp(var, "backend")) { ctx->backend = dpl_backend_find(value); if (NULL == ctx->backend) { fprintf(stderr, "no such backend '%s'\n", value); return -1; } } else if (!strcmp(var, "encode_slashes")) { if (!strcasecmp(value, "true")) ctx->encode_slashes = 1; else if (!strcasecmp(value, "false")) ctx->encode_slashes = 0; else { fprintf(stderr, "invalid value '%s'\n", var); return -1; } } else if (!strcmp(var, "keep_alive")) { if (!strcasecmp(value, "true")) ctx->keep_alive = 1; else if (!strcasecmp(value, "false")) ctx->keep_alive = 0; else { fprintf(stderr, "invalid value '%s'\n", var); return -1; } } else if (!strcmp(var, "url_encoding")) { if (!strcasecmp(value, "true")) ctx->url_encoding = 1; else if (!strcasecmp(value, "false")) ctx->url_encoding = 0; else { fprintf(stderr, "invalid value '%s'\n", var); return -1; } } else if (!strcmp(var, "enterprise_number")) { ctx->enterprise_number = strtoul(value, NULL, 0); } else { fprintf(stderr, "no such variable '%s'\n", var); return -1; } return 0; }