static RC_TYPE do_update_alias_table(DYN_DNS_CLIENT *p_self) { int i; int shutdown = 0; RC_TYPE rc = RC_OK; FILE *fp; do { for (i = 0; i < p_self->alias_info.count; ++i) { if (p_self->alias_info.update_required[i] != TRUE) { continue; } rc = http_client_init(&p_self->http_to_dyndns); if (rc != RC_OK) { break; } /*build dyndns transaction*/ { HTTP_TRANSACTION http_tr; http_tr.req_len = p_self->info.p_dns_system->p_dns_update_req_func( (struct _DYN_DNS_CLIENT*) p_self,i, (struct DYNDNS_SYSTEM*) p_self->info.p_dns_system); 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; p_self->p_work_buffer[http_tr.rsp_len+1] = 0; /*send it*/ rc = http_client_transaction(&p_self->http_to_dyndns, &http_tr); if (p_self->dbg.level > 2) { p_self->p_req_buffer[http_tr.req_len] = 0; DBG_PRINTF((LOG_DEBUG,"DYNDNS my Request:\n%s\n", p_self->p_req_buffer)); } if (rc == RC_OK) { int rc = p_self->info.p_dns_system->p_rsp_ok_func((struct _DYN_DNS_CLIENT*)p_self, http_tr.p_rsp, p_self->info.p_dns_system->p_success_string); if (rc == RC_OK) { p_self->alias_info.update_required[i] = FALSE; DBG_PRINTF((LOG_WARNING,"I:" MODULE_TAG "Alias '%s' to IP '%s' updated successfully.\n", p_self->alias_info.names[i].name, p_self->info.my_ip_address.name)); p_self->times_since_last_update = 0; /*recalc forced update period*/ p_self->forced_update_period_sec = p_self->forced_update_period_sec_orig; p_self->forced_update_times = p_self->forced_update_period_sec / p_self->sleep_sec; if ((fp=fopen(p_self->ip_cache, "w"))) { fprintf(fp,"%s", p_self->info.my_ip_address.name); fclose(fp); } if ((fp=fopen(p_self->time_cache, "w"))) { fprintf(fp,"%ld", time (NULL)); fclose(fp); } if (strlen(p_self->external_command) > 0) os_shell_execute(p_self->external_command); } else { DBG_PRINTF((LOG_WARNING,"W:" MODULE_TAG "Response Code: %d\n", rc)); DBG_PRINTF((LOG_WARNING,"W:" MODULE_TAG "Error validating DYNDNS svr answer. Check usr,pass,hostname! (%s)\n", http_tr.p_rsp)); shutdown++; } if (p_self->dbg.level > 2) { http_tr.p_rsp[http_tr.rsp_len] = 0; DBG_PRINTF((LOG_WARNING,"W:" MODULE_TAG "DYNDNS Server response:\n%s\n", http_tr.p_rsp)); } } } { RC_TYPE rc2 = http_client_shutdown(&p_self->http_to_dyndns); if (rc == RC_OK) { rc = rc2; } } if (rc != RC_OK || shutdown>2) { break; } os_sleep_ms(1000); } if (rc != RC_OK) { break; } } while(0); return rc; }
static RC_TYPE do_update_alias_table(DYN_DNS_CLIENT *p_self) { int i, j; RC_TYPE rc = RC_OK, rc2; HTTP_TRANSACTION http_tr; int anychange = 0; for (i = 0; i < p_self->info_count; i++) { DYNDNS_INFO_TYPE *info = &p_self->info[i]; for (j = 0; j < info->alias_count; j++) { if (info->alias_info[j].update_required != TRUE) { continue; } rc = http_client_init(&p_self->http_to_dyndns[i], "Sending IP# update to DDNS server"); if (rc != RC_OK) { break; } /* Build dyndns transaction */ http_tr.req_len = info->p_dns_system->p_dns_update_req_func( (struct _DYN_DNS_CLIENT*) p_self, i, j); 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(&p_self->http_to_dyndns[i], &http_tr); http_tr.p_rsp[http_tr.rsp_len] = 0; if (p_self->dbg.level > 2) { p_self->p_req_buffer[http_tr.req_len] = 0; logit(LOG_DEBUG, MODULE_TAG "Sending alias table update to DDNS server:"); logit(LOG_DEBUG, MODULE_TAG "%s", p_self->p_req_buffer); } if (rc == RC_OK) { rc = info->p_dns_system->p_rsp_ok_func((struct _DYN_DNS_CLIENT*)p_self, &http_tr, i); if (rc == RC_OK) { info->alias_info[j].update_required = FALSE; logit(LOG_INFO, MODULE_TAG "Successful alias table update for %s => new IP# %s", info->alias_info[j].names.name, info->my_ip_address.name); p_self->time_since_last_update = 0; anychange++; /* Adjust forced update period on success */ } else { logit(LOG_WARNING, MODULE_TAG "%s error in DDNS server response:", rc == RC_DYNDNS_RSP_RETRY_LATER ? "Temporary" : "Fatal"); logit(LOG_WARNING, MODULE_TAG "[%d %s] %s", http_tr.status, http_tr.status_desc, http_tr.p_rsp_body != http_tr.p_rsp ? http_tr.p_rsp_body : ""); } if (p_self->dbg.level > 2) { logit(LOG_DEBUG, MODULE_TAG "DDNS server response:"); logit(LOG_DEBUG, MODULE_TAG "%s", http_tr.p_rsp); } } rc2 = http_client_shutdown(&p_self->http_to_dyndns[i]); if (rc == RC_OK) { /* Only overwrite rc with of http_client_shutdown() rc if previous call, in * e.g., http_client_transaction() or the p_rsp_ok_func() callback was OK. */ rc = rc2; } if (rc != RC_OK) { break; } os_sleep_ms(1000); } } /* Successful change or when cache file does not yet exist! */ if (anychange || access(p_self->cachefile, F_OK)) { FILE *fp; /* Update cache with new IP */ fp = fopen(p_self->cachefile, "w"); if (fp) { fprintf(fp, "%s", p_self->info[0].my_ip_address.name); fclose(fp); } if (anychange && p_self->external_command) { /* Run external command hook on update. */ os_shell_execute(p_self->external_command); } } return rc; }
static int do_update_alias_table(ddns_t *ctx) { int i, j; int rc = 0, rc2; http_trans_t http_tr; int anychange = 0; for (i = 0; i < ctx->info_count; i++) { ddns_info_t *info = &ctx->info[i]; for (j = 0; j < info->alias_count; j++) { if (info->alias[j].update_required != 1) { continue; } rc = http_client_init(&ctx->http_to_dyndns[i], "Sending IP# update to DDNS server"); if (rc != 0) { break; } /* Build dyndns transaction */ http_tr.req_len = info->system->update_request_func(ctx, i, j); http_tr.p_req = (char *)ctx->request_buf; http_tr.p_rsp = (char *)ctx->work_buf; http_tr.max_rsp_len = ctx->work_buflen - 1; /* Save place for a \0 at the end */ http_tr.rsp_len = 0; rc = http_client_transaction(&ctx->http_to_dyndns[i], &http_tr); http_tr.p_rsp[http_tr.rsp_len] = 0; if (ctx->dbg.level > 2) { ctx->request_buf[http_tr.req_len] = 0; logit(LOG_DEBUG, "Sending alias table update to DDNS server:"); logit(LOG_DEBUG, "%s", ctx->request_buf); } if (rc == 0) { rc = info->system->response_ok_func(ctx, &http_tr, i); if (rc == 0) { info->alias[j].update_required = 0; logit(LOG_INFO, "Successful alias table update for %s => new IP# %s", info->alias[j].names.name, info->my_ip_address.name); ctx->time_since_last_update = 0; ctx->force_addr_update = 0; anychange++; } else { logit(LOG_WARNING, "%s error in DDNS server response:", rc == RC_DYNDNS_RSP_RETRY_LATER ? "Temporary" : "Fatal"); logit(LOG_WARNING, "[%d %s] %s", http_tr.status, http_tr.status_desc, http_tr.p_rsp_body != http_tr.p_rsp ? http_tr.p_rsp_body : ""); } if (ctx->dbg.level > 2) { logit(LOG_DEBUG, "DDNS server response:"); logit(LOG_DEBUG, "%s", http_tr.p_rsp); } } rc2 = http_client_shutdown(&ctx->http_to_dyndns[i]); if (rc == 0) { /* Only overwrite rc with of http_client_shutdown() rc if previous call, in * e.g., http_client_transaction() or the response_ok_func() callback was OK. */ rc = rc2; } if (rc != 0) { break; } os_sleep_ms(1000); } } /* Successful change or when cache file does not yet exist! */ if (anychange || access(ctx->cache_file, F_OK)) { FILE *fp; /* Update cache with new IP */ fp = fopen(ctx->cache_file, "w"); if (fp) { fprintf(fp, "%s", ctx->info[0].my_ip_address.name); fclose(fp); } /* Run external command hook on update. */ if (anychange && ctx->external_command) { os_shell_execute(ctx->external_command, ctx->info[0].my_ip_address.name, ctx->info[0].alias[0].names.name, ctx->bind_interface); } } return rc; }