init ems server code
This commit is contained in:
557
plat/public/src/pub_sys.c
Normal file
557
plat/public/src/pub_sys.c
Normal file
@@ -0,0 +1,557 @@
|
||||
//////////////////////////////////////////////////
|
||||
//Title : linux_sys.c
|
||||
//Auhtor : Liu Wei
|
||||
//Desc : Linux system infomation
|
||||
//Created : 2007-06-02
|
||||
//Revision :
|
||||
//
|
||||
//Revision :
|
||||
//
|
||||
//////////////////////////////////////////////////
|
||||
|
||||
#include "./include/pub_sys.h"
|
||||
|
||||
/*@ignore@*/
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
// InitParalPort:Init parallel port data .
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
extern void InitParalPort(void)
|
||||
{
|
||||
#if 0
|
||||
ioperm(0x37a,3,1);
|
||||
ioperm(0x378,3,1);
|
||||
ioperm(0x379,3,1);
|
||||
outb(0,0x37a);
|
||||
outb(0,0x378);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
// Name : WriteParalPort
|
||||
// Function : Write parallel port data
|
||||
// Node : Parallel port address:
|
||||
// : flag=0,address=0x37a B1;flag=1,address=0x37a B2
|
||||
// : flag=2--9,address=0x378 B0--B7
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
extern void WriteParalPort(u8 uFlag,u8 uData)
|
||||
{
|
||||
#if 0
|
||||
u8 ii,jj;
|
||||
|
||||
if (uFlag > 9)
|
||||
return;
|
||||
if (uData != 0 && uData != 1)
|
||||
return;
|
||||
if (uFlag == 0 || uFlag == 1) // read or write 0x37a
|
||||
{
|
||||
ii = inb(0x37a);
|
||||
jj = 1 << (uFlag + 1);
|
||||
ii = ii & (~jj);
|
||||
if (uFlag == 0)
|
||||
jj = (~uData & 0x01) << (uFlag + 1);
|
||||
else
|
||||
jj = uData << (uFlag + 1);
|
||||
ii = ii | jj;
|
||||
outb(ii,0x37a);
|
||||
}
|
||||
else
|
||||
{
|
||||
ii = inb(0x378);
|
||||
jj = 1 << (uFlag - 2);
|
||||
ii = ii & (~jj);
|
||||
jj = uData << (uFlag - 2);
|
||||
ii = ii | jj;
|
||||
outb(ii,0x378);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
// GetMemoryStr: Get memery string
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
extern char *GetMemoryStr(u32 Amount)
|
||||
{
|
||||
static char Buff[64];
|
||||
|
||||
if (Amount > 0) {
|
||||
(void) snprintf(Buff, sizeof(Buff), "%d", Amount/MBYTES);
|
||||
return(Buff);
|
||||
}
|
||||
|
||||
return((char *) NULL);
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
// GetBootTimeProc: Get System Model using the /proc/cpuinfo file.
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#define PROC_FILE_UPTIME "/proc/uptime"
|
||||
|
||||
extern char *GetBootTimeProc ( )
|
||||
{
|
||||
FILE *pFile;
|
||||
static char sBuff[64];
|
||||
char *pCh;
|
||||
char *DateStr;
|
||||
time_t tmUptime;
|
||||
time_t tmBootTime;
|
||||
|
||||
pFile = fopen ( PROC_FILE_UPTIME, "r" );
|
||||
if ( !pFile )
|
||||
{
|
||||
FLogMsg ( PIF_GERR, "%s: open readonly failed: %s", PROC_FILE_UPTIME,
|
||||
SYSERR );
|
||||
return ( ( char * ) NULL );
|
||||
}
|
||||
|
||||
if ( !fgets ( sBuff, sizeof ( sBuff ), pFile ) )
|
||||
{
|
||||
FLogMsg ( PIF_GERR, "%s: Read uptime failed: %s", PROC_FILE_UPTIME,
|
||||
SYSERR );
|
||||
( void ) fclose ( pFile );
|
||||
return ( ( char * ) NULL );
|
||||
}
|
||||
|
||||
if ( pCh = strchr ( sBuff, ' ' ) )
|
||||
{
|
||||
*pCh = CNULL;
|
||||
}
|
||||
|
||||
tmUptime = ( time_t ) strtol ( sBuff, NULL, 0 );
|
||||
if ( tmUptime <= 0 )
|
||||
{
|
||||
FLogMsg ( PIF_GERR, "Convert `%s' to long failed", sBuff );
|
||||
( void ) fclose ( pFile );
|
||||
return ( ( char * ) NULL );
|
||||
}
|
||||
|
||||
tmBootTime = time ( NULL );
|
||||
tmBootTime -= tmUptime;
|
||||
|
||||
DateStr = TimeToStr ( tmBootTime, NULL );
|
||||
|
||||
( void ) fclose ( pFile );
|
||||
|
||||
return ( DateStr );
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
// Get System Model using the /proc/cpuinfo file.
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#define PROC_FILE_CPUINFO "/proc/cpuinfo"
|
||||
/*
|
||||
extern char *GetModelProc ( )
|
||||
{
|
||||
FILE *pFile;
|
||||
static char sBuff[256];
|
||||
char *Cpu = NULL;
|
||||
char *Vendor = NULL;
|
||||
char *Model = NULL;
|
||||
char Speed[64];
|
||||
float sp = 0;
|
||||
char **Argv;
|
||||
int Argc;
|
||||
int Cleanup;
|
||||
|
||||
if ( sBuff[0] )
|
||||
{
|
||||
return ( sBuff );
|
||||
}
|
||||
|
||||
pFile = fopen ( PROC_FILE_CPUINFO, "r" );
|
||||
if ( !pFile )
|
||||
{
|
||||
FLogMsg ( PIF_GERR, "%s: open readonly failed: %s", PROC_FILE_CPUINFO,
|
||||
SYSERR );
|
||||
return ( ( char * ) NULL );
|
||||
}
|
||||
|
||||
Speed[0] = CNULL;
|
||||
while ( fgets ( sBuff, sizeof ( sBuff ), pFile ) )
|
||||
{
|
||||
Cleanup = TRUE;
|
||||
Argc = StrToArgv ( sBuff, ":", &Argv, NULL, 0 );
|
||||
if ( Argc < 2 )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if ( EQ ( Argv[0], "cpu" ) )
|
||||
{
|
||||
Cpu = Argv[1];
|
||||
}
|
||||
else if ( EQ ( Argv[0], "vendor_id" ) )
|
||||
{
|
||||
Vendor = Argv[1];
|
||||
}
|
||||
else if ( EQ ( Argv[0], "model name" ) )
|
||||
{
|
||||
Model = Argv[1];
|
||||
}
|
||||
else if ( EQ ( Argv[0], "cpu MHz" ) )
|
||||
{
|
||||
|
||||
// This value is not always perfectly accurate as Linux estimates
|
||||
// the actual Mhz by doing a loop test at boot.
|
||||
|
||||
if ( sscanf ( Argv[1], "%f", &sp ) )
|
||||
{
|
||||
( void ) sprintf ( Speed, "%.0f Mhz", rint ( ( double ) sp ) );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
DestroyArgv ( &Argv, Argc );
|
||||
Cleanup = FALSE;
|
||||
}
|
||||
|
||||
if ( Cleanup )
|
||||
{
|
||||
( void ) free ( Argv[0] );
|
||||
}
|
||||
}
|
||||
|
||||
sBuff[0] = CNULL;
|
||||
if ( Vendor )
|
||||
{
|
||||
( void ) strcpy ( sBuff, Vendor );
|
||||
( void ) free ( Vendor );
|
||||
}
|
||||
if ( Speed[0] )
|
||||
{
|
||||
if ( sBuff[0] )
|
||||
{
|
||||
( void ) strcat ( sBuff, " " );
|
||||
}
|
||||
( void ) strcat ( sBuff, Speed );
|
||||
}
|
||||
if ( Model )
|
||||
{
|
||||
if ( sBuff[0] )
|
||||
{
|
||||
strcat ( sBuff, " " );
|
||||
}
|
||||
strcat ( sBuff, Model );
|
||||
( void ) free ( Model );
|
||||
}
|
||||
if ( Cpu )
|
||||
{
|
||||
if ( sBuff[0] )
|
||||
{
|
||||
strcat ( sBuff, " " );
|
||||
}
|
||||
strcat ( sBuff, Cpu );
|
||||
( void ) free ( Cpu );
|
||||
}
|
||||
|
||||
( void ) fclose ( pFile );
|
||||
|
||||
return ( sBuff );
|
||||
}
|
||||
*/
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
// GetMBytesStr: Get the string of Mbytes
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
extern char *GetMBytesStr ( u32 wAmount )
|
||||
{
|
||||
static char sBuff[64];
|
||||
|
||||
if ( !wAmount )
|
||||
{
|
||||
return ( ( char * ) NULL );
|
||||
}
|
||||
|
||||
if ( wAmount > KBYTES )
|
||||
{
|
||||
( void ) snprintf ( sBuff, sizeof ( sBuff ), "%.1f GB",
|
||||
( float ) MbytesToGbytes ( wAmount ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
( void ) snprintf ( sBuff, sizeof ( sBuff ), "%.0f MB",
|
||||
( float ) wAmount );
|
||||
}
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
// GetMemoryKcore: Get System Memory using size of /proc/kcore
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#define PROC_FILE_KCORE "/proc/kcore"
|
||||
|
||||
extern char *GetMemoryKcore ( )
|
||||
{
|
||||
static char *pMemStr = NULL;
|
||||
u32 wMemBytes = 0;
|
||||
u32 wAmount = 0;
|
||||
struct stat tStatBuf;
|
||||
|
||||
if ( pMemStr )
|
||||
{
|
||||
return ( pMemStr );
|
||||
}
|
||||
|
||||
if ( stat ( PROC_FILE_KCORE, &tStatBuf ) != 0 )
|
||||
{
|
||||
FLogMsg ( PIF_GERR, "%s: stat failed: %s", PROC_FILE_KCORE, SYSERR );
|
||||
return ( ( char * ) NULL );
|
||||
}
|
||||
|
||||
wMemBytes = ( u32 ) ( tStatBuf.st_size - 4096 );
|
||||
wAmount = DivRndUp( wMemBytes, ( u32 ) MBYTES );
|
||||
pMemStr = GetMBytesStr ( wAmount );
|
||||
|
||||
return ( pMemStr );
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
// GetMemorySysinfo: Get System Memory using sysinfo() system call
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
extern char *GetMemorySysinfo ( )
|
||||
{
|
||||
struct sysinfo tSysInfo;
|
||||
static char *pMemStr = NULL;
|
||||
u32 wMemBytes = 0;
|
||||
u32 wAmount = 0;
|
||||
|
||||
if ( pMemStr )
|
||||
{
|
||||
return ( pMemStr );
|
||||
}
|
||||
|
||||
if ( sysinfo ( &tSysInfo ) != 0 )
|
||||
{
|
||||
FLogMsg ( PIF_GERR, "sysinfo() system call failed: %s", SYSERR );
|
||||
return ( ( char * ) NULL );
|
||||
}
|
||||
|
||||
// sysinfo.totalram represents total USABLE physical memory. Memory
|
||||
// reserved by the kernel is not included. So this is as close as we
|
||||
// can get for now.
|
||||
|
||||
wMemBytes = ( u32 ) tSysInfo.totalram;
|
||||
wAmount = DivRndUp( wMemBytes, ( u32 ) MBYTES );
|
||||
pMemStr = GetMemoryStr ( wAmount );
|
||||
|
||||
return ( pMemStr );
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
// GetVirtMemLinux:Get Virtual Memory using sysinfo() system call
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
extern char *GetVirtMemLinux ( )
|
||||
{
|
||||
struct sysinfo tSysInfo;
|
||||
static char *pMemStr = NULL;
|
||||
u32 wMemBytes = 0;
|
||||
u32 wAmount = 0;
|
||||
|
||||
if ( pMemStr )
|
||||
{
|
||||
return ( pMemStr );
|
||||
}
|
||||
|
||||
if ( sysinfo ( &tSysInfo ) != 0 )
|
||||
{
|
||||
FLogMsg ( PIF_GERR, "sysinfo() system call failed: %s", SYSERR );
|
||||
return ( ( char * ) NULL );
|
||||
}
|
||||
|
||||
wMemBytes = ( u32 ) ( tSysInfo.totalram + tSysInfo.totalswap );
|
||||
wAmount = DivRndUp( wMemBytes, ( u32 ) MBYTES );
|
||||
pMemStr = GetMemoryStr ( wAmount );
|
||||
|
||||
return ( pMemStr );
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
// GetCpuTypeProc:Get CPU Type from /proc/cpuinfo
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#define PROC_FILE_CPUINFO "/proc/cpuinfo"
|
||||
/*
|
||||
extern char *GetCpuTypeProc ( )
|
||||
{
|
||||
FILE *pFile;
|
||||
static char sBuff[256];
|
||||
static char *Cpu = NULL;
|
||||
char **Argv;
|
||||
char *pCh;
|
||||
int Argc;
|
||||
|
||||
if ( Cpu )
|
||||
{
|
||||
return ( Cpu );
|
||||
}
|
||||
|
||||
pFile = fopen ( PROC_FILE_CPUINFO, "r" );
|
||||
if ( !pFile )
|
||||
{
|
||||
FLogMsg ( PIF_GERR, "%s: open readonly failed: %s", PROC_FILE_CPUINFO,
|
||||
SYSERR );
|
||||
return ( ( char * ) NULL );
|
||||
}
|
||||
|
||||
while ( fgets ( sBuff, sizeof ( sBuff ), pFile ) )
|
||||
{
|
||||
Argc = StrToArgv ( sBuff, ":", &Argv, NULL, 0 );
|
||||
if ( Argc < 2 )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if ( EQ ( Argv[0], "cpu" ) )
|
||||
{
|
||||
// Linux 2.0
|
||||
Cpu = Argv[1];
|
||||
break;
|
||||
}
|
||||
else if ( EQ ( Argv[0], "model name" ) )
|
||||
{
|
||||
// Linux 2.2
|
||||
Cpu = Argv[1];
|
||||
if ( pCh = strchr ( Cpu, ' ' ) )
|
||||
{
|
||||
*pCh = CNULL;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
( void ) fclose ( pFile );
|
||||
|
||||
return ( Cpu );
|
||||
|
||||
}
|
||||
*/
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
// GetKernVerProc: Get Kernel Version string using /proc/version
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#define PROC_FILE_VERSION "/proc/version"
|
||||
|
||||
extern char *GetKernVerProc ( )
|
||||
{
|
||||
FILE *pFile;
|
||||
static char sBuff[512];
|
||||
|
||||
if ( sBuff[0] )
|
||||
{
|
||||
return ( sBuff );
|
||||
}
|
||||
|
||||
pFile = fopen ( PROC_FILE_VERSION, "r" );
|
||||
if ( !pFile )
|
||||
{
|
||||
FLogMsg ( PIF_GERR, "%s: open readonly failed: %s", PROC_FILE_VERSION,
|
||||
SYSERR );
|
||||
return ( ( char * ) NULL );
|
||||
}
|
||||
|
||||
if ( !fgets ( sBuff, sizeof ( sBuff ), pFile ) )
|
||||
{
|
||||
FLogMsg ( PIF_GERR, "%s: read failed: %s", PROC_FILE_VERSION, SYSERR );
|
||||
return ( ( char * ) NULL );
|
||||
}
|
||||
|
||||
( void ) fclose ( pFile );
|
||||
|
||||
return ( sBuff );
|
||||
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
// GetKernVerLinux: Get Kernel Version string using uname()
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
extern char *GetKernVerLinux ( )
|
||||
{
|
||||
static struct utsname tName;
|
||||
static char *pVerStr = NULL;
|
||||
|
||||
if ( uname ( &tName ) != 0 )
|
||||
{
|
||||
FLogMsg ( PIF_GERR, "uname() system call failed: %s", SYSERR );
|
||||
return ( ( char * ) NULL );
|
||||
}
|
||||
|
||||
pVerStr = tName.version;
|
||||
|
||||
return ( pVerStr );
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
// GetOSDistLinux: Get linux distribution (vendor)
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
/*
|
||||
extern char *GetOSDistLinux ( )
|
||||
{
|
||||
static char sBuff[256];
|
||||
register char *pCh;
|
||||
register char *End;
|
||||
char IssueFile[] = "/etc/issue";
|
||||
char Welcome[] = "Welcome to ";
|
||||
FILE *pFile;
|
||||
int Found = FALSE;
|
||||
|
||||
if ( !( pFile = fopen ( IssueFile, "r" ) ) )
|
||||
{
|
||||
FLogMsg ( PIF_GERR, "%s: Cannot open to get OS Dist: %s", IssueFile,
|
||||
SYSERR );
|
||||
return ( ( char * ) NULL );
|
||||
}
|
||||
|
||||
while ( fgets ( sBuff, sizeof ( sBuff ), pFile ) )
|
||||
{
|
||||
// Some distributions have VGA control chars in them
|
||||
if ( !isalpha ( sBuff[0] ) )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
for ( pCh = sBuff; pCh && *pCh && *pCh != '\n' && !isalpha ( *pCh );
|
||||
++pCh )
|
||||
;
|
||||
if ( *pCh == '\n' || !strlen ( pCh ) )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
// Found first nonblank line
|
||||
Found = TRUE;
|
||||
break;
|
||||
}
|
||||
|
||||
( void ) fclose ( pFile );
|
||||
|
||||
if ( !Found )
|
||||
{
|
||||
return ( ( char * ) NULL );
|
||||
}
|
||||
|
||||
if ( EQN ( pCh, Welcome, sizeof ( Welcome ) - 1 ) )
|
||||
{
|
||||
pCh += sizeof ( Welcome ) - 1;
|
||||
}
|
||||
else if ( EQN ( pCh, "Linux ", 6 ) )
|
||||
{
|
||||
pCh += 6;
|
||||
}
|
||||
|
||||
if ( End = strchr ( pCh, '-' ) )
|
||||
{
|
||||
--End;
|
||||
while ( *End && isspace ( *End ) )
|
||||
{
|
||||
--End;
|
||||
}
|
||||
*++End = CNULL;
|
||||
}
|
||||
|
||||
return ( pCh );
|
||||
}
|
||||
|
||||
/*@end@*/
|
||||
Reference in New Issue
Block a user