Index: channels/chan_skinny.c =================================================================== --- channels/chan_skinny.c (revision 65232) +++ channels/chan_skinny.c (working copy) @@ -100,6 +100,7 @@ static int keep_alive = 120; static char vmexten[AST_MAX_EXTENSION]; /* Voicemail pilot number */ +static char regcontext[AST_MAX_CONTEXT]; /* Context for auto-extension */ static char date_format[6] = "D-M-Y"; static char version_id[16] = "P002F202"; @@ -781,6 +782,7 @@ /* static int busycount = 3;*/ static char accountcode[AST_MAX_ACCOUNT_CODE] = ""; static char mailbox[AST_MAX_EXTENSION]; +static char regexten[AST_MAX_EXTENSION]; static int amaflags = 0; static int callnums = 1; @@ -940,6 +942,8 @@ char call_forward[AST_MAX_EXTENSION]; char mailbox[AST_MAX_EXTENSION]; char vmexten[AST_MAX_EXTENSION]; + char regexten[AST_MAX_EXTENSION]; /* Extension for auto-extensions */ + char regcontext[AST_MAX_CONTEXT]; /* Context for auto-extensions */ char mohinterpret[MAX_MUSICCLASS]; char mohsuggest[MAX_MUSICCLASS]; char lastnumberdialed[AST_MAX_EXTENSION]; /* Last number that was dialed - used for redial */ @@ -1383,6 +1387,10 @@ sd->stateid = ast_extension_state_add(sd->context, sd->exten, skinny_extensionstate_cb, sd); } for (l = d->lines; l; l = l->next) { + if (!ast_strlen_zero(l->regexten) && !ast_strlen_zero(regcontext)) + ast_add_extension(regcontext, 1, l->regexten, 1, NULL, NULL, "NoOp", + ast_strdup(l->name), ast_free, "Skinny"); + ast_device_state_changed("Skinny/%s@%s", l->name, d->name); } break; @@ -1412,6 +1420,8 @@ ast_extension_state_del(sd->stateid, NULL); } for (l = d->lines; l; l = l->next) { + if (!ast_strlen_zero(l->regexten) && !ast_strlen_zero(regcontext)) + ast_context_remove_extension(regcontext, l->regexten, 1, NULL); ast_device_state_changed("Skinny/%s@%s", l->name, d->name); } } @@ -2135,6 +2145,8 @@ ast_copy_string(device_vmexten, v->value, sizeof(device_vmexten)); } else if (!strcasecmp(v->name, "context")) { ast_copy_string(context, v->value, sizeof(context)); + } else if (!strcasecmp(v->name, "regexten")) { + ast_copy_string(regexten, v->value, sizeof(regexten)); } else if (!strcasecmp(v->name, "allow")) { ast_parse_allow_disallow(&d->prefs, &d->capability, v->value, 1); } else if (!strcasecmp(v->name, "disallow")) { @@ -2241,8 +2253,8 @@ ast_copy_string(l->language, language, sizeof(l->language)); ast_copy_string(l->mohinterpret, mohinterpret, sizeof(l->mohinterpret)); ast_copy_string(l->mohsuggest, mohsuggest, sizeof(l->mohsuggest)); + ast_copy_string(l->regexten, regexten, sizeof(l->regexten)); ast_copy_string(l->mailbox, mailbox, sizeof(l->mailbox)); - ast_copy_string(l->mailbox, mailbox, sizeof(l->mailbox)); if (!ast_strlen_zero(mailbox)) { if (option_verbose > 2) ast_verbose(VERBOSE_PREFIX_3 "Setting mailbox '%s' on %s@%s\n", mailbox, d->name, l->name); @@ -4726,6 +4738,10 @@ keep_alive = atoi(v->value); } else if (!strcasecmp(v->name, "vmexten")) { ast_copy_string(vmexten, v->value, sizeof(vmexten)); + } else if (!strcasecmp(v->name, "regcontext")) { + ast_copy_string(regcontext, v->value, sizeof(regcontext)); + if (!ast_context_find(regcontext)) + ast_context_create(NULL, regcontext, "Skinny"); } else if (!strcasecmp(v->name, "dateformat")) { ast_copy_string(date_format, v->value, sizeof(date_format)); } else if (!strcasecmp(v->name, "allow")) { Index: configs/skinny.conf.sample =================================================================== --- configs/skinny.conf.sample (revision 65232) +++ configs/skinny.conf.sample (working copy) @@ -11,6 +11,8 @@ ; It must be in the same context as the calling ; device/line +;regcontext=skinnyregistrations ; Context to dynamically add extension on line registration + ;allow=all ; see doc/rtp-packetization for framing options ;disallow= @@ -85,6 +87,7 @@ ;line => 100 ;callerid="John Chambers" <408-526-4000> ;context=did +;regexten=110 ; Extension to create in regcontext on registration ;linelabel="John" ;mailbox=110 ;line => 110