| A01. | 根據路徑找到資料在記憶體的位置. |
| A02. | 使用進階模式函式存取記憶體內的資料. |
| 01. | 取得資料的狀態 (mcm_config_get_entry_self_status_by_path). |
| 02. | 取得資料的數值 (mcm_config_get_entry_by_path). |
| 01. | 根據路徑找到資料在記憶體的位置. |
| 02. | 取得資料狀態 (進階模式). |
| 03. | 取得資料數值 (進階模式). |
| 01. | 迴圈處理 (每次增加資料的 index). |
| 02. | 使用 index 組合路徑. |
| 03. | 取得資料的狀態 (mcm_config_get_entry_self_status_by_path). |
| 04. | 取得資料的數值 (mcm_config_get_entry_by_path). |
| 05. | 迴圈處理 (結尾). |
| 01. | 根據路徑找到第一筆資料在記憶體的位置. |
| 02. | 迴圈處理 (每次將資料指標往下一筆資料移動). |
| 03. | 取得資料狀態 (進階模式). |
| 04. | 取得資料數值 (進階模式). |
| 05. | 迴圈處理 (結尾). |
|
struct mcm_config_model_group_t * parent_model_group |
指向 parent |
|
struct mcm_config_model_group_t * next_model_group |
指向下一個 |
|
struct mcm_config_model_member_t * next_model_member |
指向下一個 |
|
struct mcm_config_store_t * parent_store |
指向 parent |
|
struct mcm_config_store_t * prev_store |
指向上一筆 |
|
struct mcm_config_store_t * next_store |
指向下一筆 |
|
mcm_config_find_group_by_mask 處理 mask_path 類型的路徑, 找到目標的 group_info.
範例 :
外部程式部分
#include <errno.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "mcm_lib/mcm_lheader/mcm_type.h"
#include "mcm_lib/mcm_lheader/mcm_size.h"
#include "mcm_lib/mcm_lheader/mcm_connect.h"
#include "mcm_lib/mcm_lheader/mcm_return.h"
#include "mcm_lib/mcm_lheader/mcm_data_exinfo_auto.h"
#include "mcm_lib/mcm_lulib/mcm_lulib_api.h"
#define DMSG(msg_fmt, msgs...) printf("%s(%04u): " msg_fmt "\n", __FILE__, __LINE__, ##msgs)
int main(
int argc,
char **argv)
{
char *path1;
struct mcm_lulib_lib_t self_lulib;
self_lulib.socket_path = "@mintcm";
self_lulib.call_from = MCM_CFROM_USER;
self_lulib.session_permission = MCM_SPERMISSION_RO;
self_lulib.session_stack_size = 0;
if(mcm_lulib_init(&self_lulib) < MCM_RCODE_PASS)
{
DMSG("call mcm_lulib_init() fail");
goto FREE_01;
}
// 呼叫內部模組.
path1 = "mcm_module_mask_path_test";
DMSG("[run] %s", path1);
if(mcm_lulib_run(&self_lulib, path1, NULL, 0, NULL, NULL) < MCM_RCODE_PASS)
{
DMSG("call mcm_lulib_run(%s) fail", path1);
goto FREE_02;
}
FREE_02:
mcm_lulib_exit(&self_lulib);
FREE_01:
return 0;
}
內部模組部分
#include <errno.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "mcm_lib/mcm_lheader/mcm_type.h"
#include "mcm_lib/mcm_lheader/mcm_size.h"
#include "mcm_lib/mcm_lheader/mcm_control.h"
#include "mcm_lib/mcm_lheader/mcm_connect.h"
#include "mcm_lib/mcm_lheader/mcm_return.h"
#include "mcm_lib/mcm_lheader/mcm_debug.h"
#include "mcm_lib/mcm_lheader/mcm_data_exinfo_auto.h"
#include "../mcm_service_handle_define.h"
#include "../mcm_config_handle_extern.h"
#define DMSG(msg_fmt, msgs...) printf("%s(%04u): " msg_fmt "\n", __FILE__, __LINE__, ##msgs)
int mcm_module_mask_path_test(
struct mcm_service_session_t *this_session)
{
int fret = MCM_RCODE_MODULE_INTERNAL_ERROR;
char *path1;
struct mcm_config_model_group_t *tmp_group;
// 範例 : 尋找 device.system
path1 = "device.system";
DMSG("[mask_path] %s", path1);
if(mcm_config_find_group_by_mask(this_session, path1, &tmp_group) < MCM_RCODE_PASS)
{
DMSG("call mcm_config_find_group_by_mask(%s) fail", path1);
goto FREE_01;
}
// 範例 : 尋找 device.vap.*
path1 = "device.vap.*";
DMSG("[mask_path] %s", path1);
if(mcm_config_find_group_by_mask(this_session, path1, &tmp_group) < MCM_RCODE_PASS)
{
DMSG("call mcm_config_find_group_by_mask(%s) fail", path1);
goto FREE_01;
}
// 範例 : 尋找 device.vap.*.station.*
path1 = "device.vap.*.station.*";
DMSG("[mask_path] %s", path1);
if(mcm_config_find_group_by_mask(this_session, path1, &tmp_group) < MCM_RCODE_PASS)
{
DMSG("call mcm_config_find_group_by_mask(%s) fail", path1);
goto FREE_01;
}
fret = MCM_RCODE_PASS;
FREE_01:
return fret;
}
|
|
mcm_config_find_entry_by_mix 處理 mix_path 類型的路徑, 找到目標的 group_info, store_info.
範例 :
外部程式部分
#include <errno.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "mcm_lib/mcm_lheader/mcm_type.h"
#include "mcm_lib/mcm_lheader/mcm_size.h"
#include "mcm_lib/mcm_lheader/mcm_connect.h"
#include "mcm_lib/mcm_lheader/mcm_return.h"
#include "mcm_lib/mcm_lheader/mcm_data_exinfo_auto.h"
#include "mcm_lib/mcm_lulib/mcm_lulib_api.h"
#define DMSG(msg_fmt, msgs...) printf("%s(%04u): " msg_fmt "\n", __FILE__, __LINE__, ##msgs)
int main(
int argc,
char **argv)
{
char *path1;
struct mcm_lulib_lib_t self_lulib;
self_lulib.socket_path = "@mintcm";
self_lulib.call_from = MCM_CFROM_USER;
self_lulib.session_permission = MCM_SPERMISSION_RO;
self_lulib.session_stack_size = 0;
if(mcm_lulib_init(&self_lulib) < MCM_RCODE_PASS)
{
DMSG("call mcm_lulib_init() fail");
goto FREE_01;
}
// 呼叫內部模組.
path1 = "mcm_module_mix_path_test";
DMSG("[run] %s", path1);
if(mcm_lulib_run(&self_lulib, path1, NULL, 0, NULL, NULL) < MCM_RCODE_PASS)
{
DMSG("call mcm_lulib_run(%s) fail", path1);
goto FREE_02;
}
FREE_02:
mcm_lulib_exit(&self_lulib);
FREE_01:
return 0;
}
內部模組部分
#include <errno.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "mcm_lib/mcm_lheader/mcm_type.h"
#include "mcm_lib/mcm_lheader/mcm_size.h"
#include "mcm_lib/mcm_lheader/mcm_control.h"
#include "mcm_lib/mcm_lheader/mcm_connect.h"
#include "mcm_lib/mcm_lheader/mcm_return.h"
#include "mcm_lib/mcm_lheader/mcm_debug.h"
#include "mcm_lib/mcm_lheader/mcm_data_exinfo_auto.h"
#include "../mcm_service_handle_define.h"
#include "../mcm_config_handle_extern.h"
#define DMSG(msg_fmt, msgs...) printf("%s(%04u): " msg_fmt "\n", __FILE__, __LINE__, ##msgs)
int mcm_module_mix_path_test(
struct mcm_service_session_t *this_session)
{
int fret = MCM_RCODE_MODULE_INTERNAL_ERROR;
char *path1;
struct mcm_config_model_group_t *tmp_group;
struct mcm_config_store_t *tmp_store_list_head, *tmp_store_list_tail, *tmp_store_tree,
*parent_store;
MCM_DTYPE_EK_TD tmp_store_count;
// 範例 : 尋找 device
path1 = "device";
DMSG("[mix_path] %s", path1);
if(mcm_config_find_entry_by_mix(this_session, path1, &tmp_group, &tmp_store_list_head,
&tmp_store_list_tail, &tmp_store_count, &tmp_store_tree,
NULL) < MCM_RCODE_PASS)
{
DMSG("call mcm_config_find_entry_by_mix(%s) fail", path1);
goto FREE_01;
}
// 範例 : 尋找 device.vap.*
path1 = "device.vap.*";
DMSG("[mix_path] %s", path1);
if(mcm_config_find_entry_by_mix(this_session, path1, &tmp_group, &tmp_store_list_head,
&tmp_store_list_tail, &tmp_store_count, &tmp_store_tree,
&parent_store) < MCM_RCODE_PASS)
{
DMSG("call mcm_config_find_entry_by_mix(%s) fail", path1);
goto FREE_01;
}
// 範例 : 尋找 device.vap.@1.station.*
path1 = "device.vap.@1.station.*";
DMSG("[mix_path] %s", path1);
if(mcm_config_find_entry_by_mix(this_session, path1, &tmp_group, &tmp_store_list_head,
&tmp_store_list_tail, &tmp_store_count, &tmp_store_tree,
&parent_store) < MCM_RCODE_PASS)
{
DMSG("call mcm_config_find_entry_by_mix(%s) fail", path1);
goto FREE_01;
}
fret = MCM_RCODE_PASS;
FREE_01:
return fret;
}
|
|
mcm_config_find_alone_by_full 處理 full_path (member) 類型的路徑, 找到目標的 group_info, member_info, store_info.
範例 :
外部程式部分
#include <errno.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "mcm_lib/mcm_lheader/mcm_type.h"
#include "mcm_lib/mcm_lheader/mcm_size.h"
#include "mcm_lib/mcm_lheader/mcm_connect.h"
#include "mcm_lib/mcm_lheader/mcm_return.h"
#include "mcm_lib/mcm_lheader/mcm_data_exinfo_auto.h"
#include "mcm_lib/mcm_lulib/mcm_lulib_api.h"
#define DMSG(msg_fmt, msgs...) printf("%s(%04u): " msg_fmt "\n", __FILE__, __LINE__, ##msgs)
int main(
int argc,
char **argv)
{
char *path1;
struct mcm_lulib_lib_t self_lulib;
self_lulib.socket_path = "@mintcm";
self_lulib.call_from = MCM_CFROM_USER;
self_lulib.session_permission = MCM_SPERMISSION_RO;
self_lulib.session_stack_size = 0;
if(mcm_lulib_init(&self_lulib) < MCM_RCODE_PASS)
{
DMSG("call mcm_lulib_init() fail");
goto FREE_01;
}
// 呼叫內部模組.
path1 = "mcm_module_alone_full_path";
DMSG("[run] %s", path1);
if(mcm_lulib_run(&self_lulib, path1, NULL, 0, NULL, NULL) < MCM_RCODE_PASS)
{
DMSG("call mcm_lulib_run(%s) fail", path1);
goto FREE_02;
}
FREE_02:
mcm_lulib_exit(&self_lulib);
FREE_01:
return 0;
}
內部模組部分
#include <errno.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "mcm_lib/mcm_lheader/mcm_type.h"
#include "mcm_lib/mcm_lheader/mcm_size.h"
#include "mcm_lib/mcm_lheader/mcm_control.h"
#include "mcm_lib/mcm_lheader/mcm_connect.h"
#include "mcm_lib/mcm_lheader/mcm_return.h"
#include "mcm_lib/mcm_lheader/mcm_debug.h"
#include "mcm_lib/mcm_lheader/mcm_data_exinfo_auto.h"
#include "../mcm_service_handle_define.h"
#include "../mcm_config_handle_extern.h"
#define DMSG(msg_fmt, msgs...) printf("%s(%04u): " msg_fmt "\n", __FILE__, __LINE__, ##msgs)
int mcm_module_alone_full_path(
struct mcm_service_session_t *this_session)
{
int fret = MCM_RCODE_MODULE_INTERNAL_ERROR;
char *path1;
struct mcm_config_model_group_t *tmp_group;
struct mcm_config_model_member_t *tmp_member;
struct mcm_config_store_t *tmp_store;
// 範例 : 尋找 device.descript
path1 = "device.descript";
DMSG("[alone_full_path] %s", path1);
if(mcm_config_find_alone_by_full(this_session, path1, &tmp_group, &tmp_member, &tmp_store)
< MCM_RCODE_PASS)
{
DMSG("call mcm_config_find_alone_by_full(%s) fail", path1);
goto FREE_01;
}
// 範例 : 尋找 device.vap.@1.channel
path1 = "device.vap.@1.channel";
DMSG("[alone_full_path] %s", path1);
if(mcm_config_find_alone_by_full(this_session, path1, &tmp_group, &tmp_member, &tmp_store)
< MCM_RCODE_PASS)
{
DMSG("call mcm_config_find_alone_by_full(%s) fail", path1);
goto FREE_01;
}
// 範例 : 尋找 device.vap.#15.station.@1.rule
path1 = "device.vap.#15.station.@1.rule";
DMSG("[alone_full_path] %s", path1);
if(mcm_config_find_alone_by_full(this_session, path1, &tmp_group, &tmp_member, &tmp_store)
< MCM_RCODE_PASS)
{
DMSG("call mcm_config_find_alone_by_full(%s) fail", path1);
goto FREE_01;
}
fret = MCM_RCODE_PASS;
FREE_01:
return fret;
}
|
|
mcm_config_find_entry_by_full 處理 full_path (entry) 類型的路徑, 找到目標的 group_info, store_info.
範例 :
外部程式部分
#include <errno.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "mcm_lib/mcm_lheader/mcm_type.h"
#include "mcm_lib/mcm_lheader/mcm_size.h"
#include "mcm_lib/mcm_lheader/mcm_connect.h"
#include "mcm_lib/mcm_lheader/mcm_return.h"
#include "mcm_lib/mcm_lheader/mcm_data_exinfo_auto.h"
#include "mcm_lib/mcm_lulib/mcm_lulib_api.h"
#define DMSG(msg_fmt, msgs...) printf("%s(%04u): " msg_fmt "\n", __FILE__, __LINE__, ##msgs)
int main(
int argc,
char **argv)
{
char *path1;
struct mcm_lulib_lib_t self_lulib;
self_lulib.socket_path = "@mintcm";
self_lulib.call_from = MCM_CFROM_USER;
self_lulib.session_permission = MCM_SPERMISSION_RO;
self_lulib.session_stack_size = 0;
if(mcm_lulib_init(&self_lulib) < MCM_RCODE_PASS)
{
DMSG("call mcm_lulib_init() fail");
goto FREE_01;
}
// 呼叫內部模組.
path1 = "mcm_module_entry_full_path";
DMSG("[run] %s", path1);
if(mcm_lulib_run(&self_lulib, path1, NULL, 0, NULL, NULL) < MCM_RCODE_PASS)
{
DMSG("call mcm_lulib_run(%s) fail", path1);
goto FREE_02;
}
FREE_02:
mcm_lulib_exit(&self_lulib);
FREE_01:
return 0;
}
內部模組部分
#include <errno.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "mcm_lib/mcm_lheader/mcm_type.h"
#include "mcm_lib/mcm_lheader/mcm_size.h"
#include "mcm_lib/mcm_lheader/mcm_control.h"
#include "mcm_lib/mcm_lheader/mcm_connect.h"
#include "mcm_lib/mcm_lheader/mcm_return.h"
#include "mcm_lib/mcm_lheader/mcm_debug.h"
#include "mcm_lib/mcm_lheader/mcm_data_exinfo_auto.h"
#include "../mcm_service_handle_define.h"
#include "../mcm_config_handle_extern.h"
#define DMSG(msg_fmt, msgs...) printf("%s(%04u): " msg_fmt "\n", __FILE__, __LINE__, ##msgs)
int mcm_module_entry_full_path(
struct mcm_service_session_t *this_session)
{
int fret = MCM_RCODE_MODULE_INTERNAL_ERROR;
char *path1;
struct mcm_config_model_group_t *tmp_group;
struct mcm_config_store_t *tmp_store;
// 範例 : 尋找 device
path1 = "device";
DMSG("[entry_full_path] %s", path1);
if(mcm_config_find_entry_by_full(this_session, path1, &tmp_group, &tmp_store)
< MCM_RCODE_PASS)
{
DMSG("call mcm_config_find_entry_by_full(%s) fail", path1);
goto FREE_01;
}
// 範例 : 尋找 device.vap.#23
path1 = "device.vap.#23";
DMSG("[entry_full_path] %s", path1);
if(mcm_config_find_entry_by_full(this_session, path1, &tmp_group, &tmp_store)
< MCM_RCODE_PASS)
{
DMSG("call mcm_config_find_entry_by_full(%s) fail", path1);
goto FREE_01;
}
// 範例 : 尋找 device.vap.@2.station.#30
path1 = "device.vap.@2.station.#30";
DMSG("[entry_full_path] %s", path1);
if(mcm_config_find_entry_by_full(this_session, path1, &tmp_group, &tmp_store)
< MCM_RCODE_PASS)
{
DMSG("call mcm_config_find_entry_by_full(%s) fail", path1);
goto FREE_01;
}
fret = MCM_RCODE_PASS;
FREE_01:
return fret;
}
|
|
mcm_config_find_entry_by_ik 使用目標的 group_info 和 parent_store, 找到目標的 store_info. 在增加 entry 時如果要指定插入到目標 entry 之前, 可以使用此函式找到目標 entry.
注意事項 :
範例 :
外部程式部分
#include <errno.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "mcm_lib/mcm_lheader/mcm_type.h"
#include "mcm_lib/mcm_lheader/mcm_size.h"
#include "mcm_lib/mcm_lheader/mcm_connect.h"
#include "mcm_lib/mcm_lheader/mcm_return.h"
#include "mcm_lib/mcm_lheader/mcm_data_exinfo_auto.h"
#include "mcm_lib/mcm_lulib/mcm_lulib_api.h"
#define DMSG(msg_fmt, msgs...) printf("%s(%04u): " msg_fmt "\n", __FILE__, __LINE__, ##msgs)
int main(
int argc,
char **argv)
{
char *path1;
struct mcm_lulib_lib_t self_lulib;
self_lulib.socket_path = "@mintcm";
self_lulib.call_from = MCM_CFROM_USER;
self_lulib.session_permission = MCM_SPERMISSION_RO;
self_lulib.session_stack_size = 0;
if(mcm_lulib_init(&self_lulib) < MCM_RCODE_PASS)
{
DMSG("call mcm_lulib_init() fail");
goto FREE_01;
}
// 呼叫內部模組.
path1 = "mcm_module_entry_ik_path";
DMSG("[run] %s", path1);
if(mcm_lulib_run(&self_lulib, path1, NULL, 0, NULL, NULL) < MCM_RCODE_PASS)
{
DMSG("call mcm_lulib_run(%s) fail", path1);
goto FREE_02;
}
FREE_02:
mcm_lulib_exit(&self_lulib);
FREE_01:
return 0;
}
內部模組部分
#include <errno.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "mcm_lib/mcm_lheader/mcm_type.h"
#include "mcm_lib/mcm_lheader/mcm_size.h"
#include "mcm_lib/mcm_lheader/mcm_control.h"
#include "mcm_lib/mcm_lheader/mcm_connect.h"
#include "mcm_lib/mcm_lheader/mcm_return.h"
#include "mcm_lib/mcm_lheader/mcm_debug.h"
#include "mcm_lib/mcm_lheader/mcm_data_exinfo_auto.h"
#include "../mcm_service_handle_define.h"
#include "../mcm_config_handle_extern.h"
#define DMSG(msg_fmt, msgs...) printf("%s(%04u): " msg_fmt "\n", __FILE__, __LINE__, ##msgs)
int mcm_module_entry_ik_path(
struct mcm_service_session_t *this_session)
{
int fret = MCM_RCODE_MODULE_INTERNAL_ERROR;
char *path1;
struct mcm_config_model_group_t *tmp_group;
struct mcm_config_store_t *parent_store, *tmp_store;
// 01. 範例 : 尋找 device.vap.#23
// 01a. 先尋找 device.vap.*
path1 = "device.vap.*";
DMSG("[mix_path] %s", path1);
if(mcm_config_find_entry_by_mix(this_session, path1, &tmp_group, NULL, NULL, NULL, NULL,
&parent_store) < MCM_RCODE_PASS)
{
DMSG("call mcm_config_find_entry_by_mix(%s) fail", path1);
goto FREE_01;
}
// 01b. 找到 "#23".
path1 = "#23";
DMSG("[ik_path] %s", path1);
if(mcm_config_find_entry_by_ik(this_session, tmp_group, parent_store, path1, &tmp_store)
< MCM_RCODE_PASS)
{
DMSG("call mcm_config_find_entry_by_ik(%s) fail", path1);
goto FREE_01;
}
// 02. 範例 : 尋找 device.vap.@2.station.#33, 接著尋找 station.#30
// 02a. 先尋找 device.vap.@2.station.#30
path1 = "device.vap.@2.station.#30";
DMSG("[entry_full_path] %s", path1);
if(mcm_config_find_entry_by_full(this_session, path1, &tmp_group, &tmp_store)
< MCM_RCODE_PASS)
{
DMSG("call mcm_config_find_entry_by_full(%s) fail", path1);
goto FREE_01;
}
// 02b. 指向 device.vap.@2
parent_store = tmp_store->parent_store;
// 02c. 找到 station.#30
path1 = "#30";
DMSG("[ik_path] %s", path1);
if(mcm_config_find_entry_by_ik(this_session, tmp_group, parent_store, path1, &tmp_store)
< MCM_RCODE_PASS)
{
DMSG("call mcm_config_find_entry_by_ik(%s) fail", path1);
goto FREE_01;
}
fret = MCM_RCODE_PASS;
FREE_01:
return fret;
}
|