All pastes #23 Raw Edit

h.323 patch

public ini v1 · immutable
#23 ·published 2004-03-15 10:58 UTC
rendered paste body
Index: channels/chan_h323.c===================================================================RCS file: /usr/cvsroot/asterisk/channels/chan_h323.c,vretrieving revision 1.35diff -u -r1.35 chan_h323.c--- channels/chan_h323.c        15 Mar 2004 09:14:16 -0000      1.35+++ channels/chan_h323.c        15 Mar 2004 10:48:41 -0000@@ -191,9 +191,32 @@        ast_mutex_unlock(&iflock); }+static void alias_add_e164(struct oh323_alias *alias, char *val)+{+       struct e164_number *tmp = alias->e164;++       /* Create a new e164 number structure and chain it */+       alias->e164 = (struct e164_number *)calloc(1, sizeof(struct e164_number));+       alias->e164->next = tmp;++       strncpy(alias->e164->number, val, E164_MAX_LENGTH-1);+}++static void alias_add_prefix(struct oh323_alias *alias, char *val)+{+       struct e164_number *tmp = alias->prefix;++       /* Create a new e164 number structure and chain it */+       alias->prefix = (struct e164_number *)calloc(1, sizeof(struct e164_number));+       alias->prefix->next = tmp;++       strncpy(alias->prefix->number, val, E164_MAX_LENGTH-1);+}+ static struct oh323_alias *build_alias(char *name, struct ast_variable *v) {        struct oh323_alias *alias;+       char *p, *n;        alias = (struct oh323_alias *)malloc(sizeof(struct oh323_alias));@@ -203,9 +226,19 @@                while (v) {                        if (!strcasecmp(v->name, "e164")) {-                               strncpy(alias->e164,  v->value, sizeof(alias->e164)-1);+                               p = v->value;+                               n = strsep(&p, ",");+                               while(n) {+                                       alias_add_prefix(alias, n);+                                       n = strsep(&p, ",");+                               }                        } else if (!strcasecmp(v->name, "prefix")) {-                               strncpy(alias->prefix,  v->value, sizeof(alias->prefix)-1);+                               p = v->value;+                               n = strsep(&p, ",");+                               while(n) {+                                       alias_add_prefix(alias, n);+                                       n = strsep(&p, ",");+                               }                        } else if (!strcasecmp(v->name, "context")) {                                strncpy(alias->context,  v->value, sizeof(alias->context)-1);                        } else if (!strcasecmp(v->name, "secret")) {@@ -218,6 +251,7 @@                        v = v->next;                }        }+        return alias; }@@ -748,22 +782,21 @@ static struct oh323_pvt *find_call(int call_reference) {-        struct oh323_pvt *p;+       struct oh323_pvt *p;-               ast_mutex_lock(&iflock);-        p = iflist;+       ast_mutex_lock(&iflock);+       p = iflist;-        while(p) {-                if (p->cd.call_reference == call_reference) {-                        /* Found the call */-                                               ast_mutex_unlock(&iflock);-                                               return p;-                }-                p = p->next;-        }-        ast_mutex_unlock(&iflock);-               return NULL;-+       while(p) {+               if (p->cd.call_reference == call_reference) {+                       /* Found the call */+                       ast_mutex_unlock(&iflock);+                       return p;+               }+               p = p->next;+       }+       ast_mutex_unlock(&iflock);+       return NULL; } static struct ast_channel *oh323_request(char *type, int format, void *data)@@ -841,6 +874,7 @@ {        struct oh323_alias *a;+       ast_mutex_lock(&aliasl.lock);        a = aliasl.aliases;        while(a) {@@ -850,6 +884,66 @@                }                a = a->next;        }++       ast_mutex_unlock(&aliasl.lock);+       return a;+}++struct oh323_alias *find_e164(const char *source_aliases)+{+       struct oh323_alias *a;+       struct e164_number *num;+       int found = 0;++       ast_mutex_lock(&aliasl.lock);+       a = aliasl.aliases;++       while(a && !found) {+               if(a->e164) {+                       num = a->e164;+                       while(num) {+                               if(!strncmp(num->number, source_aliases, E164_MAX_LENGTH)) {+                                       found = 1;+                                       break;+                               }+                       num = num->next;+               }+       }+       if(!found)+               a = a->next;+       }+       ast_mutex_unlock(&aliasl.lock);++       return a;+}++struct oh323_alias *find_prefix(const char *source_aliases)+{+       struct oh323_alias *a;+       struct e164_number *num;+       int found = 0;++       ast_mutex_lock(&aliasl.lock);++       a = aliasl.aliases;++       while(a && !found) {+       if(a->prefix) {+               num = a->prefix;+               while(num) {+                       if(strlen(source_aliases) >= strlen(num->number) &&+                          !strncmp(num->number, source_aliases, strlen(num->number))) {+                               found = 1;+                               break;+                       }+                       num = num->next;+               }+       }+       if(!found)+               a = a->next;+       }+       ast_mutex_unlock(&aliasl.lock);+        return a; }@@ -907,7 +1001,7 @@        ast_log(LOG_DEBUG, "Recieved Digit: %c\n", digit);        p = find_call(call_reference);-+        if (!p) {                ast_log(LOG_ERROR, "Private structure not found in send_digit.\n");                return -1;@@ -1000,8 +1094,15 @@        if ((!strcasecmp(cd.sourceIp, gatekeeper)) && (gkroute == -1) && (usingGk == 1)) {                if (strlen(cd.call_dest_e164)) {+                       alias = find_e164(cd.call_dest_e164);+                       if(!alias)+                               alias = find_prefix(cd.call_dest_e164);++                       if(!alias)+                               ast_log(LOG_WARNING, "Call for '%s' could not be routed to a context, sending to default.\n", cd.call_dest_e164);+                        strncpy(p->exten, cd.call_dest_e164, sizeof(p->exten)-1);-                       strncpy(p->context, default_context, sizeof(p->context)-1);+                       strncpy(p->context, (alias?alias->context:default_context), sizeof(p->context)-1);                } else {                        alias = find_alias(cd.call_dest_alias);@@ -1372,6 +1473,48 @@        return RESULT_SUCCESS; }+static int h323_show_aliases(int fd, int argc, char *argv[])+{+       struct oh323_alias *alias;+       struct e164_number *num;++       if (argc != 3) {+               return RESULT_SHOWUSAGE;+       }+       ast_cli(fd, "H323 Configured Aliases/E164/Prefixes:\n");++       ast_mutex_lock(&aliasl.lock);+       alias = aliasl.aliases;++       if(!alias) {+               ast_cli(fd, "  Nothing configured!\n");+               ast_mutex_unlock(&aliasl.lock);+               return RESULT_SUCCESS;+       }++       ast_cli(fd, "%-20s %-5s %-20s %-20s\n", "Alias", "Type", "E164", "Context");++       while(alias) {+               ast_cli(fd, "%-20s %-5s %-20s %-20s\n", alias->name, "id", "", alias->context);++               num = alias->e164;+               while(num) {+                       ast_cli(fd, "%-20s %-5s %-20s %-20s\n", alias->name, "e164", num->number, alias->context);+                       num = num->next;+               }++               num = alias->prefix;+               while(num) {+                       ast_cli(fd, "%-20s %-5s %-20s %-20s\n", alias->name, "pfx", num->number, alias->context);+                       num = num->next;+               }++               alias = alias->next;+       }++       ast_mutex_unlock(&aliasl.lock);+       return RESULT_SUCCESS;+} static char trace_usage[] = "Usage: h.323 trace <level num>\n"@@ -1405,6 +1548,10 @@ "Usage: h.323 show tokens\n" "       Print out all active call tokens\n";+static char show_aliases_usage[] =+"Usage: h.323 show aliases\n"+"       Print out all configured aliases\n";+ static struct ast_cli_entry  cli_trace =        { { "h.323", "trace", NULL }, h323_do_trace, "Enable H.323 Stack Tracing", trace_usage }; static struct ast_cli_entry  cli_no_trace =@@ -1421,7 +1568,8 @@        { { "h.323", "hangup", NULL }, h323_ep_hangup, "Manually try to hang up a call", show_hangup_usage }; static struct ast_cli_entry  cli_show_tokens =        { { "h.323", "show", "tokens", NULL }, h323_tokens_show, "Manually try to hang up a call", show_tokens_usage };-+static struct ast_cli_entry  cli_show_aliases =+    { { "h.323", "show", "aliases", NULL }, h323_show_aliases, "Show configured aliases", show_aliases_usage }; int reload_config(void)@@ -1612,12 +1760,26 @@ void delete_aliases(void) {        struct oh323_alias *alias, *aliaslast;-+       struct e164_number *num, *numlast;+        /* Delete all users */        ast_mutex_lock(&aliasl.lock);        for (alias=aliasl.aliases;alias;) {                aliaslast = alias;                alias=alias->next;++               for(num=aliaslast->e164;num;) {+                       numlast = num;+                       num = num->next;+                       free(num);+               }++               for(num=aliaslast->prefix;num;) {+                       numlast = num;+                       num = num->next;+                       free(num);+               }+                free(aliaslast);        }        aliasl.aliases=NULL;@@ -1775,7 +1937,8 @@                ast_cli_register(&cli_gk_cycle);                ast_cli_register(&cli_hangup_call);                ast_cli_register(&cli_show_tokens);-+               ast_cli_register(&cli_show_aliases);+                oh323_rtp.type = type;                ast_rtp_proto_register(&oh323_rtp);@@ -1907,7 +2070,3 @@ {        return ASTERISK_GPL_KEY; }----Index: channels/h323/chan_h323.h===================================================================RCS file: /usr/cvsroot/asterisk/channels/h323/chan_h323.h,vretrieving revision 1.19diff -u -r1.19 chan_h323.h--- channels/h323/chan_h323.h   4 Mar 2004 01:57:32 -0000       1.19+++ channels/h323/chan_h323.h   15 Mar 2004 10:48:41 -0000@@ -70,15 +70,22 @@        struct oh323_peer *next; };+/* a place to store a list of e164 numbers */+#define E164_MAX_LENGTH 40+struct e164_number {+       char number[E164_MAX_LENGTH]; /* the E.164 number */+       struct e164_number *next;+};+ /* structure to hold the H.323 aliases which get registered to    the H.323 endpoint and gatekeeper */ struct oh323_alias {        char name[80];-       char e164[20];                          /* tells a GK to route this E.164 to this alias */-       char prefix[500];                       /* tells a GK this alias supports these prefixes */+       struct e164_number *e164;               /* exact e164 numbers list */+       struct e164_number *prefix;             /* e164 number prefixes list */        char secret[20];                        /* the H.235 password to send to the GK for authentication */        char context[80];-       struct oh323_alias *next;+       struct oh323_alias *next; }; /** call_option struct is filled from theIndex: channels/h323/ast_h323.cpp===================================================================RCS file: /usr/cvsroot/asterisk/channels/h323/ast_h323.cpp,vretrieving revision 1.35diff -u -r1.35 ast_h323.cpp--- channels/h323/ast_h323.cpp  4 Mar 2004 06:11:23 -0000       1.35+++ channels/h323/ast_h323.cpp  15 Mar 2004 10:48:41 -0000@@ -886,10 +886,7 @@ int h323_set_alias(struct oh323_alias *alias) {-       char *p;-       char *num;        PString h323id(alias->name);-       PString e164(alias->e164);        if (!h323_end_point_exist()) {                cout << "ERROR: [h323_set_alias] No Endpoint, this is bad!" << endl;@@ -900,18 +897,26 @@        endPoint->AddAliasName(h323id);        endPoint->RemoveAliasName(localProcess->GetUserName());-       if (!e164.IsEmpty()) {-               cout << "  == Adding E.164 \"" << e164 << "\" to endpoint" << endl;-               endPoint->AddAliasName(e164);+       if(alias->e164) {+               struct e164_number *num = alias->e164;+               while(num) {+                       if(strlen(num->number)) {+                               cout << "  == Adding E.164 \"" << num->number << "\" to endpoint" << endl;+                               endPoint->AddAliasName(num->number);+                       }+                       num = num->next;+               }        }-       if (strlen(alias->prefix)) {-               p = alias->prefix;-               num = strsep(&p, ",");++       if(alias->prefix) {+               struct e164_number *num = alias->prefix;                while(num) {-               cout << "  == Adding Prefix \"" << num << "\" to endpoint" << endl;-                       endPoint->SupportedPrefixes += PString(num);-                       endPoint->SetGateway();-               num = strsep(&p, ",");+                       if(strlen(num->number)) {+                               cout << "  == Adding Prefix \"" << num->number << "\" to endpoint" << endl;+                               endPoint->SupportedPrefixes += PString(num->number);+                               endPoint->SetGateway();+                       }+                       num = num->next;                }        }Index: channels/h323/h323.conf.sample===================================================================RCS file: /usr/cvsroot/asterisk/channels/h323/h323.conf.sample,vretrieving revision 1.8diff -u -r1.8 h323.conf.sample--- channels/h323/h323.conf.sample      24 Dec 2003 22:36:57 -0000      1.8+++ channels/h323/h323.conf.sample      15 Mar 2004 10:48:41 -0000@@ -49,14 +49,17 @@ ; Default context gets used in siutations where you are using ; the GK routed model or no type=user was found. This gives you ; the ability to either play an invalid message or to simply not-; use user authentication at all.+; use user authentication at all. Also, if a call is accepted for+; a prefix or e164 number that cannot be matched to any of the+; following sections, it will be sent here. ; ;context=default ; ; H.323 Alias definitions ; ; Type 'h323' will register aliases to the endpoint-; and Gatekeeper, if there is one.+; and Gatekeeper, if there is one. It will also offer+; itself as a gateway for prefixes. ; ; Example: if someone calls time@your.asterisk.box.com ; Asterisk will send the call to the extension 'time'@@ -69,6 +72,11 @@ ; Keyword's 'prefix' and 'e164' are only make sense when ; used with a gatekeeper. You can specify either a prefix ; or E.164 this endpoint is responsible for terminating.+; In the case of a prefix or e164, the context specified+; in that section will receive the called extension. E164+; numbers are matched before prefixes, so you can have+; a prefix covering a general case, and a specific E164 in+; another context. ; ; Example: The H.323 alias 'det-gw' will tell the gatekeeper ; to route any call with the prefix 1248 to this alias. Keyword