--- ../asterisk-dam-edition/channels/chan_sip.c 2005-04-13 15:18:08.000000000 +0200 +++ channels/chan_sip.c 2005-04-29 18:52:21.000000000 +0200 @@ -386,6 +386,7 @@ char secret[80]; char md5secret[80]; char context[80]; + char forward_context[80]; char callerid[80]; char accountcode[20]; char language[MAX_LANGUAGE]; @@ -6546,7 +6547,7 @@ if (!strncasecmp(s, "sip:", 4)) s += 4; ast_log(LOG_DEBUG, "Found 302 Redirect to extension '%s'\n", s); - if (p->owner) + if (p->owner) strncpy(p->owner->call_forward, s, sizeof(p->owner->call_forward) - 1); } } @@ -6573,6 +6574,7 @@ char *to; char *msg, *c; struct ast_channel *owner; + struct sip_user *user; struct sip_peer *peer; int pingtime; struct timeval tv; @@ -6874,9 +6876,20 @@ case 301: /* Moved permenantly */ case 302: /* Moved temporarily */ case 305: /* Use Proxy */ + ast_mutex_lock(&userl.lock); + user = find_user(p->username); + if (!user) + ast_mutex_unlock(&userl.lock); + else if (!ast_strlen_zero (user->forward_context)){ + + strncpy(p->owner->context, user->forward_context, sizeof(p->owner->context) - 1); + ast_mutex_unlock(&userl.lock); + } parse_moved_contact(p, req); - if (p->owner) + + if (p->owner) { ast_queue_control(p->owner, AST_CONTROL_BUSY); + } break; case 487: /* channel now destroyed - dec the inUse counter */ @@ -8206,6 +8219,9 @@ while(v) { if (!strcasecmp(v->name, "context")) { strncpy(user->context, v->value, sizeof(user->context) - 1); + } else if (!strcasecmp(v->name, "forward_context")) { + + strncpy(user->forward_context, v->value, sizeof(user->forward_context) - 1); } else if (!strcasecmp(v->name, "permit") || !strcasecmp(v->name, "deny")) { user->ha = ast_append_ha(v->name, v->value, user->ha);