int utils_test(void) { #if PK_TESTS char buffer1[60]; PK_MEMORY_CANARY; strcpy(buffer1, "\r\n\r\n"); assert(2 == zero_first_crlf(4, buffer1)); strcpy(buffer1, "abcd\r\n\r\ndefghijklmnop"); int length = zero_first_crlf(strlen(buffer1), buffer1); assert(length == 6); assert((buffer1[4] == '\0') && (buffer1[5] == '\0') && (buffer1[6] == '\r')); assert(strcmp(buffer1, "abcd") == 0); strcpy(buffer1, "abcd\r\nfoo\r\n\r\ndef"); assert(strcmp(skip_http_header(strlen(buffer1), buffer1), "def") == 0); #if PK_MEMORY_CANARIES add_memory_canary(&canary); PK_CHECK_MEMORY_CANARIES; canary = (void*) 0; assert(check_memory_canaries() == 1); canary = &canary; remove_memory_canary(&canary); #endif #endif return 1; }
int pkb_update_dns(struct pk_manager* pkm) { int j, len, bogus, rlen; struct pk_tunnel* fe_list[1024]; /* Magic, bounded by address_list[] below */ struct pk_tunnel** fes; struct pk_tunnel* fe; struct pk_pagekite* kite; char printip[128], get_result[10240], *result, *lastup; char address_list[1024], payload[2048], signature[2048], url[2048], *alp; PK_TRACE_FUNCTION; if (time(0) < pkm->last_dns_update + PK_DDNS_UPDATE_INTERVAL_MIN) return 0; address_list[0] = '\0'; alp = address_list; fes = fe_list; *fes = NULL; bogus = 0; for (j = 0, fe = pkm->tunnels; j < pkm->tunnel_max; j++, fe++) { if (fe->ai.ai_addr && fe->fe_hostname && (fe->conn.sockfd >= 0)) { if (fe->conn.status & FE_STATUS_WANTED) { if (NULL != in_ipaddr_to_str(fe->ai.ai_addr, printip, 128)) { len = strlen(printip); if (len < 1000-(alp-address_list)) { if (alp != address_list) *alp++ = ','; strcpy(alp, printip); alp += len; *fes++ = fe; *fes = NULL; } } if (!(fe->conn.status & FE_STATUS_IN_DNS) || pk_state.force_update) bogus++; } else /* Stuff in DNS that shouldn't be also triggers updates */ if (fe->conn.status & FE_STATUS_IN_DNS) bogus++; } } PK_CHECK_MEMORY_CANARIES; if (!bogus) return 0; if (!address_list[0]) return 0; bogus = 0; lastup = ""; for (j = 0, kite = pkm->kites; j < pkm->kite_max; kite++, j++) { if ((kite->protocol[0] != '\0') && (0 != strcasecmp(lastup, kite->public_domain))) { PKS_STATE(pkm->status = PK_STATUS_UPDATING_DNS); sprintf(payload, "%s:%s", kite->public_domain, address_list); pk_sign(NULL, kite->auth_secret, payload, 100, signature); sprintf(url, pkm->dynamic_dns_url, kite->public_domain, address_list, signature); rlen = http_get(url, get_result, 10240); if (rlen < 1) { pk_log(PK_LOG_MANAGER_ERROR, "DDNS: No response from %s", url); bogus++; } else { lastup = kite->public_domain; result = skip_http_header(rlen, get_result); if ((strncasecmp(result, "nochg", 5) == 0) || (strncasecmp(result, "good", 4) == 0)) { pk_log(PK_LOG_MANAGER_INFO, "DDNS: Update OK, %s=%s", kite->public_domain, address_list); for (fes = fe_list; *fes; fes++) { (*fes)->last_ddnsup = time(0); (*fes)->conn.status |= FE_STATUS_IN_DNS; } } else { result[7] = '\0'; pk_log(PK_LOG_MANAGER_ERROR, "DDNS: Update failed for %s (%s -> %s)", kite->public_domain, url, result); bogus++; } } } } pkm->last_dns_update = time(0); PK_CHECK_MEMORY_CANARIES; return bogus; }