diff options
author | markster <markster@f38db490-d61c-443f-a65b-d21fe96a405b> | 2004-07-13 02:20:44 +0000 |
---|---|---|
committer | markster <markster@f38db490-d61c-443f-a65b-d21fe96a405b> | 2004-07-13 02:20:44 +0000 |
commit | 20c9b9a2c7e4fb80336fa36b47128cc7d743ef2d (patch) | |
tree | 937120d901889518fa7a6e7cb36117e16174262d /channels | |
parent | fa35f11949c0f68ad9393ed80ff5eef7132b5d22 (diff) |
Make code agree with documentation so you can use sip peers
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@3421 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'channels')
-rwxr-xr-x | channels/chan_sip.c | 50 |
1 files changed, 23 insertions, 27 deletions
diff --git a/channels/chan_sip.c b/channels/chan_sip.c index 925d6ff79..523ff8e81 100755 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -481,7 +481,7 @@ static int sip_reloading = 0; /* sip_registry: Registrations with other SIP proxies */ struct sip_registry { - struct sockaddr_in addr; /* Who we connect to for registration purposes */ + int portno; /* Optional port override */ char username[80]; /* Who we are registering as */ char authuser[80]; /* Who we *authenticate* as */ char hostname[80]; @@ -2371,8 +2371,6 @@ static int sip_register(char *value, int lineno) char *contact=NULL; char *stringp=NULL; - struct hostent *hp; - struct ast_hostent ahp; if (!value) return -1; strncpy(copy, value, sizeof(copy)-1); @@ -2408,11 +2406,6 @@ static int sip_register(char *value, int lineno) ast_log(LOG_WARNING, "%s is not a valid port number at line %d\n", porta, lineno); return -1; } - hp = ast_gethostbyname(hostname, &ahp); - if (!hp) { - ast_log(LOG_WARNING, "Host '%s' not found at line %d\n", hostname, lineno); - return -1; - } reg = malloc(sizeof(struct sip_registry)); if (reg) { memset(reg, 0, sizeof(struct sip_registry)); @@ -2428,9 +2421,7 @@ static int sip_register(char *value, int lineno) reg->expire = -1; reg->timeout = -1; reg->refresh = default_expiry; - reg->addr.sin_family = AF_INET; - memcpy(®->addr.sin_addr, hp->h_addr, sizeof(®->addr.sin_addr)); - reg->addr.sin_port = porta ? htons(atoi(porta)) : htons(DEFAULT_SIP_PORT); + reg->portno = htons(atoi(porta)); reg->callid_valid = 0; reg->ocseq = 101; ast_mutex_lock(®l.lock); @@ -3875,10 +3866,9 @@ static int sip_reg_timeout(void *data) /* if we are here, our registration timed out, so we'll just do it over */ struct sip_registry *r=data; struct sip_pvt *p; - char iabuf[INET_ADDRSTRLEN]; int res; ast_mutex_lock(®l.lock); - ast_log(LOG_NOTICE, "Registration for '%s@%s' timed out, trying again\n", r->username, ast_inet_ntoa(iabuf, sizeof(iabuf), r->addr.sin_addr)); + ast_log(LOG_NOTICE, "Registration for '%s@%s' timed out, trying again\n", r->username, r->hostname); if (r->call) { /* Unlink us, destroy old call. Locking is not relevent here because all this happens in the single SIP manager thread. */ @@ -3905,8 +3895,6 @@ static int transmit_register(struct sip_registry *r, char *cmd, char *auth, char char addr[80]; char iabuf[INET_ADDRSTRLEN]; struct sip_pvt *p; - struct ast_hostent ahp; - struct hostent *hp; /* 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))) { @@ -3925,24 +3913,35 @@ static int transmit_register(struct sip_registry *r, char *cmd, char *auth, char build_callid(r->callid, sizeof(r->callid), __ourip); r->callid_valid = 1; } - p=sip_alloc( r->callid, &r->addr, 0); + p=sip_alloc( r->callid, NULL, 0); if (!p) { ast_log(LOG_WARNING, "Unable to allocate registration call\n"); return 0; } + if (create_addr(p,r->hostname)) { + sip_destroy(p); + return 0; + } + if (r->portno) + p->sa.sin_port = r->portno; p->outgoing = 1; r->call=p; p->registry=r; - strncpy(p->peersecret, r->secret, sizeof(p->peersecret)-1); - strncpy(p->peermd5secret, r->md5secret, sizeof(p->peermd5secret)-1); + if (!ast_strlen_zero(r->secret)) + strncpy(p->peersecret, r->secret, sizeof(p->peersecret)-1); + if (!ast_strlen_zero(r->md5secret)) + strncpy(p->peermd5secret, r->md5secret, sizeof(p->peermd5secret)-1); if (!ast_strlen_zero(r->authuser)) { strncpy(p->peername, r->authuser, sizeof(p->peername)-1); strncpy(p->authname, r->authuser, sizeof(p->authname)-1); } else { - strncpy(p->peername, r->username, sizeof(p->peername)-1); - strncpy(p->authname, r->username, sizeof(p->authname)-1); + if (!ast_strlen_zero(r->username)) { + strncpy(p->peername, r->username, sizeof(p->peername)-1); + strncpy(p->authname, r->username, sizeof(p->authname)-1); + } } - strncpy(p->username, r->username, sizeof(p->username)-1); + if (!ast_strlen_zero(r->username)) + strncpy(p->username, r->username, sizeof(p->username)-1); strncpy(p->exten, r->contact, sizeof(p->exten) - 1); /* @@ -3950,10 +3949,8 @@ static int transmit_register(struct sip_registry *r, char *cmd, char *auth, char based on whether the remote host is on the external or internal network so we can register through nat */ - if ((hp = ast_gethostbyname(r->hostname, &ahp))) { - if (ast_sip_ouraddrfor((struct in_addr *)hp->h_addr, &p->ourip)) - memcpy(&p->ourip, &bindaddr.sin_addr, sizeof(p->ourip)); - } + if (ast_sip_ouraddrfor(&p->sa.sin_addr, &p->ourip)) + memcpy(&p->ourip, &bindaddr.sin_addr, sizeof(p->ourip)); build_contact(p); } @@ -5586,13 +5583,12 @@ static int sip_show_registry(int fd, int argc, char *argv[]) #define FORMAT "%-20.20s %-12.12s %8d %-20.20s\n" struct sip_registry *reg; char host[80]; - char iabuf[INET_ADDRSTRLEN]; if (argc != 3) return RESULT_SHOWUSAGE; ast_mutex_lock(®l.lock); ast_cli(fd, FORMAT2, "Host", "Username", "Refresh", "State"); for (reg = regl.registrations;reg;reg = reg->next) { - snprintf(host, sizeof(host), "%s:%d", ast_inet_ntoa(iabuf, sizeof(iabuf), reg->addr.sin_addr), ntohs(reg->addr.sin_port)); + snprintf(host, sizeof(host), "%s:%d", reg->hostname, ntohs(reg->portno ? reg->portno : DEFAULT_SIP_PORT)); ast_cli(fd, FORMAT, host, reg->username, reg->refresh, regstate2str(reg->regstate)); } |