Module: sip-router
Branch: pd/outbound
Commit: 0a919692b299e2eb819f7c97fa218189849d4566
URL:
http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=0a91969…
Author: Peter Dunkley <peter.dunkley(a)crocodile-rcs.com>
Committer: Peter Dunkley <peter.dunkley(a)crocodile-rcs.com>
Date: Fri Mar 1 11:19:42 2013 +0000
modules/registrar: added additional unregister() exported function to allow the removal of
a specific contact
- Contact is removed by using the ruid (unique ID for the location record)
- Getting the ruid to use here is a problem still to be solved.
---
modules/registrar/reg_mod.c | 26 +++++++++++++++++++++++++-
modules/registrar/save.c | 35 +++++++++++++++++++++++++++++------
modules/registrar/save.h | 2 +-
3 files changed, 55 insertions(+), 8 deletions(-)
diff --git a/modules/registrar/reg_mod.c b/modules/registrar/reg_mod.c
index d3fd4f2..586e3cc 100644
--- a/modules/registrar/reg_mod.c
+++ b/modules/registrar/reg_mod.c
@@ -94,6 +94,7 @@ static int w_lookup(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);
+static int w_unregister2(struct sip_msg* _m, char* _d, char* _uri, char *_ruid);
/*! \brief Fixup functions */
static int domain_fixup(void** param, int param_no);
@@ -186,6 +187,8 @@ static cmd_export_t cmds[] = {
REQUEST_ROUTE },
{"unregister", (cmd_function)w_unregister, 2, unreg_fixup, 0,
REQUEST_ROUTE| FAILURE_ROUTE },
+ {"unregister", (cmd_function)w_unregister2, 3, unreg_fixup, 0,
+ REQUEST_ROUTE| FAILURE_ROUTE },
{"reg_fetch_contacts", (cmd_function)pv_fetch_contacts, 3,
fetchc_fixup, 0,
REQUEST_ROUTE| FAILURE_ROUTE },
@@ -501,7 +504,26 @@ static int w_unregister(struct sip_msg* _m, char* _d, char* _uri)
return -1;
}
- return unregister(_m, (udomain_t*)_d, &uri);
+ return unregister(_m, (udomain_t*)_d, &uri, NULL);
+}
+
+static int w_unregister2(struct sip_msg* _m, char* _d, char* _uri, char *_ruid)
+{
+ str uri = {0};
+ str ruid = {0};
+ if(fixup_get_svalue(_m, (gparam_p)_uri, &uri)!=0 || uri.len<=0)
+ {
+ LM_ERR("invalid uri parameter\n");
+ return -1;
+ }
+ if(fixup_get_svalue(_m, (gparam_p)_ruid, &ruid)!=0 || ruid.len<=0)
+ {
+ LM_ERR("invalid ruid parameter\n");
+ return -1;
+ }
+
+
+ return unregister(_m, (udomain_t*)_d, &uri, &ruid);
}
/*! \brief
@@ -546,6 +568,8 @@ static int unreg_fixup(void** param, int param_no)
return domain_fixup(param, 1);
} else if (param_no == 2) {
return fixup_spve_null(param, 1);
+ } else if (param_no == 3) {
+ return fixup_spve_null(param, 1);
}
return 0;
}
diff --git a/modules/registrar/save.c b/modules/registrar/save.c
index d568334..f55c933 100644
--- a/modules/registrar/save.c
+++ b/modules/registrar/save.c
@@ -953,26 +953,49 @@ error:
return 0;
}
-int unregister(struct sip_msg* _m, udomain_t* _d, str* _uri)
+int unregister(struct sip_msg* _m, udomain_t* _d, str* _uri, str *_ruid)
{
str aor = {0, 0};
sip_uri_t *u;
+ urecord_t *r;
+ ucontact_t *c;
u = parse_to_uri(_m);
if(u==NULL)
return -2;
-
if (extract_aor(_uri, &aor, NULL) < 0) {
LM_ERR("failed to extract Address Of Record\n");
return -1;
}
- if (star(_m, _d, &aor, &u->host) < 0)
- {
- LM_ERR("error unregistering user [%.*s]\n", aor.len, aor.s);
- return -1;
+ if (_ruid == NULL) {
+ /* No ruid provided - remove all contacts for aor */
+
+ if (star(_m, _d, &aor, &u->host) < 0)
+ {
+ LM_ERR("error unregistering user [%.*s]\n", aor.len, aor.s);
+ return -1;
+ }
+ } else {
+ /* ruid provided - remove a specific contact */
+
+ ul.lock_udomain(_d, &aor);
+ if (ul.get_urecord_by_ruid(_d, ul.get_aorhash(&aor),
+ _ruid, r, c) != 0) {
+ ul.unlock_udomain(_d, &aor);
+ LM_WARN("AOR/Contact not found\n");
+ return -1;
+ }
+ if (ul.delete_ucontact(r, c) != 0) {
+ ul.unlock_udomain(_d, &aor);
+ LM_WARN("could not delete contact\n");
+ return -1;
+ }
+ ul.release_urecord(r);
+ ul.unlock_udomain(_d, &aor);
}
+
return 1;
}
diff --git a/modules/registrar/save.h b/modules/registrar/save.h
index 69e1352..c6aa928 100644
--- a/modules/registrar/save.h
+++ b/modules/registrar/save.h
@@ -47,7 +47,7 @@
* Process REGISTER request and save it's contacts
*/
int save(struct sip_msg* _m, udomain_t* _d, int _cflags, str* _uri);
-int unregister(struct sip_msg* _m, udomain_t* _d, str* _uri);
+int unregister(struct sip_msg* _m, udomain_t* _d, str* _uri, str *_ruid);
#endif /* SAVE_H */