diff options
Diffstat (limited to 'channels')
-rw-r--r-- | channels/chan_dahdi.c | 29 | ||||
-rw-r--r-- | channels/chan_misdn.c | 17 | ||||
-rw-r--r-- | channels/chan_sip.c | 75 | ||||
-rw-r--r-- | channels/misdn/chan_misdn_config.h | 2 | ||||
-rw-r--r-- | channels/misdn_config.c | 48 | ||||
-rw-r--r-- | channels/sip/include/sip.h | 4 |
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 */ |