]> git.vpit.fr Git - perl/modules/Linux-SysInfo.git/blob - SysInfo.xs
Importing Linux-SysInfo-0.03.tar.gz
[perl/modules/Linux-SysInfo.git] / SysInfo.xs
1 #include "EXTERN.h"
2 #include "perl.h"
3 #include "XSUB.h"
4
5 #include <linux/version.h> /* LINUX_VERSION_CODE, KERNEL_VERSION() */
6 #include <sys/sysinfo.h>   /* <struct sysinfo>, sysinfo(), SI_LOAD_SHIFT */
7
8 #if ((defined(__i386__) || defined(__x86_64__)) && (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 3, 23))) || (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 3, 48))
9 # define SYSINFO_EXTENDED 1
10 #else
11 # define SYSINFO_EXTENDED 0
12 #endif
13
14 typedef struct {
15  const char* key;
16  U32 klen;
17  U32 hash;
18 } sysinfo_key;
19
20 #define SYSINFO_KEY_SET_HASH(S) PERL_HASH((S).hash, (S).key, (S).klen)
21 #define SYSINFO_KEY_STORE(H,S,V) hv_store((H), (S).key, (S).klen, (V), (S).hash)
22
23 static sysinfo_key key_uptime    = { "uptime",    6, 0 };
24 static sysinfo_key key_load1     = { "load1",     5, 0 };
25 static sysinfo_key key_load5     = { "load5",     5, 0 };
26 static sysinfo_key key_load15    = { "load15",    6, 0 };
27 static sysinfo_key key_totalram  = { "totalram",  8, 0 };
28 static sysinfo_key key_freeram   = { "freeram",   7, 0 };
29 static sysinfo_key key_sharedram = { "sharedram", 9, 0 };
30 static sysinfo_key key_bufferram = { "bufferram", 9, 0 };
31 static sysinfo_key key_totalswap = { "totalswap", 9, 0 };
32 static sysinfo_key key_freeswap  = { "freeswap",  8, 0 };
33 static sysinfo_key key_procs     = { "procs",     5, 0 };
34 #if SYSINFO_EXTENDED
35 static sysinfo_key key_totalhigh = { "totalhigh", 9, 0 };
36 static sysinfo_key key_freehigh  = { "freehigh",  8, 0 };
37 static sysinfo_key key_mem_unit  = { "mem_unit",  8, 0 };
38 #endif /* SYSINFO_EXTENDED */
39
40 MODULE = Linux::SysInfo              PACKAGE = Linux::SysInfo
41
42 PROTOTYPES: ENABLE
43
44 BOOT:
45 {
46  SYSINFO_KEY_SET_HASH(key_uptime);
47  SYSINFO_KEY_SET_HASH(key_load1);
48  SYSINFO_KEY_SET_HASH(key_load5);
49  SYSINFO_KEY_SET_HASH(key_load15);
50  SYSINFO_KEY_SET_HASH(key_totalram);
51  SYSINFO_KEY_SET_HASH(key_freeram);
52  SYSINFO_KEY_SET_HASH(key_sharedram);
53  SYSINFO_KEY_SET_HASH(key_bufferram);
54  SYSINFO_KEY_SET_HASH(key_totalswap);
55  SYSINFO_KEY_SET_HASH(key_freeswap);
56  SYSINFO_KEY_SET_HASH(key_procs);
57 #if SYSINFO_EXTENDED
58  SYSINFO_KEY_SET_HASH(key_totalhigh);
59  SYSINFO_KEY_SET_HASH(key_freehigh);
60  SYSINFO_KEY_SET_HASH(key_mem_unit);
61 #endif /* SYSINFO_EXTENDED */
62 }
63
64 SV *
65 sysinfo()
66 PREINIT:
67  struct sysinfo si;
68  NV l;
69  HV* h;
70 CODE:
71  if (sysinfo(&si) == -1) {
72   XSRETURN_UNDEF;
73  }
74
75  h = newHV(); /* mortalized in RETVAL */
76
77  SYSINFO_KEY_STORE(h, key_uptime,    newSViv(si.uptime));
78
79  l = ((NV) si.loads[0]) / ((NV) (((U32) 1) << ((U32) SI_LOAD_SHIFT)));
80  SYSINFO_KEY_STORE(h, key_load1,     newSVnv(l));
81  l = ((NV) si.loads[1]) / ((NV) (((U32) 1) << ((U32) SI_LOAD_SHIFT)));
82  SYSINFO_KEY_STORE(h, key_load5,     newSVnv(l));
83  l = ((NV) si.loads[2]) / ((NV) (((U32) 1) << ((U32) SI_LOAD_SHIFT)));
84  SYSINFO_KEY_STORE(h, key_load15,    newSVnv(l));
85
86  SYSINFO_KEY_STORE(h, key_totalram,  newSVuv(si.totalram));
87  SYSINFO_KEY_STORE(h, key_freeram,   newSVuv(si.freeram));
88  SYSINFO_KEY_STORE(h, key_sharedram, newSVuv(si.sharedram));
89  SYSINFO_KEY_STORE(h, key_bufferram, newSVuv(si.bufferram));
90  SYSINFO_KEY_STORE(h, key_totalswap, newSVuv(si.totalswap));
91  SYSINFO_KEY_STORE(h, key_freeswap,  newSVuv(si.freeswap));
92  SYSINFO_KEY_STORE(h, key_procs,     newSVuv(si.procs));
93 #if SYSINFO_EXTENDED
94  SYSINFO_KEY_STORE(h, key_totalhigh, newSVuv(si.totalhigh));
95  SYSINFO_KEY_STORE(h, key_freehigh,  newSVuv(si.freehigh));
96  SYSINFO_KEY_STORE(h, key_mem_unit,  newSVuv(si.mem_unit));
97 #endif /* SYSINFO_EXTENDED */
98
99  RETVAL = newRV_noinc((SV *) h);
100 OUTPUT:
101  RETVAL
102
103 SV *
104 LS_HAS_EXTENDED()
105 CODE:
106  RETVAL = newSViv(SYSINFO_EXTENDED); /* mortalized in RETVAL */
107 OUTPUT:
108  RETVAL