12-Openwrt libubox ulog md5 list
7711 단어 Openwrt
libubox 는 주로 두 가지 기능 을 제공 합 니 다.
다시 말하자면, libubox 는 당신 이 새 판 openwrt 를 하 는 데 필수 적 인 것 이 므 로, 그것 도 모두 가 연구 하고 공부 할 가치 가 있다 고 믿 습 니 다.
libubox 소스 코드 는 다음 과 같 습 니 다. 우리 가 호출 한 모든 인 터 페 이 스 는 안에서 찾 을 수 있 고 그 원 리 를 볼 수 있 습 니 다.
libubox-2016-11-29$ ls
avl.c blobmsg_json.h jshn.c list.h ulog.c ustream.h
avl-cmp.c CMakeCache.txt json_script.c lua ulog.h utils.c
avl-cmp.h CMakeFiles json_script.h Makefile uloop.c utils.h
avl.h cmake_install.cmake kvlist.c md5.c uloop-epoll.c vlist.c
base64.c CMakeLists.txt kvlist.h md5.h uloop.h vlist.h
blob.c examples libblobmsg_json.a runqueue.c uloop-kqueue.c
blob.h install_manifest.txt libblobmsg_json.so runqueue.h usock.c
blobmsg.c ipkg-install libjson_script.so safe_list.c usock.h
blobmsg.h ipkg-mtk_24kec libubox.a safe_list.h ustream.c
blobmsg_json.c jshn libubox.so sh ustream-fd.c
1. 환경 구축
먼저 package 아래 에 ztest 모듈 을 추가 하고 해당 하 는 Makefile 을 수정 하 며 config 에
CONFIG_PACKAGE_ztest=y
옵션 을 추가 합 니 다.linye@ubuntu:~/packages/ztest$ tree
.
├── files
│ └── ztest.init
├── Makefile
└── src
├── Makefile
├── ubus.c
├── ztest.c
└── ztest.h
2 directories, 6 files
컴 파일 할 때 전부 컴 파일 하지 않 고 ztest 모듈 을 직접 컴 파일 하면 됩 니 다.
make package/ztest/compile V=s
컴 파일 을 마치 고
14.07/build_dir/target-mipsel_1004kc_uClibc-0.9.33.2/ztest_1.0/
아래 에서 최신 ztest 파일 을 복사 하여 판 / usr / bin / 아래 에 올 리 면 됩 니 다.2. syslog 로 디 버 깅 로그 인쇄
vim ztest/src/ztest.h
#include
extern int debugLevel;
enum{
MSG_ERROR,
MSG_WARNING,
MSG_INFO,
MSG_DEBUG,
MSG_MSGDUMP,
MSG_EXCESSIVE,
};
#define dbg_printf(level, ...) \
do \
{ \
if (debugLevel > level) \
{ \
syslog(LOG_WARNING, __VA_ARGS__); \
} \
} \
while (0)
vim ztest/src/ztest.c
int debugLevel = MSG_DEBUG;
int main(int argc, char **argv){
dbg_printf(MSG_INFO, "ztest
");
return 1;
}
여 기 는 시스템 인터페이스 syslog 를 사용 하여 디 버 깅 정 보 를 인쇄 합 니 다. 코드 가 달 린 후에 logread 를 사용 하여 디 버 깅 정 보 를 볼 수 있 습 니 다.
logread - f 를 사용 하면 온라인 으로 log 를 볼 수 있 습 니 다.
root@zihome:/# logread -f
Fri May 31 16:49:07 2019 user.warn syslog: ztest
3. libubox / ulog 디 버 깅 로그 인쇄
위 에서 사용 하 는 syslog 는 우리 가 다시 한 번 포장 한 것 입 니 다. 사실은 libubox 에서 도 이 인 터 페 이 스 를 해결 해 주 었 습 니 다. 우 리 는 초기 화 만 하면 됩 니 다.
libubox / ulog. c 의 소스 코드 를 보면 간단 합 니 다. 세 가지 인 터 페 이 스 를 봉 인 했 습 니 다.
ULOG_KMSG、ULOG_STDIO、ULOG_SYSLOG
각각 대응 하고 /dev/kmsg、fprintf、vsyslog
세 가지 형식 입 니 다.우리 가 선택 했다 면 ULOG_SYSLOG
위의 syslog 와 똑 같 을 것 이다.if (_ulog_channels & ULOG_KMSG)
{
va_start(ap, fmt);
ulog_kmsg(priority, fmt, ap);
va_end(ap);
}
if (_ulog_channels & ULOG_STDIO)
{
va_start(ap, fmt);
ulog_stdio(priority, fmt, ap);
va_end(ap);
}
if (_ulog_channels & ULOG_SYSLOG)
{
va_start(ap, fmt);
ulog_syslog(priority, fmt, ap);
va_end(ap);
}
아래 두 개의 인 터 페 이 스 를 호출 하면 사용 할 수 있다.
void log_test(void)
{
ulog_open(ULOG_SYSLOG, LOG_USER, NULL);
ulog_threshold(LOG_INFO);
ULOG_INFO("info
");
ULOG_NOTE("notice
");
ULOG_WARN("warn
");
ULOG_ERR("err
");
ulog_close();
}
4. libubox / md5 인터페이스 사용
libubox 는 md5 의 두 가지 알고리즘 을 제공 합 니 다. 하 나 는 데이터 의 md5 이 고 다른 하 나 는 파일 의 md5sum 입 니 다.
구체 적 으로 다음 과 같이 사용 하면 비교적 간단 하 다.
void md5_test(void)
{
char* data = "test data";
unsigned char buf[16] = {0};
md5_ctx_t ctx;
md5_begin(&ctx);
md5_hash(data, strlen(data), &ctx);
md5_end(buf, &ctx);
#if 1
{
char PrintBuff[1024];
int uiPrintLen = 0;
uiPrintLen = sprintf((PrintBuff + uiPrintLen), "test data md5:");
for(int ii = 0; ii < 16; ii++)
{
uiPrintLen += sprintf((PrintBuff + uiPrintLen),"%02x ", buf[ii]);
}
dbg_printf(MSG_INFO, PrintBuff);
}
#endif
memset(buf, 0, sizeof(buf));
md5sum("/usr/bin/ztest", buf);
#if 1
{
char PrintBuff[1024];
int uiPrintLen = 0;
uiPrintLen = sprintf((PrintBuff + uiPrintLen), "/usr/bin/ztest md5sum:");
for(int ii = 0; ii < 16; ii++)
{
uiPrintLen += sprintf((PrintBuff + uiPrintLen),"%02x ", buf[ii]);
}
dbg_printf(MSG_INFO, PrintBuff);
}
#endif
}
5. libubox / list 인터페이스 사용
libubox 에 있 는 list (자세히 보면 커 널 에서 이 식 된 것 같 습 니 다) 는 침입 식 링크 라 고 할 수 있 습 니 다. 이런 list 의 가장 두 드 러 진 특징 은 노드 에 데이터 가 포함 되 어 있 지 않 은 반면 list 노드 는 특정한 데이터 구조 에 포 함 된 것 입 니 다.
이렇게 하면 두 가지 좋 은 점 이 있다.
https://segmentfault.com/a/1190000012042209
typedef struct _ListData {
char data;
struct list_head list;
} ListData;
void list_test(void)
{
ListData mylist, *tmp = NULL;
struct list_head *pos = NULL, *p = NULL;
char ch = '0';
long dec = 1;
long dec_number = 0;
int i = 0;
INIT_LIST_HEAD(&mylist.list);
while((ch == '0') || (ch == '1')) {
tmp = (ListData *)malloc(sizeof(ListData));
tmp->data = ch;
list_add(&(tmp->list), &(mylist.list));
printf("list_add %d
", tmp->data);
ch = '1';
i++;
if(i == 10)
{
ch = '2';
}
}
//
list_for_each(pos, &mylist.list) {
tmp = list_entry(pos, ListData,list);
printf("list_entry %d
", tmp->data);
dec_number += (int)(tmp->data - '0') * dec;
dec *= 2;
}
printf("Decimal number is %ld
", dec_number);
//
list_for_each_safe(pos, p, &mylist.list) {
tmp = list_entry(pos, ListData, list);
printf("list_del %d
", tmp->data);
list_del(pos);
free(tmp);
}
if(list_empty(&mylist.list)){
printf("The list now is empty!
");
}
return;
}
코드 는 github 에 있 습 니 다:https://github.com/creatorly/TestCode/tree/master/openwrt/ztest