kamailio.org
Sign In
Sign Up
Sign In
Sign Up
Manage this list
×
Keyboard Shortcuts
Thread View
j
: Next unread message
k
: Previous unread message
j a
: Jump to all threads
j l
: Jump to MailingList overview
2024
December
November
October
September
August
July
June
May
April
March
February
January
2023
December
November
October
September
August
July
June
May
April
March
February
January
2022
December
November
October
September
August
July
June
May
April
March
February
January
2021
December
November
October
September
August
July
June
May
April
March
February
January
2020
December
November
October
September
August
July
June
May
April
March
February
January
2019
December
November
October
September
August
July
June
May
April
March
February
January
2018
December
November
October
September
August
July
June
May
April
March
February
January
2017
December
November
October
September
August
July
June
May
April
March
February
January
2016
December
November
October
September
August
July
June
May
April
March
February
January
2015
December
November
October
September
August
July
June
May
April
March
February
January
2014
December
November
October
September
August
July
June
May
April
March
February
January
2013
December
November
October
September
August
July
June
May
April
March
February
January
2012
December
November
October
September
August
July
June
May
April
March
February
January
2011
December
November
October
September
August
July
June
May
April
March
February
January
2010
December
November
October
September
August
July
June
May
April
March
February
January
2009
December
November
October
September
August
July
June
May
April
March
February
January
2008
December
November
List overview
Download
sr-dev
August 2011
----- 2024 -----
December 2024
November 2024
October 2024
September 2024
August 2024
July 2024
June 2024
May 2024
April 2024
March 2024
February 2024
January 2024
----- 2023 -----
December 2023
November 2023
October 2023
September 2023
August 2023
July 2023
June 2023
May 2023
April 2023
March 2023
February 2023
January 2023
----- 2022 -----
December 2022
November 2022
October 2022
September 2022
August 2022
July 2022
June 2022
May 2022
April 2022
March 2022
February 2022
January 2022
----- 2021 -----
December 2021
November 2021
October 2021
September 2021
August 2021
July 2021
June 2021
May 2021
April 2021
March 2021
February 2021
January 2021
----- 2020 -----
December 2020
November 2020
October 2020
September 2020
August 2020
July 2020
June 2020
May 2020
April 2020
March 2020
February 2020
January 2020
----- 2019 -----
December 2019
November 2019
October 2019
September 2019
August 2019
July 2019
June 2019
May 2019
April 2019
March 2019
February 2019
January 2019
----- 2018 -----
December 2018
November 2018
October 2018
September 2018
August 2018
July 2018
June 2018
May 2018
April 2018
March 2018
February 2018
January 2018
----- 2017 -----
December 2017
November 2017
October 2017
September 2017
August 2017
July 2017
June 2017
May 2017
April 2017
March 2017
February 2017
January 2017
----- 2016 -----
December 2016
November 2016
October 2016
September 2016
August 2016
July 2016
June 2016
May 2016
April 2016
March 2016
February 2016
January 2016
----- 2015 -----
December 2015
November 2015
October 2015
September 2015
August 2015
July 2015
June 2015
May 2015
April 2015
March 2015
February 2015
January 2015
----- 2014 -----
December 2014
November 2014
October 2014
September 2014
August 2014
July 2014
June 2014
May 2014
April 2014
March 2014
February 2014
January 2014
----- 2013 -----
December 2013
November 2013
October 2013
September 2013
August 2013
July 2013
June 2013
May 2013
April 2013
March 2013
February 2013
January 2013
----- 2012 -----
December 2012
November 2012
October 2012
September 2012
August 2012
July 2012
June 2012
May 2012
April 2012
March 2012
February 2012
January 2012
----- 2011 -----
December 2011
November 2011
October 2011
September 2011
August 2011
July 2011
June 2011
May 2011
April 2011
March 2011
February 2011
January 2011
----- 2010 -----
December 2010
November 2010
October 2010
September 2010
August 2010
July 2010
June 2010
May 2010
April 2010
March 2010
February 2010
January 2010
----- 2009 -----
December 2009
November 2009
October 2009
September 2009
August 2009
July 2009
June 2009
May 2009
April 2009
March 2009
February 2009
January 2009
----- 2008 -----
December 2008
November 2008
sr-dev@lists.kamailio.org
33 participants
291 discussions
Start a n
N
ew thread
git:master: db_postgres: remove db_int2pg_varbit function, commented out since 2008
by Henning Westerholt
Module: sip-router Branch: master Commit: 91d70925870aeb8212bb3099d650e32627dd4d97 URL:
http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=91d7092…
Author: Henning Westerholt <henning.westerholt(a)1und1.de> Committer: Henning Westerholt <henning.westerholt(a)1und1.de> Date: Mon Aug 8 22:43:23 2011 +0200 db_postgres: remove db_int2pg_varbit function, commented out since 2008 --- modules/db_postgres/pg_fld.c | 17 +---------------- 1 files changed, 1 insertions(+), 16 deletions(-) diff --git a/modules/db_postgres/pg_fld.c b/modules/db_postgres/pg_fld.c index fe64217..76ad4df 100644 --- a/modules/db_postgres/pg_fld.c +++ b/modules/db_postgres/pg_fld.c @@ -246,22 +246,6 @@ static inline void db_int2pg_bit(struct pg_params* dst, int i, db_fld_t* src) dst->len[i] = 8; } -/* -static inline void db_int2pg_varbit(struct pg_params* dst, int i, - db_fld_t* src) -{ - unsigned int len = 32; - struct pg_fld* pfld = DB_GET_PAYLOAD(src); - - pfld->v.int4[0] = htonl(len); - pfld->v.int4[1] = htonl(src->v.int4); - - dst->fmt[i] = 1; - dst->val[i] = pfld->v.byte; - dst->len[i] = 4 + len / 8 + (len % 8 ? 1 : 0); -} -*/ - static inline void db_str2pg_string(struct pg_params* dst, int i, db_fld_t* src) @@ -271,6 +255,7 @@ static inline void db_str2pg_string(struct pg_params* dst, int i, dst->len[i] = src->v.lstr.len; } + static inline void db_cstr2pg_string(struct pg_params* dst, int i, db_fld_t* src) {
13 years, 4 months
1
0
0
0
git:master: modules_k/xcap_server: Added new pseudo variable $xcapuri(name= >xuiddomain)
by Peter Dunkley
Module: sip-router Branch: master Commit: 3abdef329a13e4bc452f860c76f70735fcd16201 URL:
http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=3abdef3…
Author: pd <peter.dunkley(a)crocodile-rcs.com> Committer: pd <peter.dunkley(a)crocodile-rcs.com> Date: Mon Aug 8 12:24:46 2011 +0100 modules_k/xcap_server: Added new pseudo variable $xcapuri(name=>xuiddomain) - $xcapuri(name=>xuiddomain) contains the domain part from $xcapuri(name=>xuid) The xuiddomain can be used with www_authorize() and www_challenge() if you want the realm to be based on the user's domain instead of something hard-coded (like "xcap"). This is particularly useful if you need multi-domain support, don't want plain-text passwords in the subscriber table, and also don't want to have to create two entries for each subscriber (one with the SIP domain as the realm and one with "xcap" as the realm). --- modules_k/xcap_server/README | 2 +- modules_k/xcap_server/doc/xcap_server_admin.xml | 2 +- modules_k/xcap_server/xcap_misc.c | 13 +++++++++++++ modules_k/xcap_server/xcap_misc.h | 1 + 4 files changed, 16 insertions(+), 2 deletions(-) diff --git a/modules_k/xcap_server/README b/modules_k/xcap_server/README index aca4a04..88623e1 100644 --- a/modules_k/xcap_server/README +++ b/modules_k/xcap_server/README @@ -264,7 +264,7 @@ event_route[xhttp:request] { * $xcapuri(name=>key) - name can be any to idenitfy the XCAP uri; key can be: data, uri, root, auid, type, tree, xuid, file, node, - target, domain. + target, domain, xuiddomain. Exported pseudo-variables are documented at
http://www.kamailio.org/dokuwiki/
. diff --git a/modules_k/xcap_server/doc/xcap_server_admin.xml b/modules_k/xcap_server/doc/xcap_server_admin.xml index c690557..d83c7c5 100644 --- a/modules_k/xcap_server/doc/xcap_server_admin.xml +++ b/modules_k/xcap_server/doc/xcap_server_admin.xml @@ -307,7 +307,7 @@ event_route[xhttp:request] { <listitem><para> <emphasis>$xcapuri(name=>key)</emphasis> - name can be any to idenitfy the XCAP uri; key can be: data, uri, root, auid, - type, tree, xuid, file, node, target, domain. + type, tree, xuid, file, node, target, domain, xuiddomain. </para></listitem> </itemizedlist> <para> diff --git a/modules_k/xcap_server/xcap_misc.c b/modules_k/xcap_server/xcap_misc.c index 57abf3f..06b5a57 100644 --- a/modules_k/xcap_server/xcap_misc.c +++ b/modules_k/xcap_server/xcap_misc.c @@ -238,6 +238,13 @@ int xcap_parse_uri(str *huri, str *xroot, xcap_uri_t *xuri) s.len -= xuri->xuid.len + 1; } + /* xuiddomain */ + if (xuri->xuid.len > 0) { + p = strchr(xuri->xuid.s, '@'); + xuri->xuiddomain.s = p + 1; + xuri->xuiddomain.len = xuri->xuid.len - (p - xuri->xuid.s) - 1; + } + /* file */ xuri->file.s = s.s; if(xuri->nss==NULL) { @@ -747,6 +754,8 @@ int pv_parse_xcap_uri_name(pv_spec_p sp, str *in) pxs->ktype = 9; } else if(pxs->key.len==6 && strncmp(pxs->key.s, "domain", 6)==0) { pxs->ktype = 10; + } else if(pxs->key.len==10 && strncmp(pxs->key.s, "xuiddomain", 10)==0) { + pxs->ktype = 11; } else { LM_ERR("unknown key type [%.*s]\n", in->len, in->s); goto error; @@ -850,6 +859,10 @@ int pv_get_xcap_uri(struct sip_msg *msg, pv_param_t *param, /* get domain */ if(pxs->xus->xuri.domain.len>0) return pv_get_strval(msg, param, res, &pxs->xus->xuri.domain); + case 11: + /* get xuiddomain */ + if(pxs->xus->xuri.xuiddomain.len>0) + return pv_get_strval(msg, param, res, &pxs->xus->xuri.xuiddomain); break; default: return pv_get_null(msg, param, res); diff --git a/modules_k/xcap_server/xcap_misc.h b/modules_k/xcap_server/xcap_misc.h index 4fcd3d1..908d592 100644 --- a/modules_k/xcap_server/xcap_misc.h +++ b/modules_k/xcap_server/xcap_misc.h @@ -48,6 +48,7 @@ typedef struct xcap_uri { str node; str target; str domain; + str xuiddomain; } xcap_uri_t; int xcap_parse_uri(str *huri, str *xroot, xcap_uri_t *xuri);
13 years, 4 months
2
4
0
0
git:master: modules_k/pv: fix 64bit bug.
by Alex Hermann
Module: sip-router Branch: master Commit: 8d9b600516a6cafccf7ae06fe30009656abcdf56 URL:
http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=8d9b600…
Author: Alex Hermann <alex(a)speakup.nl> Committer: Alex Hermann <alex(a)speakup.nl> Date: Mon Aug 8 16:11:01 2011 +0200 modules_k/pv: fix 64bit bug. time_t is a long int on 64bit systems. Do not cast a int* to time_t*. --- modules_k/pv/pv_trans.c | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) diff --git a/modules_k/pv/pv_trans.c b/modules_k/pv/pv_trans.c index 7b7b564..43ff05d 100644 --- a/modules_k/pv/pv_trans.c +++ b/modules_k/pv/pv_trans.c @@ -72,7 +72,7 @@ int tr_eval_string(struct sip_msg *msg, tr_param_t *tp, int subtype, char *p, *s; str st, st2; pv_value_t v, w; - void *vp; + time_t t; if(val==NULL || (val->flags&PV_VAL_NULL && subtype != TR_S_SQL)) return -1; @@ -586,9 +586,9 @@ int tr_eval_string(struct sip_msg *msg, tr_param_t *tp, int subtype, } memcpy(s, st.s, st.len); s[st.len] = '\0'; - vp = (void*)&val->ri; + t = val->ri; val->rs.len = strftime(_tr_buffer, TR_BUFFER_SIZE-1, s, - localtime((time_t*)vp)); + localtime(&t)); pkg_free(s); val->flags = PV_VAL_STR; val->rs.s = _tr_buffer;
13 years, 4 months
1
0
0
0
git:alexh/master: core modules/tm modules/sl: Make adding path and flags to redirected contacts optional
by Alex Hermann
Module: sip-router Branch: alexh/master Commit: 5c0d3f66e240686c4eda3f73928a64de266bb37e URL:
http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=5c0d3f6…
Author: Alex Hermann <alex(a)speakup.nl> Committer: Alex Hermann <alex(a)speakup.nl> Date: Tue Jul 26 12:36:56 2011 +0200 core modules/tm modules/sl: Make adding path and flags to redirected contacts optional --- dset.c | 24 ++++++----- dset.h | 6 ++- modules/sl/README | 22 +++++++++- modules/sl/doc/params.xml | 30 +++++++++++++++ modules/sl/sl.c | 1 + modules/sl/sl_funcs.c | 5 ++- modules/sl/sl_funcs.h | 2 + modules/tm/README | 92 ++++++++++++++++++++++++++------------------ modules/tm/doc/params.xml | 30 +++++++++++++++ modules/tm/t_reply.c | 5 ++- modules/tm/tm.c | 1 + modules_k/pv/pv_core.c | 2 +- modules_s/xlog/xl_lib.c | 2 +- 13 files changed, 165 insertions(+), 57 deletions(-) Diff:
http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commitdiff;h=5c0…
13 years, 4 months
3
7
0
0
git:master: modules/tm: t_load_contacts() now ignores ruri if it has already been used
by Juha Heinanen
Module: sip-router Branch: master Commit: 9efc7014638e2c7ead56ac36d880b303f2873b85 URL:
http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=9efc701…
Author: Juha Heinanen <jh(a)tutpro.com> Committer: Juha Heinanen <jh(a)tutpro.com> Date: Mon Aug 8 10:55:24 2011 +0300 modules/tm: t_load_contacts() now ignores ruri if it has already been used - Thanks to Alex Hermann for the patch. --- modules/tm/t_serial.c | 49 ++++++++++++++++++++++++++++++++----------------- 1 files changed, 32 insertions(+), 17 deletions(-) diff --git a/modules/tm/t_serial.c b/modules/tm/t_serial.c index 899cb5b..bd5ae27 100644 --- a/modules/tm/t_serial.c +++ b/modules/tm/t_serial.c @@ -242,15 +242,21 @@ int t_load_contacts(struct sip_msg* msg, char* key, char* value) } ruri = (str *)0; - - /* Take first q from Request-URI */ - ruri = GET_RURI(msg); - if (!ruri) { - LM_ERR("no Request-URI found\n"); - return -1; + if (ruri_is_new) { + /* Take first q from Request-URI */ + ruri = GET_RURI(msg); + if (!ruri) { + LM_ERR("no Request-URI found\n"); + return -1; + } + first_q = get_ruri_q(); + first_idx = 0; + } else { + /* Take first q from first branch */ + uri.s = get_branch(0, &uri.len, &first_q, &dst_uri, &path, &flags, + &sock); + first_idx = 1; } - first_q = get_ruri_q(); - first_idx = 0; /* Check if all q values are equal */ for(idx = first_idx; (tmp.s = get_branch(idx, &tmp.len, &q, 0, 0, 0, 0)) @@ -272,15 +278,24 @@ rest: return -1; } - /* Insert Request-URI branch to first contact */ - contacts->uri.s = ruri->s; - contacts->uri.len = ruri->len; - contacts->dst_uri = msg->dst_uri; - contacts->sock = msg->force_send_socket; - getbflagsval(0, &contacts->flags); - contacts->path = msg->path_vec; - contacts->q = first_q; - contacts->next = (struct contact *)0; + if (ruri_is_new) { + /* Insert Request-URI branch to first contact */ + contacts->uri.s = ruri->s; + contacts->uri.len = ruri->len; + contacts->dst_uri = msg->dst_uri; + contacts->sock = msg->force_send_socket; + getbflagsval(0, &contacts->flags); + contacts->path = msg->path_vec; + } else { + /* Insert first branch to first contact */ + contacts->uri = uri; + contacts->dst_uri = dst_uri; + contacts->sock = sock; + contacts->flags = flags; + contacts->path = path; + } + contacts->q = first_q; + contacts->next = (struct contact *)0; /* Insert (remaining) branches to contact list in increasing q order */
13 years, 4 months
3
4
0
0
git:alexh/master: modules_k/uac_redirect: Parse Contact's "flags" header parameter into branch flags.
by Alex Hermann
Module: sip-router Branch: alexh/master Commit: e430827e3501181992596dd950ea0e36b41c084b URL:
http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=e430827…
Author: Alex Hermann <alex(a)speakup.nl> Committer: Alex Hermann <alex(a)speakup.nl> Date: Tue Jul 26 11:14:25 2011 +0200 modules_k/uac_redirect: Parse Contact's "flags" header parameter into branch flags. --- modules_k/uac_redirect/rd_funcs.c | 6 ++++-- parser/contact/contact.c | 2 ++ parser/contact/contact.h | 1 + parser/parse_param.c | 12 +++++++++++- parser/parse_param.h | 2 ++ 5 files changed, 20 insertions(+), 3 deletions(-) diff --git a/modules_k/uac_redirect/rd_funcs.c b/modules_k/uac_redirect/rd_funcs.c index 2f85ed1..173f398 100644 --- a/modules_k/uac_redirect/rd_funcs.c +++ b/modules_k/uac_redirect/rd_funcs.c @@ -32,7 +32,6 @@ #include "../../dprint.h" #include "../../qvalue.h" #include "../../parser/contact/parse_contact.h" -#include "../../qvalue.h" #include "rd_filter.h" #include "rd_funcs.h" @@ -189,6 +188,7 @@ static int shmcontact2dset(struct sip_msg *req, struct sip_msg *sh_rpl, int added; int dup; int ret; + unsigned int flags; /* dup can be: * 0 - sh reply but nothing duplicated @@ -274,8 +274,10 @@ static int shmcontact2dset(struct sip_msg *req, struct sip_msg *sh_rpl, for ( i=0 ; i<n ; i++ ) { LM_DBG("adding contact <%.*s>\n", scontacts[i]->uri.len, scontacts[i]->uri.s); + if (!scontacts[i]->flags || str2int(&(scontacts[i]->flags->body), &flags) < 0) + flags = bflags; if (km_append_branch( 0, &scontacts[i]->uri, 0, 0, sqvalues[i], - bflags, 0)<0) { + flags, 0)<0) { LM_ERR("failed to add contact to dset\n"); } else { added++; diff --git a/parser/contact/contact.c b/parser/contact/contact.c index 4b953f3..f14aabb 100644 --- a/parser/contact/contact.c +++ b/parser/contact/contact.c @@ -248,6 +248,7 @@ int parse_contacts(str* _s, contact_t** _c) c->received = hooks.contact.received; c->methods = hooks.contact.methods; c->instance = hooks.contact.instance; + c->flags = hooks.contact.flags; if (_s->len == 0) goto ok; } @@ -317,6 +318,7 @@ void print_contacts(FILE* _o, contact_t* _c) fprintf(_o, "received: %p\n", ptr->received); fprintf(_o, "methods : %p\n", ptr->methods); fprintf(_o, "instance: %p\n", ptr->instance); + fprintf(_o, "flags : %p\n", ptr->flags); fprintf(_o, "len : %d\n", ptr->len); if (ptr->params) { print_params(_o, ptr->params); diff --git a/parser/contact/contact.h b/parser/contact/contact.h index 1865bd4..48bba22 100644 --- a/parser/contact/contact.h +++ b/parser/contact/contact.h @@ -51,6 +51,7 @@ typedef struct contact { param_t* methods; /* methods parameter hook */ param_t* received; /* received parameter hook */ param_t* instance; /* sip.instance parameter hook */ + param_t* flags; /* flags parameter hook */ param_t* params; /* List of all parameters */ int len; /* Total length of the element */ struct contact* next; /* Next contact in the list */ diff --git a/parser/parse_param.c b/parser/parse_param.c index 6e8f653..f6a5413 100644 --- a/parser/parse_param.c +++ b/parser/parse_param.c @@ -113,7 +113,7 @@ static inline void parse_event_dialog_class(param_hooks_t* h, param_t* p) /*! \brief * Try to find out parameter name, recognized parameters - * are q, expires and methods + * are q, expires, methods, +sip.instance and flags */ static inline void parse_contact_class(param_hooks_t* _h, param_t* _p) { @@ -168,6 +168,15 @@ static inline void parse_contact_class(param_hooks_t* _h, param_t* _p) _h->contact.instance = _p; } break; + + case 'f': + case 'F': + if ((_p->name.len == 5) && + (!strncasecmp(_p->name.s + 1, "lags", 4))) { + _p->type = P_FLAGS; + _h->contact.flags = _p; + } + break; } } @@ -602,6 +611,7 @@ static inline void print_param(FILE* _o, param_t* _p) case P_Q: type = "P_Q"; break; case P_EXPIRES: type = "P_EXPIRES"; break; case P_METHODS: type = "P_METHODS"; break; + case P_FLAGS: type = "P_FLAGS"; break; case P_TRANSPORT: type = "P_TRANSPORT"; break; case P_LR: type = "P_LR"; break; case P_R2: type = "P_R2"; break; diff --git a/parser/parse_param.h b/parser/parse_param.h index 1b92de6..1429f23 100644 --- a/parser/parse_param.h +++ b/parser/parse_param.h @@ -53,6 +53,7 @@ typedef enum ptype { P_EXPIRES, /*!< Contact: expires parameter */ P_METHODS, /*!< Contact: methods parameter */ P_RECEIVED, /*!< Contact: received parameter */ + P_FLAGS, /*!< Contact: flags parameter */ P_TRANSPORT, /*!< URI: transport parameter */ P_LR, /*!< URI: lr parameter */ P_R2, /*!< URI: r2 parameter (ser specific) */ @@ -103,6 +104,7 @@ struct contact_hooks { struct param* methods; /*!< methods parameter */ struct param* received; /*!< received parameter */ struct param* instance; /*!< sip.instance parameter */ + struct param* flags; /*!< flags parameter */ };
13 years, 4 months
1
0
0
0
git:alexh/master: modules_k/uac_redirect: Make using the flags Contact-header-parameter configurable
by Alex Hermann
Module: sip-router Branch: alexh/master Commit: 54e95bd7a9411f89a52774de0e457c0baa4556ef URL:
http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=54e95bd…
Author: Alex Hermann <alex(a)speakup.nl> Committer: Alex Hermann <alex(a)speakup.nl> Date: Tue Aug 2 10:25:20 2011 +0200 modules_k/uac_redirect: Make using the flags Contact-header-parameter configurable --- modules_k/uac_redirect/README | 42 ++++++++++++++++---- modules_k/uac_redirect/doc/uac_redirect_admin.xml | 36 +++++++++++++++++- modules_k/uac_redirect/rd_funcs.c | 8 +++- modules_k/uac_redirect/rd_funcs.h | 2 + modules_k/uac_redirect/redirect.c | 2 + 5 files changed, 78 insertions(+), 12 deletions(-) diff --git a/modules_k/uac_redirect/README b/modules_k/uac_redirect/README index ca88e4c..9bc562d 100644 --- a/modules_k/uac_redirect/README +++ b/modules_k/uac_redirect/README @@ -30,6 +30,7 @@ Bogdan-Andrei Iancu 4.4. acc_function (string) 4.5. acc_db_table (string) 4.6. bflags (int) + 4.7. flags_hdr_mode (int) 5. Exported Functions @@ -48,11 +49,12 @@ Bogdan-Andrei Iancu 1.4. Set acc_function parameter 1.5. Set acc_db_table parameter 1.6. Set bflags module parameter - 1.7. set_deny_filter usage - 1.8. set_accept_filter usage - 1.9. get_redirects usage + 1.7. Set flags_hdr_mode parameter + 1.8. set_deny_filter usage + 1.9. set_accept_filter usage 1.10. get_redirects usage - 1.11. Redirection script example + 1.11. get_redirects usage + 1.12. Redirection script example Chapter 1. Admin Guide @@ -73,6 +75,7 @@ Chapter 1. Admin Guide 4.4. acc_function (string) 4.5. acc_db_table (string) 4.6. bflags (int) + 4.7. flags_hdr_mode (int) 5. Exported Functions @@ -145,6 +148,7 @@ Chapter 1. Admin Guide 4.4. acc_function (string) 4.5. acc_db_table (string) 4.6. bflags (int) + 4.7. flags_hdr_mode (int) 4.1. default_filter (string) @@ -249,6 +253,26 @@ branch_route[1] { } } +4.7. flags_hdr_mode (int) + + Specifies if and how a Contact's flags header parameter must be used. + If set, and a flags header parameter is set, its value will be set as + branch flags for that contact. + + Its values may be: + * 0 - ignore flags header parameter, just use bflags module parameter + * 1 - use flags header parameter if present, ignore bflags module + parameter + * 2 - use flags header parameter if present and merg (binary or) it + with the bflags module parameter + + The default value is “0”. + + Example 1.7. Set flags_hdr_mode parameter +... +modparam("uac_redirect","flags_hdr_mode",2) +... + 5. Exported Functions 5.1. set_deny_filter(filter,flags) @@ -271,7 +295,7 @@ branch_route[1] { This function can be used from FAILURE_ROUTE. - Example 1.7. set_deny_filter usage + Example 1.8. set_deny_filter usage ... set_deny_filter(".*(a)domain2.net","reset_all"); set_deny_filter(".*(a)domain1.net",""); @@ -292,7 +316,7 @@ set_deny_filter(".*(a)domain1.net",""); This function can be used from FAILURE_ROUTE. - Example 1.8. set_accept_filter usage + Example 1.9. set_accept_filter usage ... set_accept_filter(".*(a)domain2.net","reset_added"); set_accept_filter(".*(a)domain1.net",""); @@ -321,7 +345,7 @@ set_accept_filter(".*(a)domain1.net",""); This function can be used from FAILURE_ROUTE. - Example 1.9. get_redirects usage + Example 1.10. get_redirects usage ... # max 2 contacts per branch, but no overall limit get_redirects("*:2"); @@ -345,14 +369,14 @@ get_redirects("*"); This function can be used from FAILURE_ROUTE. - Example 1.10. get_redirects usage + Example 1.11. get_redirects usage ... get_redirects("4:1","Redirected"); ... 6. Script Example - Example 1.11. Redirection script example + Example 1.12. Redirection script example loadmodule "modules/sl/sl.so" loadmodule "modules/usrloc/usrloc.so" loadmodule "modules/registrar/registrar.so" diff --git a/modules_k/uac_redirect/doc/uac_redirect_admin.xml b/modules_k/uac_redirect/doc/uac_redirect_admin.xml index de9a7e6..2ffc444 100644 --- a/modules_k/uac_redirect/doc/uac_redirect_admin.xml +++ b/modules_k/uac_redirect/doc/uac_redirect_admin.xml @@ -302,8 +302,42 @@ branch_route[1] { </programlisting> </example> </section> + <section> + <title><varname>flags_hdr_mode</varname> (int)</title> + <para> + Specifies if and how a Contact's flags header parameter + must be used. If set, and a flags header parameter is set, + its value will be set as branch flags for that contact. + </para> + <para> + Its values may be: + </para> + <itemizedlist> + <listitem> + <para><emphasis>0</emphasis> - ignore flags header parameter, just use bflags module parameter</para> + </listitem> + <listitem> + <para><emphasis>1</emphasis> - use flags header parameter if present, ignore bflags module parameter</para> + </listitem> + <listitem> + <para><emphasis>2</emphasis> - use flags header parameter if present and merg (binary or) it with the bflags module parameter</para> + </listitem> + </itemizedlist> + <para> + <emphasis> + The default value is <quote>0</quote>. + </emphasis> + </para> + <example> + <title>Set <varname>flags_hdr_mode</varname> parameter</title> + <programlisting format="linespecific"> +... +modparam("uac_redirect","flags_hdr_mode",2) +... + </programlisting> + </example> + </section> </section> - <section> <title>Exported Functions</title> <section> diff --git a/modules_k/uac_redirect/rd_funcs.c b/modules_k/uac_redirect/rd_funcs.c index 173f398..9c4c296 100644 --- a/modules_k/uac_redirect/rd_funcs.c +++ b/modules_k/uac_redirect/rd_funcs.c @@ -273,9 +273,13 @@ static int shmcontact2dset(struct sip_msg *req, struct sip_msg *sh_rpl, /* add the sortet contacts as branches in dset and log this! */ for ( i=0 ; i<n ; i++ ) { LM_DBG("adding contact <%.*s>\n", scontacts[i]->uri.len, - scontacts[i]->uri.s); - if (!scontacts[i]->flags || str2int(&(scontacts[i]->flags->body), &flags) < 0) + scontacts[i]->uri.s, flags_hdr_mode); + if (flags_hdr_mode && scontacts[i]->flags && str2int(&(scontacts[i]->flags->body), &flags) == 0) { + if (flags_hdr_mode == 2) + flags |= bflags; + } else { flags = bflags; + } if (km_append_branch( 0, &scontacts[i]->uri, 0, 0, sqvalues[i], flags, 0)<0) { LM_ERR("failed to add contact to dset\n"); diff --git a/modules_k/uac_redirect/rd_funcs.h b/modules_k/uac_redirect/rd_funcs.h index 0b21eeb..9168427 100644 --- a/modules_k/uac_redirect/rd_funcs.h +++ b/modules_k/uac_redirect/rd_funcs.h @@ -42,6 +42,8 @@ extern cmd_function rd_acc_fct; extern char *acc_db_table; +extern int flags_hdr_mode; + int get_redirect( struct sip_msg *msg , int maxt, int maxb, struct acc_param *reason, unsigned int bflags); diff --git a/modules_k/uac_redirect/redirect.c b/modules_k/uac_redirect/redirect.c index febd373..eeaa4b8 100644 --- a/modules_k/uac_redirect/redirect.c +++ b/modules_k/uac_redirect/redirect.c @@ -52,6 +52,7 @@ char *accept_filter_s = 0; char *def_filter_s = 0; unsigned int bflags = 0; +int flags_hdr_mode = 0; #define ACCEPT_RULE_STR "accept" #define DENY_RULE_STR "deny" @@ -87,6 +88,7 @@ static param_export_t params[] = { {"acc_function", STR_PARAM, &acc_fct_s }, {"acc_db_table", STR_PARAM, &acc_db_table }, {"bflags", INT_PARAM, &bflags }, + {"flags_hdr_mode", INT_PARAM, &flags_hdr_mode }, {0, 0, 0} };
13 years, 4 months
1
0
0
0
git:alexh/master: core/dset: Create contacts with flags as header parameter
by Alex Hermann
Module: sip-router Branch: alexh/master Commit: 74af2df4b37cae1b72c964eed0d1d80cc499f64e URL:
http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=74af2df…
Author: Alex Hermann <alex(a)speakup.nl> Committer: Alex Hermann <alex(a)speakup.nl> Date: Tue Jul 26 10:32:18 2011 +0200 core/dset: Create contacts with flags as header parameter --- dset.c | 34 +++++++++++++++++++++++----------- 1 files changed, 23 insertions(+), 11 deletions(-) diff --git a/dset.c b/dset.c index 2a42d43..a876119 100644 --- a/dset.c +++ b/dset.c @@ -51,9 +51,12 @@ #define CONTACT_DELIM ", " #define CONTACT_DELIM_LEN (sizeof(CONTACT_DELIM) - 1) -#define Q_PARAM ">;q=" +#define Q_PARAM ";q=" #define Q_PARAM_LEN (sizeof(Q_PARAM) - 1) +#define FLAGS_PARAM ";flags=" +#define FLAGS_PARAM_LEN (sizeof(FLAGS_PARAM) - 1) + #define PATH_PARAM "?Route=" #define PATH_PARAM_LEN (sizeof(PATH_PARAM) - 1) @@ -291,6 +294,7 @@ int append_branch(struct sip_msg* msg, str* uri, str* dst_uri, str* path, { str luri; + LM_DBG("uri=%.*s q=%d flags=%d\n", uri->len, uri->s, q, flags); /* if we have already set up the maximum number * of branches, don't try new ones */ @@ -422,17 +426,13 @@ static int escape_param(str *sin, str *sout) * end = end of target buffer * Returns pointer to final position in target buffer or 0 on failure */ -char* print_contact_str(char *p, str uri, qvalue_t q, str path, char *end) +char* print_contact_str(char *p, str uri, qvalue_t q, str path, unsigned int flags, char *end) { str buf; - if (q != Q_UNSPECIFIED) { - if (p + 1 > end) return 0; - *p++ = '<'; - } - /* uri */ - if (p + uri.len > end) return 0; + if (p + uri.len + 1 > end) return 0; + *p++ = '<'; memcpy(p, uri.s, uri.len); p += uri.len; @@ -450,6 +450,9 @@ char* print_contact_str(char *p, str uri, qvalue_t q, str path, char *end) p += buf.len; } + if (p + 1 > end) return 0; + *p++ = '>'; + /* q value (header parameter) */ if (q != Q_UNSPECIFIED) { buf.s = q2str(q, (unsigned int*)&buf.len); @@ -460,6 +463,14 @@ char* print_contact_str(char *p, str uri, qvalue_t q, str path, char *end) p += buf.len; } + /* branch flags (header parameter) */ + buf.s = int2str(flags, &buf.len); + if (p + FLAGS_PARAM_LEN + buf.len > end) return 0; + memcpy(p, FLAGS_PARAM, FLAGS_PARAM_LEN); + p += FLAGS_PARAM_LEN; + memcpy(p, buf.s, buf.len); + p += buf.len; + return p; } @@ -472,6 +483,7 @@ char* print_dset(struct sip_msg* msg, int* len) int i; qvalue_t q; str uri, path; + unsigned int flags; char *p; static char dset[MAX_REDIRECTION_LEN]; char *end = dset + MAX_REDIRECTION_LEN; @@ -480,7 +492,7 @@ char* print_dset(struct sip_msg* msg, int* len) memcpy(dset, CONTACT, CONTACT_LEN); p = dset + CONTACT_LEN; if (msg->new_uri.s) { - p = print_contact_str(p, msg->new_uri, ruri_q, msg->path_vec, end); + p = print_contact_str(p, msg->new_uri, ruri_q, msg->path_vec, ruri_bflags, end); if (!p) goto memfail; i = 1; @@ -489,13 +501,13 @@ char* print_dset(struct sip_msg* msg, int* len) } init_branch_iterator(); - while ((uri.s = next_branch(&uri.len, &q, 0, &path, 0, 0))) { + while ((uri.s = next_branch(&uri.len, &q, 0, &path, &flags, 0))) { if (i) { if (p + CONTACT_DELIM_LEN > end) goto memfail; memcpy(p, CONTACT_DELIM, CONTACT_DELIM_LEN); p += CONTACT_DELIM_LEN; } - p = print_contact_str(p, uri, q, path, end); + p = print_contact_str(p, uri, q, path, flags, end); if (!p) goto memfail; i++;
13 years, 4 months
1
0
0
0
git:alexh/master: core/dset: Create contacts with path vector as Route header
by Alex Hermann
Module: sip-router Branch: alexh/master Commit: 0ef0618e2273dfd717014d4caa484f7f20f0a2c1 URL:
http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=0ef0618…
Author: Alex Hermann <alex(a)speakup.nl> Committer: Alex Hermann <alex(a)speakup.nl> Date: Tue Jul 26 10:23:36 2011 +0200 core/dset: Create contacts with path vector as Route header --- config.h | 2 +- dset.c | 197 ++++++++++++++++++++++++++++++++++++++++++-------------------- 2 files changed, 134 insertions(+), 65 deletions(-) diff --git a/config.h b/config.h index 57c40b2..70791a1 100644 --- a/config.h +++ b/config.h @@ -170,7 +170,7 @@ #define MAX_PRINT_TEXT 256 /*!< max length of the text of fifo 'print' command */ -#define MAX_REDIRECTION_LEN 512 /*!< maximum length of Contact header field in redirection replies */ +#define MAX_REDIRECTION_LEN 1024 /*!< maximum length of Contact header field in redirection replies */ /*! \brief used by FIFO statistics in module to terminate line; extra whitespaces are used to overwrite remainders of diff --git a/dset.c b/dset.c index f8bb337..2a42d43 100644 --- a/dset.c +++ b/dset.c @@ -54,6 +54,8 @@ #define Q_PARAM ">;q=" #define Q_PARAM_LEN (sizeof(Q_PARAM) - 1) +#define PATH_PARAM "?Route=" +#define PATH_PARAM_LEN (sizeof(PATH_PARAM) - 1) /* * Where we store URIs of additional transaction branches @@ -355,97 +357,164 @@ int append_branch(struct sip_msg* msg, str* uri, str* dst_uri, str* path, } -/* - * Create a Contact header field from the dset - * array +/*! \brief + * Escape all printable characters that are not valid in + * a param part of request uri: = | ; | , | | " | ? | & */ -char* print_dset(struct sip_msg* msg, int* len) +static int escape_param(str *sin, str *sout) { - int cnt, i; - unsigned int qlen; - qvalue_t q; - str uri; - char* p, *qbuf; - static char dset[MAX_REDIRECTION_LEN]; + char *at, *p; + unsigned char x; + + if (sin==NULL || sout==NULL || sin->s==NULL || sout->s==NULL || + sin->len<0 || sout->len < 3*sin->len+1) + return -1; + + at = sout->s; + p = sin->s; + while (p < sin->s+sin->len) { + if (*p < 32 || *p > 126) { + LM_ERR("invalid escaped character <%u>\n", (unsigned int)*p); + return -1; + } + switch (*p) { + case ' ': + case '?': + case '&': + case '=': + case ',': + case ';': + case '"': + case '+': + *at++ = '%'; + x = (*p) >> 4; + if (x < 10) + { + *at++ = x + '0'; + } else { + *at++ = x - 10 + 'a'; + } + x = (*p) & 0x0f; + if (x < 10) { + *at = x + '0'; + } else { + *at = x - 10 + 'a'; + } + break; + default: + *at = *p; + } + at++; + p++; + } + *at = 0; + sout->len = at - sout->s; + LM_DBG("escaped string is <%s>\n", sout->s); + + return 0; +} - if (msg->new_uri.s) { - cnt = 1; - *len = msg->new_uri.len; - if (ruri_q != Q_UNSPECIFIED) { - *len += 1 + Q_PARAM_LEN + len_q(ruri_q); - } - } else { - cnt = 0; - *len = 0; + +/*! \brief + * Combines the given elements into a Contact header field + * p = target buffer + * uri, q, path = contact elements + * end = end of target buffer + * Returns pointer to final position in target buffer or 0 on failure + */ +char* print_contact_str(char *p, str uri, qvalue_t q, str path, char *end) +{ + str buf; + + if (q != Q_UNSPECIFIED) { + if (p + 1 > end) return 0; + *p++ = '<'; } - init_branch_iterator(); - while ((uri.s = next_branch(&uri.len, &q, 0, 0, 0, 0))) { - cnt++; - *len += uri.len; - if (q != Q_UNSPECIFIED) { - *len += 1 + Q_PARAM_LEN + len_q(q); - } + /* uri */ + if (p + uri.len > end) return 0; + memcpy(p, uri.s, uri.len); + p += uri.len; + + /* path vector in Route header (uri parameter)*/ + if (path.len > 0) { + if (p + PATH_PARAM_LEN + path.len*3 > end) return 0; + memcpy(p, PATH_PARAM, PATH_PARAM_LEN); + p += PATH_PARAM_LEN; + /* strip <> from path and escape */ + path.s += 1; + path.len -= 2; + buf.s = p; + buf.len = end - p; + if (escape_param(&path, &buf) < 0) return 0; + p += buf.len; } - if (cnt == 0) return 0; + /* q value (header parameter) */ + if (q != Q_UNSPECIFIED) { + buf.s = q2str(q, (unsigned int*)&buf.len); + if (p + Q_PARAM_LEN + buf.len > end) return 0; + memcpy(p, Q_PARAM, Q_PARAM_LEN); + p += Q_PARAM_LEN; + memcpy(p, buf.s, buf.len); + p += buf.len; + } - *len += CONTACT_LEN + CRLF_LEN + (cnt - 1) * CONTACT_DELIM_LEN; + return p; +} - if (*len + 1 > MAX_REDIRECTION_LEN) { - LOG(L_ERR, "ERROR: redirection buffer length exceed\n"); - return 0; - } +/* + * Create a Contact header field from the dset array + */ +char* print_dset(struct sip_msg* msg, int* len) +{ + int i; + qvalue_t q; + str uri, path; + char *p; + static char dset[MAX_REDIRECTION_LEN]; + char *end = dset + MAX_REDIRECTION_LEN; + + if (CONTACT_LEN + CRLF_LEN > MAX_REDIRECTION_LEN) goto memfail; memcpy(dset, CONTACT, CONTACT_LEN); p = dset + CONTACT_LEN; if (msg->new_uri.s) { - if (ruri_q != Q_UNSPECIFIED) { - *p++ = '<'; - } - - memcpy(p, msg->new_uri.s, msg->new_uri.len); - p += msg->new_uri.len; - - if (ruri_q != Q_UNSPECIFIED) { - memcpy(p, Q_PARAM, Q_PARAM_LEN); - p += Q_PARAM_LEN; - - qbuf = q2str(ruri_q, &qlen); - memcpy(p, qbuf, qlen); - p += qlen; - } + p = print_contact_str(p, msg->new_uri, ruri_q, msg->path_vec, end); + if (!p) + goto memfail; i = 1; } else { i = 0; } init_branch_iterator(); - while ((uri.s = next_branch(&uri.len, &q, 0, 0, 0, 0))) { + while ((uri.s = next_branch(&uri.len, &q, 0, &path, 0, 0))) { if (i) { + if (p + CONTACT_DELIM_LEN > end) goto memfail; memcpy(p, CONTACT_DELIM, CONTACT_DELIM_LEN); p += CONTACT_DELIM_LEN; } - - if (q != Q_UNSPECIFIED) { - *p++ = '<'; - } - - memcpy(p, uri.s, uri.len); - p += uri.len; - if (q != Q_UNSPECIFIED) { - memcpy(p, Q_PARAM, Q_PARAM_LEN); - p += Q_PARAM_LEN; - - qbuf = q2str(q, &qlen); - memcpy(p, qbuf, qlen); - p += qlen; - } + p = print_contact_str(p, uri, q, path, end); + if (!p) + goto memfail; i++; } - memcpy(p, CRLF " ", CRLF_LEN + 1); + /* No contacts */ + if (!i) { + goto none; + } + + memcpy(p, CRLF, CRLF_LEN); + *len = p + CRLF_LEN - dset; return dset; + +memfail: + LM_ERR("redirection buffer length exceeded\n"); +none: + *len = 0; + return 0; }
13 years, 4 months
1
0
0
0
git:alexh/master DELETED: modules_k/pv: Add s.replace transformation.
by Alex Hermann
Module: sip-router Branch: alexh/master DELETED Commit: 7ef14ec53505e269b85c5fe511e93c61fd380d37 URL:
http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=7ef14ec…
Author: Alex Hermann <alex(a)speakup.nl> Committer: Alex Hermann <alex(a)speakup.nl> Date: Thu Mar 24 14:12:05 2011 +0100 modules_k/pv: Add s.replace transformation. Syntax: {s.replace,<search>,<replace>} Replaces every occurance of <search> with <replace>. Both parameters may contain pvars. --- modules_k/pv/pv_trans.c | 89 +++++++++++++++++++++++++++++++++++++++++++++- modules_k/pv/pv_trans.h | 3 +- 2 files changed, 89 insertions(+), 3 deletions(-) diff --git a/modules_k/pv/pv_trans.c b/modules_k/pv/pv_trans.c index 4842a06..b60f529 100644 --- a/modules_k/pv/pv_trans.c +++ b/modules_k/pv/pv_trans.c @@ -69,8 +69,8 @@ int tr_eval_string(struct sip_msg *msg, tr_param_t *tp, int subtype, { int i, j, max; char *p, *s; - str st; - pv_value_t v; + str st, st2; + pv_value_t v, w; if(val==NULL || val->flags&PV_VAL_NULL) return -1; @@ -496,6 +496,61 @@ int tr_eval_string(struct sip_msg *msg, tr_param_t *tp, int subtype, val->rs.len = j-1; break; + + case TR_S_REPLACE: + if(tp==NULL || tp->next==NULL) + { + LM_ERR("select invalid parameters\n"); + return -1; + } + if(!(val->flags&PV_VAL_STR)) + val->rs.s = int2str(val->ri, &val->rs.len); + + if(tp->type==TR_PARAM_STRING) + { + st = tp->v.s; + } else { + if(pv_get_spec_value(msg, (pv_spec_p)tp->v.data, &v)!=0 + || (!(v.flags&PV_VAL_STR)) || v.rs.len<=0) + { + LM_ERR("replace cannot get p1\n"); + return -1; + } + st = v.rs; + } + + if(tp->next->type==TR_PARAM_STRING) + { + st2 = tp->next->v.s; + } else { + if(pv_get_spec_value(msg, (pv_spec_p)tp->next->v.data, &w)!=0 + || (!(w.flags&PV_VAL_STR)) || w.rs.len<=0) + { + LM_ERR("replace cannot get p2\n"); + return -1; + } + st2 = w.rs; + } + + val->flags = PV_VAL_STR; + val->ri = 0; + + i = 0; + j = 0; + max = val->rs.len - st.len; + while (i < val->rs.len && j < TR_BUFFER_SIZE) { + if (i <= max && val->rs.s[i] == st.s[0] && strncmp(val->rs.s+i, st.s, st.len) == 0) { + strncpy(_tr_buffer+j, st2.s, st2.len); + i += st.len; + j += st2.len; + } else { + _tr_buffer[j++] = val->rs.s[i++]; + } + } + val->rs.s = _tr_buffer; + val->rs.len = j; + break; + case TR_S_TIMEFORMAT: if(tp==NULL) { @@ -1483,6 +1538,36 @@ char* tr_parse_string(str* in, trans_t *t) goto error; } goto done; + } else if(name.len==7 && strncasecmp(name.s, "replace", 7)==0) { + t->subtype = TR_S_REPLACE; + if(*p!=TR_PARAM_MARKER) + { + LM_ERR("invalid replace transformation: %.*s!\n", in->len, in->s); + goto error; + } + p++; + _tr_parse_sparam(p, p0, tp, spec, ps, in, s); + t->params = tp; + tp = 0; + while(*p && (*p==' ' || *p=='\t' || *p=='\n')) p++; + if(*p!=TR_PARAM_MARKER) + { + LM_ERR("invalid replace transformation: %.*s!\n", + in->len, in->s); + goto error; + } + p++; + _tr_parse_sparam(p, p0, tp, spec, ps, in, s); + t->params->next = tp; + tp = 0; + while(*p && (*p==' ' || *p=='\t' || *p=='\n')) p++; + if(*p!=TR_RBRACKET) + { + LM_ERR("invalid replace transformation: %.*s!!\n", + in->len, in->s); + goto error; + } + goto done; } LM_ERR("unknown transformation: %.*s/%.*s/%d!\n", in->len, in->s, diff --git a/modules_k/pv/pv_trans.h b/modules_k/pv/pv_trans.h index 222c09e..0938ddc 100644 --- a/modules_k/pv/pv_trans.h +++ b/modules_k/pv/pv_trans.h @@ -39,7 +39,8 @@ enum _tr_s_subtype { TR_S_SELECT, TR_S_ENCODEHEXA, TR_S_DECODEHEXA, TR_S_ESCAPECOMMON, TR_S_UNESCAPECOMMON, TR_S_ESCAPEUSER, TR_S_UNESCAPEUSER, TR_S_ESCAPEPARAM, TR_S_UNESCAPEPARAM, TR_S_TOLOWER, TR_S_TOUPPER, - TR_S_STRIP, TR_S_STRIPTAIL, TR_S_PREFIXES, TR_S_PREFIXES_QUOT, TR_S_TIMEFORMAT + TR_S_STRIP, TR_S_STRIPTAIL, TR_S_PREFIXES, TR_S_PREFIXES_QUOT, TR_S_REPLACE, + TR_S_TIMEFORMAT }; enum _tr_uri_subtype { TR_URI_NONE=0, TR_URI_USER, TR_URI_HOST, TR_URI_PASSWD, TR_URI_PORT,
13 years, 4 months
1
0
0
0
← Newer
1
...
20
21
22
23
24
25
26
...
30
Older →
Jump to page:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Results per page:
10
25
50
100
200