summaryrefslogtreecommitdiff
path: root/channels
diff options
context:
space:
mode:
Diffstat (limited to 'channels')
-rw-r--r--channels/chan_dahdi.c29
-rw-r--r--channels/chan_misdn.c17
-rw-r--r--channels/chan_sip.c75
-rw-r--r--channels/misdn/chan_misdn_config.h2
-rw-r--r--channels/misdn_config.c48
-rw-r--r--channels/sip/include/sip.h4
6 files changed, 169 insertions, 6 deletions
diff --git a/channels/chan_dahdi.c b/channels/chan_dahdi.c
index c0afc576a..b60838358 100644
--- a/channels/chan_dahdi.c
+++ b/channels/chan_dahdi.c
@@ -1092,6 +1092,16 @@ struct dahdi_pvt {
*/
ast_group_t pickupgroup;
/*!
+ * \brief Named call groups this belongs to.
+ * \note The "namedcallgroup" string read in from chan_dahdi.conf
+ */
+ struct ast_namedgroups *named_callgroups;
+ /*!
+ * \brief Named pickup groups this belongs to.
+ * \note The "namedpickupgroup" string read in from chan_dahdi.conf
+ */
+ struct ast_namedgroups *named_pickupgroups;
+ /*!
* \brief Channel variable list with associated values to set when a channel is created.
* \note The "setvar" strings read in from chan_dahdi.conf
*/
@@ -5917,6 +5927,10 @@ static void destroy_dahdi_pvt(struct dahdi_pvt *pvt)
if (p->cc_params) {
ast_cc_config_params_destroy(p->cc_params);
}
+
+ p->named_callgroups = ast_unref_namedgroups(p->named_callgroups);
+ p->named_pickupgroups = ast_unref_namedgroups(p->named_pickupgroups);
+
ast_mutex_destroy(&p->lock);
dahdi_close_sub(p, SUB_REAL);
if (p->owner)
@@ -9904,6 +9918,8 @@ static struct ast_channel *dahdi_new(struct dahdi_pvt *i, int state, int startpb
/* Only FXO signalled stuff can be picked up */
ast_channel_callgroup_set(tmp, i->callgroup);
ast_channel_pickupgroup_set(tmp, i->pickupgroup);
+ ast_channel_named_callgroups_set(tmp, i->named_callgroups);
+ ast_channel_named_pickupgroups_set(tmp, i->named_pickupgroups);
}
if (!ast_strlen_zero(i->parkinglot))
ast_channel_parkinglot_set(tmp, i->parkinglot);
@@ -13159,6 +13175,10 @@ static struct dahdi_pvt *mkintf(int channel, const struct dahdi_chan_conf *conf,
tmp->group = conf->chan.group;
tmp->callgroup = conf->chan.callgroup;
tmp->pickupgroup= conf->chan.pickupgroup;
+ ast_unref_namedgroups(tmp->named_callgroups);
+ tmp->named_callgroups = ast_ref_namedgroups(conf->chan.named_callgroups);
+ ast_unref_namedgroups(tmp->named_pickupgroups);
+ tmp->named_pickupgroups = ast_ref_namedgroups(conf->chan.named_pickupgroups);
if (conf->chan.vars) {
struct ast_variable *v, *tmpvar;
for (v = conf->chan.vars ; v ; v = v->next) {
@@ -17557,6 +17577,10 @@ static int process_dahdi(struct dahdi_chan_conf *confp, const char *cat, struct
confp->chan.pickupgroup = 0;
else
confp->chan.pickupgroup = ast_get_group(v->value);
+ } else if (!strcasecmp(v->name, "namedcallgroup")) {
+ confp->chan.named_callgroups = ast_get_namedgroups(v->value);
+ } else if (!strcasecmp(v->name, "namedpickupgroup")) {
+ confp->chan.named_pickupgroups = ast_get_namedgroups(v->value);
} else if (!strcasecmp(v->name, "setvar")) {
char *varname = ast_strdupa(v->value), *varval = NULL;
struct ast_variable *tmpvar;
@@ -18541,6 +18565,11 @@ static int process_dahdi(struct dahdi_chan_conf *confp, const char *cat, struct
}
ast_cc_config_params_destroy(conf.chan.cc_params);
}
+
+ /* Since named callgroup and named pickup group are ref'd to dahdi_pvt at this point, unref container in confp's pvt. */
+ confp->chan.named_callgroups = ast_unref_namedgroups(confp->chan.named_callgroups);
+ confp->chan.named_pickupgroups = ast_unref_namedgroups(confp->chan.named_pickupgroups);
+
return 0;
}
diff --git a/channels/chan_misdn.c b/channels/chan_misdn.c
index 82939614a..ce654ee41 100644
--- a/channels/chan_misdn.c
+++ b/channels/chan_misdn.c
@@ -5904,6 +5904,9 @@ static int read_config(struct chan_list *ch)
char buf2[256];
ast_group_t pg;
ast_group_t cg;
+ struct ast_namedgroups *npg;
+ struct ast_namedgroups *ncg;
+ struct ast_str *tmp_str;
if (!ch) {
ast_log(LOG_WARNING, "Cannot configure without chanlist\n");
@@ -5987,6 +5990,20 @@ static int read_config(struct chan_list *ch)
ast_channel_pickupgroup_set(ast, pg);
ast_channel_callgroup_set(ast, cg);
+ misdn_cfg_get(port, MISDN_CFG_NAMEDPICKUPGROUP, &npg, sizeof(npg));
+ misdn_cfg_get(port, MISDN_CFG_NAMEDCALLGROUP, &ncg, sizeof(ncg));
+
+ tmp_str = ast_str_create(1024);
+ if (tmp_str) {
+ chan_misdn_log(5, port, " --> * NamedCallGrp:%s\n", ast_print_namedgroups(&tmp_str, ncg));
+ ast_str_reset(tmp_str);
+ chan_misdn_log(5, port, " --> * NamedPickupGrp:%s\n", ast_print_namedgroups(&tmp_str, npg));
+ ast_free(tmp_str);
+ }
+
+ ast_channel_named_pickupgroups_set(ast, npg);
+ ast_channel_named_callgroups_set(ast, ncg);
+
if (ch->originator == ORG_AST) {
char callerid[BUFFERSIZE + 1];
diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index 7afe46f1a..b002254ef 100644
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -410,6 +410,12 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
<enum name="pickupgroup">
<para>The configured Pickupgroup.</para>
</enum>
+ <enum name="namedcallgroup">
+ <para>The configured Named Callgroup.</para>
+ </enum>
+ <enum name="namedpickupgroup">
+ <para>The configured Named Pickupgroup.</para>
+ </enum>
<enum name="codecs">
<para>The configured codecs.</para>
</enum>
@@ -1453,6 +1459,7 @@ static char * _sip_show_peers(int fd, int *total, struct mansession *s, const st
static char *sip_show_peers(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a);
static char *sip_show_objects(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a);
static void print_group(int fd, ast_group_t group, int crlf);
+static void print_named_groups(int fd, struct ast_namedgroups *groups, int crlf);
static const char *dtmfmode2str(int mode) attribute_const;
static int str2dtmfmode(const char *str) attribute_unused;
static const char *insecure2str(int mode) attribute_const;
@@ -4907,6 +4914,9 @@ static void sip_destroy_peer(struct sip_peer *peer)
peer->socket.ws_session = NULL;
}
+ peer->named_callgroups = ast_unref_namedgroups(peer->named_callgroups);
+ peer->named_pickupgroups = ast_unref_namedgroups(peer->named_pickupgroups);
+
ast_cc_config_params_destroy(peer->cc_params);
ast_string_field_free_memory(peer);
@@ -5628,6 +5638,10 @@ static int create_addr_from_peer(struct sip_pvt *dialog, struct sip_peer *peer)
ref_proxy(dialog, obproxy_get(dialog, peer));
dialog->callgroup = peer->callgroup;
dialog->pickupgroup = peer->pickupgroup;
+ ast_unref_namedgroups(dialog->named_callgroups);
+ dialog->named_callgroups = ast_ref_namedgroups(peer->named_callgroups);
+ ast_unref_namedgroups(dialog->named_pickupgroups);
+ dialog->named_pickupgroups = ast_ref_namedgroups(peer->named_pickupgroups);
ast_copy_string(dialog->zone, peer->zone, sizeof(dialog->zone));
dialog->allowtransfer = peer->allowtransfer;
dialog->jointnoncodeccapability = dialog->noncodeccapability;
@@ -6219,6 +6233,9 @@ void __sip_destroy(struct sip_pvt *p, int lockowner, int lockdialoglist)
p->peerauth = NULL;
}
+ p->named_callgroups = ast_unref_namedgroups(p->named_callgroups);
+ p->named_pickupgroups = ast_unref_namedgroups(p->named_pickupgroups);
+
p->caps = ast_format_cap_destroy(p->caps);
p->jointcaps = ast_format_cap_destroy(p->jointcaps);
p->peercaps = ast_format_cap_destroy(p->peercaps);
@@ -7570,6 +7587,10 @@ static struct ast_channel *sip_new(struct sip_pvt *i, int state, const char *tit
ast_channel_callgroup_set(tmp, i->callgroup);
ast_channel_pickupgroup_set(tmp, i->pickupgroup);
+
+ ast_channel_named_callgroups_set(tmp, i->named_callgroups);
+ ast_channel_named_pickupgroups_set(tmp, i->named_pickupgroups);
+
ast_channel_caller(tmp)->id.name.presentation = i->callingpres;
ast_channel_caller(tmp)->id.number.presentation = i->callingpres;
if (!ast_strlen_zero(i->parkinglot)) {
@@ -17344,6 +17365,10 @@ static enum check_auth_result check_peer_ok(struct sip_pvt *p, char *of,
p->amaflags = peer->amaflags;
p->callgroup = peer->callgroup;
p->pickupgroup = peer->pickupgroup;
+ ast_unref_namedgroups(p->named_callgroups);
+ p->named_callgroups = ast_ref_namedgroups(peer->named_callgroups);
+ ast_unref_namedgroups(p->named_pickupgroups);
+ p->named_pickupgroups = ast_ref_namedgroups(peer->named_pickupgroups);
ast_format_cap_copy(p->caps, peer->caps);
ast_format_cap_copy(p->jointcaps, peer->caps);
p->prefs = peer->prefs;
@@ -18347,6 +18372,16 @@ static void print_group(int fd, ast_group_t group, int crlf)
ast_cli(fd, crlf ? "%s\r\n" : "%s\n", ast_print_group(buf, sizeof(buf), group) );
}
+/*! \brief Print named call groups and pickup groups */
+static void print_named_groups(int fd, struct ast_namedgroups *group, int crlf)
+{
+ struct ast_str *buf = ast_str_create(1024);
+ if (buf) {
+ ast_cli(fd, crlf ? "%s\r\n" : "%s\n", ast_print_namedgroups(&buf, group) );
+ ast_free(buf);
+ }
+}
+
/*! \brief mapping between dtmf flags and strings */
static const struct _map_x_s dtmfstr[] = {
{ SIP_DTMF_RFC2833, "rfc2833" },
@@ -19002,6 +19037,10 @@ static char *_sip_show_peer(int type, int fd, struct mansession *s, const struct
print_group(fd, peer->callgroup, 0);
ast_cli(fd, " Pickupgroup : ");
print_group(fd, peer->pickupgroup, 0);
+ ast_cli(fd, " Named Callgr : ");
+ print_named_groups(fd, peer->named_callgroups, 0);
+ ast_cli(fd, " Nam. Pickupgr: ");
+ print_named_groups(fd, peer->named_pickupgroups, 0);
peer_mailboxes_to_str(&mailbox_str, peer);
ast_cli(fd, " MOH Suggest : %s\n", peer->mohsuggest);
ast_cli(fd, " Mailbox : %s\n", mailbox_str->str);
@@ -19096,7 +19135,7 @@ static char *_sip_show_peer(int type, int fd, struct mansession *s, const struct
peer = sip_unref_peer(peer, "sip_show_peer: sip_unref_peer: done with peer ptr");
} else if (peer && type == 1) { /* manager listing */
char buffer[256];
- struct ast_str *mailbox_str = ast_str_alloca(512);
+ struct ast_str *tmp_str = ast_str_alloca(512);
astman_append(s, "Channeltype: SIP\r\n");
astman_append(s, "ObjectName: %s\r\n", peer->name);
astman_append(s, "ChanObjectType: peer\r\n");
@@ -19118,9 +19157,15 @@ static char *_sip_show_peer(int type, int fd, struct mansession *s, const struct
astman_append(s, "%s\r\n", ast_print_group(buffer, sizeof(buffer), peer->callgroup));
astman_append(s, "Pickupgroup: ");
astman_append(s, "%s\r\n", ast_print_group(buffer, sizeof(buffer), peer->pickupgroup));
+ astman_append(s, "Named Callgroup: ");
+ astman_append(s, "%s\r\n", ast_print_namedgroups(&tmp_str, peer->named_callgroups));
+ ast_str_reset(tmp_str);
+ astman_append(s, "Named Pickupgroup: ");
+ astman_append(s, "%s\r\n", ast_print_namedgroups(&tmp_str, peer->named_pickupgroups));
+ ast_str_reset(tmp_str);
astman_append(s, "MOHSuggest: %s\r\n", peer->mohsuggest);
- peer_mailboxes_to_str(&mailbox_str, peer);
- astman_append(s, "VoiceMailbox: %s\r\n", mailbox_str->str);
+ peer_mailboxes_to_str(&tmp_str, peer);
+ astman_append(s, "VoiceMailbox: %s\r\n", tmp_str->str);
astman_append(s, "TransferMode: %s\r\n", transfermode2str(peer->allowtransfer));
astman_append(s, "LastMsgsSent: %d\r\n", peer->lastmsgssent);
astman_append(s, "Maxforwards: %d\r\n", peer->maxforwards);
@@ -19287,6 +19332,10 @@ static char *sip_show_user(struct ast_cli_entry *e, int cmd, struct ast_cli_args
print_group(a->fd, user->callgroup, 0);
ast_cli(a->fd, " Pickupgroup : ");
print_group(a->fd, user->pickupgroup, 0);
+ ast_cli(a->fd, " Named Callgr : ");
+ print_named_groups(a->fd, user->named_callgroups, 0);
+ ast_cli(a->fd, " Nam. Pickupgr: ");
+ print_named_groups(a->fd, user->named_pickupgroups, 0);
ast_cli(a->fd, " Callerid : %s\n", ast_callerid_merge(cbuf, sizeof(cbuf), user->cid_name, user->cid_num, "<unspecified>"));
ast_cli(a->fd, " ACL : %s\n", AST_CLI_YESNO(ast_acl_list_is_empty(user->acl) == 0));
ast_cli(a->fd, " Sess-Timers : %s\n", stmode2str(user->stimer.st_mode_oper));
@@ -21039,6 +21088,18 @@ static int function_sippeer(struct ast_channel *chan, const char *cmd, char *dat
ast_print_group(buf, len, peer->callgroup);
} else if (!strcasecmp(colname, "pickupgroup")) {
ast_print_group(buf, len, peer->pickupgroup);
+ } else if (!strcasecmp(colname, "namedcallgroup")) {
+ struct ast_str *tmp_str = ast_str_create(1024);
+ if (tmp_str) {
+ ast_copy_string(buf, ast_print_namedgroups(&tmp_str, peer->named_callgroups), len);
+ ast_free(tmp_str);
+ }
+ } else if (!strcasecmp(colname, "namedpickupgroup")) {
+ struct ast_str *tmp_str = ast_str_create(1024);
+ if (tmp_str) {
+ ast_copy_string(buf, ast_print_namedgroups(&tmp_str, peer->named_pickupgroups), len);
+ ast_free(tmp_str);
+ }
} else if (!strcasecmp(colname, "useragent")) {
ast_copy_string(buf, peer->useragent, len);
} else if (!strcasecmp(colname, "mailbox")) {
@@ -29431,6 +29492,10 @@ static struct sip_peer *build_peer(const char *name, struct ast_variable *v, str
}
}
+ /* clear named callgroup and named pickup group container */
+ peer->named_callgroups = ast_unref_namedgroups(peer->named_callgroups);
+ peer->named_pickupgroups = ast_unref_namedgroups(peer->named_pickupgroups);
+
for (; v || ((v = alt) && !(alt=NULL)); v = v->next) {
if (!devstate_only) {
if (handle_common_options(&peerflags[0], &mask[0], v)) {
@@ -29668,6 +29733,10 @@ static struct sip_peer *build_peer(const char *name, struct ast_variable *v, str
peer->allowtransfer = ast_true(v->value) ? TRANSFER_OPENFORALL : TRANSFER_CLOSED;
} else if (!strcasecmp(v->name, "pickupgroup")) {
peer->pickupgroup = ast_get_group(v->value);
+ } else if (!strcasecmp(v->name, "namedcallgroup")) {
+ peer->named_callgroups = ast_get_namedgroups(v->value);
+ } else if (!strcasecmp(v->name, "namedpickupgroup")) {
+ peer->named_pickupgroups = ast_get_namedgroups(v->value);
} else if (!strcasecmp(v->name, "allow")) {
int error = ast_parse_allow_disallow(&peer->prefs, peer->caps, v->value, TRUE);
if (error) {
diff --git a/channels/misdn/chan_misdn_config.h b/channels/misdn/chan_misdn_config.h
index 270b505ba..c4054a87b 100644
--- a/channels/misdn/chan_misdn_config.h
+++ b/channels/misdn/chan_misdn_config.h
@@ -89,6 +89,8 @@ enum misdn_cfg_elements {
MISDN_CFG_JITTERBUFFER_UPPER_THRESHOLD, /* int */
MISDN_CFG_CALLGROUP, /* ast_group_t */
MISDN_CFG_PICKUPGROUP, /* ast_group_t */
+ MISDN_CFG_NAMEDCALLGROUP, /* ast_namedgroups * */
+ MISDN_CFG_NAMEDPICKUPGROUP, /* ast_namedgroups * */
MISDN_CFG_MAX_IN, /* int */
MISDN_CFG_MAX_OUT, /* int */
MISDN_CFG_L1_TIMEOUT, /* int */
diff --git a/channels/misdn_config.c b/channels/misdn_config.c
index 30e96eca4..32f92c323 100644
--- a/channels/misdn_config.c
+++ b/channels/misdn_config.c
@@ -70,7 +70,8 @@ enum misdn_cfg_type {
MISDN_CTYPE_BOOL,
MISDN_CTYPE_BOOLINT,
MISDN_CTYPE_MSNLIST,
- MISDN_CTYPE_ASTGROUP
+ MISDN_CTYPE_ASTGROUP,
+ MISDN_CTYPE_ASTNAMEDGROUP
};
struct msn_list {
@@ -83,6 +84,7 @@ union misdn_cfg_pt {
int *num;
struct msn_list *ml;
ast_group_t *grp;
+ struct ast_namedgroups *namgrp;
void *any;
};
@@ -330,6 +332,10 @@ static const struct misdn_cfg_spec port_spec[] = {
"Callgroup." },
{ "pickupgroup", MISDN_CFG_PICKUPGROUP, MISDN_CTYPE_ASTGROUP, NO_DEFAULT, NONE,
"Pickupgroup." },
+ { "namedcallgroup", MISDN_CFG_NAMEDCALLGROUP, MISDN_CTYPE_ASTNAMEDGROUP, NO_DEFAULT, NONE,
+ "Named callgroup." },
+ { "namedpickupgroup", MISDN_CFG_NAMEDPICKUPGROUP, MISDN_CTYPE_ASTNAMEDGROUP, NO_DEFAULT, NONE,
+ "Named pickupgroup." },
{ "max_incoming", MISDN_CFG_MAX_IN, MISDN_CTYPE_INT, "-1", NONE,
"Defines the maximum amount of incoming calls per port for this group.\n"
"\tCalls which exceed the maximum will be marked with the channel variable\n"
@@ -541,10 +547,13 @@ static void _free_port_cfg (void)
for (j = 0; free_list[j]; ++j) {
for (i = 0; i < NUM_PORT_ELEMENTS; ++i) {
if (free_list[j][i].any) {
- if (port_spec[i].type == MISDN_CTYPE_MSNLIST)
+ if (port_spec[i].type == MISDN_CTYPE_MSNLIST) {
_free_msn_list(free_list[j][i].ml);
- else
+ } else if (port_spec[i].type == MISDN_CTYPE_ASTNAMEDGROUP) {
+ ast_unref_namedgroups(free_list[j][i].namgrp);
+ } else {
ast_free(free_list[j][i].any);
+ }
}
}
}
@@ -588,6 +597,17 @@ void misdn_cfg_get(int port, enum misdn_cfg_elements elem, void *buf, int bufsiz
} else
memset(buf, 0, bufsize);
break;
+ case MISDN_CTYPE_ASTNAMEDGROUP:
+ if (bufsize >= sizeof(struct ast_namedgroups *)) {
+ if (port_cfg[port][place].namgrp) {
+ *(struct ast_namedgroups **)buf = port_cfg[port][place].namgrp;
+ } else if (port_cfg[0][place].namgrp) {
+ *(struct ast_namedgroups **)buf = port_cfg[0][place].namgrp;
+ } else {
+ *(struct ast_namedgroups **)buf = NULL;
+ }
+ }
+ break;
default:
if (port_cfg[port][place].any)
memcpy(buf, port_cfg[port][place].any, bufsize);
@@ -831,6 +851,25 @@ void misdn_cfg_get_config_string (int port, enum misdn_cfg_elements elem, char*
else
snprintf(buf, bufsize, " -> %s:", port_spec[place].name);
break;
+ case MISDN_CTYPE_ASTNAMEDGROUP:
+ if (port_cfg[port][place].namgrp) {
+ struct ast_str *tmp_str = ast_str_create(1024);
+ if (tmp_str) {
+ snprintf(buf, bufsize, " -> %s: %s", port_spec[place].name,
+ ast_print_namedgroups(&tmp_str, port_cfg[port][place].namgrp));
+ ast_free(tmp_str);
+ }
+ } else if (port_cfg[0][place].namgrp) {
+ struct ast_str *tmp_str = ast_str_create(1024);
+ if (tmp_str) {
+ snprintf(buf, bufsize, " -> %s: %s", port_spec[place].name,
+ ast_print_namedgroups(&tmp_str, port_cfg[0][place].namgrp));
+ ast_free(tmp_str);
+ }
+ } else {
+ snprintf(buf, bufsize, " -> %s:", port_spec[place].name);
+ }
+ break;
case MISDN_CTYPE_MSNLIST:
if (port_cfg[port][place].ml)
iter = port_cfg[port][place].ml;
@@ -984,6 +1023,9 @@ static int _parse (union misdn_cfg_pt *dest, const char *value, enum misdn_cfg_t
}
*(dest->grp) = ast_get_group(value);
break;
+ case MISDN_CTYPE_ASTNAMEDGROUP:
+ dest->namgrp = ast_get_namedgroups(value);
+ break;
}
return re;
diff --git a/channels/sip/include/sip.h b/channels/sip/include/sip.h
index a10d405a9..a821435e9 100644
--- a/channels/sip/include/sip.h
+++ b/channels/sip/include/sip.h
@@ -1062,6 +1062,8 @@ struct sip_pvt {
uint32_t init_icseq; /*!< Initial incoming seqno from first request */
ast_group_t callgroup; /*!< Call group */
ast_group_t pickupgroup; /*!< Pickup group */
+ struct ast_namedgroups *named_callgroups; /*!< Named call group */
+ struct ast_namedgroups *named_pickupgroups; /*!< Named pickup group */
uint32_t lastinvite; /*!< Last seqno of invite */
struct ast_flags flags[3]; /*!< SIP_ flags */
@@ -1328,6 +1330,8 @@ struct sip_peer {
int rtpkeepalive; /*!< Send RTP packets for keepalive */
ast_group_t callgroup; /*!< Call group */
ast_group_t pickupgroup; /*!< Pickup group */
+ struct ast_namedgroups *named_callgroups; /*!< Named call group */
+ struct ast_namedgroups *named_pickupgroups; /*!< Named pickup group */
struct sip_proxy *outboundproxy;/*!< Outbound proxy for this peer */
struct ast_dnsmgr_entry *dnsmgr;/*!< DNS refresh manager for peer */
struct ast_sockaddr addr; /*!< IP address of peer */