- Add error handling to ast_parse_allow_disallow
authorOlle Johansson <oej@edvina.net>
Mon, 1 Jan 2007 19:48:31 +0000 (19:48 +0000)
committerOlle Johansson <oej@edvina.net>
Mon, 1 Jan 2007 19:48:31 +0000 (19:48 +0000)
- Use this in chan_sip configuration parsing

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@49093 65c4cc65-6c06-0410-ace0-fbb531ad65f3

channels/chan_sip.c
include/asterisk/frame.h
main/frame.c

index a5cfbfd..e71af5e 100644 (file)
@@ -15806,9 +15806,13 @@ static struct sip_user *build_user(const char *name, struct ast_variable *v, int
                                user->amaflags = format;
                        }
                } else if (!strcasecmp(v->name, "allow")) {
-                       ast_parse_allow_disallow(&user->prefs, &user->capability, v->value, 1);
+                       int error =  ast_parse_allow_disallow(&user->prefs, &user->capability, v->value, TRUE);
+                       if (error)
+                               ast_log(LOG_WARNING, "Codec configuration errors found in line %d : %s = %s\n", v->lineno, v->name, v->value);
                } else if (!strcasecmp(v->name, "disallow")) {
-                       ast_parse_allow_disallow(&user->prefs, &user->capability, v->value, 0);
+                       int error =  ast_parse_allow_disallow(&user->prefs, &user->capability, v->value, FALSE);
+                       if (error)
+                               ast_log(LOG_WARNING, "Codec configuration errors found in line %d : %s = %s\n", v->lineno, v->name, v->value);
                } else if (!strcasecmp(v->name, "autoframing")) {
                        user->autoframing = ast_true(v->value);
                } else if (!strcasecmp(v->name, "callingpres")) {
@@ -16079,9 +16083,13 @@ static struct sip_peer *build_peer(const char *name, struct ast_variable *v, str
                } else if (!strcasecmp(v->name, "pickupgroup")) {
                        peer->pickupgroup = ast_get_group(v->value);
                } else if (!strcasecmp(v->name, "allow")) {
-                       ast_parse_allow_disallow(&peer->prefs, &peer->capability, v->value, 1);
+                       int error =  ast_parse_allow_disallow(&peer->prefs, &peer->capability, v->value, TRUE);
+                       if (error)
+                               ast_log(LOG_WARNING, "Codec configuration errors found in line %d : %s = %s\n", v->lineno, v->name, v->value);
                } else if (!strcasecmp(v->name, "disallow")) {
-                       ast_parse_allow_disallow(&peer->prefs, &peer->capability, v->value, 0);
+                       int error =  ast_parse_allow_disallow(&peer->prefs, &peer->capability, v->value, FALSE);
+                       if (error)
+                               ast_log(LOG_WARNING, "Codec configuration errors found in line %d : %s = %s\n", v->lineno, v->name, v->value);
                } else if (!strcasecmp(v->name, "autoframing")) {
                        peer->autoframing = ast_true(v->value);
                } else if (!strcasecmp(v->name, "rtptimeout")) {
@@ -16440,9 +16448,13 @@ static int reload_config(enum channelreloadreason reason)
                                externrefresh = 10;
                        }
                } else if (!strcasecmp(v->name, "allow")) {
-                       ast_parse_allow_disallow(&default_prefs, &global_capability, v->value, 1);
+                       int error =  ast_parse_allow_disallow(&default_prefs, &global_capability, v->value, TRUE);
+                       if (error)
+                               ast_log(LOG_WARNING, "Codec configuration errors found in line %d : %s = %s\n", v->lineno, v->name, v->value);
                } else if (!strcasecmp(v->name, "disallow")) {
-                       ast_parse_allow_disallow(&default_prefs, &global_capability, v->value, 0);
+                       int error =  ast_parse_allow_disallow(&default_prefs, &global_capability, v->value, FALSE);
+                       if (error)
+                               ast_log(LOG_WARNING, "Codec configuration errors found in line %d : %s = %s\n", v->lineno, v->name, v->value);
                } else if (!strcasecmp(v->name, "autoframing")) {
                        global_autoframing = ast_true(v->value);
                } else if (!strcasecmp(v->name, "allowexternaldomains")) {
index 49968ff..f78a6a6 100644 (file)
@@ -533,8 +533,9 @@ struct ast_format_list ast_codec_pref_getsize(struct ast_codec_pref *pref, int f
 /*! \brief Parse an "allow" or "deny" line in a channel or device configuration 
         and update the capabilities mask and pref if provided.
        Video codecs are not added to codec preference lists, since we can not transcode
+       \return Returns number of errors encountered during parsing
  */
-void ast_parse_allow_disallow(struct ast_codec_pref *pref, int *mask, const char *list, int allowing);
+int ast_parse_allow_disallow(struct ast_codec_pref *pref, int *mask, const char *list, int allowing);
 
 /*! \brief Dump audio codec preference list into a string */
 int ast_codec_pref_string(struct ast_codec_pref *pref, char *buf, size_t size);
index a6fd97a..ba796d1 100644 (file)
@@ -1143,8 +1143,9 @@ int ast_codec_choose(struct ast_codec_pref *pref, int formats, int find_best)
        return find_best ? ast_best_codec(formats) : 0;
 }
 
-void ast_parse_allow_disallow(struct ast_codec_pref *pref, int *mask, const char *list, int allowing) 
+int ast_parse_allow_disallow(struct ast_codec_pref *pref, int *mask, const char *list, int allowing) 
 {
+       int errors = 0;
        char *parse = NULL, *this = NULL, *psize = NULL;
        int format = 0, framems = 0;
 
@@ -1156,11 +1157,15 @@ void ast_parse_allow_disallow(struct ast_codec_pref *pref, int *mask, const char
                        if (option_debug)
                                ast_log(LOG_DEBUG,"Packetization for codec: %s is %s\n", this, psize);
                        framems = atoi(psize);
-                       if (framems < 0)
+                       if (framems < 0) {
                                framems = 0;
+                               errors++;
+                               ast_log(LOG_WARNING, "Bad packetization value for codec %s\n", this);
+                       }
                }
                if (!(format = ast_getformatbyname(this))) {
                        ast_log(LOG_WARNING, "Cannot %s unknown format '%s'\n", allowing ? "allow" : "disallow", this);
+                       errors++;
                        continue;
                }
 
@@ -1187,6 +1192,7 @@ void ast_parse_allow_disallow(struct ast_codec_pref *pref, int *mask, const char
                        }
                }
        }
+       return errors;
 }
 
 static int g723_len(unsigned char buf)