2
0
Эх сурвалжийг харах

registrar: new api function lookup_to_dset

Federico Cabiddu 11 жил өмнө
parent
commit
ccaa53b122

+ 16 - 0
modules/registrar/api.c

@@ -122,6 +122,21 @@ int regapi_set_q_override(struct sip_msg *msg, str *new_q)
 	return set_q_override(msg, _q);
 }
 
+/**
+ *
+ */
+int regapi_lookup_to_dset(struct sip_msg *msg, char *table, str *uri)
+{
+	udomain_t* d;
+
+	if(ul.get_udomain(table, &d)<0)
+	{
+		LM_ERR("usrloc domain [%s] not found\n", table);
+		return -1;
+	}
+	return lookup_to_dset(msg, d, uri);
+}
+
 /**
  *
  */
@@ -135,6 +150,7 @@ int bind_registrar(registrar_api_t* api)
 	api->save_uri   = regapi_save_uri;
 	api->lookup     = regapi_lookup;
 	api->lookup_uri = regapi_lookup_uri;
+	api->lookup_to_dset = regapi_lookup_to_dset;
 	api->registered = regapi_registered;
 	api->set_q_override = regapi_set_q_override;
 

+ 2 - 0
modules/registrar/api.h

@@ -42,6 +42,7 @@ int regapi_lookup(struct sip_msg *msg, char *table);
 
 typedef int (*regapi_lookup_uri_f)(struct sip_msg *msg, char *table, str *uri);
 int regapi_lookup_uri(struct sip_msg *msg, char *table, str *uri);
+int regapi_lookup_to_dset(struct sip_msg *msg, char *table, str *uri);
 
 typedef int (*regapi_set_q_override_f)(struct sip_msg *msg, str *new_q);
 int regapi_set_q_override(struct sip_msg *msg, str *new_q);
@@ -54,6 +55,7 @@ typedef struct registrar_api {
 	regapi_save_uri_f   save_uri;
 	regapi_lookup_f     lookup;
 	regapi_lookup_uri_f lookup_uri;
+	regapi_lookup_uri_f lookup_to_dset;
 	regapi_lookup_f     registered;
 	regapi_set_q_override_f set_q_override;
 } registrar_api_t;

+ 20 - 2
modules/registrar/lookup.c

@@ -81,13 +81,30 @@ int reg_cmp_instances(str *i1, str *i2)
 	return -1;
 }
 
+/*! \brief
+ * Lookup a contact in usrloc and rewrite R-URI if found
+ */
+int lookup(struct sip_msg* _m, udomain_t* _d, str* _uri) {
+     return lookup_helper(_m, _d, _uri, 0);
+}
+
+/*! \brief
+ * Lookup a contact in usrloc and add the records to the dset structure
+ */
+int lookup_to_dset(struct sip_msg* _m, udomain_t* _d, str* _uri) {
+     return lookup_helper(_m, _d, _uri, 1);
+}
+
 /*! \brief
  * Lookup contact in the database and rewrite Request-URI
+ * or not according to _mode value:
+ *  0: rewrite
+ *  1: don't rewrite
  * \return: -1 : not found
  *          -2 : found but method not allowed
  *          -3 : error
  */
-int lookup(struct sip_msg* _m, udomain_t* _d, str* _uri)
+int lookup_helper(struct sip_msg* _m, udomain_t* _d, str* _uri, int _mode)
 {
 	urecord_t* r;
 	str aor, uri;
@@ -211,7 +228,8 @@ int lookup(struct sip_msg* _m, udomain_t* _d, str* _uri)
 	}
 
 	ret = 1;
-	if (ptr) {
+	/* don't rewrite r-uri if called by lookup_to_dset */
+	if (_mode == 0 && ptr) {
 		if (rewrite_uri(_m, &ptr->c) < 0) {
 			LM_ERR("unable to rewrite Request-URI\n");
 			ret = -3;

+ 16 - 0
modules/registrar/lookup.h

@@ -36,11 +36,27 @@
 #include "../../modules/usrloc/usrloc.h"
 
 
+/*! \brief
+ * Lookup contact in the database and rewrite Request-URI
+ * or not according to _mode value:
+ *  0: rewrite
+ *  1: don't rewrite
+ * \return: -1 : not found
+ *          -2 : found but method not allowed
+ *          -3 : error
+ */
+int lookup_helper(struct sip_msg* _m, udomain_t* _d, str* _uri, int _mode);
+
 /*! \brief
  * Lookup a contact in usrloc and rewrite R-URI if found
  */
 int lookup(struct sip_msg* _m, udomain_t* _d, str* _uri);
 
+/*! \brief
+ * Lookup a contact in usrloc and add the records to the dset structure
+ */
+int lookup_to_dset(struct sip_msg* _m, udomain_t* _d, str* _uri);
+
 /*! \brief
  * Lookup r-uri and additional branches in usrloc
  */

+ 17 - 0
modules/registrar/reg_mod.c

@@ -91,6 +91,7 @@ static void mod_destroy(void);
 static int w_save2(struct sip_msg* _m, char* _d, char* _cflags);
 static int w_save3(struct sip_msg* _m, char* _d, char* _cflags, char* _uri);
 static int w_lookup(struct sip_msg* _m, char* _d, char* _p2);
+static int w_lookup_to_dset(struct sip_msg* _m, char* _d, char* _p2);
 static int w_lookup_branches(struct sip_msg* _m, char* _d, char* _p2);
 static int w_registered(struct sip_msg* _m, char* _d, char* _uri);
 static int w_unregister(struct sip_msg* _m, char* _d, char* _uri);
@@ -181,6 +182,8 @@ static cmd_export_t cmds[] = {
 			REQUEST_ROUTE | FAILURE_ROUTE },
 	{"lookup",       (cmd_function)w_lookup,      2,  domain_uri_fixup, 0,
 			REQUEST_ROUTE | FAILURE_ROUTE },
+	{"lookup_to_dset",  (cmd_function)w_lookup_to_dset,  1,  domain_uri_fixup, 0,
+			REQUEST_ROUTE | FAILURE_ROUTE },
 	{"registered",   (cmd_function)w_registered,  1,  domain_uri_fixup, 0,
 			REQUEST_ROUTE | FAILURE_ROUTE },
 	{"registered",   (cmd_function)w_registered,  2,  domain_uri_fixup, 0,
@@ -474,6 +477,20 @@ static int w_lookup(struct sip_msg* _m, char* _d, char* _uri)
 	return lookup(_m, (udomain_t*)_d, (uri.len>0)?&uri:NULL);
 }
 
+/*! \brief
+ * Wrapper to lookup_to_dset(location)
+ */
+static int w_lookup_to_dset(struct sip_msg* _m, char* _d, char* _uri)
+{
+	str uri = {0};
+	if(_uri!=NULL && (fixup_get_svalue(_m, (gparam_p)_uri, &uri)!=0 || uri.len<=0))
+	{
+		LM_ERR("invalid uri parameter\n");
+		return -1;
+	}
+
+	return lookup_to_dset(_m, (udomain_t*)_d, (uri.len>0)?&uri:NULL);
+}
 /*! \brief
  * Wrapper to lookup_branches(location)
  */