12-Openwrt libubox ulog md5 list

7711 단어 Openwrt
openwrt 아래 의 libubox 라 이브 러 리 는 매우 강력 하 다 고 할 수 있 습 니 다. 많은 라 이브 러 리 가 그 중의 인터페이스 로 호출 됩 니 다. 예 를 들 어 ubus, uhpd 등 입 니 다.
libubox 는 주로 두 가지 기능 을 제공 합 니 다.
  • 이벤트 구동 을 바탕 으로 하 는 메커니즘 을 제공한다.
  • 다양한 개발 지원 인 터 페 이 스 를 제공한다.(예 를 들 어 링크, kv 링크, 균형 찾기 이 진 트 리, md5, json)
  • libubox 를 사용 하여 개발 한 장점 은 다음 과 같은 몇 가지 가 있 습 니 다.
  • 프로그램 이 이벤트 구동 을 바탕 으로 현재 단일 스 레 드 에서 여러 작업 을 처리 할 수 있 습 니 다.
  • libubox 가 제공 하 는 개발 API 를 바탕 으로 개발 진 도 를 가속 화 하 는 동료 들 이 프로그램의 안정성 을 높 일 수 있다.
  • 프로그램 을 openwrt 의 구조 에 더욱 잘 융합 시 킬 수 있 습 니 다. 새로운 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 노드 는 특정한 데이터 구조 에 포 함 된 것 입 니 다.
    이렇게 하면 두 가지 좋 은 점 이 있다.
  • 링크 자체 가 내 보 내 는 방법 이 비교적 간결 하 다. 데이터 의 조작 과 관련 되 지 않 기 때문에 list 의 모든 API 는 통용 할 수 있다.
  • 모든 데이터 형식 에 링크 작업 을 수행 하지 않 아 도 됩 니 다. 물론 일반적인 언어 에서 템 플 릿 을 사용 하여 이러한 유 니 버 설 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

    좋은 웹페이지 즐겨찾기