From f38c1f9849817336bc208e169139891a3544ffa3 Mon Sep 17 00:00:00 2001 From: Vlad Patrascu Date: Mon, 10 Dec 2018 14:56:03 +0200 Subject: [PATCH] permissions: port MI commands to jsonrpc --- modules/permissions/hash.c | 144 +++++------ modules/permissions/hash.h | 4 +- modules/permissions/mi.c | 392 ++++++++++++++++-------------- modules/permissions/mi.h | 28 ++- modules/permissions/permissions.c | 25 +- 5 files changed, 306 insertions(+), 287 deletions(-) diff --git a/modules/permissions/hash.c b/modules/permissions/hash.c index 904dce6689a..a510cd1964f 100644 --- a/modules/permissions/hash.c +++ b/modules/permissions/hash.c @@ -247,48 +247,41 @@ int find_group_in_hash_table(struct address_list** table, -int hash_mi_print(struct address_list **table, struct mi_node* rpl, - struct pm_part_struct *pm) { +int hash_mi_print(struct address_list **table, mi_item_t *part_item, + struct pm_part_struct *pm) +{ int i, len; struct address_list *node; - struct mi_node *dst; char *p, prbuf[PROTO_NAME_MAX_SIZE]; + mi_item_t *dests_arr, *dest_item; + + dests_arr = add_mi_array(part_item, MI_SSTR("Destinations")); + if (dests_arr) + return -1; for (i = 0; i < PERM_HASH_SIZE; i++) { for (node = table[i]; node; node=node->next) { - - dst = add_mi_node_child(rpl, 0, MI_SSTR("dest"), NULL, 0); - if (!dst) { - LM_ERR("oom!\n"); + dest_item = add_mi_object(dests_arr, NULL, 0); + if (!dest_item) return -1; - } - p = int2str(node->grp, &len); - if (!add_mi_attr(dst, MI_DUP_VALUE, MI_SSTR("grp"), p, len)) { - goto out_free; - } + if (add_mi_number(dest_item, MI_SSTR("grp"), node->grp) < 0) + return -1; p = ip_addr2a(node->ip); - if (!add_mi_attr(dst, MI_DUP_VALUE, MI_SSTR("ip"), p, strlen(p))) { - goto out_free; - } + if (add_mi_string(dest_item, MI_SSTR("ip"), p, strlen(p)) < 0) + return -1; if (node->ip->af==AF_INET) { - if (!add_mi_attr(dst, MI_DUP_VALUE, MI_SSTR("mask"), - MI_SSTR("32"))) { - goto out_free; - } + if (add_mi_string(dest_item, MI_SSTR("mask"), MI_SSTR("32")) < 0) + return -1; } else { - if (!add_mi_attr(dst, MI_DUP_VALUE, MI_SSTR("mask"), - MI_SSTR("128"))) { - goto out_free; - } + if (add_mi_string(dest_item, MI_SSTR("mask"), MI_SSTR("128")) < 0) + return -1; } - p = int2str(node->port, &len); - if (!add_mi_attr(dst, MI_DUP_VALUE, MI_SSTR("port"), p, len)) { - goto out_free; - } + if (add_mi_number(dest_item, MI_SSTR("port"), node->port) < 0) + return -1; if (node->proto == PROTO_NONE) { p = "any"; @@ -298,29 +291,22 @@ int hash_mi_print(struct address_list **table, struct mi_node* rpl, len = p - prbuf; p = prbuf; } - if (!add_mi_attr(dst, MI_DUP_VALUE, MI_SSTR("proto"), p, len)) { - goto out_free; - } + if (add_mi_string(dest_item, MI_SSTR("proto"), p, len) < 0) + return -1; - if (!add_mi_attr(dst, MI_DUP_VALUE, MI_SSTR("pattern"), - node->pattern, - node->pattern ? strlen(node->pattern) : 0)) { - goto out_free; - } + if (add_mi_string(dest_item, MI_SSTR("pattern"), + node->pattern, + node->pattern ? strlen(node->pattern) : 0) < 0) + return -1; - if (!add_mi_attr(dst, MI_DUP_VALUE, MI_SSTR("context_info"), - node->info, - node->info ? strlen(node->info) : 0)) { - LM_ERR("oom!\n"); - goto out_free; - } + if (add_mi_string(dest_item, MI_SSTR("context_info"), + node->info, + node->info ? strlen(node->info) : 0) < 0) + return -1; } } - return 0; -out_free: - free_mi_node(dst); - return -1; + return 0; } void empty_hash(struct address_list** table) { @@ -527,18 +513,26 @@ int match_subnet_table(struct sip_msg *msg, struct subnet* table, unsigned int g /* * Print subnets stored in subnet table */ -int subnet_table_mi_print(struct subnet* table, struct mi_node* rpl, +int subnet_table_mi_print(struct subnet* table, mi_item_t *part_item, struct pm_part_struct *pm) { unsigned int count, i; char *p, *ip, *mask, prbuf[PROTO_NAME_MAX_SIZE]; int len; static char ip_buff[IP_ADDR_MAX_STR_SIZE]; - struct mi_node *net; + mi_item_t *dests_arr, *dest_item; count = table[PERM_MAX_SUBNETS].grp; + dests_arr = add_mi_array(part_item, MI_SSTR("Destinations")); + if (dests_arr) + return -1; + for (i = 0; i < count; i++) { + dest_item = add_mi_object(dests_arr, NULL, 0); + if (!dest_item) + return -1; + ip = ip_addr2a(&table[i].subnet->ip); if (!ip) { LM_ERR("cannot print ip address\n"); @@ -551,31 +545,17 @@ int subnet_table_mi_print(struct subnet* table, struct mi_node* rpl, continue; } - net = add_mi_node_child(rpl, 0, MI_SSTR("dest"), NULL, 0); - if (!net) { - LM_ERR("oom!\n"); + if (add_mi_number(dest_item, MI_SSTR("grp"), table[i].grp) < 0) return -1; - } - - p = int2str(table[i].grp, &len); - if (!add_mi_attr(net, MI_DUP_VALUE, MI_SSTR("grp"), p, len)) { - goto out_free; - } - if (!add_mi_attr(net, MI_DUP_VALUE, MI_SSTR("ip"), ip_buff, - strlen(ip_buff))) { - goto out_free; - } + if (add_mi_string(dest_item, MI_SSTR("ip"), ip_buff, strlen(ip_buff)) < 0) + return -1; - if (!add_mi_attr(net, MI_DUP_VALUE, MI_SSTR("mask"), mask, - strlen(mask))) { - goto out_free; - } + if (add_mi_string(dest_item, MI_SSTR("ip"), mask, strlen(mask)) < 0) + return -1; - p = int2str(table[i].port, &len); - if (!add_mi_attr(net, MI_DUP_VALUE, MI_SSTR("port"), p, len)) { - goto out_free; - } + if (add_mi_number(dest_item, MI_SSTR("port"), table[i].port) < 0) + return -1; if (table[i].proto == PROTO_NONE) { p = "any"; @@ -585,29 +565,21 @@ int subnet_table_mi_print(struct subnet* table, struct mi_node* rpl, len = p - prbuf; p = prbuf; } - if (!add_mi_attr(net, MI_DUP_VALUE, MI_SSTR("proto"), p, len)) { - goto out_free; - } + if (add_mi_string(dest_item, MI_SSTR("proto"), p, len) < 0) + return -1; - if (!add_mi_attr(net, MI_DUP_VALUE, MI_SSTR("pattern"), - table[i].pattern, - table[i].pattern ? strlen(table[i].pattern) : 0)) { - goto out_free; - } + if (add_mi_string(dest_item, MI_SSTR("pattern"), + table[i].pattern, + table[i].pattern ? strlen(table[i].pattern) : 0) < 0) + return -1; - if (!add_mi_attr(net, MI_DUP_VALUE, MI_SSTR("context_info"), - table[i].info, - table[i].info ? strlen(table[i].info) : 0)) { - LM_ERR("oom!\n"); - goto out_free; - } + if (add_mi_string(dest_item, MI_SSTR("context_info"), + table[i].info, + table[i].info ? strlen(table[i].info) : 0) < 0) + return -1; } return 0; - -out_free: - free_mi_node(net); - return -1; } diff --git a/modules/permissions/hash.h b/modules/permissions/hash.h index fa199e7033b..cc4dd1985f1 100644 --- a/modules/permissions/hash.h +++ b/modules/permissions/hash.h @@ -87,7 +87,7 @@ int hash_match(struct sip_msg *msg, struct address_list** table, * Print entries stored in hash table */ //void hash_print(struct address_list** hash_table, FILE* reply_file); -int hash_mi_print(struct address_list **table, struct mi_node* rpl, +int hash_mi_print(struct address_list **table, mi_item_t *part_item, struct pm_part_struct *pm); /* @@ -166,7 +166,7 @@ int subnet_table_insert(struct subnet* table, unsigned int grp, * Print subnets stored in subnet table */ /*void subnet_table_print(struct subnet* table, FILE* reply_file);*/ -int subnet_table_mi_print(struct subnet* table, struct mi_node* rpl, +int subnet_table_mi_print(struct subnet* table, mi_item_t *part_item, struct pm_part_struct *pm); diff --git a/modules/permissions/mi.c b/modules/permissions/mi.c index baea04f3a8c..de0e30b344c 100644 --- a/modules/permissions/mi.c +++ b/modules/permissions/mi.c @@ -35,229 +35,255 @@ /* * MI function to reload address table */ -struct mi_root* mi_address_reload(struct mi_root *cmd_tree, void *param) +mi_response_t *mi_address_reload(const mi_params_t *params, + struct mi_handler *async_hdl) { - struct mi_node *node = NULL; - struct pm_part_struct *it, *ps; + struct pm_part_struct *it; char errbuf[100] = "failed to reload partition "; int errlen = strlen(errbuf); - if (cmd_tree) - node = cmd_tree->node.kids; - - if (node == NULL) { - /* reload all partitions */ - for (it=get_part_structs(); it; it = it->next) { - if (it->hash_table == NULL) - continue; - - sprintf(errbuf + errlen, " %.*s!", it->name.len, it->name.s); - LM_DBG("trying to reload address table for %.*s\n", - it->name.len, it->name.s); - if (reload_address_table(it) != 1) - return init_mi_tree( 400, MI_SSTR(errbuf)); - } - - return init_mi_tree( 200, MI_SSTR(MI_OK)); - } else { - /* reload requested partition */ - ps = get_part_struct(&node->value); - if (ps == NULL) - goto err; - if (ps->hash_table == NULL) - return init_mi_tree( 200, MI_SSTR(MI_OK)); - LM_INFO("trying to reload address table for %.*s\n", - ps->name.len, ps->name.s); - if (reload_address_table(ps) == 1) - return init_mi_tree( 200, MI_SSTR(MI_OK)); + for (it=get_part_structs(); it; it = it->next) { + if (it->hash_table == NULL) + continue; + + sprintf(errbuf + errlen, " %.*s!", it->name.len, it->name.s); + LM_DBG("trying to reload address table for %.*s\n", + it->name.len, it->name.s); + if (reload_address_table(it) != 1) + return init_mi_error( 400, MI_SSTR(errbuf)); } -err: - return init_mi_tree( 400, MI_SSTR("Trusted table reload failed")); + return init_mi_result_ok(); } +mi_response_t *mi_address_reload_1(const mi_params_t *params, + struct mi_handler *async_hdl) +{ + struct pm_part_struct *ps; + str partn; + + if (get_mi_string_param(params, "partition", &partn.s, &partn.len) < 0) + return init_mi_param_error(); + + ps = get_part_struct(&partn); + if (ps == NULL) + return init_mi_error( 400, MI_SSTR("Trusted table reload failed")); + if (ps->hash_table == NULL) + return init_mi_result_ok(); + + LM_INFO("trying to reload address table for %.*s\n", + ps->name.len, ps->name.s); + if (reload_address_table(ps) == 1) + return init_mi_result_ok(); + else + return init_mi_error(500, MI_SSTR("Failed to reolad")); +} /* * MI function to print address entries from current hash table */ -struct mi_root* mi_address_dump(struct mi_root *cmd_tree, void *param) +mi_response_t *mi_address_dump(const mi_params_t *params, + struct mi_handler *async_hdl) { - struct mi_root* rpl_tree; - struct mi_node *node = NULL, *part_node; - struct pm_part_struct *it, *ps; - - if (cmd_tree) - node = cmd_tree->node.kids; - - rpl_tree = init_mi_tree( 200, MI_SSTR(MI_OK)); - if (rpl_tree == NULL) - return NULL; - rpl_tree->node.flags |= MI_IS_ARRAY; - - if (node == NULL) { - /* dump all partitions */ - for (it=get_part_structs(); it; it = it->next) { - if (it->hash_table == NULL) - continue; - - part_node = add_mi_node_child(&rpl_tree->node, MI_IS_ARRAY, "part", 4, - it->name.s, it->name.len); - if (part_node == NULL) { - LM_ERR("failed to add MI node for part %.*s\n", - it->name.len, it->name.s); - return NULL; - } - - if(hash_mi_print(*it->hash_table, part_node, it)< 0) { - LM_ERR("failed to add a node\n"); - free_mi_tree(rpl_tree); - return 0; - } - } - } else { - /* dump only requested partition */ - ps = get_part_struct(&node->value); - if (ps == NULL) - return init_mi_tree(404, MI_SSTR("No such partition")); - if (ps->hash_table == NULL) - return init_mi_tree( 200, MI_SSTR(MI_OK)); - part_node = add_mi_node_child(&rpl_tree->node, MI_IS_ARRAY, "part", 4, - ps->name.s, ps->name.len); - if (part_node == NULL) { - LM_ERR("failed to add MI node for part %.*s\n", - ps->name.len, ps->name.s); - return NULL; - } - if(hash_mi_print(*ps->hash_table, &rpl_tree->node, ps)< 0) { - LM_ERR("failed to add a node\n"); - free_mi_tree(rpl_tree); - return 0; - } + struct pm_part_struct *it; + mi_response_t *resp; + mi_item_t *resp_obj; + mi_item_t *parts_arr, *part_item; + + resp = init_mi_result_object(&resp_obj); + if (!resp) + return 0; + + parts_arr = add_mi_array(resp_obj, MI_SSTR("Partitions")); + if (parts_arr) + goto error; + + for (it=get_part_structs(); it; it = it->next) { + if (it->hash_table == NULL) + continue; + + part_item = add_mi_object(parts_arr, NULL, 0); + if (!part_item) + goto error; + + if (add_mi_string(part_item, MI_SSTR("name"), + it->name.s, it->name.len) < 0) + goto error; + + if(hash_mi_print(*it->hash_table, part_item, it)< 0) + goto error; } - return rpl_tree; + return resp; + +error: + free_mi_response(resp); + return 0; } +mi_response_t *mi_address_dump_1(const mi_params_t *params, + struct mi_handler *async_hdl) +{ + struct pm_part_struct *ps; + str partn; + mi_response_t *resp; + mi_item_t *resp_obj; + + if (get_mi_string_param(params, "partition", &partn.s, &partn.len) < 0) + return init_mi_param_error(); + + ps = get_part_struct(&partn); + if (ps == NULL) + return init_mi_error(404, MI_SSTR("No such partition")); + + if (ps->hash_table == NULL) + return init_mi_result_ok(); + + resp = init_mi_result_object(&resp_obj); + if (!resp) + return 0; + + if (add_mi_string(resp_obj, MI_SSTR("part"),ps->name.s, ps->name.len) < 0) + goto error; + + if(hash_mi_print(*ps->hash_table, resp_obj, ps)< 0) + goto error; + + return resp; + +error: + free_mi_response(resp); + return 0; +} #define MAX_FILE_LEN 128 /* * MI function to make allow_uri query. */ -struct mi_root* mi_allow_uri(struct mi_root *cmd, void *param) +mi_response_t *mi_allow_uri(const mi_params_t *params, + struct mi_handler *async_hdl) { - struct mi_node *node; - str *basenamep, *urip, *contactp; + str basename_s, uri_s, contact_s; char basename[MAX_FILE_LEN + 1]; char uri[MAX_URI_SIZE + 1], contact[MAX_URI_SIZE + 1]; unsigned int allow_suffix_len; - node = cmd->node.kids; - if (node == NULL || node->next == NULL || node->next->next == NULL || - node->next->next->next != NULL) - return init_mi_tree(400, MI_SSTR(MI_MISSING_PARM)); + if (get_mi_string_param(params, "basename", + &basename_s.s, &basename_s.len) < 0) + return init_mi_param_error(); + if (basename_s.s == NULL || basename_s.len == 0) + return init_mi_error(404, MI_SSTR("Basename is empty")); - /* look for base name */ - basenamep = &node->value; - if (basenamep == NULL) - return init_mi_tree(404, MI_SSTR("Basename is NULL")); allow_suffix_len = strlen(allow_suffix); - if (basenamep->len + allow_suffix_len + 1 > MAX_FILE_LEN) - return init_mi_tree(404, MI_SSTR("Basename is too long")); - memcpy(basename, basenamep->s, basenamep->len); - memcpy(basename + basenamep->len, allow_suffix, allow_suffix_len); - basename[basenamep->len + allow_suffix_len] = 0; - - /* look for uri */ - urip = &node->next->value; - if (urip == NULL) - return init_mi_tree(404, MI_SSTR("URI is NULL")); - if (urip->len > MAX_URI_SIZE) - return init_mi_tree(404, MI_SSTR("URI is too long")); - memcpy(uri, urip->s, urip->len); - uri[urip->len] = 0; - - /* look for contact */ - contactp = &node->next->next->value; - if (contactp == NULL) - return init_mi_tree(404, MI_SSTR("Contact is NULL")); - if (contactp->len > MAX_URI_SIZE) - return init_mi_tree(404, MI_SSTR("Contact is too long")); - memcpy(contact, contactp->s, contactp->len); - contact[contactp->len] = 0; + if (basename_s.len + allow_suffix_len + 1 > MAX_FILE_LEN) + return init_mi_error(404, MI_SSTR("Basename is too long")); + memcpy(basename, basename_s.s, basename_s.len); + memcpy(basename + basename_s.len, allow_suffix, allow_suffix_len); + basename[basename_s.len + allow_suffix_len] = 0; + + if (get_mi_string_param(params, "uri", + &uri_s.s, &uri_s.len) < 0) + return init_mi_param_error(); + if (uri_s.s == NULL || uri_s.len == 0) + return init_mi_error(404, MI_SSTR("Basename is empty")); + + if (uri_s.len > MAX_URI_SIZE) + return init_mi_error(404, MI_SSTR("URI is too long")); + memcpy(uri, uri_s.s, uri_s.len); + uri[uri_s.len] = 0; + + if (get_mi_string_param(params, "contact", + &contact_s.s, &contact_s.len) < 0) + return init_mi_param_error(); + if (contact_s.s == NULL || contact_s.len == 0) + return init_mi_error(404, MI_SSTR("Basename is empty")); + + if (contact_s.len > MAX_URI_SIZE) + return init_mi_error(404, MI_SSTR("Contact is too long")); + memcpy(contact, contact_s.s, contact_s.len); + contact[contact_s.len] = 0; if (allow_test(basename, uri, contact) == 1) { - return init_mi_tree(200, MI_SSTR(MI_OK)); + return init_mi_result_ok(); } else { - return init_mi_tree(403, MI_SSTR("Forbidden")); + return init_mi_error(403, MI_SSTR("Forbidden")); } } /* * MI function to print subnets from current subnet table */ -struct mi_root* mi_subnet_dump(struct mi_root *cmd_tree, void *param) +mi_response_t *mi_subnet_dump(const mi_params_t *params, + struct mi_handler *async_hdl) { - struct mi_root* rpl_tree; - struct mi_node *node = NULL, *part_node; - struct pm_part_struct *it, *ps; - - if (cmd_tree) - node = cmd_tree->node.kids; - - rpl_tree = init_mi_tree( 200, MI_SSTR(MI_OK)); - if (rpl_tree == NULL) - return NULL; - rpl_tree->node.flags |= MI_IS_ARRAY; - - if (node == NULL) { - /* dump all subnets */ - for (it=get_part_structs(); it; it = it->next) { - if (it->subnet_table == NULL) - continue; - - part_node = add_mi_node_child(&rpl_tree->node, MI_IS_ARRAY, "part", 4, - it->name.s, it->name.len); - if (part_node == NULL) { - LM_ERR("failed to add MI node for part %.*s\n", - it->name.len, it->name.s); - return NULL; - } - - if (subnet_table_mi_print(*it->subnet_table, part_node, it) < 0) { - LM_ERR("failed to add a node\n"); - free_mi_tree(rpl_tree); - return 0; - } - } - } else { - ps = get_part_struct(&node->value); - if (ps == NULL) - return init_mi_tree(404, MI_SSTR("No such partition")); - if (ps->subnet_table == NULL) - return init_mi_tree( 200, MI_SSTR(MI_OK)); - - part_node = add_mi_node_child(&rpl_tree->node, MI_IS_ARRAY, "part", 4, - ps->name.s, ps->name.len); - if (part_node == NULL) { - LM_ERR("failed to add MI node for part %.*s\n", - ps->name.len, ps->name.s); - return NULL; - } - - if (subnet_table_mi_print(*ps->subnet_table, part_node, ps) < 0) { - LM_ERR("failed to add a node\n"); - free_mi_tree(rpl_tree); - return 0; - } - - /* dump requested subnet*/ - if (subnet_table_mi_print(*ps->subnet_table, part_node, ps) < 0) { - LM_ERR("failed to add a node\n"); - free_mi_tree(rpl_tree); - return 0; - } + struct pm_part_struct *it; + mi_response_t *resp; + mi_item_t *resp_obj; + mi_item_t *parts_arr, *part_item; + + resp = init_mi_result_object(&resp_obj); + if (!resp) + return 0; + + parts_arr = add_mi_array(resp_obj, MI_SSTR("Partitions")); + if (parts_arr) + goto error; + + for (it=get_part_structs(); it; it = it->next) { + if (it->subnet_table == NULL) + continue; + + part_item = add_mi_object(parts_arr, NULL, 0); + if (!part_item) + goto error; + + if (add_mi_string(part_item, MI_SSTR("name"), + it->name.s, it->name.len) < 0) + goto error; + + if (subnet_table_mi_print(*it->subnet_table, part_item, it) < 0) + goto error; } - return rpl_tree; + return resp; + +error: + free_mi_response(resp); + return 0; +} + +mi_response_t *mi_subnet_dump_1(const mi_params_t *params, + struct mi_handler *async_hdl) +{ + str partn; + mi_response_t *resp; + mi_item_t *resp_obj; + struct pm_part_struct *ps; + + if (get_mi_string_param(params, "partition", &partn.s, &partn.len) < 0) + return init_mi_param_error(); + + ps = get_part_struct(&partn); + if (ps == NULL) + return init_mi_error(404, MI_SSTR("No such partition")); + + if (ps->subnet_table == NULL) + return init_mi_result_ok(); + + resp = init_mi_result_object(&resp_obj); + if (!resp) + return 0; + + if (add_mi_string(resp_obj, MI_SSTR("part"),ps->name.s, ps->name.len) < 0) + goto error; + + if (subnet_table_mi_print(*ps->subnet_table, resp_obj, ps) < 0) + goto error; + + return resp; + +error: + free_mi_response(resp); + return 0; } diff --git a/modules/permissions/mi.h b/modules/permissions/mi.h index 36567364aea..b63916191fa 100644 --- a/modules/permissions/mi.h +++ b/modules/permissions/mi.h @@ -35,16 +35,22 @@ #define MI_ALLOW_URI "allow_uri" -struct mi_root* mi_address_reload(struct mi_root *cmd, void *param); - -struct mi_root* mi_address_dump(struct mi_root *cmd, void *param); - -//struct mi_root* mi_address_reload(struct mi_root *cmd, void *param); - -//struct mi_root* mi_address_dump(struct mi_root *cmd, void *param); - -struct mi_root* mi_subnet_dump(struct mi_root *cmd_tree, void *param); - -struct mi_root* mi_allow_uri(struct mi_root *cmd, void *param); +mi_response_t *mi_address_reload(const mi_params_t *params, + struct mi_handler *async_hdl); +mi_response_t *mi_address_reload_1(const mi_params_t *params, + struct mi_handler *async_hdl); + +mi_response_t *mi_address_dump(const mi_params_t *params, + struct mi_handler *async_hdl); +mi_response_t *mi_address_dump_1(const mi_params_t *params, + struct mi_handler *async_hdl); + +mi_response_t *mi_subnet_dump(const mi_params_t *params, + struct mi_handler *async_hdl); +mi_response_t *mi_subnet_dump_1(const mi_params_t *params, + struct mi_handler *async_hdl); + +mi_response_t *mi_allow_uri(const mi_params_t *params, + struct mi_handler *async_hdl); #endif diff --git a/modules/permissions/permissions.c b/modules/permissions/permissions.c index c15d609f56a..86215d98b8f 100644 --- a/modules/permissions/permissions.c +++ b/modules/permissions/permissions.c @@ -182,11 +182,26 @@ static param_export_t params[] = { * Exported MI functions */ static mi_export_t mi_cmds[] = { - { MI_ADDRESS_RELOAD, 0, mi_address_reload, 0, 0, mi_address_child_init }, - { MI_ADDRESS_DUMP, 0, mi_address_dump, 0, 0, 0 }, - { MI_SUBNET_DUMP, 0, mi_subnet_dump, 0, 0, 0 }, - { MI_ALLOW_URI, 0, mi_allow_uri, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0} + { MI_ADDRESS_RELOAD, 0, 0, mi_address_child_init, { + {mi_address_reload, {0}}, + {mi_address_reload_1, {"partition", 0}}, + {EMPTY_MI_RECIPE}} + }, + { MI_ADDRESS_DUMP, 0, 0, 0, { + {mi_address_dump, {0}}, + {mi_address_dump_1, {"partition", 0}}, + {EMPTY_MI_RECIPE}} + }, + { MI_SUBNET_DUMP, 0, 0, 0, { + {mi_subnet_dump, {0}}, + {mi_subnet_dump_1, {"partition", 0}}, + {EMPTY_MI_RECIPE}} + }, + { MI_ALLOW_URI, 0, 0, 0, { + {mi_allow_uri, {"basename", "uri", "contact", 0}}, + {EMPTY_MI_RECIPE}} + }, + {EMPTY_MI_EXPORT} }; /* Module interface */