- construct the difference and have only one call to snprintf in build_via

- convert some while loops to for loops
- localize some variables and remove unneeded initializations
- store result of get_header locally so it only has to be called once
- remove some duplicate calls to strcasecmp by storing result
(issue #5955)


git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@7587 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
Russell Bryant
2005-12-22 02:20:44 +00:00
parent 134c3757d8
commit 1d498c35cd
+59 -70
View File
@@ -1078,12 +1078,12 @@ static void sip_destroy(struct sip_pvt *p);
static void build_via(struct sip_pvt *p, char *buf, int len)
{
char iabuf[INET_ADDRSTRLEN];
/* Work around buggy UNIDEN UIP200 firmware */
const char *rport= ast_test_flag(p, SIP_NAT) & SIP_NAT_RFC3581 ? ";rport" : "";
/* z9hG4bK is a magic cookie. See RFC 3261 section 8.1.1.7 */
if (ast_test_flag(p, SIP_NAT) & SIP_NAT_RFC3581)
snprintf(buf, len, "SIP/2.0/UDP %s:%d;branch=z9hG4bK%08x;rport", ast_inet_ntoa(iabuf, sizeof(iabuf), p->ourip), ourport, p->branch);
else /* Work around buggy UNIDEN UIP200 firmware */
snprintf(buf, len, "SIP/2.0/UDP %s:%d;branch=z9hG4bK%08x", ast_inet_ntoa(iabuf, sizeof(iabuf), p->ourip), ourport, p->branch);
snprintf(buf, len, "SIP/2.0/UDP %s:%d;branch=z9hG4bK%08x%s",
ast_inet_ntoa(iabuf, sizeof(iabuf), p->ourip), ourport, p->branch, rport);
}
/*! \brief ast_sip_ouraddrfor: NAT fix - decide which IP address to use for ASterisk server? ---*/
@@ -1687,9 +1687,8 @@ static struct sip_peer *realtime_peer(const char *peername, struct sockaddr_in *
if (!var)
return NULL;
tmp = var;
/* If this is type=user, then skip this object. */
while(tmp) {
for (tmp = var; tmp; tmp = tmp->next) {
/* If this is type=user, then skip this object. */
if (!strcasecmp(tmp->name, "type") &&
!strcasecmp(tmp->value, "user")) {
ast_variables_destroy(var);
@@ -1697,7 +1696,6 @@ static struct sip_peer *realtime_peer(const char *peername, struct sockaddr_in *
} else if (!newpeername && !strcasecmp(tmp->name, "name")) {
newpeername = tmp->value;
}
tmp = tmp->next;
}
if (!newpeername) { /* Did not find peer in realtime */
@@ -1756,7 +1754,6 @@ static struct sip_peer *find_peer(const char *peer, struct sockaddr_in *sin, int
if (!p && realtime) {
p = realtime_peer(peer, sin);
}
return p;
}
@@ -1789,17 +1786,13 @@ static struct sip_user *realtime_user(const char *username)
if (!var)
return NULL;
tmp = var;
while (tmp) {
for (tmp = var; tmp; tmp = tmp->next) {
if (!strcasecmp(tmp->name, "type") &&
!strcasecmp(tmp->value, "peer")) {
ast_variables_destroy(var);
return NULL;
}
tmp = tmp->next;
}
user = build_user(username, var, !ast_test_flag((&global_flags_page2), SIP_PAGE2_RTCACHEFRIENDS));
@@ -2718,6 +2711,7 @@ static struct ast_channel *sip_new(struct sip_pvt *i, int state, char *title)
struct ast_channel *tmp;
struct ast_variable *v = NULL;
int fmt;
int what;
#ifdef OSP_SUPPORT
char iabuf[INET_ADDRSTRLEN];
char peer[MAXHOSTNAMELEN];
@@ -2735,11 +2729,12 @@ static struct ast_channel *sip_new(struct sip_pvt *i, int state, char *title)
/* Select our native format based on codec preference until we receive
something from another device to the contrary. */
if (i->jointcapability)
tmp->nativeformats = ast_codec_choose(&i->prefs, i->jointcapability, 1);
what = i->jointcapability;
else if (i->capability)
tmp->nativeformats = ast_codec_choose(&i->prefs, i->capability, 1);
what = i->capability;
else
tmp->nativeformats = ast_codec_choose(&i->prefs, global_capability, 1);
what = global_capability;
tmp->nativeformats = ast_codec_choose(&i->prefs, what, 1);
ast_mutex_unlock(&i->lock);
fmt = ast_best_codec(tmp->nativeformats);
@@ -4880,9 +4875,6 @@ static int transmit_invite(struct sip_pvt *p, int sipmethod, int sdp, int init)
add_header(&req, "Allow", ALLOWED_METHODS);
if (p->options && p->options->addsipheaders ) {
struct ast_channel *ast;
const char *header = (char *) NULL;
char *content = (char *) NULL;
char *end = (char *) NULL;
struct varshead *headp = (struct varshead *) NULL;
const struct ast_var_t *current;
@@ -4896,7 +4888,9 @@ static int transmit_invite(struct sip_pvt *p, int sipmethod, int sdp, int init)
AST_LIST_TRAVERSE(headp, current, entries) {
/* SIPADDHEADER: Add SIP header to outgoing call */
if (!strncasecmp(ast_var_name(current), "SIPADDHEADER", strlen("SIPADDHEADER"))) {
header = ast_var_value(current);
char *content, *end;
const char *header = ast_var_value(current);
headdup = ast_strdupa(header);
/* Strip of the starting " (if it's there) */
if (*headdup == '"')
@@ -8581,8 +8575,9 @@ static void handle_request_info(struct sip_pvt *p, struct sip_request *req)
char *c;
/* Need to check the media/type */
if (!strcasecmp(get_header(req, "Content-Type"), "application/dtmf-relay") ||
!strcasecmp(get_header(req, "Content-Type"), "application/vnd.nortelnetworks.digits")) {
c = get_header(req, "Content-Type");
if (!strcasecmp(c, "application/dtmf-relay") ||
!strcasecmp(c, "application/vnd.nortelnetworks.digits")) {
/* Try getting the "signal=" part */
if (ast_strlen_zero(c = get_sdp(req, "Signal")) && ast_strlen_zero(c = get_sdp(req, "d"))) {
@@ -8636,7 +8631,7 @@ static void handle_request_info(struct sip_pvt *p, struct sip_request *req)
}
transmit_response(p, "200 OK", req);
return;
} else if (!strcasecmp(get_header(req, "Content-Type"), "application/media_control+xml")) {
} else if (!strcasecmp(c, "application/media_control+xml")) {
/* Eh, we'll just assume it's a fast picture update for now */
if (p->owner)
ast_queue_control(p->owner, AST_CONTROL_VIDUPDATE);
@@ -8674,13 +8669,10 @@ static int sip_do_debug_ip(int fd, int argc, char *argv[])
if (argc != 4)
return RESULT_SHOWUSAGE;
arg = argv[3];
p = strstr(arg, ":");
if (p) {
*p = '\0';
p++;
p = arg = argv[3];
strsep(&p, ":");
if (p)
port = atoi(p);
}
hp = ast_gethostbyname(arg, &ahp);
if (hp == NULL) {
return RESULT_SHOWUSAGE;
@@ -11878,11 +11870,9 @@ static struct sip_user *build_user(const char *name, struct ast_variable *v, int
strcpy(user->context, default_context);
strcpy(user->language, default_language);
strcpy(user->musicclass, global_musicclass);
while(v) {
if (handle_common_options(&userflags, &mask, v)) {
v = v->next;
for (; v; v = v->next) {
if (handle_common_options(&userflags, &mask, v))
continue;
}
if (!strcasecmp(v->name, "context")) {
ast_copy_string(user->context, v->value, sizeof(user->context));
@@ -11937,10 +11927,6 @@ static struct sip_user *build_user(const char *name, struct ast_variable *v, int
if (user->callingpres == -1)
user->callingpres = atoi(v->value);
}
/*else if (strcasecmp(v->name,"type"))
* ast_log(LOG_WARNING, "Ignoring %s\n", v->name);
*/
v = v->next;
}
ast_copy_flags(user, &userflags, mask.flags);
ast_free_ha(oldha);
@@ -12261,7 +12247,6 @@ static int reload_config(void)
struct sip_user *user;
struct ast_hostent ahp;
char *cat;
char *utype;
struct hostent *hp;
int format;
char iabuf[INET_ADDRSTRLEN];
@@ -12331,12 +12316,9 @@ static int reload_config(void)
global_allowguest = 1;
/* Read the [general] config section of sip.conf (or from realtime config) */
v = ast_variable_browse(cfg, "general");
while(v) {
if (handle_common_options(&global_flags, &dummy, v)) {
v = v->next;
for (v = ast_variable_browse(cfg, "general"); v; v = v->next) {
if (handle_common_options(&global_flags, &dummy, v))
continue;
}
/* Create the interface list */
if (!strcasecmp(v->name, "context")) {
@@ -12517,10 +12499,6 @@ static int reload_config(void)
} else if (!strcasecmp(v->name, "callevents")) {
callevents = ast_true(v->value);
}
/* else if (strcasecmp(v->name,"type"))
* ast_log(LOG_WARNING, "Ignoring %s\n", v->name);
*/
v = v->next;
}
if (!allow_external_domains && AST_LIST_EMPTY(&domain_list)) {
@@ -12539,31 +12517,42 @@ static int reload_config(void)
}
/* Load peers, users and friends */
cat = ast_category_browse(cfg, NULL);
while(cat) {
if (strcasecmp(cat, "general") && strcasecmp(cat, "authentication")) {
utype = ast_variable_retrieve(cfg, cat, "type");
if (utype) {
if (!strcasecmp(utype, "user") || !strcasecmp(utype, "friend")) {
user = build_user(cat, ast_variable_browse(cfg, cat), 0);
if (user) {
ASTOBJ_CONTAINER_LINK(&userl,user);
ASTOBJ_UNREF(user, sip_destroy_user);
}
cat = NULL;
while ( (cat = ast_category_browse(cfg, cat)) ) {
const char *utype;
if (!strcasecmp(cat, "general") || !strcasecmp(cat, "authentication"))
continue;
utype = ast_variable_retrieve(cfg, cat, "type");
if (!utype) {
ast_log(LOG_WARNING, "Section '%s' lacks type\n", cat);
continue;
} else {
int is_user = 0, is_peer = 0;
if (!strcasecmp(utype, "user"))
is_user = 1;
else if (!strcasecmp(utype, "friend"))
is_user = is_peer = 1;
else if (!strcasecmp(utype, "peer"))
is_peer = 1;
else {
ast_log(LOG_WARNING, "Unknown type '%s' for '%s' in %s\n", utype, cat, "sip.conf");
continue;
}
if (is_user) {
user = build_user(cat, ast_variable_browse(cfg, cat), 0);
if (user) {
ASTOBJ_CONTAINER_LINK(&userl,user);
ASTOBJ_UNREF(user, sip_destroy_user);
}
if (!strcasecmp(utype, "peer") || !strcasecmp(utype, "friend")) {
peer = build_peer(cat, ast_variable_browse(cfg, cat), 0);
if (peer) {
ASTOBJ_CONTAINER_LINK(&peerl,peer);
ASTOBJ_UNREF(peer, sip_destroy_peer);
}
} else if (strcasecmp(utype, "user")) {
ast_log(LOG_WARNING, "Unknown type '%s' for '%s' in %s\n", utype, cat, "sip.conf");
}
if (is_peer) {
peer = build_peer(cat, ast_variable_browse(cfg, cat), 0);
if (peer) {
ASTOBJ_CONTAINER_LINK(&peerl,peer);
ASTOBJ_UNREF(peer, sip_destroy_peer);
}
} else
ast_log(LOG_WARNING, "Section '%s' lacks type\n", cat);
}
}
cat = ast_category_browse(cfg, cat);
}
if (ast_find_ourip(&__ourip, bindaddr)) {
ast_log(LOG_WARNING, "Unable to get own IP address, SIP disabled\n");