1 /* HOSTINFO.C (c) Copyright "Fish" (David B. Trout), 2002-2009 */
2 /* Set and query host information */
3
4 /* Released under the Q Public License */
5 /* (http://www.hercules-390.org/herclic.html) */
6 /* as modifications to Hercules. */
7
8 /*-------------------------------------------------------------------*/
9 /* functions to set/query host system information */
10 /*-------------------------------------------------------------------*/
11
12 #include "hstdinc.h"
13
14 #define _HOSTINFO_C_
15 #define _HUTIL_DLL_
16
17 #include "hercules.h"
18
19 DLL_EXPORT HOST_INFO hostinfo; /* Host system information */
20
21 /*-------------------------------------------------------------------*/
22 /* Initialize host system information */
23 /*-------------------------------------------------------------------*/
init_hostinfo(HOST_INFO * pHostInfo)24 DLL_EXPORT void init_hostinfo ( HOST_INFO* pHostInfo )
25 {
26 #if defined(_MSVC_)
27 if ( !pHostInfo ) pHostInfo = &hostinfo;
28 w32_init_hostinfo( pHostInfo );
29 #elif defined( HAVE_SYS_UTSNAME_H )
30 struct utsname uname_info;
31 if ( !pHostInfo ) pHostInfo = &hostinfo;
32 uname( &uname_info );
33 strlcpy( pHostInfo->sysname, uname_info.sysname, sizeof(pHostInfo->sysname) );
34 strlcpy( pHostInfo->nodename, uname_info.nodename, sizeof(pHostInfo->nodename) );
35 strlcpy( pHostInfo->release, uname_info.release, sizeof(pHostInfo->release) );
36 strlcpy( pHostInfo->version, uname_info.version, sizeof(pHostInfo->version) );
37 strlcpy( pHostInfo->machine, uname_info.machine, sizeof(pHostInfo->machine) );
38 pHostInfo->trycritsec_avail = 0;
39 #if defined(HAVE_SYSCONF) && defined(HAVE_DECL__SC_NPROCESSORS_CONF) && HAVE_DECL__SC_NPROCESSORS_CONF
40 pHostInfo->num_procs = sysconf(_SC_NPROCESSORS_CONF);
41 #else
42 pHostInfo->num_procs = 1;
43 #endif
44 #else
45 if ( !pHostInfo ) pHostInfo = &hostinfo;
46 strlcpy( pHostInfo->sysname, "(unknown)", sizeof(pHostInfo->sysname) );
47 strlcpy( pHostInfo->nodename, "(unknown)", sizeof(pHostInfo->nodename) );
48 strlcpy( pHostInfo->release, "(unknown)", sizeof(pHostInfo->release) );
49 strlcpy( pHostInfo->version, "(unknown)", sizeof(pHostInfo->version) );
50 strlcpy( pHostInfo->machine, "(unknown)", sizeof(pHostInfo->machine) );
51 pHostInfo->trycritsec_avail = 0;
52 #if defined(HAVE_SYSCONF) && defined(HAVE_DECL__SC_NPROCESSORS_CONF) && HAVE_DECL__SC_NPROCESSORS_CONF
53 pHostInfo->num_procs = sysconf(_SC_NPROCESSORS_CONF);
54 #else
55 pHostInfo->num_procs = 1;
56 #endif
57 #endif
58 }
59
60 /*-------------------------------------------------------------------*/
61 /* Build a host system information string for displaying purposes */
62 /* (the returned string does NOT end with a newline) */
63 /*-------------------------------------------------------------------*/
get_hostinfo_str(HOST_INFO * pHostInfo,char * pszHostInfoStrBuff,size_t nHostInfoStrBuffSiz)64 DLL_EXPORT char* get_hostinfo_str ( HOST_INFO* pHostInfo,
65 char* pszHostInfoStrBuff,
66 size_t nHostInfoStrBuffSiz )
67 {
68 if ( pszHostInfoStrBuff && nHostInfoStrBuffSiz )
69 {
70 char num_procs[16];
71 if ( !pHostInfo ) pHostInfo = &hostinfo;
72 if ( pHostInfo->num_procs > 1 )
73 snprintf( num_procs, sizeof(num_procs),
74 " MP=%d", pHostInfo->num_procs );
75 else if ( pHostInfo->num_procs == 1 )
76 strlcpy( num_procs, " UP", sizeof(num_procs) );
77 else
78 strlcpy( num_procs, "", sizeof(num_procs) );
79
80 snprintf( pszHostInfoStrBuff, nHostInfoStrBuffSiz,
81 _("Running on %s %s-%s.%s %s%s"),
82 pHostInfo->nodename,
83 pHostInfo->sysname,
84 pHostInfo->release,
85 pHostInfo->version,
86 pHostInfo->machine,
87 num_procs
88 );
89 *(pszHostInfoStrBuff + nHostInfoStrBuffSiz - 1) = 0;
90 }
91 return pszHostInfoStrBuff;
92 }
93
94 /*-------------------------------------------------------------------*/
95 /* Display host system information on the indicated stream */
96 /*-------------------------------------------------------------------*/
display_hostinfo(HOST_INFO * pHostInfo,FILE * f,int httpfd)97 DLL_EXPORT void display_hostinfo ( HOST_INFO* pHostInfo, FILE *f, int httpfd )
98 {
99 char host_info_str[256]; init_hostinfo( pHostInfo );
100 get_hostinfo_str(pHostInfo, host_info_str, sizeof(host_info_str));
101 if(httpfd<0)
102 {
103 if (!f) f = stdout; if (f != stdout)
104 fprintf(f, "%s\n", host_info_str);
105 else logmsg( "%s\n", host_info_str);
106 }
107 else
108 {
109 hprintf(httpfd,"%s\n",host_info_str);
110 }
111 }
112