/** Sets up the object. - sets the IPs of the DYN DNS server - if proxy server is set use it! - ... */ RC_TYPE dyn_dns_init(DYN_DNS_CLIENT *p_self) { int i = 0; if (p_self == NULL) { return RC_INVALID_POINTER; } if (p_self->initialized == TRUE) { return RC_OK; } p_self->abort_on_network_errors = FALSE; p_self->force_addr_update = (p_self->total_iterations == 1) ? TRUE : FALSE; do { DYNDNS_INFO_TYPE *info = &p_self->info[i]; if (strlen(info->proxy_server_name.name) > 0) { http_client_set_port(&p_self->http_to_ip_server[i], info->proxy_server_name.port); http_client_set_remote_name(&p_self->http_to_ip_server[i], info->proxy_server_name.name); http_client_set_port(&p_self->http_to_dyndns[i], info->proxy_server_name.port); http_client_set_remote_name(&p_self->http_to_dyndns[i], info->proxy_server_name.name); } else { http_client_set_port(&p_self->http_to_ip_server[i], info->ip_server_name.port); http_client_set_remote_name(&p_self->http_to_ip_server[i], info->ip_server_name.name); http_client_set_port(&p_self->http_to_dyndns[i], info->dyndns_server_name.port); http_client_set_remote_name(&p_self->http_to_dyndns[i], info->dyndns_server_name.name); } http_client_set_bind_iface(&p_self->http_to_dyndns[i], p_self->bind_interface); http_client_set_bind_iface(&p_self->http_to_ip_server[i], p_self->bind_interface); } while (++i < p_self->info_count); p_self->cmd = NO_CMD; if (p_self->cmd_check_period == 0) { p_self->cmd_check_period = DYNDNS_DEFAULT_CMD_CHECK_PERIOD; } /* Reset to old value, if restarted by SIGHUP */ p_self->time_since_last_update = cached_time_since_last_update; p_self->num_iterations = cached_num_iterations; p_self->initialized = TRUE; return RC_OK; }
/** Sets up the object. - sets the IPs of the DYN DNS server - if proxy server is set use it! - ... */ int dyn_dns_init(ddns_t *ctx) { int i = 0; if (!ctx) return RC_INVALID_POINTER; if (ctx->initialized == 1) return 0; ctx->force_addr_update = 0; do { ddns_info_t *info = &ctx->info[i]; if (strlen(info->proxy_server_name.name)) { http_client_set_port(&ctx->http_to_ip_server[i], info->proxy_server_name.port); http_client_set_remote_name(&ctx->http_to_ip_server[i], info->proxy_server_name.name); http_client_set_port(&ctx->http_to_dyndns[i], info->proxy_server_name.port); http_client_set_remote_name(&ctx->http_to_dyndns[i], info->proxy_server_name.name); } else { http_client_set_port(&ctx->http_to_ip_server[i], info->ip_server_name.port); http_client_set_remote_name(&ctx->http_to_ip_server[i], info->ip_server_name.name); http_client_set_port(&ctx->http_to_dyndns[i], info->dyndns_server_name.port); http_client_set_remote_name(&ctx->http_to_dyndns[i], info->dyndns_server_name.name); } http_client_set_bind_iface(&ctx->http_to_dyndns[i], ctx->bind_interface); http_client_set_bind_iface(&ctx->http_to_ip_server[i], ctx->bind_interface); } while (++i < ctx->info_count); ctx->cmd = NO_CMD; if (ctx->cmd_check_period == 0) { ctx->cmd_check_period = DYNDNS_DEFAULT_CMD_CHECK_PERIOD; } /* Restore values, if reset by SIGHUP. Initialize time from cache file at startup. */ ctx->time_since_last_update = cached_time_since_last_update; ctx->num_iterations = cached_num_iterations; ctx->initialized = 1; return 0; }
/* Sets up the object. - sets the IPs of the DYN DNS server - if proxy server is set use it! - ... */ RC_TYPE dyn_dns_init(DYN_DNS_CLIENT *p_self) { if (p_self == NULL) { return RC_INVALID_POINTER; } if (p_self->initialized == TRUE) { return RC_OK; } p_self->abort_on_network_errors = FALSE; p_self->force_addr_update = FALSE; if (strlen(p_self->info.proxy_server_name.name) > 0) { http_client_set_port(&p_self->http_to_ip_server, p_self->info.proxy_server_name.port); http_client_set_remote_name(&p_self->http_to_ip_server, p_self->info.proxy_server_name.name); http_client_set_port(&p_self->http_to_dyndns, p_self->info.proxy_server_name.port); http_client_set_remote_name(&p_self->http_to_dyndns, p_self->info.proxy_server_name.name); } else { http_client_set_port(&p_self->http_to_ip_server, p_self->info.ip_server_name.port); http_client_set_remote_name(&p_self->http_to_ip_server, p_self->info.ip_server_name.name); http_client_set_port(&p_self->http_to_dyndns, p_self->info.dyndns_server_name.port); http_client_set_remote_name(&p_self->http_to_dyndns, p_self->info.dyndns_server_name.name); } p_self->cmd = NO_CMD; if (p_self->cmd_check_period == 0) { p_self->cmd_check_period = DYNDNS_DEFAULT_CMD_CHECK_PERIOD; } p_self->initialized = TRUE; return RC_OK; }
static RC_TYPE local_set_params(HTTP_CLIENT *p_self) { { int timeout; /*set default TCP specififc params*/ http_client_get_remote_timeout(p_self, &timeout); if (timeout == 0) { http_client_set_remote_timeout(p_self, HTTP_DEFAULT_TIMEOUT); } } { int port; http_client_get_port(p_self, &port); if ( port == 0) { http_client_set_port(p_self, HTTP_DEFAULT_PORT); } } return RC_OK; }
static int get_req_for_freedns_server(DYN_DNS_CLIENT *p_self, int infcnt, int alcnt) { RC_TYPE rc = RC_OK, rc2; HTTP_CLIENT http_to_dyndns; HTTP_TRANSACTION http_tr; char buffer[256]; unsigned char digestbuf[SHA1_DIGEST_BYTES]; char digeststr[SHA1_DIGEST_BYTES*2+1]; int i; char *buf, *tmp, *line; char host[256], updateurl[256]; char *hash = NULL; if (p_self == NULL) { /* 0 == "No characters written" */ return 0; } // I know it's ugly, http client needs redesign. do { if ((rc = http_client_construct(&http_to_dyndns)) != RC_OK) break; http_client_set_port(&http_to_dyndns, p_self->info[infcnt].dyndns_server_name.port); http_client_set_remote_name(&http_to_dyndns, p_self->info[infcnt].dyndns_server_name.name); http_client_set_bind_iface(&http_to_dyndns, p_self->bind_interface); if ((rc = http_client_init(&http_to_dyndns, "Sending update URL query")) != RC_OK) break; snprintf(buffer, sizeof(buffer), "%s|%s", p_self->info[infcnt].credentials.my_username, p_self->info[infcnt].credentials.my_password); sha1(buffer, strlen(buffer), digestbuf); for (i = 0; i < SHA1_DIGEST_BYTES; i++) sprintf(&digeststr[i*2], "%02x", digestbuf[i]); snprintf(buffer, sizeof(buffer), "/api/?action=getdyndns&sha=%s", digeststr); http_tr.req_len = sprintf(p_self->p_req_buffer, GENERIC_HTTP_REQUEST, buffer, p_self->info[infcnt].dyndns_server_name.name); http_tr.p_req = (char*) p_self->p_req_buffer; http_tr.p_rsp = (char*) p_self->p_work_buffer; http_tr.max_rsp_len = p_self->work_buffer_size - 1; /* Save place for a \0 at the end */ http_tr.rsp_len = 0; rc = http_client_transaction(&http_to_dyndns, &http_tr); http_tr.p_rsp[http_tr.rsp_len] = 0; rc2 = http_client_shutdown(&http_to_dyndns); http_client_destruct(&http_to_dyndns, 1); if (rc != RC_OK || rc2 != RC_OK) break; if ((rc = is_http_status_code_ok(http_tr.status)) != RC_OK) break; tmp = buf = strdup(http_tr.p_rsp_body); for (line = strsep(&tmp, "\n"); line; line = strsep(&tmp, "\n")) { if (*line && sscanf(line, "%255[^|\r\n]|%*[^|\r\n]|%255[^|\r\n]", host, updateurl) == 2 && !strcmp(host, p_self->info[infcnt].alias_info[alcnt].names.name)) { hash = strstr(updateurl, "?"); break; } } free(buf); if (!hash) rc = RC_DYNDNS_RSP_NOTOK; } while (0); if (rc != RC_OK) { logit(LOG_INFO, MODULE_TAG "Update URL query failed"); return 0; } return sprintf(p_self->p_req_buffer, FREEDNS_UPDATE_IP_REQUEST, p_self->info[infcnt].dyndns_server_url, hash, p_self->info[infcnt].my_ip_address.name, p_self->info[infcnt].dyndns_server_name.name); }
static int get_req_for_freedns_server(ddns_t *ctx, int infcnt, int alcnt) { int rc = 0, rc2; http_client_t client; http_trans_t trans; char buffer[256]; unsigned char digestbuf[SHA1_DIGEST_BYTES]; char digeststr[SHA1_DIGEST_BYTES * 2 + 1]; int i; char *buf, *tmp, *line; char host[256], updateurl[256]; char *hash = NULL; if (ctx == NULL) { /* 0 == "No characters written" */ return 0; } // I know it's ugly, http client needs redesign. do { if ((rc = http_client_construct(&client)) != 0) break; http_client_set_port(&client, ctx->info[infcnt].dyndns_server_name.port); http_client_set_remote_name(&client, ctx->info[infcnt].dyndns_server_name.name); http_client_set_bind_iface(&client, ctx->bind_interface); if ((rc = http_client_init(&client, "Sending update URL query")) != 0) break; snprintf(buffer, sizeof(buffer), "%s|%s", ctx->info[infcnt].creds.username, ctx->info[infcnt].creds.password); sha1((unsigned char *)buffer, strlen(buffer), digestbuf); for (i = 0; i < SHA1_DIGEST_BYTES; i++) sprintf(&digeststr[i * 2], "%02x", digestbuf[i]); snprintf(buffer, sizeof(buffer), "/api/?action=getdyndns&sha=%s", digeststr); trans.req_len = sprintf(ctx->request_buf, GENERIC_HTTP_REQUEST, buffer, ctx->info[infcnt].dyndns_server_name.name); trans.p_req = (char *)ctx->request_buf; trans.p_rsp = (char *)ctx->work_buf; trans.max_rsp_len = ctx->work_buflen - 1; /* Save place for a \0 at the end */ trans.rsp_len = 0; rc = http_client_transaction(&client, &trans); trans.p_rsp[trans.rsp_len] = 0; rc2 = http_client_shutdown(&client); http_client_destruct(&client, 1); if (rc != 0 || rc2 != 0) break; if ((rc = is_http_status_code_ok(trans.status)) != 0) break; tmp = buf = strdup(trans.p_rsp_body); for (line = strsep(&tmp, "\n"); line; line = strsep(&tmp, "\n")) { if (*line && sscanf(line, "%255[^|\r\n]|%*[^|\r\n]|%255[^|\r\n]", host, updateurl) == 2 && !strcmp(host, ctx->info[infcnt].alias[alcnt].names.name)) { hash = strstr(updateurl, "?"); break; } } free(buf); if (!hash) rc = RC_DYNDNS_RSP_NOTOK; } while (0); if (rc != 0) { logit(LOG_INFO, "Update URL query failed"); return 0; } return sprintf(ctx->request_buf, FREEDNS_UPDATE_IP_REQUEST, ctx->info[infcnt].dyndns_server_url, hash, ctx->info[infcnt].my_ip_address.name, ctx->info[infcnt].dyndns_server_name.name); }