|
MCM_DTYPE_LIST_TD call_from |
表示是誰呼叫內部模組 [詳細] |
| 對應型態 | printf 格式 |
| MCM_DTYPE_DS_TD | MCM_DTYPE_DS_PF |
|
MCM_DATA_STATUS_CHANGE_FLAG (mint_cm/mcm_lib/mcm_lheader/mcm_control.h) |
|
| MCM_DSCHANGE_NONE | 資料無修改 |
| MCM_DSCHANGE_SET | 資料被設定 |
| MCM_DSCHANGE_ADD | 資料被增加 |
| MCM_DSCHANGE_DEL | 資料被刪除 |
|
MCM_DSCHANGE_SET
作用的範圍 : 被設定的 entry 和被設定的 member. 對 child-entry 的影響 : 無. 範例 :
設定 device.system.date
設定 device.system.ip_addr 設定 device.vap.@1.channel
device.system
被設定, 有狀態 (entry) device.system.date 被設定, 有狀態 (member) device.system.ip_addr 被設定, 有狀態 (member) device.system.uptime 沒設定, 沒狀態 (member) device.system.loading 沒設定, 沒狀態 (member) device.vap.@1 被設定, 有狀態 (entry) device.vap.@1.ssid 沒設定, 沒狀態 (member) device.vap.@1.channel 被設定, 有狀態 (member) device.vap.@1.extra parent-entry 被設定, 但是不會影響 child-entry, 所以沒狀態 |
|
MCM_DSCHANGE_ADD
作用的範圍 : 被增加的 entry 和所有的 member. 對 child-entry 的影響 : 如果 parent-group 是 gd 類型而 child-entry 是 gs 類型, 當 parent-group 增加 entry 時, 也會一併被增加, 這時候也會被貼上狀態. 範例 :
增加 device.vap.#45
device.vap.#45
device.vap.#45.ssid device.vap.#45.channel 被增加, 有狀態 device.vap.#45.extra device.vap.#45.extra.hidden device.vap.#45.extra.tx_power parent-entry 被增加, 也會跟著被增加, 有狀態 |
|
MCM_DSCHANGE_DEL
作用的範圍 : 被刪除的 entry 和所有的 member. 對 child-entry 的影響 : 所有的 child-entry 都會被刪除, 都會貼上狀態. 範例 :
刪除 device.vap.#15
device.vap.#15
device.vap.#15.ssid device.vap.#15.channel 被刪除, 有狀態 device.vap.#15.extra device.vap.#15.extra.hidden device.vap.#15.extra.tx_power parent-entry 被刪除, 也會跟著被刪除, 有狀態 device.vap.#15.station.#30 device.vap.#15.station.#30.mac_addr device.vap.#15.station.#30.rule parent-entry 被刪除, 也會跟著被刪除, 有狀態 device.vap.#15.station.#33 device.vap.#15.station.#33.mac_addr device.vap.#15.station.#33.rule parent-entry 被刪除, 也會跟著被刪除, 有狀態 |
|
mcm_config_get_alone_status_by_path 讀出 member 的狀態.
範例 :
外部程式部分
#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;
MCM_DTYPE_ISLL_TD uptime;
struct mcm_dv_device_vap_t vap_v;
self_lulib.socket_path = "@mintcm";
self_lulib.call_from = MCM_CFROM_USER;
self_lulib.session_permission = MCM_SPERMISSION_RW;
self_lulib.session_stack_size = 0;
if(mcm_lulib_init(&self_lulib) < MCM_RCODE_PASS)
{
DMSG("call mcm_lulib_init() fail");
goto FREE_01;
}
// 範例-01 : 設定 device.system.uptime
path1 = "device.system.uptime";
uptime = 123456;
DMSG("[set] %s", path1);
if(mcm_lulib_set_alone(&self_lulib, path1, &uptime, sizeof(uptime)) < MCM_RCODE_PASS)
{
DMSG("call mcm_lulib_set_alone(%s) fail", path1);
goto FREE_02;
}
// 範例-02a : 設定 device.vap.@2
path1 = "device.vap.@2";
memset(&vap_v, 0, sizeof(struct mcm_dv_device_vap_t));
snprintf(vap_v.ssid, sizeof(vap_v.ssid), "ap-1234");
vap_v.channel = 14;
DMSG("[set] %s", path1);
if(mcm_lulib_set_entry(&self_lulib, path1, &vap_v, sizeof(vap_v)) < MCM_RCODE_PASS)
{
DMSG("call mcm_lulib_set_entry(%s) fail", path1);
goto FREE_02;
}
// 範例 02b : 增加 device.vap.#51
path1 = "device.vap.#51";
DMSG("[add] %s", path1);
if(mcm_lulib_add_entry(&self_lulib, path1, NULL, NULL, 0) < MCM_RCODE_PASS)
{
DMSG("call mcm_lulib_add_entry(%s) fail", path1);
goto FREE_02;
}
// 範例 02c : 刪除 device.vap.#8
path1 = "device.vap.#8";
DMSG("[del] %s", path1);
if(mcm_lulib_del_entry(&self_lulib, path1) < MCM_RCODE_PASS)
{
DMSG("call mcm_lulib_del_entry(%s) fail", path1);
goto FREE_02;
}
// 呼叫內部模組處理.
path1 = "mcm_module_status_test_get_alone";
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 <stdio.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)
void show_status(
char *case_name,
char *path_name,
char *post_name,
MCM_DTYPE_DS_TD status_code)
{
char *status_type = NULL;
switch(status_code)
{
case MCM_DSCHANGE_NONE:
status_type = "non";
break;
case MCM_DSCHANGE_SET:
status_type = "set";
break;
case MCM_DSCHANGE_ADD:
status_type = "add";
break;
case MCM_DSCHANGE_DEL:
status_type = "del";
break;
}
DMSG("[%s] %s %s%s", case_name, status_type, path_name, post_name);
}
int mcm_module_status_test_get_alone(
struct mcm_service_session_t *this_session)
{
int fret = MCM_RCODE_MODULE_INTERNAL_ERROR;
char *path1;
MCM_DTYPE_DS_TD tmp_status;
// 範例 : 取得 device 的狀態.
// 沒有修改 device, 會是 MCM_DSCHANGE_NONE.
path1 = "device.ekey";
if(mcm_config_get_alone_status_by_path(this_session, path1, &tmp_status) < MCM_RCODE_PASS)
{
DMSG("call mcm_config_get_alone_status_by_path(%s) fail", path1);
goto FREE_01;
}
tmp_status &= MCM_DSCHANGE_MASK;
show_status("alone", path1, "", tmp_status);
// 範例-01 : 取得 device.system 的狀態.
// 設定 device.system.uptime, 會是 MCM_DSCHANGE_SET.
path1 = "device.system.ekey";
if(mcm_config_get_alone_status_by_path(this_session, path1, &tmp_status) < MCM_RCODE_PASS)
{
DMSG("call mcm_config_get_alone_status_by_path(%s) fail", path1);
goto FREE_01;
}
tmp_status &= MCM_DSCHANGE_MASK;
show_status("alone", path1, "", tmp_status);
// 範例-01-01 : 取得 device.system.uptime 的狀態.
// 設定 device.system.uptime, 會是 MCM_DSCHANGE_SET.
path1 = "device.system.uptime";
if(mcm_config_get_alone_status_by_path(this_session, path1, &tmp_status) < MCM_RCODE_PASS)
{
DMSG("call mcm_config_get_alone_status_by_path(%s) fail", path1);
goto FREE_01;
}
tmp_status &= MCM_DSCHANGE_MASK;
show_status("alone", path1, "", tmp_status);
// 範例-01-02 : 取得 device.system.loading 的狀態.
// 沒修改 device.system.loading, 會是 MCM_DSCHANGE_NONE.
path1 = "device.system.loading";
if(mcm_config_get_alone_status_by_path(this_session, path1, &tmp_status) < MCM_RCODE_PASS)
{
DMSG("call mcm_config_get_alone_status_by_path(%s) fail", path1);
goto FREE_01;
}
tmp_status &= MCM_DSCHANGE_MASK;
show_status("alone", path1, "", tmp_status);
// 範例-02a : 取得 device.vap.@2 的狀態.
// 設定 device.vap.@2, 會是 MCM_DSCHANGE_SET.
path1 = "device.vap.@2.ekey";
if(mcm_config_get_alone_status_by_path(this_session, path1, &tmp_status) < MCM_RCODE_PASS)
{
DMSG("call mcm_config_get_alone_status_by_path(%s) fail", path1);
goto FREE_01;
}
tmp_status &= MCM_DSCHANGE_MASK;
show_status("alone", path1, "", tmp_status);
// 範例-02a-01 : 取得 device.vap.@2.extra 的狀態.
// 設定不會影響到 child-group, 所以會是 MCM_DSCHANGE_NONE.
path1 = "device.vap.@2.extra.ekey";
if(mcm_config_get_alone_status_by_path(this_session, path1, &tmp_status) < MCM_RCODE_PASS)
{
DMSG("call mcm_config_get_alone_status_by_path(%s) fail", path1);
goto FREE_01;
}
tmp_status &= MCM_DSCHANGE_MASK;
show_status("alone", path1, "", tmp_status);
// 範例-02b : 取得 device.vap.#51 的狀態.
// 增加 device.vap.#51, 會是 MCM_DSCHANGE_ADD.
path1 = "device.vap.#51.ekey";
if(mcm_config_get_alone_status_by_path(this_session, path1, &tmp_status) < MCM_RCODE_PASS)
{
DMSG("call mcm_config_get_alone_status_by_path(%s) fail", path1);
goto FREE_01;
}
tmp_status &= MCM_DSCHANGE_MASK;
show_status("alone", path1, "", tmp_status);
// 範例-02b-01 : 取得 device.vap.#51.extra 的狀態.
// 增加會一起增加 gs 類型的 child-group, 所以會是 MCM_DSCHANGE_ADD.
path1 = "device.vap.#51.extra.ekey";
if(mcm_config_get_alone_status_by_path(this_session, path1, &tmp_status) < MCM_RCODE_PASS)
{
DMSG("call mcm_config_get_alone_status_by_path(%s) fail", path1);
goto FREE_01;
}
tmp_status &= MCM_DSCHANGE_MASK;
show_status("alone", path1, "", tmp_status);
// 範例-02c : 取得 device.vap.#8 的狀態.
// 刪除 device.vap.#8, 會是 MCM_DSCHANGE_DEL.
path1 = "device.vap.#8.ekey";
if(mcm_config_get_alone_status_by_path(this_session, path1, &tmp_status) < MCM_RCODE_PASS)
{
DMSG("call mcm_config_get_alone_status_by_path(%s) fail", path1);
goto FREE_01;
}
tmp_status &= MCM_DSCHANGE_MASK;
show_status("alone", path1, "", tmp_status);
// 範例-02c-01 : 取得 device.vap.#8.extra 的狀態.
// 刪除會一起刪除 child-group, 所以會是 MCM_DSCHANGE_DEL.
path1 = "device.vap.#8.extra.ekey";
if(mcm_config_get_alone_status_by_path(this_session, path1, &tmp_status) < MCM_RCODE_PASS)
{
DMSG("call mcm_config_get_alone_status_by_path(%s) fail", path1);
goto FREE_01;
}
tmp_status &= MCM_DSCHANGE_MASK;
show_status("alone", path1, "", tmp_status);
// 範例-02c-02 : 取得 device.vap.#8.station.@1 的狀態.
// 刪除會一起刪除 child-group, 所以會是 MCM_DSCHANGE_DEL.
path1 = "device.vap.#8.station.@1.ekey";
if(mcm_config_get_alone_status_by_path(this_session, path1, &tmp_status) < MCM_RCODE_PASS)
{
DMSG("call mcm_config_get_alone_status_by_path(%s) fail", path1);
goto FREE_01;
}
tmp_status &= MCM_DSCHANGE_MASK;
show_status("alone", path1, "", tmp_status);
// 範例-02d : 取得 device.vap.#23 的狀態.
// 沒有修改 device.vap.#23, 會是 MCM_DSCHANGE_NONE.
path1 = "device.vap.#23.ekey";
if(mcm_config_get_alone_status_by_path(this_session, path1, &tmp_status) < MCM_RCODE_PASS)
{
DMSG("call mcm_config_get_alone_status_by_path(%s) fail", path1);
goto FREE_01;
}
tmp_status &= MCM_DSCHANGE_MASK;
show_status("alone", path1, "", tmp_status);
fret = MCM_RCODE_PASS;
FREE_01:
return fret;
}
|
|
mcm_config_get_entry_self_status_by_path 讀出 entry 的狀態. 等同使用 mcm_config_get_alone_status_by_path() 取得資料模型中 $(type) 為 ek 類型的 member, 如果只是要取得 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;
MCM_DTYPE_ISLL_TD uptime;
struct mcm_dv_device_vap_t vap_v;
self_lulib.socket_path = "@mintcm";
self_lulib.call_from = MCM_CFROM_USER;
self_lulib.session_permission = MCM_SPERMISSION_RW;
self_lulib.session_stack_size = 0;
if(mcm_lulib_init(&self_lulib) < MCM_RCODE_PASS)
{
DMSG("call mcm_lulib_init() fail");
goto FREE_01;
}
// 範例-01 : 設定 device.system.uptime
path1 = "device.system.uptime";
uptime = 123456;
DMSG("[set] %s", path1);
if(mcm_lulib_set_alone(&self_lulib, path1, &uptime, sizeof(uptime)) < MCM_RCODE_PASS)
{
DMSG("call mcm_lulib_set_alone(%s) fail", path1);
goto FREE_02;
}
// 範例-02a : 設定 device.vap.@2
path1 = "device.vap.@2";
memset(&vap_v, 0, sizeof(vap_v));
snprintf(vap_v.ssid, sizeof(vap_v.ssid), "ap-1234");
vap_v.channel = 14;
DMSG("[set] %s", path1);
if(mcm_lulib_set_entry(&self_lulib, path1, &vap_v, sizeof(vap_v)) < MCM_RCODE_PASS)
{
DMSG("call mcm_lulib_set_entry(%s) fail", path1);
goto FREE_02;
}
// 範例 02b : 增加 device.vap.#51
path1 = "device.vap.#51";
DMSG("[add] %s", path1);
if(mcm_lulib_add_entry(&self_lulib, path1, NULL, NULL, 0) < MCM_RCODE_PASS)
{
DMSG("call mcm_lulib_add_entry(%s) fail", path1);
goto FREE_02;
}
// 範例 02c : 刪除 device.vap.#8
path1 = "device.vap.#8";
DMSG("[del] %s", path1);
if(mcm_lulib_del_entry(&self_lulib, path1) < MCM_RCODE_PASS)
{
DMSG("call mcm_lulib_del_entry(%s) fail", path1);
goto FREE_02;
}
// 呼叫內部模組處理.
path1 = "mcm_module_status_test_get_entry_self";
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 <stdio.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)
void show_status(
char *case_name,
char *path_name,
char *post_name,
MCM_DTYPE_DS_TD status_code)
{
char *status_type = NULL;
switch(status_code)
{
case MCM_DSCHANGE_NONE:
status_type = "non";
break;
case MCM_DSCHANGE_SET:
status_type = "set";
break;
case MCM_DSCHANGE_ADD:
status_type = "add";
break;
case MCM_DSCHANGE_DEL:
status_type = "del";
break;
}
DMSG("[%s] %s %s%s", case_name, status_type, path_name, post_name);
}
int mcm_module_status_test_get_entry_self(
struct mcm_service_session_t *this_session)
{
int fret = MCM_RCODE_MODULE_INTERNAL_ERROR;
char *path1;
MCM_DTYPE_DS_TD tmp_status;
// 範例 : 取得 device 的狀態.
// 沒有修改 device, 會是 MCM_DSCHANGE_NONE.
path1 = "device";
if(mcm_config_get_entry_self_status_by_path(this_session, path1, &tmp_status)
< MCM_RCODE_PASS)
{
DMSG("call mcm_config_get_entry_self_status_by_path(%s) fail", path1);
goto FREE_01;
}
tmp_status &= MCM_DSCHANGE_MASK;
show_status("entry-self", path1, "", tmp_status);
// 範例-01 : 取得 device.system 的狀態.
// 設定 device.system.uptime, 會是 MCM_DSCHANGE_SET.
path1 = "device.system";
if(mcm_config_get_entry_self_status_by_path(this_session, path1, &tmp_status)
< MCM_RCODE_PASS)
{
DMSG("call mcm_config_get_entry_self_status_by_path(%s) fail", path1);
goto FREE_01;
}
tmp_status &= MCM_DSCHANGE_MASK;
show_status("entry-self", path1, "", tmp_status);
// 範例-02a : 取得 device.vap.@2 的狀態.
// 設定 device.vap.@2, 會是 MCM_DSCHANGE_SET.
path1 = "device.vap.@2";
if(mcm_config_get_entry_self_status_by_path(this_session, path1, &tmp_status)
< MCM_RCODE_PASS)
{
DMSG("call mcm_config_get_entry_self_status_by_path(%s) fail", path1);
goto FREE_01;
}
tmp_status &= MCM_DSCHANGE_MASK;
show_status("entry-self", path1, "", tmp_status);
// 範例-02a-01 : 取得 device.vap.@2.extra 的狀態.
// 設定不會影響到 child-group, 所以會是 MCM_DSCHANGE_NONE.
path1 = "device.vap.@2.extra";
if(mcm_config_get_entry_self_status_by_path(this_session, path1, &tmp_status)
< MCM_RCODE_PASS)
{
DMSG("call mcm_config_get_entry_self_status_by_path(%s) fail", path1);
goto FREE_01;
}
tmp_status &= MCM_DSCHANGE_MASK;
show_status("entry-self", path1, "", tmp_status);
// 範例-02b : 取得 device.vap.#51 的狀態.
// 增加 device.vap.#51, 會是 MCM_DSCHANGE_ADD.
path1 = "device.vap.#51";
if(mcm_config_get_entry_self_status_by_path(this_session, path1, &tmp_status)
< MCM_RCODE_PASS)
{
DMSG("call mcm_config_get_entry_self_status_by_path(%s) fail", path1);
goto FREE_01;
}
tmp_status &= MCM_DSCHANGE_MASK;
show_status("entry-self", path1, "", tmp_status);
// 範例-02b-01 : 取得 device.vap.#51.extra 的狀態.
// 增加會一起增加 gs 類型的 child-group, 所以會是 MCM_DSCHANGE_ADD.
path1 = "device.vap.#51.extra";
if(mcm_config_get_entry_self_status_by_path(this_session, path1, &tmp_status)
< MCM_RCODE_PASS)
{
DMSG("call mcm_config_get_entry_self_status_by_path(%s) fail", path1);
goto FREE_01;
}
tmp_status &= MCM_DSCHANGE_MASK;
show_status("entry-self", path1, "", tmp_status);
// 範例-02c : 取得 device.vap.#8 的狀態.
// 刪除 device.vap.#8, 會是 MCM_DSCHANGE_DEL.
path1 = "device.vap.#8";
if(mcm_config_get_entry_self_status_by_path(this_session, path1, &tmp_status)
< MCM_RCODE_PASS)
{
DMSG("call mcm_config_get_entry_self_status_by_path(%s) fail", path1);
goto FREE_01;
}
tmp_status &= MCM_DSCHANGE_MASK;
show_status("entry-self", path1, "", tmp_status);
// 範例-02c-01 : 取得 device.vap.#8.extra 的狀態.
// 刪除會一起刪除 child-group, 所以會是 MCM_DSCHANGE_DEL.
path1 = "device.vap.#8.extra";
if(mcm_config_get_entry_self_status_by_path(this_session, path1, &tmp_status)
< MCM_RCODE_PASS)
{
DMSG("call mcm_config_get_entry_self_status_by_path(%s) fail", path1);
goto FREE_01;
}
tmp_status &= MCM_DSCHANGE_MASK;
show_status("entry-self", path1, "", tmp_status);
// 範例-02c-02 : 取得 device.vap.#8.station.@1 的狀態.
// 刪除會一起刪除 child-group, 所以會是 MCM_DSCHANGE_DEL.
path1 = "device.vap.#8.station.@1";
if(mcm_config_get_entry_self_status_by_path(this_session, path1, &tmp_status)
< MCM_RCODE_PASS)
{
DMSG("call mcm_config_get_entry_self_status_by_path(%s) fail", path1);
goto FREE_01;
}
tmp_status &= MCM_DSCHANGE_MASK;
show_status("entry-self", path1, "", tmp_status);
// 範例-02d : 取得 device.vap.#23 的狀態.
// 沒有修改 device.vap.#23, 會是 MCM_DSCHANGE_NONE.
path1 = "device.vap.#23";
if(mcm_config_get_entry_self_status_by_path(this_session, path1, &tmp_status)
< MCM_RCODE_PASS)
{
DMSG("call mcm_config_get_entry_self_status_by_path(%s) fail", path1);
goto FREE_01;
}
tmp_status &= MCM_DSCHANGE_MASK;
show_status("entry-self", path1, "", tmp_status);
fret = MCM_RCODE_PASS;
FREE_01:
return fret;
}
|
|
mcm_config_get_entry_all_status_by_path 讀出 entry 中所有 member 的狀態.
範例 :
外部程式部分
#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;
MCM_DTYPE_ISLL_TD uptime;
struct mcm_dv_device_vap_t vap_v;
self_lulib.socket_path = "@mintcm";
self_lulib.call_from = MCM_CFROM_USER;
self_lulib.session_permission = MCM_SPERMISSION_RW;
self_lulib.session_stack_size = 0;
if(mcm_lulib_init(&self_lulib) < MCM_RCODE_PASS)
{
DMSG("call mcm_lulib_init() fail");
goto FREE_01;
}
// 範例-01 : 設定 device.system.uptime
path1 = "device.system.uptime";
uptime = 123456;
DMSG("[set] %s", path1);
if(mcm_lulib_set_alone(&self_lulib, path1, &uptime, sizeof(uptime)) < MCM_RCODE_PASS)
{
DMSG("call mcm_lulib_set_alone(%s) fail", path1);
goto FREE_02;
}
// 範例-02a : 設定 device.vap.@2
path1 = "device.vap.@2";
memset(&vap_v, 0, sizeof(struct mcm_dv_device_vap_t));
snprintf(vap_v.ssid, sizeof(vap_v.ssid), "ap-1234");
vap_v.channel = 14;
DMSG("[set] %s", path1);
if(mcm_lulib_set_entry(&self_lulib, path1, &vap_v, sizeof(vap_v)) < MCM_RCODE_PASS)
{
DMSG("call mcm_lulib_set_entry(%s) fail", path1);
goto FREE_02;
}
// 範例 02b : 增加 device.vap.#51
path1 = "device.vap.#51";
DMSG("[add] %s", path1);
if(mcm_lulib_add_entry(&self_lulib, path1, NULL, NULL, 0) < MCM_RCODE_PASS)
{
DMSG("call mcm_lulib_add_entry(%s) fail", path1);
goto FREE_02;
}
// 範例 02c : 刪除 device.vap.#8
path1 = "device.vap.#8";
DMSG("[del] %s", path1);
if(mcm_lulib_del_entry(&self_lulib, path1) < MCM_RCODE_PASS)
{
DMSG("call mcm_lulib_del_entry(%s) fail", path1);
goto FREE_02;
}
// 呼叫內部模組處理.
path1 = "mcm_module_status_test_get_entry_all";
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 <stdio.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)
void show_status(
char *case_name,
char *path_name,
char *post_name,
MCM_DTYPE_DS_TD status_code)
{
char *status_type = NULL;
switch(status_code)
{
case MCM_DSCHANGE_NONE:
status_type = "non";
break;
case MCM_DSCHANGE_SET:
status_type = "set";
break;
case MCM_DSCHANGE_ADD:
status_type = "add";
break;
case MCM_DSCHANGE_DEL:
status_type = "del";
break;
}
DMSG("[%s] %s %s%s", case_name, status_type, path_name, post_name);
}
int mcm_module_status_test_get_entry_all(
struct mcm_service_session_t *this_session)
{
int fret = MCM_RCODE_MODULE_INTERNAL_ERROR;
char *path1;
struct mcm_ds_device_t device_s;
struct mcm_ds_device_system_t system_s;
struct mcm_ds_device_vap_t vap_s;
struct mcm_ds_device_vap_extra_t extra_s;
struct mcm_ds_device_vap_station_t station_s;
// 範例 : 取得 device 的狀態.
// 沒有修改 device, 會是 MCM_DSCHANGE_NONE.
path1 = "device";
if(mcm_config_get_entry_all_status_by_path(this_session, path1, &device_s) < MCM_RCODE_PASS)
{
DMSG("call mcm_config_get_entry_all_status_by_path(%s) fail", path1);
goto FREE_01;
}
device_s.ekey &= MCM_DSCHANGE_MASK;
device_s.descript &= MCM_DSCHANGE_MASK;
device_s.serial_number &= MCM_DSCHANGE_MASK;
show_status("entry-all", path1, "", device_s.ekey);
show_status("entry-all", path1, ".descript", device_s.descript);
show_status("entry-all", path1, ".serial_number", device_s.serial_number);
// 範例-01 : 取得 device.system 的狀態.
// 設定 device.system.uptime, 會是 MCM_DSCHANGE_SET.
path1 = "device.system";
if(mcm_config_get_entry_all_status_by_path(this_session, path1, &system_s) < MCM_RCODE_PASS)
{
DMSG("call mcm_config_get_entry_all_status_by_path(%s) fail", path1);
goto FREE_01;
}
system_s.ekey &= MCM_DSCHANGE_MASK;
system_s.date &= MCM_DSCHANGE_MASK;
system_s.ip_addr &= MCM_DSCHANGE_MASK;
system_s.uptime &= MCM_DSCHANGE_MASK;
system_s.loading &= MCM_DSCHANGE_MASK;
show_status("entry-all", path1, "", system_s.ekey);
show_status("entry-all", path1, ".date", system_s.date);
show_status("entry-all", path1, ".ip_addr", system_s.ip_addr);
show_status("entry-all", path1, ".uptime", system_s.uptime);
show_status("entry-all", path1, ".loading", system_s.loading);
// 範例-02a : 取得 device.vap.@2 的狀態.
// 設定 device.vap.@2, 會是 MCM_DSCHANGE_SET.
path1 = "device.vap.@2";
if(mcm_config_get_entry_all_status_by_path(this_session, path1, &vap_s) < MCM_RCODE_PASS)
{
DMSG("call mcm_config_get_entry_all_status_by_path(%s) fail", path1);
goto FREE_01;
}
vap_s.ekey &= MCM_DSCHANGE_MASK;
vap_s.ssid &= MCM_DSCHANGE_MASK;
vap_s.channel &= MCM_DSCHANGE_MASK;
show_status("entry-all", path1, "", vap_s.ekey);
show_status("entry-all", path1, ".ssid", vap_s.ssid);
show_status("entry-all", path1, ".channel", vap_s.channel);
// 範例-02a-01 : 取得 device.vap.@2.extra 的狀態.
// 設定不會影響到 child-group, 所以會是 MCM_DSCHANGE_NONE.
path1 = "device.vap.@2.extra";
if(mcm_config_get_entry_all_status_by_path(this_session, path1, &extra_s) < MCM_RCODE_PASS)
{
DMSG("call mcm_config_get_entry_all_status_by_path(%s) fail", path1);
goto FREE_01;
}
extra_s.ekey &= MCM_DSCHANGE_MASK;
extra_s.hidden &= MCM_DSCHANGE_MASK;
extra_s.tx_power &= MCM_DSCHANGE_MASK;
show_status("entry-all", path1, "", extra_s.ekey);
show_status("entry-all", path1, ".hidden", extra_s.hidden);
show_status("entry-all", path1, ".tx_power", extra_s.tx_power);
// 範例-02b : 取得 device.vap.#51 的狀態.
// 增加 device.vap.#51, 會是 MCM_DSCHANGE_ADD.
path1 = "device.vap.#51";
if(mcm_config_get_entry_all_status_by_path(this_session, path1, &vap_s) < MCM_RCODE_PASS)
{
DMSG("call mcm_config_get_entry_all_status_by_path(%s) fail", path1);
goto FREE_01;
}
vap_s.ekey &= MCM_DSCHANGE_MASK;
vap_s.ssid &= MCM_DSCHANGE_MASK;
vap_s.channel &= MCM_DSCHANGE_MASK;
show_status("entry-all", path1, "", vap_s.ekey);
show_status("entry-all", path1, ".ssid", vap_s.ssid);
show_status("entry-all", path1, ".channel", vap_s.channel);
// 範例-02b-01 : 取得 device.vap.#51.extra 的狀態.
// 增加會一起增加 gs 類型的 child-group, 所以會是 MCM_DSCHANGE_ADD.
path1 = "device.vap.#51.extra";
if(mcm_config_get_entry_all_status_by_path(this_session, path1, &extra_s) < MCM_RCODE_PASS)
{
DMSG("call mcm_config_get_entry_all_status_by_path(%s) fail", path1);
goto FREE_01;
}
extra_s.ekey &= MCM_DSCHANGE_MASK;
extra_s.hidden &= MCM_DSCHANGE_MASK;
extra_s.tx_power &= MCM_DSCHANGE_MASK;
show_status("entry-all", path1, "", extra_s.ekey);
show_status("entry-all", path1, ".hidden", extra_s.hidden);
show_status("entry-all", path1, ".tx_power", extra_s.tx_power);
// 範例-02c : 取得 device.vap.#8 的狀態.
// 刪除 device.vap.#8, 會是 MCM_DSCHANGE_DEL.
path1 = "device.vap.#8";
if(mcm_config_get_entry_all_status_by_path(this_session, path1, &vap_s) < MCM_RCODE_PASS)
{
DMSG("call mcm_config_get_entry_all_status_by_path(%s) fail", path1);
goto FREE_01;
}
vap_s.ekey &= MCM_DSCHANGE_MASK;
vap_s.ssid &= MCM_DSCHANGE_MASK;
vap_s.channel &= MCM_DSCHANGE_MASK;
show_status("entry-all", path1, "", vap_s.ekey);
show_status("entry-all", path1, ".ssid", vap_s.ssid);
show_status("entry-all", path1, ".channel", vap_s.channel);
// 範例-02c-01 : 取得 device.vap.#8.extra 的狀態.
// 刪除會一起刪除 child-group, 所以會是 MCM_DSCHANGE_DEL.
path1 = "device.vap.#8.extra";
if(mcm_config_get_entry_all_status_by_path(this_session, path1, &extra_s) < MCM_RCODE_PASS)
{
DMSG("call mcm_config_get_entry_all_status_by_path(%s) fail", path1);
goto FREE_01;
}
extra_s.ekey &= MCM_DSCHANGE_MASK;
extra_s.hidden &= MCM_DSCHANGE_MASK;
extra_s.tx_power &= MCM_DSCHANGE_MASK;
show_status("entry-all", path1, "", extra_s.ekey);
show_status("entry-all", path1, ".hidden", extra_s.hidden);
show_status("entry-all", path1, ".tx_power", extra_s.tx_power);
// 範例-02c-02 : 取得 device.vap.#8.station.@1 的狀態.
// 刪除會一起刪除 child-group, 所以會是 MCM_DSCHANGE_DEL.
path1 = "device.vap.#8.station.@1";
if(mcm_config_get_entry_all_status_by_path(this_session, path1, &station_s) < MCM_RCODE_PASS)
{
DMSG("call mcm_config_get_entry_all_status_by_path(%s) fail", path1);
goto FREE_01;
}
station_s.ekey &= MCM_DSCHANGE_MASK;
station_s.mac_addr &= MCM_DSCHANGE_MASK;
station_s.rule &= MCM_DSCHANGE_MASK;
show_status("entry-all", path1, "", station_s.ekey);
show_status("entry-all", path1, ".mac_addr", station_s.mac_addr);
show_status("entry-all", path1, ".rule", station_s.rule);
// 範例-02d : 取得 device.vap.#23 的狀態.
// 沒有修改 device.vap.#23, 會是 MCM_DSCHANGE_NONE.
path1 = "device.vap.#23";
if(mcm_config_get_entry_all_status_by_path(this_session, path1, &vap_s) < MCM_RCODE_PASS)
{
DMSG("call mcm_config_get_entry_all_status_by_path(%s) fail", path1);
goto FREE_01;
}
vap_s.ekey &= MCM_DSCHANGE_MASK;
vap_s.ssid &= MCM_DSCHANGE_MASK;
vap_s.channel &= MCM_DSCHANGE_MASK;
show_status("entry-all", path1, "", vap_s.ekey);
show_status("entry-all", path1, ".ssid", vap_s.ssid);
show_status("entry-all", path1, ".channel", vap_s.channel);
fret = MCM_RCODE_PASS;
FREE_01:
return fret;
}
|
| 01. | 範例程式目錄在 mint_cm/usage/example/0402. |
| 02. | 下面關於 make 的操作沒有特別註明的話都是在 mint_cm 目錄. |
| 03. | 第一次使用, 使用 make example_add KEY=0402 載入範例並編譯. |
| 04. |
web_app 是範例程式. 範例項目 :
|
| 05. | 先執行 mcm_daemon 和 mini_httpd 才可測試. |
| 06. | 瀏覽器連至 http://<server-address>/web_app_0402_index.html 就可以看到範例頁面. |
| 07. | 測試完畢不使用後, 使用 make example_del KEY=0402 將範例移除. |
| 08. |
範例程式目錄下的檔案在做完 make example_add
後會複製到真正使用的位置, 要修改做測試的話要改在複製後的.
|