Module: sip-router
Branch: pd/outbound
Commit: 0a919692b299e2eb819f7c97fa218189849d4566
URL:    
http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=0a919692b299e2eb819f7c97fa218189849d4566

Author: Peter Dunkley <[email protected]>
Committer: Peter Dunkley <[email protected]>
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 */


_______________________________________________
sr-dev mailing list
[email protected]
http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-dev

Reply via email to