ソースを参照

registrar(s): support for disabled code, reason and contact AVPs

reply_code_attr, reply_reason_attr and contact_attr modparams can
now be set to "" to disable setting the corresponding AVPs when
a save*_noreply() is used (speed-up if not needed).
Andrei Pelinescu-Onciul 15 年 前
コミット
fb021d55b0
3 ファイル変更67 行追加52 行削除
  1. 39 31
      modules_s/registrar/reg_mod.c
  2. 1 0
      modules_s/registrar/reg_mod.h
  3. 27 21
      modules_s/registrar/reply.c

+ 39 - 31
modules_s/registrar/reg_mod.c

@@ -174,42 +174,50 @@ static int parse_attr_params(void)
 {
 {
 	str tmp;
 	str tmp;
 
 
-	tmp = reply_code_attr;
-	trim(&tmp);
-	if (!tmp.len || tmp.s[0] != '$') {
-		ERR("Invalid attribute name '%.*s'\n", tmp.len, tmp.s);
-		return -1;
-	}
-	tmp.s++; tmp.len--;
-	if (parse_avp_ident(&tmp, &avpid_code) < 0) {
-		ERR("Error while parsing attribute name '%.*s'\n", tmp.len, tmp.s);
-		return -1;
+	if (reply_code_attr.len) {
+		tmp = reply_code_attr;
+		trim(&tmp);
+		if (!tmp.len || tmp.s[0] != '$') {
+			ERR("Invalid attribute name '%.*s'\n", tmp.len, tmp.s);
+			return -1;
+		}
+		tmp.s++; tmp.len--;
+		if (parse_avp_ident(&tmp, &avpid_code) < 0) {
+			ERR("Error while parsing attribute name '%.*s'\n",
+					tmp.len, tmp.s);
+			return -1;
+		}
 	}
 	}
 
 
-	tmp = reply_reason_attr;
-	trim(&tmp);
-	if (!tmp.len || tmp.s[0] != '$') {
-		ERR("Invalid attribute name '%.*s'\n", tmp.len, tmp.s);
-		return -1;
-	}
-	tmp.s++; tmp.len--;
-	if (parse_avp_ident(&tmp, &avpid_reason) < 0) {
-		ERR("Error while parsing attribute name '%.*s'\n", tmp.len, tmp.s);
-		return -1;
+	if (reply_reason_attr.len) {
+		tmp = reply_reason_attr;
+		trim(&tmp);
+		if (!tmp.len || tmp.s[0] != '$') {
+			ERR("Invalid attribute name '%.*s'\n", tmp.len, tmp.s);
+			return -1;
+		}
+		tmp.s++; tmp.len--;
+		if (parse_avp_ident(&tmp, &avpid_reason) < 0) {
+			ERR("Error while parsing attribute name '%.*s'\n",
+					tmp.len, tmp.s);
+			return -1;
+		}
 	}
 	}
 
 
-	tmp = contact_attr;
-	trim(&tmp);
-	if (!tmp.len || tmp.s[0] != '$') {
-		ERR("Invalid attribute name '%.*s'\n", tmp.len, tmp.s);
-		return -1;
-	}
-	tmp.s++; tmp.len--;
-	if (parse_avp_ident(&tmp, &avpid_contact) < 0) {
-		ERR("Error while parsing attribute name '%.*s'\n", tmp.len, tmp.s);
-		return -1;
+	if (contact_attr.len) {
+		tmp = contact_attr;
+		trim(&tmp);
+		if (!tmp.len || tmp.s[0] != '$') {
+			ERR("Invalid attribute name '%.*s'\n", tmp.len, tmp.s);
+			return -1;
+		}
+		tmp.s++; tmp.len--;
+		if (parse_avp_ident(&tmp, &avpid_contact) < 0) {
+			ERR("Error while parsing attribute name '%.*s'\n",
+					tmp.len, tmp.s);
+			return -1;
+		}
 	}
 	}
-
 	return 0;
 	return 0;
 }
 }
 
 

+ 1 - 0
modules_s/registrar/reg_mod.h

@@ -57,6 +57,7 @@ extern usrloc_api_t ul;  /* Structure containing pointers to usrloc functions */
 
 
 extern sl_api_t slb;
 extern sl_api_t slb;
 
 
+extern str reply_code_attr, reply_reason_attr, contact_attr;
 extern avp_ident_t avpid_code, avpid_reason, avpid_contact;
 extern avp_ident_t avpid_code, avpid_reason, avpid_contact;
 
 
 #endif /* REG_MOD_H */
 #endif /* REG_MOD_H */

+ 27 - 21
modules_s/registrar/reply.c

@@ -349,40 +349,46 @@ int setup_attrs(struct sip_msg* msg)
 	str reason, c;
 	str reason, c;
 	avp_value_t val;
 	avp_value_t val;
 
 
-	reason.s = NULL;
-	reason.len = 0;
 	code = codes[rerrno];
 	code = codes[rerrno];
-	switch(code) {
-	case 200: reason.s = MSG_200; reason.len = sizeof(MSG_200) - 1; break;
-	case 400: reason.s = MSG_400; reason.len = sizeof(MSG_400) - 1; break;
-	case 500: reason.s = MSG_500; reason.len = sizeof(MSG_500) - 1; break;
-	case 503: reason.s = MSG_503; reason.len = sizeof(MSG_503) - 1; break;
-	}
 
 
-	val.n = code;
-	if (add_avp(avpid_code.flags, avpid_code.name, val) < 0) {
-		ERR("Error while creating reply code attribute\n");
-		return -1;
+	if (reply_code_attr.len) {
+		val.n = code;
+		if (add_avp(avpid_code.flags, avpid_code.name, val) < 0) {
+			ERR("Error while creating reply code attribute\n");
+			return -1;
+		}
 	}
 	}
 
 
-	val.s = reason;
-	if (add_avp(avpid_reason.flags | AVP_VAL_STR, avpid_reason.name, val) < 0) {
-		ERR("Error while creating reply reason attribute\n");
-		return -1;
-	}	
+	if (reply_reason_attr.len) {
+		reason.s = NULL;
+		reason.len = 0;
+		switch(code) {
+		case 200: reason.s = MSG_200; reason.len = sizeof(MSG_200) - 1; break;
+		case 400: reason.s = MSG_400; reason.len = sizeof(MSG_400) - 1; break;
+		case 500: reason.s = MSG_500; reason.len = sizeof(MSG_500) - 1; break;
+		case 503: reason.s = MSG_503; reason.len = sizeof(MSG_503) - 1; break;
+		}
+		val.s = reason;
+		if (add_avp(avpid_reason.flags | AVP_VAL_STR, avpid_reason.name, val)
+				< 0) {
+			ERR("Error while creating reply reason attribute\n");
+			return -1;
+		}
+	}
 
 
-	if (contact.data_len > 0) {
+	if (contact_attr.len && contact.data_len > 0) {
 		c.s = contact.buf;
 		c.s = contact.buf;
 		c.len = contact.data_len;
 		c.len = contact.data_len;
 		val.s = c;
 		val.s = c;
 
 
-		if (add_avp(avpid_contact.flags | AVP_VAL_STR, avpid_contact.name, val) < 0) {
+		if (add_avp(avpid_contact.flags | AVP_VAL_STR, avpid_contact.name, val)
+				< 0) {
 			ERR("Error while creating contact attribute\n");
 			ERR("Error while creating contact attribute\n");
 			return -1;
 			return -1;
-		}	
+		}
 
 
 		contact.data_len = 0;
 		contact.data_len = 0;
-	}	
+	}
 
 
 	return 0;
 	return 0;
 }
 }