Make code agree with documentation so you can use sip peers

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@3421 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
Mark Spencer
2004-07-13 02:20:44 +00:00
parent 423fd40090
commit 634521b59b

View File

@@ -481,7 +481,7 @@ static int sip_reloading = 0;
/* sip_registry: Registrations with other SIP proxies */ /* sip_registry: Registrations with other SIP proxies */
struct sip_registry { 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 username[80]; /* Who we are registering as */
char authuser[80]; /* Who we *authenticate* as */ char authuser[80]; /* Who we *authenticate* as */
char hostname[80]; char hostname[80];
@@ -2371,8 +2371,6 @@ static int sip_register(char *value, int lineno)
char *contact=NULL; char *contact=NULL;
char *stringp=NULL; char *stringp=NULL;
struct hostent *hp;
struct ast_hostent ahp;
if (!value) if (!value)
return -1; return -1;
strncpy(copy, value, sizeof(copy)-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); ast_log(LOG_WARNING, "%s is not a valid port number at line %d\n", porta, lineno);
return -1; 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)); reg = malloc(sizeof(struct sip_registry));
if (reg) { if (reg) {
memset(reg, 0, sizeof(struct sip_registry)); memset(reg, 0, sizeof(struct sip_registry));
@@ -2428,9 +2421,7 @@ static int sip_register(char *value, int lineno)
reg->expire = -1; reg->expire = -1;
reg->timeout = -1; reg->timeout = -1;
reg->refresh = default_expiry; reg->refresh = default_expiry;
reg->addr.sin_family = AF_INET; reg->portno = htons(atoi(porta));
memcpy(&reg->addr.sin_addr, hp->h_addr, sizeof(&reg->addr.sin_addr));
reg->addr.sin_port = porta ? htons(atoi(porta)) : htons(DEFAULT_SIP_PORT);
reg->callid_valid = 0; reg->callid_valid = 0;
reg->ocseq = 101; reg->ocseq = 101;
ast_mutex_lock(&regl.lock); ast_mutex_lock(&regl.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 */ /* if we are here, our registration timed out, so we'll just do it over */
struct sip_registry *r=data; struct sip_registry *r=data;
struct sip_pvt *p; struct sip_pvt *p;
char iabuf[INET_ADDRSTRLEN];
int res; int res;
ast_mutex_lock(&regl.lock); ast_mutex_lock(&regl.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) { if (r->call) {
/* Unlink us, destroy old call. Locking is not relevent here because all this happens /* Unlink us, destroy old call. Locking is not relevent here because all this happens
in the single SIP manager thread. */ 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 addr[80];
char iabuf[INET_ADDRSTRLEN]; char iabuf[INET_ADDRSTRLEN];
struct sip_pvt *p; struct sip_pvt *p;
struct ast_hostent ahp;
struct hostent *hp;
/* exit if we are already in process with this registrar ?*/ /* 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))) { 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); build_callid(r->callid, sizeof(r->callid), __ourip);
r->callid_valid = 1; r->callid_valid = 1;
} }
p=sip_alloc( r->callid, &r->addr, 0); p=sip_alloc( r->callid, NULL, 0);
if (!p) { if (!p) {
ast_log(LOG_WARNING, "Unable to allocate registration call\n"); ast_log(LOG_WARNING, "Unable to allocate registration call\n");
return 0; 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; p->outgoing = 1;
r->call=p; r->call=p;
p->registry=r; p->registry=r;
strncpy(p->peersecret, r->secret, sizeof(p->peersecret)-1); if (!ast_strlen_zero(r->secret))
strncpy(p->peermd5secret, r->md5secret, sizeof(p->peermd5secret)-1); 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)) { if (!ast_strlen_zero(r->authuser)) {
strncpy(p->peername, r->authuser, sizeof(p->peername)-1); strncpy(p->peername, r->authuser, sizeof(p->peername)-1);
strncpy(p->authname, r->authuser, sizeof(p->authname)-1); strncpy(p->authname, r->authuser, sizeof(p->authname)-1);
} else { } else {
strncpy(p->peername, r->username, sizeof(p->peername)-1); if (!ast_strlen_zero(r->username)) {
strncpy(p->authname, r->username, sizeof(p->authname)-1); 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); 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 based on whether the remote host is on the external or
internal network so we can register through nat internal network so we can register through nat
*/ */
if ((hp = ast_gethostbyname(r->hostname, &ahp))) { if (ast_sip_ouraddrfor(&p->sa.sin_addr, &p->ourip))
if (ast_sip_ouraddrfor((struct in_addr *)hp->h_addr, &p->ourip)) memcpy(&p->ourip, &bindaddr.sin_addr, sizeof(p->ourip));
memcpy(&p->ourip, &bindaddr.sin_addr, sizeof(p->ourip));
}
build_contact(p); 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" #define FORMAT "%-20.20s %-12.12s %8d %-20.20s\n"
struct sip_registry *reg; struct sip_registry *reg;
char host[80]; char host[80];
char iabuf[INET_ADDRSTRLEN];
if (argc != 3) if (argc != 3)
return RESULT_SHOWUSAGE; return RESULT_SHOWUSAGE;
ast_mutex_lock(&regl.lock); ast_mutex_lock(&regl.lock);
ast_cli(fd, FORMAT2, "Host", "Username", "Refresh", "State"); ast_cli(fd, FORMAT2, "Host", "Username", "Refresh", "State");
for (reg = regl.registrations;reg;reg = reg->next) { 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, ast_cli(fd, FORMAT, host,
reg->username, reg->refresh, regstate2str(reg->regstate)); reg->username, reg->refresh, regstate2str(reg->regstate));
} }