Kaynağa Gözat

- support for URI attributes

Jan Janak 19 yıl önce
ebeveyn
işleme
e61ba5d274
4 değiştirilmiş dosya ile 43 ekleme ve 8 silme
  1. 4 0
      cfg.lex
  2. 4 0
      cfg.y
  3. 33 7
      usr_avp.c
  4. 2 1
      usr_avp.h

+ 4 - 0
cfg.lex

@@ -206,6 +206,8 @@ ATTR_MARK   "$"|"%"
 SELECT_MARK  "@"
 ATTR_FROM         "f"
 ATTR_TO           "t"
+ATTR_FROMURI      "fr"
+ATTR_TOURI       "tr"
 ATTR_FROMUSER     "fu"
 ATTR_TOUSER       "tu"
 ATTR_FROMDOMAIN   "fd"
@@ -519,6 +521,8 @@ EAT_ABLE	[\ \t\b\r]
 <INITIAL>{ATTR_MARK}    { count(); state = ATTR_S; BEGIN(ATTR); return ATTR_MARK; }
 <ATTR>{ATTR_FROM}       { count(); return ATTR_FROM; }
 <ATTR>{ATTR_TO}         { count(); return ATTR_TO; }
+<ATTR>{ATTR_FROMURI}    { count(); return ATTR_FROMURI; }
+<ATTR>{ATTR_TOURI}      { count(); return ATTR_TOURI; }
 <ATTR>{ATTR_FROMUSER}   { count(); return ATTR_FROMUSER; }
 <ATTR>{ATTR_TOUSER}     { count(); return ATTR_TOUSER; }
 <ATTR>{ATTR_FROMDOMAIN} { count(); return ATTR_FROMDOMAIN; }

+ 4 - 0
cfg.y

@@ -290,6 +290,8 @@ static struct socket_id* mk_listen_id(char*, int, int);
 %token SELECT_MARK
 %token ATTR_FROM
 %token ATTR_TO
+%token ATTR_FROMURI
+%token ATTR_TOURI
 %token ATTR_FROMUSER
 %token ATTR_TOUSER
 %token ATTR_FROMDOMAIN
@@ -1390,6 +1392,8 @@ select_id:
 attr_class_spec:
 	ATTR_FROM { s_attr->type |= AVP_TRACK_FROM; }
 	| ATTR_TO { s_attr->type |= AVP_TRACK_TO; }
+        | ATTR_FROMURI { s_attr->type |= AVP_TRACK_FROM | AVP_CLASS_URI; }
+        | ATTR_TOURI { s_attr->type |= AVP_TRACK_TO | AVP_CLASS_URI; }
 	| ATTR_FROMUSER { s_attr->type |= AVP_TRACK_FROM | AVP_CLASS_USER; }
 	| ATTR_TOUSER { s_attr->type |= AVP_TRACK_TO | AVP_CLASS_USER; }
 	| ATTR_FROMDOMAIN { s_attr->type |= AVP_TRACK_FROM | AVP_CLASS_DOMAIN; }

+ 33 - 7
usr_avp.c

@@ -50,7 +50,9 @@
 #include "usr_avp.h"
 
 enum idx {
-	IDX_FROM_USER = 0,
+	IDX_FROM_URI = 0,
+	IDX_TO_URI,
+	IDX_FROM_USER,
 	IDX_TO_USER,
 	IDX_FROM_DOMAIN,
 	IDX_TO_DOMAIN,
@@ -108,7 +110,13 @@ int init_avps(void)
  */
 static avp_list_t* select_list(avp_flags_t flags)
 {
-	if (flags & AVP_CLASS_USER) {
+	if (flags & AVP_CLASS_URI) {
+		if (flags & AVP_TRACK_TO) {
+			return crt_list[IDX_TO_URI];
+		} else {
+			return crt_list[IDX_FROM_URI];
+		}
+	} else if (flags & AVP_CLASS_USER) {
 		if (flags & AVP_TRACK_TO) {
 			return crt_list[IDX_TO_USER];
 		} else {
@@ -241,14 +249,15 @@ int add_avp(avp_flags_t flags, avp_name_t name, avp_value_t val)
 	avp_flags_t avp_class;
 	avp_list_t* list;
 
-	     /* Add avp to user class if no class has been
+	     /* Add avp to uri class if no class has been
 	      * specified by the caller
 	      */
-	if ((flags & AVP_CLASS_ALL) == 0) flags |= AVP_CLASS_USER;
+	if ((flags & AVP_CLASS_ALL) == 0) flags |= AVP_CLASS_URI;
 	if ((flags & AVP_TRACK_ALL) == 0) flags |= AVP_TRACK_FROM;
 	list = select_list(flags);
 
-	if (flags & AVP_CLASS_USER) avp_class = AVP_CLASS_USER;
+	if (flags & AVP_CLASS_URI) avp_class = AVP_CLASS_URI;
+	else if (flags & AVP_CLASS_USER) avp_class = AVP_CLASS_USER;
 	else if (flags & AVP_CLASS_DOMAIN) avp_class = AVP_CLASS_DOMAIN;
 	else avp_class = AVP_CLASS_GLOBAL;
 
@@ -482,7 +491,10 @@ avp_t *search_next_avp(struct search_state* s, avp_value_t *val )
 			}
 		}
 
-		if (s->flags & AVP_CLASS_USER) {
+		if (s->flags & AVP_CLASS_URI) {
+			s->flags &= ~AVP_CLASS_URI;
+			s->avp = *select_list(s->flags);
+		} else if (s->flags & AVP_CLASS_USER) {
 			s->flags &= ~AVP_CLASS_USER;
 			s->avp = *select_list(s->flags);
 		} else if (s->flags & AVP_CLASS_DOMAIN) {
@@ -627,7 +639,15 @@ avp_list_t* set_avp_list( avp_flags_t flags, avp_list_t* list )
 {
 	avp_list_t* prev;
 
-	if (flags & AVP_CLASS_USER) {
+	if (flags & AVP_CLASS_URI) {
+		if (flags & AVP_TRACK_FROM) {
+			prev = crt_list[IDX_FROM_URI];
+			crt_list[IDX_FROM_URI] = list;
+		} else {
+			prev = crt_list[IDX_TO_URI];
+			crt_list[IDX_TO_URI] = list;
+		}
+	} else if (flags & AVP_CLASS_USER) {
 		if (flags & AVP_TRACK_FROM) {
 			prev = crt_list[IDX_FROM_USER];
 			crt_list[IDX_FROM_USER] = list;
@@ -845,6 +865,12 @@ int parse_avp_ident( str *name, avp_ident_t* attr)
 			case 't':
 				attr->flags = AVP_TRACK_TO;
 				break;
+			case 0x6672: /* 'fr' */
+				attr->flags = AVP_TRACK_FROM | AVP_CLASS_URI;
+				break;
+			case 0x7472: /* 'tr' */
+				attr->flags = AVP_TRACK_TO | AVP_CLASS_URI;
+				break;				
 			case 0x6675: /* 'fu' */
 				attr->flags = AVP_TRACK_FROM | AVP_CLASS_USER;
 				break;

+ 2 - 1
usr_avp.h

@@ -131,6 +131,7 @@ typedef struct avp_spec {
 #define AVP_NAME_RE      (1<<2)
 
 /* AVP classes */
+#define AVP_CLASS_URI    (1<<4)
 #define AVP_CLASS_USER   (1<<5)
 #define AVP_CLASS_DOMAIN (1<<6)
 #define AVP_CLASS_GLOBAL (1<<7)
@@ -140,7 +141,7 @@ typedef struct avp_spec {
 #define AVP_TRACK_TO     (1<<9)
 #define AVP_TRACK_ALL    (AVP_TRACK_FROM|AVP_TRACK_TO)
 
-#define AVP_CLASS_ALL (AVP_CLASS_USER|AVP_CLASS_DOMAIN|AVP_CLASS_GLOBAL)
+#define AVP_CLASS_ALL (AVP_CLASS_URI|AVP_CLASS_USER|AVP_CLASS_DOMAIN|AVP_CLASS_GLOBAL)
 
 /* AVP name index */
 #define AVP_INDEX_FORWARD	(1<<10)