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