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;
|
|
}
|