]> git.vpit.fr Git - perl/modules/Linux-SysInfo.git/blob - SysInfo.xs
Importing Linux-SysInfo-0.01.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>
6 #include <sys/sysinfo.h>
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  HV* h;
69 CODE:
70  if (sysinfo(&si) == -1) {
71   XSRETURN_UNDEF;
72  }
73
74  h = newHV();
75 /* sv_2mortal((SV *) h); */
76
77  SYSINFO_KEY_STORE(h, key_uptime,    newSViv(si.uptime));
78  SYSINFO_KEY_STORE(h, key_load1,     newSVuv(si.loads[0]));
79  SYSINFO_KEY_STORE(h, key_load5,     newSVuv(si.loads[1]));
80  SYSINFO_KEY_STORE(h, key_load15,    newSVuv(si.loads[2]));
81  SYSINFO_KEY_STORE(h, key_totalram,  newSVuv(si.totalram));
82  SYSINFO_KEY_STORE(h, key_freeram,   newSVuv(si.freeram));
83  SYSINFO_KEY_STORE(h, key_sharedram, newSVuv(si.sharedram));
84  SYSINFO_KEY_STORE(h, key_bufferram, newSVuv(si.bufferram));
85  SYSINFO_KEY_STORE(h, key_totalswap, newSVuv(si.totalswap));
86  SYSINFO_KEY_STORE(h, key_freeswap,  newSVuv(si.freeswap));
87  SYSINFO_KEY_STORE(h, key_procs,     newSVuv(si.procs));
88 #if SYSINFO_EXTENDED
89  SYSINFO_KEY_STORE(h, key_totalhigh, newSVuv(si.totalhigh));
90  SYSINFO_KEY_STORE(h, key_freehigh,  newSVuv(si.freehigh));
91  SYSINFO_KEY_STORE(h, key_mem_unit,  newSVuv(si.mem_unit));
92 #endif /* SYSINFO_EXTENDED */
93
94  RETVAL = newRV_noinc((SV *) h);
95 OUTPUT:
96  RETVAL
97
98 SV *
99 LS_HAS_EXTENDED()
100 CODE:
101  RETVAL = newSViv(SYSINFO_EXTENDED);
102 OUTPUT:
103  RETVAL