142 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			142 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
#include <stdio.h>
 | 
						|
#include <stdlib.h>
 | 
						|
#include <string.h>
 | 
						|
#include <kwrap/cmdsys.h>
 | 
						|
 | 
						|
 | 
						|
const char VERSION_INFO_BEGIN[] __attribute__((section (".nvtversioninfo.begin")))  = "version_info_begin";
 | 
						|
const char VERSION_INFO_END[] __attribute__((section (".nvtversioninfo.end")))      = "version_info_end";
 | 
						|
 | 
						|
extern char _section_verinfostart[] __attribute__((weak));
 | 
						|
extern char _section_verinfoend[] __attribute__((weak));
 | 
						|
 | 
						|
#define MDU_NAME_LEN    40
 | 
						|
#define MDU_MAX_COUNT   500
 | 
						|
static char  ver_name[MDU_NAME_LEN];
 | 
						|
static char  mdu_name[MDU_NAME_LEN];
 | 
						|
static char  sha1_name[MDU_NAME_LEN];
 | 
						|
typedef struct _UNIT{
 | 
						|
    char* p_name;
 | 
						|
    char* p_ver;
 | 
						|
    void* p_sha1;
 | 
						|
}UNIT;
 | 
						|
 | 
						|
static UNIT p_unit[MDU_MAX_COUNT];
 | 
						|
 | 
						|
static int comp( const void * p, const void * q)
 | 
						|
{
 | 
						|
    UNIT* p1 = (UNIT*)p;
 | 
						|
    UNIT* q1 = (UNIT*)q;
 | 
						|
    return strcmp(p1->p_name,q1->p_name);
 | 
						|
}
 | 
						|
 | 
						|
static char * find_next_string(char** pp)
 | 
						|
{
 | 
						|
    char* p = NULL;
 | 
						|
    while(*(*pp)++==0);
 | 
						|
    p = (*pp) - 1;
 | 
						|
    while(*(*pp)++!=0);
 | 
						|
    return p;
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
    Dump version information of Nvt's library(.a)
 | 
						|
 | 
						|
    Display all library version information. This function will list library's
 | 
						|
\n  module_name     version_code    build_date & build_time
 | 
						|
 | 
						|
    Example:
 | 
						|
    @code
 | 
						|
    {
 | 
						|
           Startup.a   1.00.000  Sep 11 2013, 14:05:12
 | 
						|
        AppControl.a   1.00.002  Sep 11 2013, 14:11:06
 | 
						|
           Capture.a   1.00.005  Sep 11 2013, 14:11:20
 | 
						|
            DevMan.a   1.00.002  Sep 11 2013, 14:11:22
 | 
						|
          LviewNvt.a   1.00.006  Sep 11 2013, 14:11:24
 | 
						|
             Debug.a   1.00.012  Sep 11 2013, 14:04:55
 | 
						|
            Kernel.a   1.01.006  Sep 11 2013, 14:04:59
 | 
						|
            ...
 | 
						|
            ...
 | 
						|
    }
 | 
						|
    @endcode
 | 
						|
*/
 | 
						|
void dump_verinfo(void)
 | 
						|
{
 | 
						|
    char    * p;
 | 
						|
    char    * p_name;
 | 
						|
    char    * p_ver;
 | 
						|
    char    * p_sha1;
 | 
						|
    unsigned int  curLen;
 | 
						|
    unsigned int  i,j;
 | 
						|
    unsigned int  n = 0;
 | 
						|
 | 
						|
    unsigned char *version_begin_addr = (unsigned char *)(_section_verinfostart);
 | 
						|
    unsigned char *version_end_addr = (unsigned char *)(_section_verinfoend);
 | 
						|
 | 
						|
    printf("********************************************************************************\r\n");
 | 
						|
    while(version_end_addr > version_begin_addr)
 | 
						|
    {
 | 
						|
        p = find_next_string((char**)&version_begin_addr);
 | 
						|
 | 
						|
        if(p != NULL)
 | 
						|
        {
 | 
						|
            p_name = p;
 | 
						|
            p_ver = strstr(p,"#");
 | 
						|
            if(p_ver==NULL) {
 | 
						|
                continue;
 | 
						|
            }
 | 
						|
            p_ver++;
 | 
						|
            p_sha1 = strstr(p_ver,"_");
 | 
						|
			if(p_sha1==NULL) {
 | 
						|
                continue;
 | 
						|
            }
 | 
						|
            p_sha1++;
 | 
						|
            p_unit[n].p_name = p_name;
 | 
						|
            p_unit[n].p_ver = p_ver;
 | 
						|
            p_unit[n].p_sha1 = p_sha1;
 | 
						|
            n++;
 | 
						|
            if(n >= MDU_MAX_COUNT)
 | 
						|
            {
 | 
						|
                printf("Module count exceed %03d\r\n", MDU_MAX_COUNT);
 | 
						|
                return;
 | 
						|
            }
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    qsort ( p_unit, n, sizeof (UNIT) , comp) ;
 | 
						|
 | 
						|
    for(i=0;i<n;i++)
 | 
						|
    {
 | 
						|
        memset((void *)mdu_name, 0x00, sizeof(mdu_name));
 | 
						|
        memset((void *)ver_name, 0x00, sizeof(ver_name));
 | 
						|
        memset((void *)sha1_name, 0x00, sizeof(sha1_name));
 | 
						|
 | 
						|
        sscanf((char *)p_unit[i].p_name, "%[^#]", mdu_name);
 | 
						|
        sscanf((char *)p_unit[i].p_ver, "%[^_]", ver_name);
 | 
						|
        strncpy(sha1_name,p_unit[i].p_sha1,sizeof(sha1_name)-1);
 | 
						|
 | 
						|
        curLen = strlen(mdu_name);
 | 
						|
        mdu_name[curLen] = '.';
 | 
						|
        mdu_name[curLen + 1] = 'a';
 | 
						|
        //mdu_name[curLen + 2] = 0x0;
 | 
						|
        if((i % 2) == 0)
 | 
						|
        {
 | 
						|
            for(j = (curLen + 2); j <= 35; j++)
 | 
						|
            {
 | 
						|
                mdu_name[j] = '-';
 | 
						|
            }
 | 
						|
        }
 | 
						|
        printf("%-36s %-13s %-20s\r\n", mdu_name, ver_name, sha1_name);
 | 
						|
    }
 | 
						|
 | 
						|
    printf("********************************************************************************\r\n");
 | 
						|
}
 | 
						|
 | 
						|
//@}
 | 
						|
 | 
						|
MAINFUNC_ENTRY(ver, argc, argv)
 | 
						|
{
 | 
						|
    dump_verinfo();
 | 
						|
    return 0;
 | 
						|
}
 |