]> git.vpit.fr Git - perl/modules/Linux-SysInfo.git/blob - SysInfo.xs
Importing Linux-SysInfo-0.04.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  HV *stash;
47  stash = gv_stashpv("Linux::SysInfo", TRUE);
48  newCONSTSUB(stash, "LS_HAS_EXTENDED", newSViv(SYSINFO_EXTENDED));
49
50  SYSINFO_KEY_SET_HASH(key_uptime);
51  SYSINFO_KEY_SET_HASH(key_load1);
52  SYSINFO_KEY_SET_HASH(key_load5);
53  SYSINFO_KEY_SET_HASH(key_load15);
54  SYSINFO_KEY_SET_HASH(key_totalram);
55  SYSINFO_KEY_SET_HASH(key_freeram);
56  SYSINFO_KEY_SET_HASH(key_sharedram);
57  SYSINFO_KEY_SET_HASH(key_bufferram);
58  SYSINFO_KEY_SET_HASH(key_totalswap);
59  SYSINFO_KEY_SET_HASH(key_freeswap);
60  SYSINFO_KEY_SET_HASH(key_procs);
61 #if SYSINFO_EXTENDED
62  SYSINFO_KEY_SET_HASH(key_totalhigh);
63  SYSINFO_KEY_SET_HASH(key_freehigh);
64  SYSINFO_KEY_SET_HASH(key_mem_unit);
65 #endif /* SYSINFO_EXTENDED */
66 }
67
68 SV *
69 sysinfo()
70 PREINIT:
71  struct sysinfo si;
72  NV l;
73  HV *h;
74 CODE:
75  if (sysinfo(&si) == -1) {
76   XSRETURN_UNDEF;
77  }
78
79  h = newHV(); /* mortalized in RETVAL */
80
81  SYSINFO_KEY_STORE(h, key_uptime,    newSViv(si.uptime));
82
83  l = ((NV) si.loads[0]) / ((NV) (((U32) 1) << ((U32) SI_LOAD_SHIFT)));
84  SYSINFO_KEY_STORE(h, key_load1,     newSVnv(l));
85  l = ((NV) si.loads[1]) / ((NV) (((U32) 1) << ((U32) SI_LOAD_SHIFT)));
86  SYSINFO_KEY_STORE(h, key_load5,     newSVnv(l));
87  l = ((NV) si.loads[2]) / ((NV) (((U32) 1) << ((U32) SI_LOAD_SHIFT)));
88  SYSINFO_KEY_STORE(h, key_load15,    newSVnv(l));
89
90  SYSINFO_KEY_STORE(h, key_totalram,  newSVuv(si.totalram));
91  SYSINFO_KEY_STORE(h, key_freeram,   newSVuv(si.freeram));
92  SYSINFO_KEY_STORE(h, key_sharedram, newSVuv(si.sharedram));
93  SYSINFO_KEY_STORE(h, key_bufferram, newSVuv(si.bufferram));
94  SYSINFO_KEY_STORE(h, key_totalswap, newSVuv(si.totalswap));
95  SYSINFO_KEY_STORE(h, key_freeswap,  newSVuv(si.freeswap));
96  SYSINFO_KEY_STORE(h, key_procs,     newSVuv(si.procs));
97 #if SYSINFO_EXTENDED
98  SYSINFO_KEY_STORE(h, key_totalhigh, newSVuv(si.totalhigh));
99  SYSINFO_KEY_STORE(h, key_freehigh,  newSVuv(si.freehigh));
100  SYSINFO_KEY_STORE(h, key_mem_unit,  newSVuv(si.mem_unit));
101 #endif /* SYSINFO_EXTENDED */
102
103  RETVAL = newRV_noinc((SV *) h);
104 OUTPUT:
105  RETVAL
106