static int transmit_register(struct sip_registry *r, int sipmethod, const char *auth, const char *authheader){ struct sip_request req; char from[256]; char to[256]; char tmp[80]; char addr[80]; struct sip_pvt *p; struct in_addr sin; int changed = 0; ast_log(LOG_DEBUG, "Transmit_Register\n"); /* exit if we are already in process with this registrar ?*/ if ( r == NULL || ((auth==NULL) && (r->regstate==REG_STATE_REGSENT || r->regstate==REG_STATE_AUTHSENT))) { ast_log(LOG_NOTICE, "Strange, trying to register %s@%s when registration already pending\n", r->username, r->hostname); return 0; } if (r->dnsmgr == NULL) { ast_dnsmgr_lookup(r->hostname, &sin, &r->dnsmgr); memcpy(&sin, &r->us.sin_addr, sizeof(sin)); ast_log(LOG_DEBUG, "dnsmgr was NULL\n"); } else { changed = ast_dnsmgr_changed(r->dnsmgr); ast_log(LOG_DEBUG, "Change status = %d\n", changed); } if (r->call && !changed) { /* We have a registration and the IP has not changed*/ if (!auth) { ast_log(LOG_WARNING, "Already have a REGISTER going on to %s@%s?? \n", r->username, r->hostname); return 0; } else { ast_log(LOG_DEBUG, "registration valid and authorized\n"); p = r->call; make_our_tag(p->tag, sizeof(p->tag)); /* create a new local tag for every register attempt */ ast_string_field_set(p, theirtag, NULL); /* forget their old tag, so we don't match tags when getting response */ } } else { if (changed) { ast_log(LOG_DEBUG, "IP change detected, cancelling current registration\n"); //r->call = sip_destroy(r->call); // TODO: HELP? } /* Build callid for registration if we haven't registered before */ /* Build callid for registration if we haven't registered before */ if (!r->callid_valid) { build_callid_registry(r, internip.sin_addr, default_fromdomain); r->callid_valid = TRUE; } /* Allocate SIP dialog for registration */ if (!(p = sip_alloc( r->callid, NULL, 0, SIP_REGISTER))) { ast_log(LOG_WARNING, "Unable to allocate registration transaction (memory or socket error)\n"); return 0; } if (p->do_history) append_history(p, "RegistryInit", "Account: %s@%s", r->username, r->hostname); p->outboundproxy = obproxy_get(p, NULL); /* Find address to hostname */ if (create_addr(p, r->hostname)) { /* we have what we hope is a temporary network error, * probably DNS. We need to reschedule a registration try */ sip_destroy(p); if (r->timeout > -1) { AST_SCHED_REPLACE(r->timeout, sched, global_reg_timeout * 1000, sip_reg_timeout, r); ast_log(LOG_WARNING, "Still have a registration timeout for %s@%s (create_addr() error), %d\n", r->username, r->hostname, r->timeout); } else { r->timeout = ast_sched_add(sched, global_reg_timeout * 1000, sip_reg_timeout, r); ast_log(LOG_WARNING, "Probably a DNS error for registration to %s@%s, trying REGISTER again (after %d seconds)\n", r->username, r->hostname, global_reg_timeout); }.... 9162,1 42%