From f5696b556e0f8fc89628e5ef280961d384555716 Mon Sep 17 00:00:00 2001 From: zhanglianghy Date: Tue, 18 Jun 2019 15:54:42 +0800 Subject: [PATCH] =?UTF-8?q?MOD=20aaa-12=20=E5=A2=9E=E5=8A=A0=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E7=AE=A1=E7=90=86=E6=9C=8D=E5=8A=A1=E7=AB=AF=E5=92=8C?= =?UTF-8?q?api=20SOL=E5=A2=9E=E5=8A=A0=E9=85=8D=E7=BD=AE=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E6=9C=8D=E5=8A=A1=E7=AB=AF=E5=92=8Capi=20=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E4=BA=BA=EF=BC=9Azhangliang=20=E6=A3=80=E8=A7=86=E4=BA=BA?= =?UTF-8?q?=EF=BC=9Azhangliang?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Makefile | 18 +- Platform/build/user.configm.Makefile | 20 +- Platform/build/user.configmapi.Makefile | 77 ++ Platform/build/user.configmtest.Makefile | 77 ++ Platform/build/user.openrpc.Makefile | 8 +- Platform/common/configm/configm.h | 30 +- Platform/common/configm/configmapi.h | 32 + Platform/thirdparty/arm64/libev.so | Bin 0 -> 70608 bytes .../user/configm/config-api/configclient.c | 117 +++ .../{ => config-server}/configserver.c | 748 +++++++-------- .../{ => config-server}/include/ipconfig.h | 186 ++-- .../{ => config-server}/include/parsefile.h | 20 +- .../{ => config-server}/ipconfig/ipconfig.c | 778 +++++++-------- .../{ => config-server}/ipconfig/parsefile.c | 904 +++++++++--------- .../comfigtest.c} | 403 +++----- 15 files changed, 1800 insertions(+), 1618 deletions(-) create mode 100644 Platform/build/user.configmapi.Makefile create mode 100644 Platform/build/user.configmtest.Makefile create mode 100644 Platform/common/configm/configmapi.h create mode 100644 Platform/thirdparty/arm64/libev.so create mode 100644 Platform/user/configm/config-api/configclient.c rename Platform/user/configm/{ => config-server}/configserver.c (95%) mode change 100755 => 100644 rename Platform/user/configm/{ => config-server}/include/ipconfig.h (96%) mode change 100755 => 100644 rename Platform/user/configm/{ => config-server}/include/parsefile.h (96%) mode change 100755 => 100644 rename Platform/user/configm/{ => config-server}/ipconfig/ipconfig.c (95%) mode change 100755 => 100644 rename Platform/user/configm/{ => config-server}/ipconfig/parsefile.c (96%) mode change 100755 => 100644 rename Platform/user/configm/{configclient.c => config-test/comfigtest.c} (76%) mode change 100755 => 100644 diff --git a/Makefile b/Makefile index 78ca69a59..9374f0554 100755 --- a/Makefile +++ b/Makefile @@ -28,9 +28,9 @@ MAKE_FLAGS += -j$(shell cat /proc/cpuinfo | grep processor | wc -l) endif endif -.PHONY : demo conntrack netlink trace openrpc +.PHONY : demo conntrack netlink trace openrpc configm -all: demo conntrack netlink trace openrpc +all: demo conntrack netlink trace openrpc configm ifeq ($(OPT), install) #$(shell `find ../release -name "*.zip" -delete`) @@ -120,3 +120,17 @@ else $(MLOG)make all $(MAKE_FLAGS) -C Platform/build -f user.openrpc.Makefile MLOG=$(MLOG) DISABLE_WARRING=$(DIS_BUILD_WARRING) MAKE_TARGET=openrpc endif +configm: +ifeq ($(OPT), clean) + $(MLOG)make $(MAKE_FLAGS) -C Platform/build -f user.configm.Makefile cleanall MLOG=$(MLOG) MAKE_TARGET=configm + $(MLOG)make $(MAKE_FLAGS) -C Platform/build -f user.configmapi.Makefile cleanall MLOG=$(MLOG) MAKE_TARGET=configm-api + $(MLOG)make $(MAKE_FLAGS) -C Platform/build -f user.configmtest.Makefile cleanall MLOG=$(MLOG) MAKE_TARGET=configmtest +else ifeq ($(OPT), install) + $(MLOG)make $(MAKE_FLAGS) -C Platform/build -f user.configm.Makefile install DIR=$(DIR) MLOG=$(MLOG) MAKE_TARGET=configm + $(MLOG)make $(MAKE_FLAGS) -C Platform/build -f user.configmapi.Makefile install DIR=$(DIR) MLOG=$(MLOG) MAKE_TARGET=configm-api + $(MLOG)make $(MAKE_FLAGS) -C Platform/build -f user.configmtest.Makefile install DIR=$(DIR) MLOG=$(MLOG) MAKE_TARGET=configmtest +else + $(MLOG)make all $(MAKE_FLAGS) -C Platform/build -f user.configm.Makefile MLOG=$(MLOG) DISABLE_WARRING=$(DIS_BUILD_WARRING) MAKE_TARGET=configm + $(MLOG)make all $(MAKE_FLAGS) -C Platform/build -f user.configmapi.Makefile MLOG=$(MLOG) DISABLE_WARRING=$(DIS_BUILD_WARRING) MAKE_TARGET=configm-api + $(MLOG)make all $(MAKE_FLAGS) -C Platform/build -f user.configmtest.Makefile MLOG=$(MLOG) DISABLE_WARRING=$(DIS_BUILD_WARRING) MAKE_TARGET=configmtest +endif diff --git a/Platform/build/user.configm.Makefile b/Platform/build/user.configm.Makefile index e04abb356..e235e544c 100755 --- a/Platform/build/user.configm.Makefile +++ b/Platform/build/user.configm.Makefile @@ -1,5 +1,5 @@ # target name, the target name must have the same name of c source file -TARGET_NAME=test-trace +TARGET_NAME=configm # target # for linux module driver: KO @@ -21,7 +21,7 @@ DEBUG = TRUE PLAT_LINUX ?= TRUE PLAT_ARM64 ?= TRUE -VPATH = ../user/configm +VPATH = ../user/configm/config-server # source code @@ -34,28 +34,28 @@ PLAT_LINUX_SRCS = $(COMMON_SRCS) PLAT_ARM64_SRCS = $(COMMON_SRCS) # gcc CFLAGS -PLAT_ARM64_CFLAGS := -I../user/configm/include -I../../Common -I../common/configm -I../common/rpc -I../common/rpc/hashtable +PLAT_ARM64_CFLAGS := -I../user/configm/config-server/include -I../../Common -I../common/configm -I../common/rpc -I../common/rpc/hashtable PLAT_LINUX_CFLAGS := $(PLAT_ARM64_CFLAGS) PLAT_ARM64_LDFLAGS := PLAT_LINUX_LDFLAGS := - #gcc libs -ARM64_LIBS := -lpthread -lpthread -lev -lm -LINUX_LIBS := -lpthread -lpthread -lev -lm +ARM64_LIBS := ../thirdparty/arm64/libev.so ./libopenrpc-arm64.so -lpthread -lm +LINUX_LIBS := ../thirdparty/x86_64/libev.so ./libopenrpc-linux.so -lpthread -lm ifeq ($(PLAT_ARM64), TRUE) -DEPEND_LIB += ./debug/libopenrpc.so -USER_CLEAN_ITEMS += ./libopenrpc.so +DEPEND_LIB += ../thirdparty/arm64/libev.so ./debug/libopenrpc-arm64.so +USER_CLEAN_ITEMS += ./libopenrpc-arm64.so endif ifeq ($(PLAT_LINUX), TRUE) -DEPEND_LIB += ./debug/libopenrpc.so -USER_CLEAN_ITEMS += ./debug/libopenrpc.soo +DEPEND_LIB += ../thirdparty/x86_64/libev.so ./debug/libopenrpc-linux.so +USER_CLEAN_ITEMS += ./libopenrpc-linux.so endif + # this line must be at below of thus, because of... include ../../Common/common.Makefile diff --git a/Platform/build/user.configmapi.Makefile b/Platform/build/user.configmapi.Makefile new file mode 100644 index 000000000..0a4b1a9dd --- /dev/null +++ b/Platform/build/user.configmapi.Makefile @@ -0,0 +1,77 @@ +# target name, the target name must have the same name of c source file +TARGET_NAME=libconfigmapi + +# target +# for linux module driver: KO +# for application: EXE +# for dynamic library: DLL +TARGET_TYPE = DLL + +# target object +# for application: APP +# for device driver: DRV +TARGET_OBJ = APP + +# custom install dir +TARGET_BOX = + +#debug mode or release mode +DEBUG = TRUE + +PLAT_LINUX ?= TRUE +PLAT_ARM64 ?= TRUE + +VPATH = ../user/configm/config-api + +# source code + +# set the source file, don't used .o because of ... + +COMMON_SRCS = configclient.c + +# MRS Board Source Files +PLAT_LINUX_SRCS = $(COMMON_SRCS) +PLAT_ARM64_SRCS = $(COMMON_SRCS) + +# gcc CFLAGS +PLAT_ARM64_CFLAGS := -fPIC -I../../Common -I../common/configm -I../common/rpc -I../common/rpc/hashtable +PLAT_LINUX_CFLAGS := $(PLAT_ARM64_CFLAGS) + + +PLAT_ARM64_LDFLAGS := -fPIC -shared +PLAT_LINUX_LDFLAGS := $(PLAT_ARM64_LDFLAGS) + + +#gcc libs +ARM64_LIBS := ../thirdparty/arm64/libev.so ./libopenrpc-arm64.so -lpthread -lm +LINUX_LIBS := ../thirdparty/x86_64/libev.so ./libopenrpc-linux.so -lpthread -lm + +ifeq ($(PLAT_ARM64), TRUE) +DEPEND_LIB += ../thirdparty/arm64/libev.so ./debug/libopenrpc-arm64.so +USER_CLEAN_ITEMS += ./libopenrpc-arm64.so +endif + +ifeq ($(PLAT_LINUX), TRUE) +DEPEND_LIB += ../thirdparty/x86_64/libev.so ./debug/libopenrpc-linux.so +USER_CLEAN_ITEMS += ./libopenrpc-linux.so +endif + +# this line must be at below of thus, because of... +include ../../Common/common.Makefile + +ifneq ($(MAKECMDGOALS), clean) +ifneq ($(MAKECMDGOALS), cleanall) +ifneq ($(notdir $(DEPEND_LIB)), $(wildcard $(DEPEND_LIB))) +$(shell $(CP) $(DEPEND_LIB) ./) +endif +endif +endif + +ifeq ($(MAKECMDGOALS), ) +$(shell find ./ -name "$(TARGET)-*.ko" -delete) +else +ifeq ($(MAKECMDGOALS), all) +$(shell find ./ -name "$(TARGET)-*.ko" -delete) +endif +endif + diff --git a/Platform/build/user.configmtest.Makefile b/Platform/build/user.configmtest.Makefile new file mode 100644 index 000000000..b43021d1f --- /dev/null +++ b/Platform/build/user.configmtest.Makefile @@ -0,0 +1,77 @@ +# target name, the target name must have the same name of c source file +TARGET_NAME=configmtest + +# target +# for linux module driver: KO +# for application: EXE +# for dynamic library: DLL +TARGET_TYPE = EXE + +# target object +# for application: APP +# for device driver: DRV +TARGET_OBJ = APP + +# custom install dir +TARGET_BOX = + +#debug mode or release mode +DEBUG = TRUE + +PLAT_LINUX ?= TRUE +PLAT_ARM64 ?= TRUE + +VPATH = ../user/configm/config-test + +# source code + +# set the source file, don't used .o because of ... + +COMMON_SRCS = configtest.c + +# MRS Board Source Files +PLAT_LINUX_SRCS = $(COMMON_SRCS) +PLAT_ARM64_SRCS = $(COMMON_SRCS) + +# gcc CFLAGS +PLAT_ARM64_CFLAGS := -I../user/configm/config-server/include -I../../Common -I../common/configm -I../common/rpc -I../common/rpc/hashtable +PLAT_LINUX_CFLAGS := $(PLAT_ARM64_CFLAGS) + + +PLAT_ARM64_LDFLAGS := +PLAT_LINUX_LDFLAGS := + +#gcc libs +ARM64_LIBS := ../thirdparty/arm64/libev.so ./libopenrpc-arm64.so ./libconfigmapi-arm64.so -lpthread -lm +LINUX_LIBS := ../thirdparty/x86_64/libev.so ./libopenrpc-linux.so ./libconfigmapi-linux.so -lpthread -lm + +ifeq ($(PLAT_ARM64), TRUE) +DEPEND_LIB += ../thirdparty/arm64/libev.so ./debug/libopenrpc-arm64.so ./debug/libconfigmapi-arm64.so +USER_CLEAN_ITEMS += ./libconfigmapi-arm64.so +endif + +ifeq ($(PLAT_LINUX), TRUE) +DEPEND_LIB += ../thirdparty/x86_64/libev.so ./debug/libopenrpc-linux.so ./debug/libconfigmapi-linux.so +USER_CLEAN_ITEMS += ./libconfigmapi-linux.so +endif + + +# this line must be at below of thus, because of... +include ../../Common/common.Makefile + +ifneq ($(MAKECMDGOALS), clean) +ifneq ($(MAKECMDGOALS), cleanall) +ifneq ($(notdir $(DEPEND_LIB)), $(wildcard $(DEPEND_LIB))) +$(shell $(CP) $(DEPEND_LIB) ./) +endif +endif +endif + +ifeq ($(MAKECMDGOALS), ) +$(shell find ./ -name "$(TARGET)-*.ko" -delete) +else +ifeq ($(MAKECMDGOALS), all) +$(shell find ./ -name "$(TARGET)-*.ko" -delete) +endif +endif + diff --git a/Platform/build/user.openrpc.Makefile b/Platform/build/user.openrpc.Makefile index d263aec20..95235171c 100755 --- a/Platform/build/user.openrpc.Makefile +++ b/Platform/build/user.openrpc.Makefile @@ -1,5 +1,5 @@ # target name, the target name must have the same name of c source file -TARGET_NAME=openrpc +TARGET_NAME=libopenrpc # target # for linux module driver: KO @@ -43,11 +43,11 @@ PLAT_LINUX_LDFLAGS := $(PLAT_ARM64_LDFLAGS) #gcc libs -ARM64_LIBS := -lpthread -lm -LINUX_LIBS := -lpthread -lm +ARM64_LIBS := ../thirdparty/arm64/libev.so -lpthread -lm +LINUX_LIBS := ../thirdparty/x86_64/libev.so -lpthread -lm ifeq ($(PLAT_ARM64), TRUE) -DEPEND_LIB += +DEPEND_LIB += ../thirdparty/arm64/libev.so USER_CLEAN_ITEMS += endif diff --git a/Platform/common/configm/configm.h b/Platform/common/configm/configm.h index b43afe254..cb6bd4c24 100755 --- a/Platform/common/configm/configm.h +++ b/Platform/common/configm/configm.h @@ -3,14 +3,9 @@ #include "rpc_common.h" #include "ipconfig.h" - +#include "configmapi.h" /* 类型定义 */ -#define CONFIG_FROM_WEB 0x00000001 -#define CONFIG_FROM_NETOPEER 0x00000010 -#define CONFIG_FROM_RECOVER1 0x01000000 -#define CONFIG_FROM_RECOVER2 0x02000000 - /* IP CONFIG */ #define IPCONFIG_MODULE 0x00000001 @@ -52,10 +47,6 @@ #define CONFIG_RECOVERY_DONE "/tmp/config_recovery" -typedef struct _config_message config_msg_t; - -typedef struct _config_service config_service_t; - typedef ret_code (*cm_config_chk)(uint source, uint config_type, pointer input, int input_len, pointer output, int *output_len); @@ -72,16 +63,6 @@ typedef ret_code (*cm_config_get_all)(uint source, uint64 config_id, pointer output, short *single_len, int *output_len); -/* 结构体定义 */ - -/* 配置消息 */ -struct _config_message { - uint64 config_id; /*配置ID*/ - uint source; /*配置来源*/ - uint config_type; /*配置类型:add,del,set*/ - char config_buff[0]; /*配置数据缓存*/ -}; - /* 配置注册 */ struct _config_service { uint64 config_id; /* 配置ID,全局唯一,用于寻找对应的配置业务*/ @@ -94,15 +75,10 @@ struct _config_service { cm_config_get_all getall_callback; /* 获取所有配置接口 */ }; -/* 函数声明 */ +typedef struct _config_service config_service_t; + -ret_code web_config_exec_sync(uint config_type, uint64 config_id, - char* config_data, int config_len, - char**output, int *output_len); -ret_code web_config_exec_async(uint config_type, uint64 config_id, - char* config_data, int config_len, - rpc_callback callback, pointer data); #endif /* RPC_COMMON_H_ */ diff --git a/Platform/common/configm/configmapi.h b/Platform/common/configm/configmapi.h new file mode 100644 index 000000000..7f84090f4 --- /dev/null +++ b/Platform/common/configm/configmapi.h @@ -0,0 +1,32 @@ +#ifndef CONFIGMAPI_H_ +#define CONFIGMAPI_H_ + +#include "rpc_common.h" + +#define CONFIG_FROM_WEB 0x00000001 +#define CONFIG_FROM_NETOPEER 0x00000010 +#define CONFIG_FROM_RECOVER1 0x01000000 +#define CONFIG_FROM_RECOVER2 0x02000000 + +/* 结构体定义 */ + +/* 配置消息 */ +struct _config_message { + uint64 config_id; /*配置ID*/ + uint source; /*配置来源*/ + uint config_type; /*配置类型:add,del,set*/ + char config_buff[0]; /*配置数据缓存*/ +}; +typedef struct _config_message config_msg_t; +/* 函数声明 */ + +ret_code web_config_exec_sync(uint config_type, uint64 config_id, + char* config_data, int config_len, + char**output, int *output_len); + +ret_code web_config_exec_async(uint config_type, uint64 config_id, + char* config_data, int config_len, + rpc_callback callback, pointer data); + +#endif /* RPC_COMMON_H_ */ + diff --git a/Platform/thirdparty/arm64/libev.so b/Platform/thirdparty/arm64/libev.so new file mode 100644 index 0000000000000000000000000000000000000000..b7894409f5b02994c9ef1b671d9970f586da2023 GIT binary patch literal 70608 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 F{{Xz~RILC2 literal 0 HcmV?d00001 diff --git a/Platform/user/configm/config-api/configclient.c b/Platform/user/configm/config-api/configclient.c new file mode 100644 index 000000000..b54103ee1 --- /dev/null +++ b/Platform/user/configm/config-api/configclient.c @@ -0,0 +1,117 @@ +#include +#include +#include "rpc.h" +#include "configmapi.h" + + +rpc_client *config_client = NULL; + +rpc_client *config_client_get() +{ + if(config_client == NULL) + { + config_client = rpc_client_connect_ex("ConfigManger#0"); + if(config_client == NULL) + { + rpc_log_error("connect ConfigManger#0 error\n"); + return NULL; + } + } + + return config_client; +} + +ret_code config_construct_msg(uint config_type, uint64 config_id, + char* config_data, int config_len, + config_msg_t **config_msg, int *msg_len) +{ + config_msg_t *pconfig_msg; + + if(config_data == NULL) + { + return RET_NULLP; + } + + *msg_len = sizeof(config_msg_t) + config_len; + pconfig_msg= (config_msg_t *) malloc(*msg_len); + if(pconfig_msg == NULL) + { + return RET_NOMEM; + } + + pconfig_msg->source = CONFIG_FROM_WEB; + pconfig_msg->config_type = config_type; + pconfig_msg->config_id = config_id; + + memcpy(pconfig_msg->config_buff, config_data, config_len); + *config_msg = pconfig_msg; + + return RET_OK; +} + +ret_code config_destroy_msg(config_msg_t *config_msg, int msg_len) +{ + if(config_msg) + { + memset(config_msg, 0, msg_len); + free(config_msg); + } +} + + +ret_code web_config_exec_sync(uint config_type, uint64 config_id, + char* config_data, int config_len, + char**output, int *output_len) +{ + rpc_client * client = config_client_get(); + ret_code code = RET_OK ; + config_msg_t *config_msg; + int msg_len = 0; + + if(client == NULL) + { + return RET_ERR; + } + + code = config_construct_msg(config_type, config_id, config_data, + config_len, &config_msg, &msg_len); + ASSERT_RET(code); + + code = rpc_client_call(client, "ConfigManger#0", "cm_config_process", + config_msg, msg_len, (pointer)output, output_len); + ASSERT_RET_NO(code); + + config_destroy_msg(config_msg, msg_len); + + return code; +} + +ret_code web_config_exec_async(uint config_type, uint64 config_id, + char* config_data, int config_len, + rpc_callback callback, pointer data) + { + rpc_client * client = config_client_get(); + config_msg_t *config_msg; + int msg_len = 0; + + ret_code ret = RET_OK ; + + if(client == NULL) + { + return RET_ERR; + } + + ret = config_construct_msg(config_type, config_id, config_data, + config_len, &config_msg, &msg_len); + ASSERT_RET(ret); + + ret = rpc_client_call_async(client, "ConfigManger#0", "cm_config_process", + config_msg, msg_len, callback, data); + + config_destroy_msg(config_msg, msg_len); + + return ret; + } + + + diff --git a/Platform/user/configm/configserver.c b/Platform/user/configm/config-server/configserver.c old mode 100755 new mode 100644 similarity index 95% rename from Platform/user/configm/configserver.c rename to Platform/user/configm/config-server/configserver.c index a583ecc82..822919057 --- a/Platform/user/configm/configserver.c +++ b/Platform/user/configm/config-server/configserver.c @@ -1,374 +1,374 @@ - -#include -#include -#include -#include -#include -#include - -#include "rpc.h" -#include "configm.h" - - -config_service_t g_config_service[] = CONFIG_SERVICE_ARRAY; - -void test_big_data(rpc_conn *conn, pointer input, int input_len, void* data) { - char buf[input_len]; - memcpy(buf, input, input_len); - buf[input_len] = '\0'; - printf("get data is %s\n", buf); - //sleep(15); - rpc_return_null(conn); -} - - -config_service_t *cm_config_service_get(uint64 config_id) -{ - int len = sizeof(g_config_service) / sizeof(config_service_t); - int config_idx; - - for(config_idx = 0; config_idx < len; config_idx++) - { - if(config_id == g_config_service[config_idx].config_id) - { - return &(g_config_service[config_idx]); - } - } - - return NULL; -} - -ret_code cm_config_rec_pre(char **input, short **input_len, - char **output, int *output_len) -{ - /*if((access(CONFIG_RECOVERY_DONE, F_OK))!=-1) - { - return RET_ERR; - } */ - - *input = rpc_new(char, CM_BUFF_SIZE); - *input_len = rpc_new(short, CM_BUFF_SIZE); - *output = rpc_new(char, CM_BUFF_SIZE); - *output_len = CM_BUFF_SIZE; - - if(*input == NULL - || *input_len == NULL - || *output == NULL) - { - return RET_NOMEM; - } - - memset(*input, 0, CM_BUFF_SIZE); - memset(*input_len, 0, CM_BUFF_SIZE * sizeof(short)); - memset(*output, 0, CM_BUFF_SIZE); - - rpc_log_info("==>config revocery start\n"); - - return RET_OK; -} - -ret_code cm_config_rec_done(char *input, short *input_len,char *output) -{ - int fd; - - memset(input, 0, CM_BUFF_SIZE); - memset(input_len, 0, CM_BUFF_SIZE * sizeof(short)); - memset(output, 0, CM_BUFF_SIZE); - - free(input); - free(input_len); - free(output); - - fd = open(CONFIG_RECOVERY_DONE, O_CREAT); - if(fd <= 0) - { - rpc_log_error("create recovery file error"); - } - else - { - close(fd); - } - - rpc_log_info("==>config revocery done!\n"); - - return RET_OK; -} - -ret_code cm_config_get_allconfig(uint source, - config_service_t *config_svr, - char *input_array, - short *len_array, - int *total_len) -{ - ret_code ret = RET_OK; - - memset(input_array, 0, CM_BUFF_SIZE); - memset(len_array, 0, CM_BUFF_SIZE*sizeof(short)); - *total_len = 0; - - ret = config_svr->getall_callback(source, config_svr->config_id, - input_array, len_array, total_len); - ASSERT_RET(ret); - - return ret; -} - - ret_code cm_config_config_rec(uint source, - config_service_t *config_svr, - char *input_array, short *len_array, - int total_len, char *output, int *output_len) - { - uint config_type = CM_CONFIG_SET; - ret_code ret = RET_OK; - int len_tem = 0; - int idx = 0; - - if(config_svr->multi_inst == TRUE) - { - config_type = CM_CONFIG_ADD; - } - - while(len_tem < total_len) - { - config_svr->proc_callback(source, config_type, - input_array, len_array[idx], - output, output_len); - - input_array = input_array + len_array[idx]; - len_tem = len_tem + len_array[idx]; - - idx++; - } - - return RET_OK; - } - - -/* 配置恢复 */ -void cm_config_recovery() -{ - int len = sizeof(g_config_service) / sizeof(config_service_t); - config_service_t *config_svr; - char *input_array = NULL; - short *len_array = NULL; - char *output = NULL; - int output_len; - - int total_len = 0; - ret_code ret = RET_OK; - int config_idx; - int recover_idx = 1,recover_phase; - - ret = cm_config_rec_pre(&input_array, &len_array, &output, &output_len); - ASSERT_RET_VOID(ret); - - while(recover_idx <= 2) - { - if(recover_idx == 1) - { - recover_phase = CONFIG_FROM_RECOVER1; - } - else if(recover_idx == 2) - { - recover_phase = CONFIG_FROM_RECOVER2; - } - else - { - break; - } - - for(config_idx = 0; config_idx < len; config_idx++) - { - config_svr = &(g_config_service[config_idx]); - - if(config_svr->recovery != TRUE) - { - continue; - } - - cm_config_get_allconfig(recover_phase, - config_svr, input_array, - len_array, &total_len); - - cm_config_config_rec(recover_phase, config_svr, - input_array, len_array, total_len, - output, &output_len); - } - - recover_idx++; - } - - cm_config_rec_done(input_array, len_array, output); - - return; -} - -/* 配置处理入口函数,所有的配置,均在此函数中处理 */ -void cm_config_process(rpc_conn *conn, pointer input, int input_len, void* data) -{ - config_service_t *config_svr; - config_msg_t *config_msg; - char *cm_get_buff = NULL; - ret_code ret = RET_OK; - int config_len = 0; - short* single_len = NULL; - int buff_len = CM_BUFF_SIZE; - int index = 0; - - if(conn == NULL || input == NULL) - { - rpc_return_error(conn, RET_NULLP, "NULL pointer"); - return; - } - - /*parse message*/ - if(input_len < sizeof(config_msg_t)) - { - rpc_return_error(conn, RET_NOMEM, "not enough memery"); - return; - } - - config_msg = (config_msg_t *)input; - config_len = input_len - sizeof(config_msg_t); - - rpc_log_info("recv config from %d, config type is %d config id is 0x%llx ,len is %x\r\n", - config_msg->source, config_msg->config_type, config_msg->config_id, - config_len); - - config_svr = cm_config_service_get(config_msg->config_id); - if(config_svr == NULL) - { - rpc_return_error(conn, RET_NULLP, "NULL pointer"); - return; - } - - /*source check*/ - if(!(config_svr->config_id & config_msg->config_id)) - { - rpc_return_error(conn, RET_CHKERR, "source check error!\r\n"); - return; - - } - - cm_get_buff = rpc_new(char, buff_len); - if(cm_get_buff == NULL) - { - rpc_return_error(conn, RET_NOMEM, "not enough memery"); - return; - } - - memset(cm_get_buff, 0, buff_len); - - /*config check*/ - if(config_svr->chk_callback) - { - ret = config_svr->chk_callback(config_msg->source, - config_msg->config_type, - config_msg->config_buff, - config_len, - cm_get_buff, - &buff_len); - if(ret != RET_OK) - { - rpc_return_error(conn, ret, cm_get_buff); - goto exit; - } - } - - /*config exec*/ - switch(config_msg->config_type) - { - case CM_CONFIG_GET: - if(config_svr->get_callback) - { - ret = config_svr->get_callback(config_msg->source, - config_msg->config_buff, - config_len, - cm_get_buff, - &buff_len); - } - break; - - case CM_CONFIG_GET_ALL: - if(config_svr->getall_callback) - { - single_len = rpc_new(short, CM_BUFF_SIZE); - if(single_len == NULL) - { - rpc_return_error(conn, RET_NOMEM, "not enough memery"); - goto exit; - } - - ret = config_svr->getall_callback(config_msg->source, - config_svr->config_id, - cm_get_buff, - single_len, - &buff_len); - } - break; - - default: - if(config_svr->proc_callback) - { - ret = config_svr->proc_callback(config_msg->source, - config_msg->config_type, - config_msg->config_buff, - config_len, - cm_get_buff, - &buff_len); - } - break; - } - - if(buff_len > CM_BUFF_SIZE) - { - ret = RET_NOMEM; - } - - if(ret != RET_OK) - { - rpc_return_error(conn, ret, cm_get_buff); - goto exit; - } - - rpc_return(conn, cm_get_buff, buff_len); - - exit: - rpc_free(cm_get_buff); - - if(single_len != NULL) - { - rpc_free(single_len); - } - - return; -} - - -int main(int argc, char **argv) -{ - rpc_server *server; - - if (server= rpc_server_create_ex("ConfigManger#0")) - { - rpc_log_info("start server\n"); - } - else - { - rpc_log_error("start server error\n"); - return EXIT_FAILURE; - } - - /* 配置恢复 */ - cm_config_recovery(); - - /* 注册配置处理函数 */ - rpc_server_regservice(server, "ConfigManger#0", "cm_config_process", cm_config_process); - rpc_server_regservice(server, "ConfigManger#0", "test_big_data", test_big_data); - - for(;;) - { - rpc_sleep(1000); - } - return EXIT_SUCCESS; -} + +#include +#include +#include +#include +#include +#include + +#include "rpc.h" +#include "configm.h" + + +config_service_t g_config_service[] = CONFIG_SERVICE_ARRAY; + +void test_big_data(rpc_conn *conn, pointer input, int input_len, void* data) { + char buf[input_len]; + memcpy(buf, input, input_len); + buf[input_len] = '\0'; + printf("get data is %s\n", buf); + //sleep(15); + rpc_return_null(conn); +} + + +config_service_t *cm_config_service_get(uint64 config_id) +{ + int len = sizeof(g_config_service) / sizeof(config_service_t); + int config_idx; + + for(config_idx = 0; config_idx < len; config_idx++) + { + if(config_id == g_config_service[config_idx].config_id) + { + return &(g_config_service[config_idx]); + } + } + + return NULL; +} + +ret_code cm_config_rec_pre(char **input, short **input_len, + char **output, int *output_len) +{ + /*if((access(CONFIG_RECOVERY_DONE, F_OK))!=-1) + { + return RET_ERR; + } */ + + *input = rpc_new(char, CM_BUFF_SIZE); + *input_len = rpc_new(short, CM_BUFF_SIZE); + *output = rpc_new(char, CM_BUFF_SIZE); + *output_len = CM_BUFF_SIZE; + + if(*input == NULL + || *input_len == NULL + || *output == NULL) + { + return RET_NOMEM; + } + + memset(*input, 0, CM_BUFF_SIZE); + memset(*input_len, 0, CM_BUFF_SIZE * sizeof(short)); + memset(*output, 0, CM_BUFF_SIZE); + + rpc_log_info("==>config revocery start\n"); + + return RET_OK; +} + +ret_code cm_config_rec_done(char *input, short *input_len,char *output) +{ + int fd; + + memset(input, 0, CM_BUFF_SIZE); + memset(input_len, 0, CM_BUFF_SIZE * sizeof(short)); + memset(output, 0, CM_BUFF_SIZE); + + free(input); + free(input_len); + free(output); + + fd = open(CONFIG_RECOVERY_DONE, O_CREAT, 0777); + if(fd <= 0) + { + rpc_log_error("create recovery file error"); + } + else + { + close(fd); + } + + rpc_log_info("==>config revocery done!\n"); + + return RET_OK; +} + +ret_code cm_config_get_allconfig(uint source, + config_service_t *config_svr, + char *input_array, + short *len_array, + int *total_len) +{ + ret_code ret = RET_OK; + + memset(input_array, 0, CM_BUFF_SIZE); + memset(len_array, 0, CM_BUFF_SIZE*sizeof(short)); + *total_len = 0; + + ret = config_svr->getall_callback(source, config_svr->config_id, + input_array, len_array, total_len); + ASSERT_RET(ret); + + return ret; +} + + ret_code cm_config_config_rec(uint source, + config_service_t *config_svr, + char *input_array, short *len_array, + int total_len, char *output, int *output_len) + { + uint config_type = CM_CONFIG_SET; + ret_code ret = RET_OK; + int len_tem = 0; + int idx = 0; + + if(config_svr->multi_inst == TRUE) + { + config_type = CM_CONFIG_ADD; + } + + while(len_tem < total_len) + { + config_svr->proc_callback(source, config_type, + input_array, len_array[idx], + output, output_len); + + input_array = input_array + len_array[idx]; + len_tem = len_tem + len_array[idx]; + + idx++; + } + + return RET_OK; + } + + +/* 配置恢复 */ +void cm_config_recovery() +{ + int len = sizeof(g_config_service) / sizeof(config_service_t); + config_service_t *config_svr; + char *input_array = NULL; + short *len_array = NULL; + char *output = NULL; + int output_len; + + int total_len = 0; + ret_code ret = RET_OK; + int config_idx; + int recover_idx = 1,recover_phase; + + ret = cm_config_rec_pre(&input_array, &len_array, &output, &output_len); + ASSERT_RET_VOID(ret); + + while(recover_idx <= 2) + { + if(recover_idx == 1) + { + recover_phase = CONFIG_FROM_RECOVER1; + } + else if(recover_idx == 2) + { + recover_phase = CONFIG_FROM_RECOVER2; + } + else + { + break; + } + + for(config_idx = 0; config_idx < len; config_idx++) + { + config_svr = &(g_config_service[config_idx]); + + if(config_svr->recovery != TRUE) + { + continue; + } + + cm_config_get_allconfig(recover_phase, + config_svr, input_array, + len_array, &total_len); + + cm_config_config_rec(recover_phase, config_svr, + input_array, len_array, total_len, + output, &output_len); + } + + recover_idx++; + } + + cm_config_rec_done(input_array, len_array, output); + + return; +} + +/* 配置处理入口函数,所有的配置,均在此函数中处理 */ +void cm_config_process(rpc_conn *conn, pointer input, int input_len, void* data) +{ + config_service_t *config_svr; + config_msg_t *config_msg; + char *cm_get_buff = NULL; + ret_code ret = RET_OK; + int config_len = 0; + short* single_len = NULL; + int buff_len = CM_BUFF_SIZE; + int index = 0; + + if(conn == NULL || input == NULL) + { + rpc_return_error(conn, RET_NULLP, "NULL pointer"); + return; + } + + /*parse message*/ + if(input_len < sizeof(config_msg_t)) + { + rpc_return_error(conn, RET_NOMEM, "not enough memery"); + return; + } + + config_msg = (config_msg_t *)input; + config_len = input_len - sizeof(config_msg_t); + + rpc_log_info("recv config from %d, config type is %d config id is 0x%llx ,len is %x\r\n", + config_msg->source, config_msg->config_type, config_msg->config_id, + config_len); + + config_svr = cm_config_service_get(config_msg->config_id); + if(config_svr == NULL) + { + rpc_return_error(conn, RET_NULLP, "NULL pointer"); + return; + } + + /*source check*/ + if(!(config_svr->config_id & config_msg->config_id)) + { + rpc_return_error(conn, RET_CHKERR, "source check error!\r\n"); + return; + + } + + cm_get_buff = rpc_new(char, buff_len); + if(cm_get_buff == NULL) + { + rpc_return_error(conn, RET_NOMEM, "not enough memery"); + return; + } + + memset(cm_get_buff, 0, buff_len); + + /*config check*/ + if(config_svr->chk_callback) + { + ret = config_svr->chk_callback(config_msg->source, + config_msg->config_type, + config_msg->config_buff, + config_len, + cm_get_buff, + &buff_len); + if(ret != RET_OK) + { + rpc_return_error(conn, ret, cm_get_buff); + goto exit; + } + } + + /*config exec*/ + switch(config_msg->config_type) + { + case CM_CONFIG_GET: + if(config_svr->get_callback) + { + ret = config_svr->get_callback(config_msg->source, + config_msg->config_buff, + config_len, + cm_get_buff, + &buff_len); + } + break; + + case CM_CONFIG_GET_ALL: + if(config_svr->getall_callback) + { + single_len = rpc_new(short, CM_BUFF_SIZE); + if(single_len == NULL) + { + rpc_return_error(conn, RET_NOMEM, "not enough memery"); + goto exit; + } + + ret = config_svr->getall_callback(config_msg->source, + config_svr->config_id, + cm_get_buff, + single_len, + &buff_len); + } + break; + + default: + if(config_svr->proc_callback) + { + ret = config_svr->proc_callback(config_msg->source, + config_msg->config_type, + config_msg->config_buff, + config_len, + cm_get_buff, + &buff_len); + } + break; + } + + if(buff_len > CM_BUFF_SIZE) + { + ret = RET_NOMEM; + } + + if(ret != RET_OK) + { + rpc_return_error(conn, ret, cm_get_buff); + goto exit; + } + + rpc_return(conn, cm_get_buff, buff_len); + + exit: + rpc_free(cm_get_buff); + + if(single_len != NULL) + { + rpc_free(single_len); + } + + return; +} + + +int main(int argc, char **argv) +{ + rpc_server *server; + + if (server= rpc_server_create_ex("ConfigManger#0")) + { + rpc_log_info("start server\n"); + } + else + { + rpc_log_error("start server error\n"); + return EXIT_FAILURE; + } + + /* 配置恢复 */ + cm_config_recovery(); + + /* 注册配置处理函数 */ + rpc_server_regservice(server, "ConfigManger#0", "cm_config_process", cm_config_process); + rpc_server_regservice(server, "ConfigManger#0", "test_big_data", test_big_data); + + for(;;) + { + rpc_sleep(1000); + } + return EXIT_SUCCESS; +} diff --git a/Platform/user/configm/include/ipconfig.h b/Platform/user/configm/config-server/include/ipconfig.h old mode 100755 new mode 100644 similarity index 96% rename from Platform/user/configm/include/ipconfig.h rename to Platform/user/configm/config-server/include/ipconfig.h index 5b51d7350..865f81a83 --- a/Platform/user/configm/include/ipconfig.h +++ b/Platform/user/configm/config-server/include/ipconfig.h @@ -1,93 +1,93 @@ -#ifndef IPCONFIG_H_ -#define IPCONFIG_H_ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define MAX_IF_NUM 32 -#define INTERFACE_NAMSIZ 20 -/* Max bit/byte length of IPv4 address. */ -#define IPV4_MAX_BYTELEN 4 -#define IPV4_MAX_BITLEN 32 -#define IPV4_MAX_PREFIXLEN 32 -#define IPV4_DEFAULT_PREFIXLEN 16 - -#define IPV4_ADDR_CMP(D,S) memcmp ((D), (S), IPV4_MAX_BYTELEN) - -#define IPV4_ADDR_COPY(D,S) ipv4_addr_copy((D), (S)) - -#define IPV4_NET0(a) ((((uint)(a)) & 0xff000000) == 0x00000000) -#define IPV4_NET127(a) ((((uint)(a)) & 0xff000000) == 0x7f000000) -#define IPV4_LINKLOCAL(a) ((((uint)(a)) & 0xffff0000) == 0xa9fe0000) -#define IPV4_CLASS_DE(a) ((((uint)(a)) & 0xe0000000) == 0xe0000000) -#define IPV4_MC_LINKLOCAL(a) ((((uint)(a)) & 0xffffff00) == 0xe0000000) -#define IPV4_ADDR_SAME(A,B) ipv4_addr_same((A), (B)) - -static inline boolean ipv4_addr_same(const struct in_addr *a, - const struct in_addr *b) -{ - return (a->s_addr == b->s_addr); -} - - -static inline void ipv4_addr_copy(struct in_addr *dst, - const struct in_addr *src) -{ - dst->s_addr = src->s_addr; -} - -/* NOTE: This routine expects the address argument in network byte order. */ -static inline int ipv4_martian(struct in_addr *addr) -{ - in_addr_t ip = ntohl(addr->s_addr); - - if (IPV4_NET0(ip) || IPV4_NET127(ip) || IPV4_CLASS_DE(ip)) - { - return TRUE; - } - - return FALSE; -} - - -/* 配置消息 */ -struct _ip_config_str { - char ifname[INTERFACE_NAMSIZ]; - uchar family; - uchar prefixlen; - struct in_addr prefix __attribute__((aligned(8))); -}; - -typedef struct _ip_config_str ip_config_t; - -/* 业务模块函数声明 */ - -/* ip config */ -ret_code ip_config_chk(uint source, uint config_type, - pointer input, int input_len, - pointer output, int *output_len); - -ret_code ip_config_proc(uint source, uint config_type, - pointer input, int input_len, - pointer output, int *output_len); - -ret_code ip_config_get(uint source, - pointer input, int input_len, - pointer output, int *output_len); - -ret_code ip_config_get_all(uint source, uint64 config_id, - pointer output, short *single_len, - int *output_len); - - - -#endif /* IPCONFIG_H_ */ - +#ifndef IPCONFIG_H_ +#define IPCONFIG_H_ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define MAX_IF_NUM 32 +#define INTERFACE_NAMSIZ 20 +/* Max bit/byte length of IPv4 address. */ +#define IPV4_MAX_BYTELEN 4 +#define IPV4_MAX_BITLEN 32 +#define IPV4_MAX_PREFIXLEN 32 +#define IPV4_DEFAULT_PREFIXLEN 16 + +#define IPV4_ADDR_CMP(D,S) memcmp ((D), (S), IPV4_MAX_BYTELEN) + +#define IPV4_ADDR_COPY(D,S) ipv4_addr_copy((D), (S)) + +#define IPV4_NET0(a) ((((uint)(a)) & 0xff000000) == 0x00000000) +#define IPV4_NET127(a) ((((uint)(a)) & 0xff000000) == 0x7f000000) +#define IPV4_LINKLOCAL(a) ((((uint)(a)) & 0xffff0000) == 0xa9fe0000) +#define IPV4_CLASS_DE(a) ((((uint)(a)) & 0xe0000000) == 0xe0000000) +#define IPV4_MC_LINKLOCAL(a) ((((uint)(a)) & 0xffffff00) == 0xe0000000) +#define IPV4_ADDR_SAME(A,B) ipv4_addr_same((A), (B)) + +static inline boolean ipv4_addr_same(const struct in_addr *a, + const struct in_addr *b) +{ + return (a->s_addr == b->s_addr); +} + + +static inline void ipv4_addr_copy(struct in_addr *dst, + const struct in_addr *src) +{ + dst->s_addr = src->s_addr; +} + +/* NOTE: This routine expects the address argument in network byte order. */ +static inline int ipv4_martian(struct in_addr *addr) +{ + in_addr_t ip = ntohl(addr->s_addr); + + if (IPV4_NET0(ip) || IPV4_NET127(ip) || IPV4_CLASS_DE(ip)) + { + return TRUE; + } + + return FALSE; +} + + +/* 配置消息 */ +struct _ip_config_str { + char ifname[INTERFACE_NAMSIZ]; + uchar family; + uchar prefixlen; + struct in_addr prefix __attribute__((aligned(8))); +}; + +typedef struct _ip_config_str ip_config_t; + +/* 业务模块函数声明 */ + +/* ip config */ +ret_code ip_config_chk(uint source, uint config_type, + pointer input, int input_len, + pointer output, int *output_len); + +ret_code ip_config_proc(uint source, uint config_type, + pointer input, int input_len, + pointer output, int *output_len); + +ret_code ip_config_get(uint source, + pointer input, int input_len, + pointer output, int *output_len); + +ret_code ip_config_get_all(uint source, uint64 config_id, + pointer output, short *single_len, + int *output_len); + + + +#endif /* IPCONFIG_H_ */ + diff --git a/Platform/user/configm/include/parsefile.h b/Platform/user/configm/config-server/include/parsefile.h old mode 100755 new mode 100644 similarity index 96% rename from Platform/user/configm/include/parsefile.h rename to Platform/user/configm/config-server/include/parsefile.h index 2100c8af9..dbe0560d0 --- a/Platform/user/configm/include/parsefile.h +++ b/Platform/user/configm/config-server/include/parsefile.h @@ -1,10 +1,10 @@ -#ifndef PARSEFILE_H_ -#define PARSEFILE_H_ - -#define IFCONFIG_PATH "/etc/network/interfaces" -#define IF_BUFF_LEN 64 - -void set_if_config(char *if_name, char *conf_name, char *conf_buff); -void del_if_config(char *if_name, char *conf_buff); - -#endif +#ifndef PARSEFILE_H_ +#define PARSEFILE_H_ + +#define IFCONFIG_PATH "/etc/network/interfaces" +#define IF_BUFF_LEN 64 + +void set_if_config(char *if_name, char *conf_name, char *conf_buff); +void del_if_config(char *if_name, char *conf_buff); + +#endif diff --git a/Platform/user/configm/ipconfig/ipconfig.c b/Platform/user/configm/config-server/ipconfig/ipconfig.c old mode 100755 new mode 100644 similarity index 95% rename from Platform/user/configm/ipconfig/ipconfig.c rename to Platform/user/configm/config-server/ipconfig/ipconfig.c index 9f6a54385..1885f4f56 --- a/Platform/user/configm/ipconfig/ipconfig.c +++ b/Platform/user/configm/config-server/ipconfig/ipconfig.c @@ -1,389 +1,389 @@ -#include "configm.h" -#include "ipconfig.h" -#include "rpc.h" -#include "parsefile.h" - -uchar ip_masklen(struct in_addr netmask) -{ - uint tmp = ~ntohl(netmask.s_addr); - if (tmp) - /* clz: count leading zeroes. sadly, the behaviour of this - * builtin - * is undefined for a 0 argument, even though most CPUs give 32 - */ - return __builtin_clz(tmp); - else - return 32; -} - - -/* Convert masklen into IP address's netmask (network byte order). */ -void masklen2ip(const int masklen, struct in_addr *netmask) -{ - if(masklen < 0 || masklen > IPV4_MAX_BITLEN) - { - return; - } - - /* left shift is only defined for less than the size of the type. - * we unconditionally use long long in case the target platform - * has defined behaviour for << 32 (or has a 64-bit left shift) */ - - if (sizeof(unsigned long long) > 4) - netmask->s_addr = htonl(0xffffffffULL << (32 - masklen)); - else - netmask->s_addr = - htonl(masklen ? 0xffffffffU << (32 - masklen) : 0); -} - -void ip_save_file(ip_config_t *ip_conf, uint config_type) -{ - char *addr_name = "address"; - char *mask_name = "netmask"; - struct in_addr netmask; - char addr_buff[IF_BUFF_LEN] = {0}; - char mask_buff[IF_BUFF_LEN] = {0}; - - if(config_type == CM_CONFIG_SET) - { - sprintf(addr_buff, "address %s\n", inet_ntoa(ip_conf->prefix)); - masklen2ip(ip_conf->prefixlen, &netmask); - sprintf(mask_buff, "netmask %s\n", inet_ntoa(netmask)); - printf("%s,%s\r\n",addr_buff, mask_buff); - - set_if_config(ip_conf->ifname, addr_name, addr_buff); - set_if_config(ip_conf->ifname, mask_name, mask_buff); - } - else if(config_type == CM_CONFIG_DEL) - { - del_if_config(ip_conf->ifname, addr_name); - del_if_config(ip_conf->ifname, mask_name); - } -} - -/* call ioctl system call */ -ret_code if_ioctl(unsigned long request, caddr_t ifreq, int *ret) -{ - int sock; - int err = 0; - - *ret = 0; - - sock = socket(AF_INET, SOCK_DGRAM, 0); - if (sock < 0) - { - rpc_log_error("Cannot create UDP socket"); - return RET_SOCKERR; - } - if ((*ret = ioctl(sock, request, ifreq)) < 0) - { - err = errno; - rpc_log_error("Ioctl error: %s\n", strerror(errno)); - - } - - close(sock); - - if (*ret < 0) - { - errno = err; - *ret = err; - return RET_SYSERR; - } - - return RET_OK; -} - -ret_code if_set_prefix(ip_config_t *ip_conf, int *code) -{ - ret_code ret; - struct ifreq ifreq; - struct sockaddr_in addr; - struct sockaddr_in mask; - - strncpy(ifreq.ifr_name, ip_conf->ifname, sizeof(ifreq.ifr_name)); - addr.sin_addr = ip_conf->prefix; - addr.sin_family = ip_conf->family; - memcpy(&ifreq.ifr_addr, &addr, sizeof(struct sockaddr_in)); - - ret = if_ioctl(SIOCSIFADDR, (caddr_t)&ifreq, code); - ASSERT_RET(ret); - - if(ip_conf->prefix.s_addr != 0) - { - masklen2ip(ip_conf->prefixlen, &mask.sin_addr); - mask.sin_family = ip_conf->family; - memcpy(&ifreq.ifr_netmask, &mask, sizeof(struct sockaddr_in)); - - ret = if_ioctl(SIOCSIFNETMASK, (caddr_t)&ifreq, code); - ASSERT_RET(ret); - } - - - return 0; -} - -ret_code if_get_prefix_all(ip_config_t *ip_conf, int *cnt, int *code) -{ - struct ifreq ifreq[MAX_IF_NUM]; - struct sockaddr_in *addr; - struct ifreq netmask; - struct ifconf ifc; - int if_count = 0; - ret_code ret; - int mask_ret; - int i; - - memset(&ifc, 0, sizeof(struct ifconf)); - memset(&ifreq, 0, MAX_IF_NUM * sizeof(struct ifreq)); - - ifc.ifc_len = MAX_IF_NUM * sizeof(struct ifreq); - ifc.ifc_buf = (char *)ifreq; - - ret = if_ioctl(SIOCGIFCONF, (caddr_t)&ifc, code); - ASSERT_RET(ret); - - if_count = ifc.ifc_len / (sizeof(struct ifreq)); - - rpc_log_info("if num is %d\n", if_count); - - if(if_count * sizeof(ip_config_t) > CM_BUFF_SIZE) - { - ret = RET_NOMEM; - ASSERT_RET(ret); - } - - *cnt = 0; - for(i = 0; i < if_count; i++) - { - rpc_log_info("get interface %s info\n", ifreq[i].ifr_name); - strncpy(ip_conf[i].ifname, ifreq[i].ifr_name, INTERFACE_NAMSIZ); - ip_conf[i].family = AF_INET; - ip_conf[i].prefix = ((struct sockaddr_in *)&(ifreq[i].ifr_addr))->sin_addr; - - memset(&netmask, 0, sizeof(netmask)); - strncpy(netmask.ifr_name, ifreq[i].ifr_name, INTERFACE_NAMSIZ); - - ret = if_ioctl(SIOCGIFNETMASK, (caddr_t)&netmask, &mask_ret); - ASSERT_RET_NO(ret); - - addr = ( struct sockaddr_in * )&(netmask.ifr_netmask ); - ip_conf[i].prefixlen = ip_masklen(addr->sin_addr); - - (*cnt)++; - } - - return RET_OK; -} - -ret_code if_get_prefix(ip_config_t *ip_conf, int *code) -{ - struct sockaddr_in *addr; - struct ifreq netmask; - struct ifreq ifreq; - ret_code ret = RET_OK; - int mask_ret; - int i; - - if(ip_conf->family != AF_INET) - { - ret = RET_INPUTERR; - } - - ASSERT_RET(ret); - - memset(&ifreq, 0, sizeof(struct ifreq)); - - rpc_log_info("get interface %s info\n", ip_conf->ifname); - - strncpy(ifreq.ifr_name, ip_conf->ifname, sizeof(ifreq.ifr_name)); - - ret = if_ioctl(SIOCGIFADDR, (caddr_t)&ifreq, code); - ASSERT_RET(ret); - - - ip_conf->prefix = ((struct sockaddr_in *)&(ifreq.ifr_addr))->sin_addr; - - memset(&ifreq, 0, sizeof(ifreq)); - strncpy(ifreq.ifr_name, ip_conf->ifname, sizeof(ifreq.ifr_name)); - - ret = if_ioctl(SIOCGIFNETMASK, (caddr_t)&ifreq, &mask_ret); - ASSERT_RET_NO(ret); - - addr = ( struct sockaddr_in * )&(ifreq.ifr_netmask); - ip_conf->prefixlen = ip_masklen(addr->sin_addr); - - return ret; -} - -ret_code ip_config_set_chk(uint source,uint config_type, - pointer input, int input_len, - pointer output, int *output_len) -{ - ret_code ret = RET_OK; - ip_config_t *ip_conf; - - ip_conf = (ip_config_t *)input; - - if(input_len < sizeof(ip_config_t) - || strlen(ip_conf->ifname) == 0) - { - ret = RET_INPUTERR; - } - - if (ipv4_martian(&ip_conf->prefix)) - { - ret = RET_IPINVALID; - } - - ASSERT_RET(ret); - - if(ip_conf->prefixlen == 0 || ip_conf->prefixlen > IPV4_MAX_PREFIXLEN) - { - ip_conf->prefixlen = IPV4_DEFAULT_PREFIXLEN; - } - - return RET_OK; -} - -ret_code ip_config_get_chk(uint source,uint config_type, - pointer input, int input_len, - pointer output, int *output_len) -{ - ret_code ret = RET_OK; - ip_config_t *ip_conf; - - ip_conf = (ip_config_t *)input; - - if(input_len < sizeof(ip_config_t) - || strlen(ip_conf->ifname) == 0 ) - { - ret = RET_INPUTERR; - } - - return ret; -} - -ret_code ip_config_getall_chk(uint source,uint config_type, - pointer input, int input_len, - pointer output, int *output_len) -{ - ret_code ret = RET_OK; - - if(*output_len < MAX_IF_NUM * sizeof(ip_config_t)) - { - ret = RET_INPUTERR; - } - - return ret; -} - - -ret_code ip_config_chk(uint source,uint config_type, - pointer input, int input_len, - pointer output, int *output_len) - -{ - ret_code ret = RET_OK; - int code = 0; - - switch (config_type) - { - case CM_CONFIG_SET: - case CM_CONFIG_DEL: - ret = ip_config_set_chk(source, config_type, - input, input_len, - output, output_len); - break; - case CM_CONFIG_GET: - ret = ip_config_get_chk(source, config_type, - input, input_len, - output, output_len); - break; - case CM_CONFIG_GET_ALL: - ret = ip_config_getall_chk(source, config_type, - input, input_len, - output, output_len); - break; - default: - ret = RET_NOTSUPPORT; - } - - RET_ERR_FORMART(ret, code, output, *output_len); - return ret; -} - -ret_code ip_config_proc(uint source, uint config_type, - pointer input, int input_len, - pointer output, int *output_len) -{ - ip_config_t *ip_conf; - ret_code ret = RET_OK; - int code; - - ip_conf = (ip_config_t *)input; - - if(config_type == CM_CONFIG_DEL) - { - ip_conf->prefix.s_addr = 0; - ip_conf->prefixlen = IPV4_DEFAULT_PREFIXLEN; - } - - rpc_log_info("config type is %d, if %s ip %s prefixlen %d\n", - config_type, ip_conf->ifname, - inet_ntoa(ip_conf->prefix), - ip_conf->prefixlen); - - ret = if_set_prefix(ip_conf, &code); - - RET_ERR_FORMART(ret, code, output, *output_len); - ASSERT_RET(ret); - - ip_save_file(ip_conf, config_type); - - return RET_OK; -} - -ret_code ip_config_get(uint source, - pointer input, int input_len, - pointer output, int *output_len) -{ - ip_config_t *ip_conf; - ret_code ret = RET_OK; - int code; - - ip_conf = (ip_config_t *)input; - - ret = if_get_prefix(ip_conf, &code); - - RET_ERR_FORMART(ret, code, output, *output_len); - ASSERT_RET(ret); - - memcpy(output, ip_conf, sizeof(ip_config_t)); - *output_len = sizeof(ip_config_t); - - return ret; -} - -ret_code ip_config_get_all(uint source, uint64 config_id, - pointer output, short *single_len, - int *output_len) -{ - ip_config_t ip_conf; - ret_code ret; - int count = 0; - int code; - - rpc_log_info("ip_config_get_all\r\n"); - - ret = if_get_prefix_all((ip_config_t *)output, &count, &code); - - RET_ERR_FORMART(ret, code, output, *output_len); - ASSERT_RET(ret); - - *single_len = sizeof(ip_config_t); - *output_len = count * sizeof(ip_config_t); - - return RET_OK; - -} +#include "configm.h" +#include "ipconfig.h" +#include "rpc.h" +#include "parsefile.h" + +uchar ip_masklen(struct in_addr netmask) +{ + uint tmp = ~ntohl(netmask.s_addr); + if (tmp) + /* clz: count leading zeroes. sadly, the behaviour of this + * builtin + * is undefined for a 0 argument, even though most CPUs give 32 + */ + return __builtin_clz(tmp); + else + return 32; +} + + +/* Convert masklen into IP address's netmask (network byte order). */ +void masklen2ip(const int masklen, struct in_addr *netmask) +{ + if(masklen < 0 || masklen > IPV4_MAX_BITLEN) + { + return; + } + + /* left shift is only defined for less than the size of the type. + * we unconditionally use long long in case the target platform + * has defined behaviour for << 32 (or has a 64-bit left shift) */ + + if (sizeof(unsigned long long) > 4) + netmask->s_addr = htonl(0xffffffffULL << (32 - masklen)); + else + netmask->s_addr = + htonl(masklen ? 0xffffffffU << (32 - masklen) : 0); +} + +void ip_save_file(ip_config_t *ip_conf, uint config_type) +{ + char *addr_name = "address"; + char *mask_name = "netmask"; + struct in_addr netmask; + char addr_buff[IF_BUFF_LEN] = {0}; + char mask_buff[IF_BUFF_LEN] = {0}; + + if(config_type == CM_CONFIG_SET) + { + sprintf(addr_buff, "address %s\n", inet_ntoa(ip_conf->prefix)); + masklen2ip(ip_conf->prefixlen, &netmask); + sprintf(mask_buff, "netmask %s\n", inet_ntoa(netmask)); + printf("%s,%s\r\n",addr_buff, mask_buff); + + set_if_config(ip_conf->ifname, addr_name, addr_buff); + set_if_config(ip_conf->ifname, mask_name, mask_buff); + } + else if(config_type == CM_CONFIG_DEL) + { + del_if_config(ip_conf->ifname, addr_name); + del_if_config(ip_conf->ifname, mask_name); + } +} + +/* call ioctl system call */ +ret_code if_ioctl(unsigned long request, caddr_t ifreq, int *ret) +{ + int sock; + int err = 0; + + *ret = 0; + + sock = socket(AF_INET, SOCK_DGRAM, 0); + if (sock < 0) + { + rpc_log_error("Cannot create UDP socket"); + return RET_SOCKERR; + } + if ((*ret = ioctl(sock, request, ifreq)) < 0) + { + err = errno; + rpc_log_error("Ioctl error: %s\n", strerror(errno)); + + } + + close(sock); + + if (*ret < 0) + { + errno = err; + *ret = err; + return RET_SYSERR; + } + + return RET_OK; +} + +ret_code if_set_prefix(ip_config_t *ip_conf, int *code) +{ + ret_code ret; + struct ifreq ifreq; + struct sockaddr_in addr; + struct sockaddr_in mask; + + strncpy(ifreq.ifr_name, ip_conf->ifname, sizeof(ifreq.ifr_name)); + addr.sin_addr = ip_conf->prefix; + addr.sin_family = ip_conf->family; + memcpy(&ifreq.ifr_addr, &addr, sizeof(struct sockaddr_in)); + + ret = if_ioctl(SIOCSIFADDR, (caddr_t)&ifreq, code); + ASSERT_RET(ret); + + if(ip_conf->prefix.s_addr != 0) + { + masklen2ip(ip_conf->prefixlen, &mask.sin_addr); + mask.sin_family = ip_conf->family; + memcpy(&ifreq.ifr_netmask, &mask, sizeof(struct sockaddr_in)); + + ret = if_ioctl(SIOCSIFNETMASK, (caddr_t)&ifreq, code); + ASSERT_RET(ret); + } + + + return 0; +} + +ret_code if_get_prefix_all(ip_config_t *ip_conf, int *cnt, int *code) +{ + struct ifreq ifreq[MAX_IF_NUM]; + struct sockaddr_in *addr; + struct ifreq netmask; + struct ifconf ifc; + int if_count = 0; + ret_code ret; + int mask_ret; + int i; + + memset(&ifc, 0, sizeof(struct ifconf)); + memset(&ifreq, 0, MAX_IF_NUM * sizeof(struct ifreq)); + + ifc.ifc_len = MAX_IF_NUM * sizeof(struct ifreq); + ifc.ifc_buf = (char *)ifreq; + + ret = if_ioctl(SIOCGIFCONF, (caddr_t)&ifc, code); + ASSERT_RET(ret); + + if_count = ifc.ifc_len / (sizeof(struct ifreq)); + + rpc_log_info("if num is %d\n", if_count); + + if(if_count * sizeof(ip_config_t) > CM_BUFF_SIZE) + { + ret = RET_NOMEM; + ASSERT_RET(ret); + } + + *cnt = 0; + for(i = 0; i < if_count; i++) + { + rpc_log_info("get interface %s info\n", ifreq[i].ifr_name); + strncpy(ip_conf[i].ifname, ifreq[i].ifr_name, INTERFACE_NAMSIZ); + ip_conf[i].family = AF_INET; + ip_conf[i].prefix = ((struct sockaddr_in *)&(ifreq[i].ifr_addr))->sin_addr; + + memset(&netmask, 0, sizeof(netmask)); + strncpy(netmask.ifr_name, ifreq[i].ifr_name, sizeof(netmask.ifr_name)); + + ret = if_ioctl(SIOCGIFNETMASK, (caddr_t)&netmask, &mask_ret); + ASSERT_RET_NO(ret); + + addr = ( struct sockaddr_in * )&(netmask.ifr_netmask ); + ip_conf[i].prefixlen = ip_masklen(addr->sin_addr); + + (*cnt)++; + } + + return RET_OK; +} + +ret_code if_get_prefix(ip_config_t *ip_conf, int *code) +{ + struct sockaddr_in *addr; + struct ifreq netmask; + struct ifreq ifreq; + ret_code ret = RET_OK; + int mask_ret; + int i; + + if(ip_conf->family != AF_INET) + { + ret = RET_INPUTERR; + } + + ASSERT_RET(ret); + + memset(&ifreq, 0, sizeof(struct ifreq)); + + rpc_log_info("get interface %s info\n", ip_conf->ifname); + + strncpy(ifreq.ifr_name, ip_conf->ifname, sizeof(ifreq.ifr_name)); + + ret = if_ioctl(SIOCGIFADDR, (caddr_t)&ifreq, code); + ASSERT_RET(ret); + + + ip_conf->prefix = ((struct sockaddr_in *)&(ifreq.ifr_addr))->sin_addr; + + memset(&ifreq, 0, sizeof(ifreq)); + strncpy(ifreq.ifr_name, ip_conf->ifname, sizeof(ifreq.ifr_name)); + + ret = if_ioctl(SIOCGIFNETMASK, (caddr_t)&ifreq, &mask_ret); + ASSERT_RET_NO(ret); + + addr = ( struct sockaddr_in * )&(ifreq.ifr_netmask); + ip_conf->prefixlen = ip_masklen(addr->sin_addr); + + return ret; +} + +ret_code ip_config_set_chk(uint source,uint config_type, + pointer input, int input_len, + pointer output, int *output_len) +{ + ret_code ret = RET_OK; + ip_config_t *ip_conf; + + ip_conf = (ip_config_t *)input; + + if(input_len < sizeof(ip_config_t) + || strlen(ip_conf->ifname) == 0) + { + ret = RET_INPUTERR; + } + + if (ipv4_martian(&ip_conf->prefix)) + { + ret = RET_IPINVALID; + } + + ASSERT_RET(ret); + + if(ip_conf->prefixlen == 0 || ip_conf->prefixlen > IPV4_MAX_PREFIXLEN) + { + ip_conf->prefixlen = IPV4_DEFAULT_PREFIXLEN; + } + + return RET_OK; +} + +ret_code ip_config_get_chk(uint source,uint config_type, + pointer input, int input_len, + pointer output, int *output_len) +{ + ret_code ret = RET_OK; + ip_config_t *ip_conf; + + ip_conf = (ip_config_t *)input; + + if(input_len < sizeof(ip_config_t) + || strlen(ip_conf->ifname) == 0 ) + { + ret = RET_INPUTERR; + } + + return ret; +} + +ret_code ip_config_getall_chk(uint source,uint config_type, + pointer input, int input_len, + pointer output, int *output_len) +{ + ret_code ret = RET_OK; + + if(*output_len < MAX_IF_NUM * sizeof(ip_config_t)) + { + ret = RET_INPUTERR; + } + + return ret; +} + + +ret_code ip_config_chk(uint source,uint config_type, + pointer input, int input_len, + pointer output, int *output_len) + +{ + ret_code ret = RET_OK; + int code = 0; + + switch (config_type) + { + case CM_CONFIG_SET: + case CM_CONFIG_DEL: + ret = ip_config_set_chk(source, config_type, + input, input_len, + output, output_len); + break; + case CM_CONFIG_GET: + ret = ip_config_get_chk(source, config_type, + input, input_len, + output, output_len); + break; + case CM_CONFIG_GET_ALL: + ret = ip_config_getall_chk(source, config_type, + input, input_len, + output, output_len); + break; + default: + ret = RET_NOTSUPPORT; + } + + RET_ERR_FORMART(ret, code, output, *output_len); + return ret; +} + +ret_code ip_config_proc(uint source, uint config_type, + pointer input, int input_len, + pointer output, int *output_len) +{ + ip_config_t *ip_conf; + ret_code ret = RET_OK; + int code; + + ip_conf = (ip_config_t *)input; + + if(config_type == CM_CONFIG_DEL) + { + ip_conf->prefix.s_addr = 0; + ip_conf->prefixlen = IPV4_DEFAULT_PREFIXLEN; + } + + rpc_log_info("config type is %d, if %s ip %s prefixlen %d\n", + config_type, ip_conf->ifname, + inet_ntoa(ip_conf->prefix), + ip_conf->prefixlen); + + ret = if_set_prefix(ip_conf, &code); + + RET_ERR_FORMART(ret, code, output, *output_len); + ASSERT_RET(ret); + + ip_save_file(ip_conf, config_type); + + return RET_OK; +} + +ret_code ip_config_get(uint source, + pointer input, int input_len, + pointer output, int *output_len) +{ + ip_config_t *ip_conf; + ret_code ret = RET_OK; + int code; + + ip_conf = (ip_config_t *)input; + + ret = if_get_prefix(ip_conf, &code); + + RET_ERR_FORMART(ret, code, output, *output_len); + ASSERT_RET(ret); + + memcpy(output, ip_conf, sizeof(ip_config_t)); + *output_len = sizeof(ip_config_t); + + return ret; +} + +ret_code ip_config_get_all(uint source, uint64 config_id, + pointer output, short *single_len, + int *output_len) +{ + ip_config_t ip_conf; + ret_code ret; + int count = 0; + int code; + + rpc_log_info("ip_config_get_all\r\n"); + + ret = if_get_prefix_all((ip_config_t *)output, &count, &code); + + RET_ERR_FORMART(ret, code, output, *output_len); + ASSERT_RET(ret); + + *single_len = sizeof(ip_config_t); + *output_len = count * sizeof(ip_config_t); + + return RET_OK; + +} diff --git a/Platform/user/configm/ipconfig/parsefile.c b/Platform/user/configm/config-server/ipconfig/parsefile.c old mode 100755 new mode 100644 similarity index 96% rename from Platform/user/configm/ipconfig/parsefile.c rename to Platform/user/configm/config-server/ipconfig/parsefile.c index 04c0285d7..c5bdd3b3f --- a/Platform/user/configm/ipconfig/parsefile.c +++ b/Platform/user/configm/config-server/ipconfig/parsefile.c @@ -1,452 +1,452 @@ -#include -#include -#include -#include -#include -#include -#include - -#include "parsefile.h" - -#if 0 -/* - *从配置文件中读取相应的值 - *输入参数:1,配置文件路径 2,匹配标记 3,输出存储空间 - *并且排除了空行,“=”前后无内容,无“=”的情况 - */ -void read_config(char *conf_path,char *conf_name,char *config_buff) -{ - char config_linebuf[256]; - char line_name[40]; - char exchange_buf[256]; - char *config_sign = "="; - char *leave_line; - FILE *f; - f = fopen(conf_path,"r"); - if(f == NULL) - { - printf("OPEN CONFIG FALID/n"); - return 0; - } - fseek(f,0,SEEK_SET); - while(fgets(config_linebuf,256,f) != NULL) - { - if(strlen(config_linebuf) < 3) //判断是否是空行 - { - continue; - } - if (config_linebuf[strlen(config_linebuf)-1] == 10) //去除最后一位是/n的情况 - { - - memset(exchange_buf,0,sizeof(exchange_buf)); - strncpy(exchange_buf,config_linebuf,strlen(config_linebuf)-1); - memset(config_linebuf,0,sizeof(config_linebuf)); - strcpy(config_linebuf,exchange_buf); - } - memset(line_name,0,sizeof(line_name)); - leave_line = strstr(config_linebuf,config_sign); - if(leave_line == NULL) //去除无"="的情况 - { - continue; - } - int leave_num = leave_line - config_linebuf; - strncpy(line_name,config_linebuf,leave_num); - if(strcmp(line_name,conf_name) ==0) - { - strncpy(config_buff,config_linebuf+(leave_num+1),strlen(config_linebuf)-leave_num-1); - break; - } - if(fgetc(f)==EOF) - { - break; - } - fseek(f,-1,SEEK_CUR); - memset(config_linebuf,0,sizeof(config_linebuf)); - } - fclose(f); -} - -/* - *添加修改文件(当配置文件中存在标记字段,则进行修改,若不存在则进行添加) - * - *输入参数:1,配置文件路径 2,匹配标记 3,替换或添加的内容 - * - */ -void add_set_config(char *conf_path,char *conf_name,char *config_buff) -{ - - char config_linebuf[256]; - char line_name[40]; - char *config_sign = "="; - char *leave_line; - int alter_sign = 0; - - FILE *f; - f = fopen(conf_path,"r+"); - if(f == NULL) - { - printf("OPEN CONFIG FALID/n"); - return 0; - } - fseek(f,0,SEEK_END); - long congig_lenth = ftell(f); - int configbuf_lenth = strlen(config_buff); - configbuf_lenth = configbuf_lenth + 5; - char sum_buf[congig_lenth+configbuf_lenth]; - memset(sum_buf,0,sizeof(sum_buf)); - fseek(f,0,SEEK_SET); - while(fgets(config_linebuf,256,f) != NULL) - { - if(strlen(config_linebuf) < 3) //判断是否是空行 - { - strcat(sum_buf,config_linebuf); - continue; - } - leave_line = NULL; - leave_line = strstr(config_linebuf,config_sign); - if(leave_line == NULL) //去除无"="的情况 - { - strcat(sum_buf,config_linebuf); - continue; - } - int leave_num = leave_line - config_linebuf; - memset(line_name,0,sizeof(line_name)); - strncpy(line_name,config_linebuf,leave_num); - if(strcmp(line_name,conf_name) ==0) - { - strcat(sum_buf,config_buff); - strcat(sum_buf,"/n"); - alter_sign = 1; - } - else - { - strcat(sum_buf,config_linebuf); - } - if(fgetc(f)==EOF) - { - break; - } - fseek(f,-1,SEEK_CUR); - memset(config_linebuf,0,sizeof(config_linebuf)); - } - if(alter_sign == 0) - { - strcat(sum_buf,config_buff); - strcat(sum_buf,"/n"); - } - printf("---sum_buf---->%s<----------/n",sum_buf); - remove(conf_path); - fclose(f); - FILE *fp; - fp = fopen(conf_path,"w+"); - if(fp == NULL) - { - printf("OPEN CONFIG FALID/n"); - return 2; - } - fseek(fp,0,SEEK_SET); - fputs(sum_buf,fp); - fclose(fp); -} -/* - *删除配置文件内容 - * - *输入参数:1,匹配标记 - * - */ -void del_if_config(char *conf_name) -{ - char *conf_path = "/etc/network/interface"; - char config_linebuf[256]; - char line_name[40]; - char *config_sign = "="; - char *leave_line; - - FILE *f; - f = fopen(conf_path,"r+"); - if(f == NULL) - { - printf("OPEN CONFIG FALID/n"); - return 0; - } - fseek(f,0,SEEK_END); - long congig_lenth = ftell(f); - char sum_buf[congig_lenth+2]; - memset(sum_buf,0,sizeof(sum_buf)); - fseek(f,0,SEEK_SET); - while(fgets(config_linebuf,256,f) != NULL) - { - if(strlen(config_linebuf) < 3) //判断是否是空行 - { - strcat(sum_buf,config_linebuf); - continue; - } - leave_line = NULL; - leave_line = strstr(config_linebuf,config_sign); - if(leave_line == NULL) //去除无"="的情况 - { - strcat(sum_buf,config_linebuf); - continue; - } - int leave_num = leave_line - config_linebuf; - memset(line_name,0,sizeof(line_name)); - strncpy(line_name,config_linebuf,leave_num); - if(strcmp(line_name,conf_name) !=0) - { - strcat(sum_buf,config_linebuf); - } - - if(fgetc(f)==EOF) - { - break; - } - fseek(f,-1,SEEK_CUR); - memset(config_linebuf,0,sizeof(config_linebuf)); - } - printf("---sum_buf---->%s<----------/n",sum_buf); - remove(conf_path); - fclose(f); - FILE *fp; - fp = fopen(conf_path,"w+"); - if(fp == NULL) - { - printf("OPEN CONFIG FALID/n"); - return 2; - } - fseek(fp,0,SEEK_SET); - fputs(sum_buf,fp); - fclose(fp); -} - -#endif - -/* - *添加修改文件(当配置文件中存在标记字段,则进行修改,若不存在则进行添加) - * - *输入参数:1,接口名 2,匹配标记 3,替换或添加的内容 - * - */ - -void set_if_config(char *if_name, char *conf_name, char *conf_buff) -{ - char *conf_path = IFCONFIG_PATH; - char config_linebuf[IF_BUFF_LEN]; - char static_name[IF_BUFF_LEN] = {0}; - char iface_str[IF_BUFF_LEN] = {0}; - char iface_str2[IF_BUFF_LEN] = {0}; - char auto_str[IF_BUFF_LEN] = {0}; - char *config_sign = "iface"; - char *leave_line; - char *leave_line2; - int alter_sign = 0; - - FILE *f; - f = fopen(conf_path,"r+"); - if(f == NULL) - { - printf("OPEN CONFIG FALID\n"); - return; - } - - fseek(f,0,SEEK_END); - - long congig_lenth = ftell(f); - int configbuf_lenth = strlen(conf_buff); - configbuf_lenth = configbuf_lenth + 5; - char sum_buf[congig_lenth+configbuf_lenth]; - - memset(sum_buf,0,sizeof(sum_buf)); - fseek(f,0,SEEK_SET); - - sprintf(iface_str, "%s %s", config_sign, if_name); - sprintf(iface_str2, "auto %s", if_name); - sprintf(static_name, "iface %s inet static\n", if_name); - - leave_line = NULL; - leave_line2 = NULL; - - while(fgets(config_linebuf,IF_BUFF_LEN,f) != NULL) - { - if(strlen(config_linebuf) < 3 || leave_line2) //判断是否是空行 - { - strcat(sum_buf,config_linebuf); - continue; - } - - if(leave_line == NULL) - { - leave_line = strstr(config_linebuf, iface_str); - - if(leave_line) - { - strcat(sum_buf,static_name); - } - else - { - strcat(sum_buf,config_linebuf); - } - } - /*leave_line != NULL && leave_line2 !=NULL*/ - else if((leave_line2 = strstr(config_linebuf,iface_str)) - || (leave_line2 = strstr(config_linebuf,iface_str2))) - { - if(alter_sign == 0) - { - strcat(sum_buf,conf_buff); - alter_sign = 1; - } - - strcat(sum_buf,config_linebuf); - } - /*leave_line != NULL && leave_line2 == NULL*/ - else - { - if(strstr(config_linebuf,conf_name) != NULL) - { - strcat(sum_buf,conf_buff); - alter_sign = 1; - } - else - { - strcat(sum_buf,config_linebuf); - } - } - - if(fgetc(f)==EOF) - { - break; - } - fseek(f,-1,SEEK_CUR); - - memset(config_linebuf,0,sizeof(config_linebuf)); - } - - if(leave_line == NULL) - { - sprintf(auto_str, "auto %s\n", if_name); - sprintf(auto_str, "%s", static_name); - strcat(sum_buf,auto_str); - } - - if(alter_sign == 0) - { - //strcat(sum_buf,"\n"); - strcat(sum_buf, conf_buff); - } - - printf("---sum_buf---->%s<----------/n",sum_buf); - remove(conf_path); - fclose(f); - - FILE *fp; - fp = fopen(conf_path,"w+"); - if(fp == NULL) - { - printf("OPEN CONFIG FALID/n"); - return; - } - fseek(fp,0,SEEK_SET); - fputs(sum_buf,fp); - fclose(fp); - - return; -} - - -/* - *删除配置文件内容 - * - *输入参数:1,匹配标记 - * - */ -void del_if_config(char *if_name, char *conf_buff) -{ - char *conf_path = IFCONFIG_PATH; - char config_linebuf[IF_BUFF_LEN]; - char iface_str[IF_BUFF_LEN] = {0}; - char iface_str2[IF_BUFF_LEN] = {0}; - char auto_str[IF_BUFF_LEN] = {0}; - char *config_sign = "iface"; - char *leave_line; - char *leave_line2; - int alter_sign = 0; - - FILE *f; - f = fopen(conf_path,"r+"); - if(f == NULL) - { - printf("OPEN CONFIG FALID\n"); - return; - } - - fseek(f,0,SEEK_END); - - long congig_lenth = ftell(f); - int configbuf_lenth = strlen(conf_buff); - configbuf_lenth = configbuf_lenth + 5; - char sum_buf[congig_lenth+configbuf_lenth]; - - memset(sum_buf,0,sizeof(sum_buf)); - fseek(f,0,SEEK_SET); - - sprintf(iface_str, "%s %s", config_sign, if_name); - sprintf(iface_str2, "auto %s", if_name); - - leave_line = NULL; - leave_line2 = NULL; - - while(fgets(config_linebuf,256,f) != NULL) - { - if(strlen(config_linebuf) < 3 || leave_line2) //判断是否是空行 - { - strcat(sum_buf,config_linebuf); - continue; - } - - if(leave_line == NULL) - { - leave_line = strstr(config_linebuf, iface_str); - strcat(sum_buf,config_linebuf); - } - /*leave_line != NULL && leave_line2 !=NULL*/ - else if((leave_line2 = strstr(config_linebuf,iface_str)) - || (leave_line2 = strstr(config_linebuf,iface_str2))) - { - - strcat(sum_buf,config_linebuf); - } - /*leave_line != NULL && leave_line2 == NULL*/ - else - { - if(strstr(config_linebuf,conf_buff) == NULL) - { - strcat(sum_buf,config_linebuf); - } - } - - if(fgetc(f)==EOF) - { - break; - } - fseek(f,-1,SEEK_CUR); - - memset(config_linebuf,0,sizeof(config_linebuf)); - } - - printf("---sum_buf---->%s<----------/n",sum_buf); - remove(conf_path); - fclose(f); - - FILE *fp; - fp = fopen(conf_path,"w+"); - if(fp == NULL) - { - printf("OPEN CONFIG FALID/n"); - return; - } - fseek(fp,0,SEEK_SET); - fputs(sum_buf,fp); - fclose(fp); -} - - +#include +#include +#include +#include +#include +#include +#include + +#include "parsefile.h" + +#if 0 +/* + *从配置文件中读取相应的值 + *输入参数:1,配置文件路径 2,匹配标记 3,输出存储空间 + *并且排除了空行,“=”前后无内容,无“=”的情况 + */ +void read_config(char *conf_path,char *conf_name,char *config_buff) +{ + char config_linebuf[256]; + char line_name[40]; + char exchange_buf[256]; + char *config_sign = "="; + char *leave_line; + FILE *f; + f = fopen(conf_path,"r"); + if(f == NULL) + { + printf("OPEN CONFIG FALID/n"); + return 0; + } + fseek(f,0,SEEK_SET); + while(fgets(config_linebuf,256,f) != NULL) + { + if(strlen(config_linebuf) < 3) //判断是否是空行 + { + continue; + } + if (config_linebuf[strlen(config_linebuf)-1] == 10) //去除最后一位是/n的情况 + { + + memset(exchange_buf,0,sizeof(exchange_buf)); + strncpy(exchange_buf,config_linebuf,strlen(config_linebuf)-1); + memset(config_linebuf,0,sizeof(config_linebuf)); + strcpy(config_linebuf,exchange_buf); + } + memset(line_name,0,sizeof(line_name)); + leave_line = strstr(config_linebuf,config_sign); + if(leave_line == NULL) //去除无"="的情况 + { + continue; + } + int leave_num = leave_line - config_linebuf; + strncpy(line_name,config_linebuf,leave_num); + if(strcmp(line_name,conf_name) ==0) + { + strncpy(config_buff,config_linebuf+(leave_num+1),strlen(config_linebuf)-leave_num-1); + break; + } + if(fgetc(f)==EOF) + { + break; + } + fseek(f,-1,SEEK_CUR); + memset(config_linebuf,0,sizeof(config_linebuf)); + } + fclose(f); +} + +/* + *添加修改文件(当配置文件中存在标记字段,则进行修改,若不存在则进行添加) + * + *输入参数:1,配置文件路径 2,匹配标记 3,替换或添加的内容 + * + */ +void add_set_config(char *conf_path,char *conf_name,char *config_buff) +{ + + char config_linebuf[256]; + char line_name[40]; + char *config_sign = "="; + char *leave_line; + int alter_sign = 0; + + FILE *f; + f = fopen(conf_path,"r+"); + if(f == NULL) + { + printf("OPEN CONFIG FALID/n"); + return 0; + } + fseek(f,0,SEEK_END); + long congig_lenth = ftell(f); + int configbuf_lenth = strlen(config_buff); + configbuf_lenth = configbuf_lenth + 5; + char sum_buf[congig_lenth+configbuf_lenth]; + memset(sum_buf,0,sizeof(sum_buf)); + fseek(f,0,SEEK_SET); + while(fgets(config_linebuf,256,f) != NULL) + { + if(strlen(config_linebuf) < 3) //判断是否是空行 + { + strcat(sum_buf,config_linebuf); + continue; + } + leave_line = NULL; + leave_line = strstr(config_linebuf,config_sign); + if(leave_line == NULL) //去除无"="的情况 + { + strcat(sum_buf,config_linebuf); + continue; + } + int leave_num = leave_line - config_linebuf; + memset(line_name,0,sizeof(line_name)); + strncpy(line_name,config_linebuf,leave_num); + if(strcmp(line_name,conf_name) ==0) + { + strcat(sum_buf,config_buff); + strcat(sum_buf,"/n"); + alter_sign = 1; + } + else + { + strcat(sum_buf,config_linebuf); + } + if(fgetc(f)==EOF) + { + break; + } + fseek(f,-1,SEEK_CUR); + memset(config_linebuf,0,sizeof(config_linebuf)); + } + if(alter_sign == 0) + { + strcat(sum_buf,config_buff); + strcat(sum_buf,"/n"); + } + printf("---sum_buf---->%s<----------/n",sum_buf); + remove(conf_path); + fclose(f); + FILE *fp; + fp = fopen(conf_path,"w+"); + if(fp == NULL) + { + printf("OPEN CONFIG FALID/n"); + return 2; + } + fseek(fp,0,SEEK_SET); + fputs(sum_buf,fp); + fclose(fp); +} +/* + *删除配置文件内容 + * + *输入参数:1,匹配标记 + * + */ +void del_if_config(char *conf_name) +{ + char *conf_path = "/etc/network/interface"; + char config_linebuf[256]; + char line_name[40]; + char *config_sign = "="; + char *leave_line; + + FILE *f; + f = fopen(conf_path,"r+"); + if(f == NULL) + { + printf("OPEN CONFIG FALID/n"); + return 0; + } + fseek(f,0,SEEK_END); + long congig_lenth = ftell(f); + char sum_buf[congig_lenth+2]; + memset(sum_buf,0,sizeof(sum_buf)); + fseek(f,0,SEEK_SET); + while(fgets(config_linebuf,256,f) != NULL) + { + if(strlen(config_linebuf) < 3) //判断是否是空行 + { + strcat(sum_buf,config_linebuf); + continue; + } + leave_line = NULL; + leave_line = strstr(config_linebuf,config_sign); + if(leave_line == NULL) //去除无"="的情况 + { + strcat(sum_buf,config_linebuf); + continue; + } + int leave_num = leave_line - config_linebuf; + memset(line_name,0,sizeof(line_name)); + strncpy(line_name,config_linebuf,leave_num); + if(strcmp(line_name,conf_name) !=0) + { + strcat(sum_buf,config_linebuf); + } + + if(fgetc(f)==EOF) + { + break; + } + fseek(f,-1,SEEK_CUR); + memset(config_linebuf,0,sizeof(config_linebuf)); + } + printf("---sum_buf---->%s<----------/n",sum_buf); + remove(conf_path); + fclose(f); + FILE *fp; + fp = fopen(conf_path,"w+"); + if(fp == NULL) + { + printf("OPEN CONFIG FALID/n"); + return 2; + } + fseek(fp,0,SEEK_SET); + fputs(sum_buf,fp); + fclose(fp); +} + +#endif + +/* + *添加修改文件(当配置文件中存在标记字段,则进行修改,若不存在则进行添加) + * + *输入参数:1,接口名 2,匹配标记 3,替换或添加的内容 + * + */ + +void set_if_config(char *if_name, char *conf_name, char *conf_buff) +{ + char *conf_path = IFCONFIG_PATH; + char config_linebuf[IF_BUFF_LEN]; + char static_name[IF_BUFF_LEN] = {0}; + char iface_str[IF_BUFF_LEN] = {0}; + char iface_str2[IF_BUFF_LEN] = {0}; + char auto_str[IF_BUFF_LEN] = {0}; + char *config_sign = "iface"; + char *leave_line; + char *leave_line2; + int alter_sign = 0; + + FILE *f; + f = fopen(conf_path,"r+"); + if(f == NULL) + { + printf("OPEN CONFIG FALID\n"); + return; + } + + fseek(f,0,SEEK_END); + + long congig_lenth = ftell(f); + int configbuf_lenth = strlen(conf_buff); + configbuf_lenth = configbuf_lenth + 5; + char sum_buf[congig_lenth+configbuf_lenth]; + + memset(sum_buf,0,sizeof(sum_buf)); + fseek(f,0,SEEK_SET); + + sprintf(iface_str, "%s %s", config_sign, if_name); + sprintf(iface_str2, "auto %s", if_name); + sprintf(static_name, "iface %s inet static\n", if_name); + + leave_line = NULL; + leave_line2 = NULL; + + while(fgets(config_linebuf,IF_BUFF_LEN,f) != NULL) + { + if(strlen(config_linebuf) < 3 || leave_line2) //判断是否是空行 + { + strcat(sum_buf,config_linebuf); + continue; + } + + if(leave_line == NULL) + { + leave_line = strstr(config_linebuf, iface_str); + + if(leave_line) + { + strcat(sum_buf,static_name); + } + else + { + strcat(sum_buf,config_linebuf); + } + } + /*leave_line != NULL && leave_line2 !=NULL*/ + else if((leave_line2 = strstr(config_linebuf,iface_str)) + || (leave_line2 = strstr(config_linebuf,iface_str2))) + { + if(alter_sign == 0) + { + strcat(sum_buf,conf_buff); + alter_sign = 1; + } + + strcat(sum_buf,config_linebuf); + } + /*leave_line != NULL && leave_line2 == NULL*/ + else + { + if(strstr(config_linebuf,conf_name) != NULL) + { + strcat(sum_buf,conf_buff); + alter_sign = 1; + } + else + { + strcat(sum_buf,config_linebuf); + } + } + + if(fgetc(f)==EOF) + { + break; + } + fseek(f,-1,SEEK_CUR); + + memset(config_linebuf,0,sizeof(config_linebuf)); + } + + if(leave_line == NULL) + { + sprintf(auto_str, "auto %s\n", if_name); + sprintf(auto_str, "%s", static_name); + strcat(sum_buf,auto_str); + } + + if(alter_sign == 0) + { + //strcat(sum_buf,"\n"); + strcat(sum_buf, conf_buff); + } + + printf("---sum_buf---->%s<----------/n",sum_buf); + remove(conf_path); + fclose(f); + + FILE *fp; + fp = fopen(conf_path,"w+"); + if(fp == NULL) + { + printf("OPEN CONFIG FALID/n"); + return; + } + fseek(fp,0,SEEK_SET); + fputs(sum_buf,fp); + fclose(fp); + + return; +} + + +/* + *删除配置文件内容 + * + *输入参数:1,匹配标记 + * + */ +void del_if_config(char *if_name, char *conf_buff) +{ + char *conf_path = IFCONFIG_PATH; + char config_linebuf[IF_BUFF_LEN]; + char iface_str[IF_BUFF_LEN] = {0}; + char iface_str2[IF_BUFF_LEN] = {0}; + char auto_str[IF_BUFF_LEN] = {0}; + char *config_sign = "iface"; + char *leave_line; + char *leave_line2; + int alter_sign = 0; + + FILE *f; + f = fopen(conf_path,"r+"); + if(f == NULL) + { + printf("OPEN CONFIG FALID\n"); + return; + } + + fseek(f,0,SEEK_END); + + long congig_lenth = ftell(f); + int configbuf_lenth = strlen(conf_buff); + configbuf_lenth = configbuf_lenth + 5; + char sum_buf[congig_lenth+configbuf_lenth]; + + memset(sum_buf,0,sizeof(sum_buf)); + fseek(f,0,SEEK_SET); + + sprintf(iface_str, "%s %s", config_sign, if_name); + sprintf(iface_str2, "auto %s", if_name); + + leave_line = NULL; + leave_line2 = NULL; + + while(fgets(config_linebuf,256,f) != NULL) + { + if(strlen(config_linebuf) < 3 || leave_line2) //判断是否是空行 + { + strcat(sum_buf,config_linebuf); + continue; + } + + if(leave_line == NULL) + { + leave_line = strstr(config_linebuf, iface_str); + strcat(sum_buf,config_linebuf); + } + /*leave_line != NULL && leave_line2 !=NULL*/ + else if((leave_line2 = strstr(config_linebuf,iface_str)) + || (leave_line2 = strstr(config_linebuf,iface_str2))) + { + + strcat(sum_buf,config_linebuf); + } + /*leave_line != NULL && leave_line2 == NULL*/ + else + { + if(strstr(config_linebuf,conf_buff) == NULL) + { + strcat(sum_buf,config_linebuf); + } + } + + if(fgetc(f)==EOF) + { + break; + } + fseek(f,-1,SEEK_CUR); + + memset(config_linebuf,0,sizeof(config_linebuf)); + } + + printf("---sum_buf---->%s<----------/n",sum_buf); + remove(conf_path); + fclose(f); + + FILE *fp; + fp = fopen(conf_path,"w+"); + if(fp == NULL) + { + printf("OPEN CONFIG FALID/n"); + return; + } + fseek(fp,0,SEEK_SET); + fputs(sum_buf,fp); + fclose(fp); +} + + diff --git a/Platform/user/configm/configclient.c b/Platform/user/configm/config-test/comfigtest.c old mode 100755 new mode 100644 similarity index 76% rename from Platform/user/configm/configclient.c rename to Platform/user/configm/config-test/comfigtest.c index b54e9ed32..a5d5f4b88 --- a/Platform/user/configm/configclient.c +++ b/Platform/user/configm/config-test/comfigtest.c @@ -1,257 +1,146 @@ -#include -#include -#include "rpc.h" -#include "configm.h" -#include "ipconfig.h" - -rpc_client *config_client = NULL; - -rpc_client *config_client_get() -{ - if(config_client == NULL) - { - config_client = rpc_client_connect_ex("ConfigManger#0"); - if(config_client == NULL) - { - rpc_log_error("connect ConfigManger#0 error\n"); - return NULL; - } - } - - return config_client; -} - -ret_code config_construct_msg(uint config_type, uint64 config_id, - char* config_data, int config_len, - config_msg_t **config_msg, int *msg_len) -{ - config_msg_t *pconfig_msg; - - if(config_data == NULL) - { - return RET_NULLP; - } - - *msg_len = sizeof(config_msg_t) + config_len; - pconfig_msg= (config_msg_t *) malloc(*msg_len); - if(pconfig_msg == NULL) - { - return RET_NOMEM; - } - - pconfig_msg->source = CONFIG_FROM_WEB; - pconfig_msg->config_type = config_type; - pconfig_msg->config_id = config_id; - - memcpy(pconfig_msg->config_buff, config_data, config_len); - *config_msg = pconfig_msg; - - return RET_OK; -} - -ret_code config_destroy_msg(config_msg_t *config_msg, int msg_len) -{ - if(config_msg) - { - memset(config_msg, 0, msg_len); - free(config_msg); - } -} - - -ret_code web_config_exec_sync(uint config_type, uint64 config_id, - char* config_data, int config_len, - char**output, int *output_len) -{ - rpc_client * client = config_client_get(); - ret_code code = RET_OK ; - config_msg_t *config_msg; - int msg_len = 0; - - if(client == NULL) - { - return RET_ERR; - } - - code = config_construct_msg(config_type, config_id, config_data, - config_len, &config_msg, &msg_len); - ASSERT_RET(code); - - code = rpc_client_call(client, "ConfigManger#0", "cm_config_process", - config_msg, msg_len, (pointer)output, output_len); - ASSERT_RET_NO(code); - - config_destroy_msg(config_msg, msg_len); - - return code; -} - -ret_code web_config_exec_async(uint config_type, uint64 config_id, - char* config_data, int config_len, - rpc_callback callback, pointer data) - { - rpc_client * client = config_client_get(); - config_msg_t *config_msg; - int msg_len = 0; - - ret_code ret = RET_OK ; - - if(client == NULL) - { - return RET_ERR; - } - - ret = config_construct_msg(config_type, config_id, config_data, - config_len, &config_msg, &msg_len); - ASSERT_RET(ret); - - ret = rpc_client_call_async(client, "ConfigManger#0", "cm_config_process", - config_msg, msg_len, callback, data); - - config_destroy_msg(config_msg, msg_len); - - return ret; - } - - -//big data test -//async -//sync io - -static char* test_data = "给李彦宏先生的一封信 (2011-03-26 04:33:37)转载" - "标签: 杂谈 " - "您好,李彦宏先生。" - "上周我和出版社的朋友沈浩波先生去山东的纸厂销毁已经印刷完毕的一百多万册《独唱团》第二期,三百多吨的纸和工业垃圾一起进了化浆炉。" - "几百万的损失对您来说可能是个小数目,但是对一个出版公司来说几乎等于一年白干了,那还得是国内数得上数的大出版公司。" - "这个行业就是这么可怜的,一个一百多人的企业一年的利润还不如在上海炒一套公寓,而且分分钟要背上“黑心书商”的骂名。" - "但是沈浩波一直很高兴,因为他说和百度的谈判终于有眉目了,百度答应派人来商量百度文库的事情,李承鹏,慕容雪村,路金波,彭浩翔," - "都是文化行业里数一数二的畅销书作家,导演和出版商,大家都很激动,准备了好几个晚上各种资料。" - "于是昨天开始谈判了,您派来几个高傲的中层,始终不承认百度文库有任何的侵权行为。" - "你们不认为那包含了几乎全中国所有最新最旧图书的279万份文档是侵权,而是网民自己上传给大家共享的。" - "你这里只是一个平台。我觉得其实我们不用讨论平台不平台,侵权不侵权这个问题了,您其实什么都心知肚明。" - "您在美国有那么长时间的生活经历,现在您的妻子和女儿也都在美国,您一定知道如果百度开了一个叫百度美国的搜索引擎," - "然后把全美国所有的作家的书和所有音乐人的音乐都放在百度美国上面免费共享会是什么样的一个结果。" - "您不会这么做,您也不会和美国人去谈什么这只是一个平台,和我没关系,都是网民自己干的,互联网的精神是共享。" - "因为您知道这事儿只有在现在的中国才能成立。而且您也知道谁能欺负,谁不能欺负,您看,您就没有做一个百度影剧院,让大家共享共享最新的电影电视剧。" - "您也许不太了解出版行业,我可以简单的给您介绍一下。1999年,十二年前,我的书卖18元一本,2011年,卖25元一本,很多读者还都嫌贵。" - "您知道这十二年间,纸张,人工,物流都涨了多少倍,但出版商一直不敢提太多价,因为怕被骂,文化人脸皮都薄。" - "一本25元的书,一般作者的版税是百分之8,可以赚2块钱,其中还要交三毛钱左右的税,也就是可以赚一块七。" - "一本书如果卖两万本,已经算是畅销,一个作家两年能写一本,一本可以赚三万四,一年赚一万七,如果他光写书," - "他得不吃不喝写一百年才够在大城市的城郊买套像样的两居室。假设一本书卖10元,里面的构成是这样的,作家赚1元,印刷成本2元多," - "出版社赚1元多,书店赚5元。有点名气的作家出去签售做宣传,住的都是三星的酒店,来回能坐上飞机已经算不错了。" - "出行标准一定还不如你们的低级别员工。最近几年我已经不出席任何宣传签售活动了,但是在2004年前," - "我至少做过几十场各个城市的宣传活动,而在那个时候,我已经是行业里的畅销书作家,我从没住到过一次300以上的酒店," - "有的时候和出版社陪同的几个人得在机场等好几个小时,因为打折的那班飞机得傍晚起飞,而多住半天酒店得加钱。" - "这个行业就是这么窘迫的。这个行业里最顶尖的企业家,年收入就几百万。出版业和互联网业,本是两个级别相当的行业," - "你们是用几百亿身价和私人飞机豪华游艇来算企业家身价的,我们这个行业里的企业家们,我几乎没见过一个出行坐头等舱的。" - "我们倒不是眼红你们有钱,我们只是觉得,你们都那么富有了,为何还要一分钱都不肯花从我们这个行业里强行获得免费的知识版权。" - "音乐人还可以靠商演赚钱,而你让作家和出版行业如何生存。也许你说,传统出版会始终消亡,但那不代表出版行业就该如此的不体面。" - "而且文艺作品和出版行业是不会消亡的,只是换了一个介质,一开始它们被画在墙上,后来刻在竹子上,现在有书,未来也许有别的科技," - "但版权是永远存在的。我写这些并不是代表这个行业向你们哭穷," - "但这的确中国唯一一个拥有很多的资源与生活息息相关却没有什么财富可言的行业。尤其在盗版和侵权的伤害之下。" - "我们也不是要求你们把百度文库关了,我们只是希望百度文库可以主动对版权进行保护,等未来数字阅读成熟以后," - "说不定百度文库还能成为中国作家生活保障的来源,而不是现在这样,成为行业公敌众矢之的。因为没有永远的敌人,也没有永远的利益。" - "我在2006年还和磨铁图书的沈浩波先生打过笔仗,为了现代诗互相骂的不可开交,而现在却是朋友和合作伙伴。" - "百度文库完全可以成为造福作家的基地,而不是埋葬作家的墓地。" - "在我们这个行业里,我算是生活得好的。李彦宏先生,也许我们一样,虽不畏惧,但并不喜欢这些是非恩怨,我喜欢晒晒太阳玩泥巴," - "你喜欢晒晒太阳种种花。无论你怎么共享我的知识版权,至少咱俩还能一起晒晒太阳,毕竟我赛车还能养活自己和家庭," - "但对于大部分作家来说,他们理应靠着传统的出版和数字出版过着体面的生活。也许他们未必能够有自己的院子晒太阳。" - "您的产品会把他们赶回阴暗的小屋里为了生活不停的写,而您头上的太阳也并不会因此大一些。" - "中国那么多的写作者被迫为百度无偿的提供了无数的知识版权和流量,他们不光没有来找过百度麻烦或者要求百度分点红," - "甚至还要承受百度拥趸们的侮辱以及百度员工谈判时的蔑视。您现在是中国排名第一的企业家,作为企业家的表率," - "您必须对百度文库给出版行业带来的伤害有所表态。倘若百度文库始终不肯退一步,那我可以多走几步,也许在不远的某天," - "在您北京的办公室里往楼下望去,您可以看见我。" - " 祝 您的女儿为她的父亲感到骄傲" - " 韩寒" - "2011年 3月26日" - "end"; - -void ip_set_callback(ret_code code, pointer output, - int output_len, pointer data) -{ - int i; - - //rpc_log_info("call %s i is %d len is %d", rpc_code_format(code), *(int *)data, output_len); - - - if(code != RET_OK) - { - rpc_log_info("ERROR: %s", (char *)output); - } - -} - -int main(int argc, char **argv) -{ - - rpc_client *client = rpc_client_connect_ex("ConfigManger#0"); - ip_config_t ip_conf; - ip_config_t *pip_conf; - int i = 0, result; - ret_code code; - char* output = NULL; - int output_len; - - strcpy(ip_conf.ifname, "ens39"); - ip_conf.prefix.s_addr = inet_addr("192.168.80.1"); - ip_conf.family=AF_INET; - ip_conf.prefixlen = 24; - - code = rpc_client_call(client, "ConfigManger#0", "test_big_data", test_data, - strlen(test_data), NULL, NULL); - ASSERT_RET_NO(code); - - /*code = web_config_exec_sync(CM_CONFIG_ADD, IPCONFIG_V4, - (pointer)&ip_conf, sizeof(ip_conf), &output, &output_len); - - rpc_log_info("call CM_CONFIG_ADD %s: %s\n", rpc_code_format(code), output);*/ - - code = web_config_exec_sync(CM_CONFIG_DEL, IPCONFIG_V4, - (pointer)&ip_conf, sizeof(ip_conf), &output, &output_len); - rpc_log_info("call CM_CONFIG_DEL %s: %s\n", rpc_code_format(code), output); - - /*code = web_config_exec_sync(CM_CONFIG_SET, IPCONFIG_V4, - (pointer)&ip_conf, sizeof(ip_conf), &output, &output_len); - rpc_log_info("call CM_CONFIG_SET %s: %s\n", rpc_code_format(code), output);*/ - - code = web_config_exec_sync(CM_CONFIG_GET_ALL, IPCONFIG_V4, - (pointer)&ip_conf, sizeof(ip_conf), &output, &output_len); - - rpc_log_info("call CM_CONFIG_GET_ALL %s: %s\n", rpc_code_format(code), output); - - for(i = 0; i < output_len / sizeof(ip_config_t); i++) - { - pip_conf = (ip_config_t *)output; - printf("ifname is %s\n",pip_conf[i].ifname); - printf("family is %d\n", pip_conf[i].family); - printf("ip is %s\n", inet_ntoa(pip_conf[i].prefix)); - printf("prefix len is %d\n", pip_conf[i].prefixlen); - } - - code = web_config_exec_sync(CM_CONFIG_GET, IPCONFIG_V4, - (pointer)&ip_conf, sizeof(ip_conf), &output, &output_len); - rpc_log_info("call %s: %s\n", rpc_code_format(code), output); - - /* code = web_config_exec_async(CM_CONFIG_ADD, IPCONFIG_V4, (pointer)&ip_conf, sizeof(ip_conf), ip_set_callback, &i); - rpc_log_info("call CM_CONFIG_ADD: %s\n", rpc_code_format(code)); - - code = web_config_exec_async(CM_CONFIG_DEL, IPCONFIG_V4, (pointer)&ip_conf, sizeof(ip_conf), ip_set_callback, &i); - rpc_log_info("call CM_CONFIG_DEL: %s\n", rpc_code_format(code)); - - code = web_config_exec_async(CM_CONFIG_SET, IPCONFIG_V4, (pointer)&ip_conf, sizeof(ip_conf), ip_set_callback, &i); - rpc_log_info("call CM_CONFIG_SET: %s\n", rpc_code_format(code)); - - code = web_config_exec_async(CM_CONFIG_GET, IPCONFIG_V4, (pointer)&ip_conf, sizeof(ip_conf), ip_set_callback, &i); - rpc_log_info("call CM_CONFIG_GET: %s\n", rpc_code_format(code)); - - code = web_config_exec_async(CM_CONFIG_GET_ALL, IPCONFIG_V4, (pointer)&ip_conf, sizeof(ip_conf), ip_set_callback, &i); - rpc_log_info("call CM_CONFIG_GET_ALL: %s\n", rpc_code_format(code));*/ - - - printf("test ok\n"); - for (;;) { - rpc_sleep(1000); - } - return EXIT_SUCCESS; -} - +#include +#include +#include "rpc.h" +#include "configm.h" +#include "ipconfig.h" + +//big data test +//async +//sync io + +static char* test_data = "给李彦宏先生的一封信 (2011-03-26 04:33:37)转载" + "标签: 杂谈 " + "您好,李彦宏先生。" + "上周我和出版社的朋友沈浩波先生去山东的纸厂销毁已经印刷完毕的一百多万册《独唱团》第二期,三百多吨的纸和工业垃圾一起进了化浆炉。" + "几百万的损失对您来说可能是个小数目,但是对一个出版公司来说几乎等于一年白干了,那还得是国内数得上数的大出版公司。" + "这个行业就是这么可怜的,一个一百多人的企业一年的利润还不如在上海炒一套公寓,而且分分钟要背上“黑心书商”的骂名。" + "但是沈浩波一直很高兴,因为他说和百度的谈判终于有眉目了,百度答应派人来商量百度文库的事情,李承鹏,慕容雪村,路金波,彭浩翔," + "都是文化行业里数一数二的畅销书作家,导演和出版商,大家都很激动,准备了好几个晚上各种资料。" + "于是昨天开始谈判了,您派来几个高傲的中层,始终不承认百度文库有任何的侵权行为。" + "你们不认为那包含了几乎全中国所有最新最旧图书的279万份文档是侵权,而是网民自己上传给大家共享的。" + "你这里只是一个平台。我觉得其实我们不用讨论平台不平台,侵权不侵权这个问题了,您其实什么都心知肚明。" + "您在美国有那么长时间的生活经历,现在您的妻子和女儿也都在美国,您一定知道如果百度开了一个叫百度美国的搜索引擎," + "然后把全美国所有的作家的书和所有音乐人的音乐都放在百度美国上面免费共享会是什么样的一个结果。" + "您不会这么做,您也不会和美国人去谈什么这只是一个平台,和我没关系,都是网民自己干的,互联网的精神是共享。" + "因为您知道这事儿只有在现在的中国才能成立。而且您也知道谁能欺负,谁不能欺负,您看,您就没有做一个百度影剧院,让大家共享共享最新的电影电视剧。" + "您也许不太了解出版行业,我可以简单的给您介绍一下。1999年,十二年前,我的书卖18元一本,2011年,卖25元一本,很多读者还都嫌贵。" + "您知道这十二年间,纸张,人工,物流都涨了多少倍,但出版商一直不敢提太多价,因为怕被骂,文化人脸皮都薄。" + "一本25元的书,一般作者的版税是百分之8,可以赚2块钱,其中还要交三毛钱左右的税,也就是可以赚一块七。" + "一本书如果卖两万本,已经算是畅销,一个作家两年能写一本,一本可以赚三万四,一年赚一万七,如果他光写书," + "他得不吃不喝写一百年才够在大城市的城郊买套像样的两居室。假设一本书卖10元,里面的构成是这样的,作家赚1元,印刷成本2元多," + "出版社赚1元多,书店赚5元。有点名气的作家出去签售做宣传,住的都是三星的酒店,来回能坐上飞机已经算不错了。" + "出行标准一定还不如你们的低级别员工。最近几年我已经不出席任何宣传签售活动了,但是在2004年前," + "我至少做过几十场各个城市的宣传活动,而在那个时候,我已经是行业里的畅销书作家,我从没住到过一次300以上的酒店," + "有的时候和出版社陪同的几个人得在机场等好几个小时,因为打折的那班飞机得傍晚起飞,而多住半天酒店得加钱。" + "这个行业就是这么窘迫的。这个行业里最顶尖的企业家,年收入就几百万。出版业和互联网业,本是两个级别相当的行业," + "你们是用几百亿身价和私人飞机豪华游艇来算企业家身价的,我们这个行业里的企业家们,我几乎没见过一个出行坐头等舱的。" + "我们倒不是眼红你们有钱,我们只是觉得,你们都那么富有了,为何还要一分钱都不肯花从我们这个行业里强行获得免费的知识版权。" + "音乐人还可以靠商演赚钱,而你让作家和出版行业如何生存。也许你说,传统出版会始终消亡,但那不代表出版行业就该如此的不体面。" + "而且文艺作品和出版行业是不会消亡的,只是换了一个介质,一开始它们被画在墙上,后来刻在竹子上,现在有书,未来也许有别的科技," + "但版权是永远存在的。我写这些并不是代表这个行业向你们哭穷," + "但这的确中国唯一一个拥有很多的资源与生活息息相关却没有什么财富可言的行业。尤其在盗版和侵权的伤害之下。" + "我们也不是要求你们把百度文库关了,我们只是希望百度文库可以主动对版权进行保护,等未来数字阅读成熟以后," + "说不定百度文库还能成为中国作家生活保障的来源,而不是现在这样,成为行业公敌众矢之的。因为没有永远的敌人,也没有永远的利益。" + "我在2006年还和磨铁图书的沈浩波先生打过笔仗,为了现代诗互相骂的不可开交,而现在却是朋友和合作伙伴。" + "百度文库完全可以成为造福作家的基地,而不是埋葬作家的墓地。" + "在我们这个行业里,我算是生活得好的。李彦宏先生,也许我们一样,虽不畏惧,但并不喜欢这些是非恩怨,我喜欢晒晒太阳玩泥巴," + "你喜欢晒晒太阳种种花。无论你怎么共享我的知识版权,至少咱俩还能一起晒晒太阳,毕竟我赛车还能养活自己和家庭," + "但对于大部分作家来说,他们理应靠着传统的出版和数字出版过着体面的生活。也许他们未必能够有自己的院子晒太阳。" + "您的产品会把他们赶回阴暗的小屋里为了生活不停的写,而您头上的太阳也并不会因此大一些。" + "中国那么多的写作者被迫为百度无偿的提供了无数的知识版权和流量,他们不光没有来找过百度麻烦或者要求百度分点红," + "甚至还要承受百度拥趸们的侮辱以及百度员工谈判时的蔑视。您现在是中国排名第一的企业家,作为企业家的表率," + "您必须对百度文库给出版行业带来的伤害有所表态。倘若百度文库始终不肯退一步,那我可以多走几步,也许在不远的某天," + "在您北京的办公室里往楼下望去,您可以看见我。" + " 祝 您的女儿为她的父亲感到骄傲" + " 韩寒" + "2011年 3月26日" + "end"; + +void ip_set_callback(ret_code code, pointer output, + int output_len, pointer data) +{ + int i; + + //rpc_log_info("call %s i is %d len is %d", rpc_code_format(code), *(int *)data, output_len); + + + if(code != RET_OK) + { + rpc_log_info("ERROR: %s", (char *)output); + } + +} + +int main(int argc, char **argv) +{ + + rpc_client *client = rpc_client_connect_ex("ConfigManger#0"); + ip_config_t ip_conf; + ip_config_t *pip_conf; + int i = 0, result; + ret_code code; + char* output = NULL; + int output_len; + + strcpy(ip_conf.ifname, "ens39"); + ip_conf.prefix.s_addr = inet_addr("192.168.80.1"); + ip_conf.family=AF_INET; + ip_conf.prefixlen = 24; + + code = rpc_client_call(client, "ConfigManger#0", "test_big_data", test_data, + strlen(test_data), NULL, NULL); + ASSERT_RET_NO(code); + + /*code = web_config_exec_sync(CM_CONFIG_ADD, IPCONFIG_V4, + (pointer)&ip_conf, sizeof(ip_conf), &output, &output_len); + + rpc_log_info("call CM_CONFIG_ADD %s: %s\n", rpc_code_format(code), output);*/ + + code = web_config_exec_sync(CM_CONFIG_DEL, IPCONFIG_V4, + (pointer)&ip_conf, sizeof(ip_conf), &output, &output_len); + rpc_log_info("call CM_CONFIG_DEL %s: %s\n", rpc_code_format(code), output); + + /*code = web_config_exec_sync(CM_CONFIG_SET, IPCONFIG_V4, + (pointer)&ip_conf, sizeof(ip_conf), &output, &output_len); + rpc_log_info("call CM_CONFIG_SET %s: %s\n", rpc_code_format(code), output);*/ + + code = web_config_exec_sync(CM_CONFIG_GET_ALL, IPCONFIG_V4, + (pointer)&ip_conf, sizeof(ip_conf), &output, &output_len); + + rpc_log_info("call CM_CONFIG_GET_ALL %s: %s\n", rpc_code_format(code), output); + + for(i = 0; i < output_len / sizeof(ip_config_t); i++) + { + pip_conf = (ip_config_t *)output; + printf("ifname is %s\n",pip_conf[i].ifname); + printf("family is %d\n", pip_conf[i].family); + printf("ip is %s\n", inet_ntoa(pip_conf[i].prefix)); + printf("prefix len is %d\n", pip_conf[i].prefixlen); + } + + code = web_config_exec_sync(CM_CONFIG_GET, IPCONFIG_V4, + (pointer)&ip_conf, sizeof(ip_conf), &output, &output_len); + rpc_log_info("call %s: %s\n", rpc_code_format(code), output); + + /* code = web_config_exec_async(CM_CONFIG_ADD, IPCONFIG_V4, (pointer)&ip_conf, sizeof(ip_conf), ip_set_callback, &i); + rpc_log_info("call CM_CONFIG_ADD: %s\n", rpc_code_format(code)); + + code = web_config_exec_async(CM_CONFIG_DEL, IPCONFIG_V4, (pointer)&ip_conf, sizeof(ip_conf), ip_set_callback, &i); + rpc_log_info("call CM_CONFIG_DEL: %s\n", rpc_code_format(code)); + + code = web_config_exec_async(CM_CONFIG_SET, IPCONFIG_V4, (pointer)&ip_conf, sizeof(ip_conf), ip_set_callback, &i); + rpc_log_info("call CM_CONFIG_SET: %s\n", rpc_code_format(code)); + + code = web_config_exec_async(CM_CONFIG_GET, IPCONFIG_V4, (pointer)&ip_conf, sizeof(ip_conf), ip_set_callback, &i); + rpc_log_info("call CM_CONFIG_GET: %s\n", rpc_code_format(code)); + + code = web_config_exec_async(CM_CONFIG_GET_ALL, IPCONFIG_V4, (pointer)&ip_conf, sizeof(ip_conf), ip_set_callback, &i); + rpc_log_info("call CM_CONFIG_GET_ALL: %s\n", rpc_code_format(code));*/ + + + printf("test ok\n"); + for (;;) { + rpc_sleep(1000); + } + return EXIT_SUCCESS; +}