kostya-sigar 0.8.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +201 -0
  3. data/NOTICE +117 -0
  4. data/README +2 -0
  5. data/Rakefile +105 -0
  6. data/bindings/SigarBuild.pm +301 -0
  7. data/bindings/SigarWrapper.pm +3025 -0
  8. data/bindings/ruby/extconf.rb +132 -0
  9. data/bindings/ruby/rbsigar.c +785 -0
  10. data/include/sigar.h +984 -0
  11. data/include/sigar_fileinfo.h +157 -0
  12. data/include/sigar_format.h +65 -0
  13. data/include/sigar_getline.h +18 -0
  14. data/include/sigar_log.h +80 -0
  15. data/include/sigar_private.h +429 -0
  16. data/include/sigar_ptql.h +53 -0
  17. data/include/sigar_util.h +197 -0
  18. data/src/os/aix/aix_sigar.c +2168 -0
  19. data/src/os/aix/sigar_os.h +73 -0
  20. data/src/os/darwin/Info.plist.in +27 -0
  21. data/src/os/darwin/darwin_sigar.c +3718 -0
  22. data/src/os/darwin/sigar_os.h +80 -0
  23. data/src/os/hpux/hpux_sigar.c +1361 -0
  24. data/src/os/hpux/sigar_os.h +49 -0
  25. data/src/os/linux/linux_sigar.c +2821 -0
  26. data/src/os/linux/sigar_os.h +82 -0
  27. data/src/os/solaris/get_mib2.c +321 -0
  28. data/src/os/solaris/get_mib2.h +127 -0
  29. data/src/os/solaris/kstats.c +181 -0
  30. data/src/os/solaris/procfs.c +97 -0
  31. data/src/os/solaris/sigar_os.h +224 -0
  32. data/src/os/solaris/solaris_sigar.c +2732 -0
  33. data/src/os/win32/peb.c +212 -0
  34. data/src/os/win32/sigar.rc.in +40 -0
  35. data/src/os/win32/sigar_os.h +685 -0
  36. data/src/os/win32/sigar_pdh.h +47 -0
  37. data/src/os/win32/win32_sigar.c +4109 -0
  38. data/src/sigar.c +2444 -0
  39. data/src/sigar_cache.c +253 -0
  40. data/src/sigar_fileinfo.c +815 -0
  41. data/src/sigar_format.c +696 -0
  42. data/src/sigar_getline.c +1849 -0
  43. data/src/sigar_ptql.c +1976 -0
  44. data/src/sigar_signal.c +216 -0
  45. data/src/sigar_util.c +1076 -0
  46. data/src/sigar_version.c.in +22 -0
  47. data/src/sigar_version_autoconf.c.in +22 -0
  48. data/version.properties +11 -0
  49. metadata +90 -0
@@ -0,0 +1,132 @@
1
+ #
2
+ # Copyright (c) 2007, 2009 Hyperic, Inc.
3
+ # Copyright (c) 2009 SpringSource, Inc.
4
+ # Copyright (c) 2010-2012 VMware, Inc.
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #
18
+
19
+ require 'mkmf'
20
+ require 'rbconfig'
21
+
22
+ extension_name = 'sigar'
23
+
24
+ print 'Ruby platform=' + RUBY_PLATFORM + "\n"
25
+
26
+ case RUBY_PLATFORM
27
+ when /darwin/
28
+ os = 'darwin'
29
+ if File.file?("/usr/include/libproc.h")
30
+ $CPPFLAGS += ' -DDARWIN_HAS_LIBPROC_H'
31
+ end
32
+ $CPPFLAGS += ' -DDARWIN'
33
+ $LDFLAGS += ' -framework CoreServices -framework IOKit'
34
+ when /bsd/
35
+ os = 'darwin'
36
+ have_library("kvm")
37
+ when /mswin|mingw|cygwin|bccwin/
38
+ os = 'win32'
39
+ require 'ftools'
40
+ $CPPFLAGS += ' -DWIN32'
41
+ is_win32 = true
42
+ have_library("kernel32")
43
+ have_library("user32")
44
+ have_library("advapi32")
45
+ have_library("ws2_32")
46
+ have_library("netapi32")
47
+ have_library("shell32")
48
+ have_library("pdh")
49
+ have_library("version")
50
+ when /linux/
51
+ os = 'linux'
52
+ when /solaris|sun/
53
+ os = 'solaris'
54
+ have_library("nsl")
55
+ have_library("socket")
56
+ have_library("kstat")
57
+ when /hpux/
58
+ os = 'hpux'
59
+ #XXX have_libary no workie on hpux?
60
+ $LDFLAGS += ' -lnsl -lnm'
61
+ when /aix/
62
+ os = 'aix'
63
+ have_library("odm")
64
+ have_library("cfg")
65
+ have_library("perfstat")
66
+ else
67
+ os = RUBY_PLATFORM
68
+ end
69
+
70
+ osdir = "../../src/os/#{os}"
71
+ $CPPFLAGS += ' -I../../include' + ' -I' + osdir
72
+ $CPPFLAGS += ' -U_FILE_OFFSET_BITS' unless is_win32
73
+ $CPPFLAGS += ' -fgnu89-inline'
74
+
75
+ if RUBY_VERSION > '1.8.4'
76
+ $CPPFLAGS += ' -DRB_HAS_RE_ERROR'
77
+ end
78
+ if RUBY_VERSION >= '1.9.0'
79
+ $CPPFLAGS += ' -DRB_RUBY_19'
80
+ end
81
+
82
+ #incase of nfs shared dir...
83
+ unless is_win32
84
+ if File.exist?('Makefile')
85
+ cmd = 'make distclean'
86
+ print cmd + "\n"
87
+ system(cmd)
88
+ end
89
+ Dir["./*.c"].each do |file|
90
+ if File.lstat(file).symlink?
91
+ print "unlink #{file}\n"
92
+ File.delete(file)
93
+ end
94
+ end
95
+ end
96
+
97
+ $distcleanfiles = ['rbsigar_generated.rx','sigar_version.c']
98
+
99
+ system('perl -Mlib=.. -MSigarWrapper -e generate Ruby .')
100
+ libname = extension_name + '.' + CONFIG['DLEXT']
101
+ filters =
102
+ 'ARCHNAME=' + RUBY_PLATFORM + ' ' +
103
+ 'ARCHLIB=' + libname + ' ' +
104
+ 'BINNAME=' + libname
105
+
106
+ system('perl -Mlib=.. -MSigarBuild -e version_file ' + filters)
107
+
108
+ if is_win32
109
+ system('perl -Mlib=.. -MSigarBuild -e resource_file ' + filters)
110
+ system('rc /r sigar.rc')
111
+ $LDFLAGS += ' sigar.res'
112
+ $distcleanfiles << ['sigar.rc', 'sigar.res']
113
+ #do not want dynamic runtime else "MSVCR80.dll was not found"
114
+ $CFLAGS = $CFLAGS.gsub('-MD', '')
115
+ end
116
+
117
+ #XXX seems mkmf forces basename on srcs
118
+ #XXX should be linking against libsigar anyhow
119
+ (Dir["../../src/*.c"] + Dir["#{osdir}/*.c"] + Dir["#{osdir}/*.cpp"]).each do |file|
120
+ cf = File.basename(file)
121
+ print file + ' -> ' + cf + "\n"
122
+ if is_win32
123
+ File.copy(file, cf)
124
+ else
125
+ File.symlink(file, cf) unless File.file?(cf)
126
+ end
127
+ $distcleanfiles.push(cf)
128
+ end
129
+
130
+ dir_config(extension_name)
131
+
132
+ create_makefile(extension_name)
@@ -0,0 +1,785 @@
1
+ /*
2
+ * Copyright (c) 2007-2009 Hyperic, Inc.
3
+ * Copyright (c) 2009 SpringSource, Inc.
4
+ * Copyright (c) 2009-2010 VMware, Inc.
5
+ *
6
+ * Licensed under the Apache License, Version 2.0 (the "License");
7
+ * you may not use this file except in compliance with the License.
8
+ * You may obtain a copy of the License at
9
+ *
10
+ * http://www.apache.org/licenses/LICENSE-2.0
11
+ *
12
+ * Unless required by applicable law or agreed to in writing, software
13
+ * distributed under the License is distributed on an "AS IS" BASIS,
14
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ * See the License for the specific language governing permissions and
16
+ * limitations under the License.
17
+ */
18
+
19
+ #include <ruby.h>
20
+ #ifdef RB_RUBY_19
21
+ #include <ruby/re.h>
22
+ #else
23
+ #include <re.h>
24
+ #endif
25
+
26
+ #include <errno.h>
27
+ #include "sigar.h"
28
+ #include "sigar_fileinfo.h"
29
+ #include "sigar_format.h"
30
+ #include "sigar_ptql.h"
31
+
32
+ #define RB_SIGAR_RAISE(msg) rb_raise(rb_eArgError, "%s", msg)
33
+ #define RB_SIGAR_CROAK RB_SIGAR_RAISE(sigar_strerror(sigar, status))
34
+ #define OBJ2PID(pid) rb_sigar_pid_get(rbsigar, pid)
35
+
36
+ #ifndef RSTRING_PTR
37
+ #define RSTRING_PTR(s) RSTRING(s)->ptr
38
+ #endif
39
+
40
+ #ifndef RSTRING_LEN
41
+ #define RSTRING_LEN(s) RSTRING(s)->len
42
+ #endif
43
+
44
+ #ifdef RB_HAS_RE_ERROR
45
+ # define RB_REGEX_ERROR rb_eRegexpError
46
+ #else
47
+ # define RB_REGEX_ERROR rb_eArgError
48
+ #endif
49
+
50
+ #define SIGAR \
51
+ sigar_t *sigar = rbsigar->sigar
52
+
53
+ #define SIGAR_GET \
54
+ rb_sigar_t *rbsigar = rb_sigar_get(obj); \
55
+ SIGAR
56
+
57
+ typedef struct {
58
+ sigar_t *sigar;
59
+ } rb_sigar_t;
60
+
61
+ static rb_sigar_t *rb_sigar_get(VALUE obj)
62
+ {
63
+ rb_sigar_t *rbsigar;
64
+ Data_Get_Struct(obj, rb_sigar_t, rbsigar);
65
+ return rbsigar;
66
+ }
67
+
68
+ static int rbsigar_ptql_re_impl(void *data,
69
+ char *haystack, char *needle)
70
+ {
71
+ #ifdef RB_RUBY_19
72
+ /* XXX no more regex.h */
73
+ return 0;
74
+ #else
75
+ struct re_pattern_buffer *regex;
76
+ int len = strlen(haystack);
77
+ int retval;
78
+ const char *err;
79
+
80
+ regex = ALLOC(struct re_pattern_buffer);
81
+ MEMZERO((char *)regex, struct re_pattern_buffer, 1);
82
+ /* XXX cache */
83
+ if ((err = re_compile_pattern(needle, strlen(needle), regex))) {
84
+ re_free_pattern(regex);
85
+ rb_raise(RB_REGEX_ERROR, "%s", err);
86
+ return 0;
87
+ }
88
+
89
+ retval = re_match(regex, haystack, len, 0, NULL);
90
+ re_free_pattern(regex);
91
+ return retval > 0;
92
+ #endif
93
+ }
94
+
95
+ #define sigar_isdigit(c) \
96
+ (isdigit(((unsigned char)(c))))
97
+
98
+ static sigar_pid_t rb_sigar_pid_get(rb_sigar_t *rbsigar, VALUE obj)
99
+ {
100
+ SIGAR;
101
+
102
+ if (TYPE(obj) == T_STRING) {
103
+ char *pid = StringValuePtr(obj);
104
+
105
+ if (sigar_isdigit(*pid)) {
106
+ obj = rb_str2inum(obj, 10);
107
+ /* fallthru */
108
+ }
109
+ else if ((RSTRING_LEN(obj) == 2) &&
110
+ (*pid == '$') && (*(pid + 1) == '$'))
111
+ {
112
+ return sigar_pid_get(sigar);
113
+ }
114
+ else {
115
+ /* XXX cache queries */
116
+ sigar_ptql_query_t *query;
117
+ sigar_ptql_error_t error;
118
+ int status =
119
+ sigar_ptql_query_create(&query, (char *)pid, &error);
120
+
121
+ if (status == SIGAR_OK) {
122
+ sigar_pid_t qpid;
123
+
124
+ sigar_ptql_re_impl_set(sigar, NULL, rbsigar_ptql_re_impl);
125
+ status = sigar_ptql_query_find_process(sigar, query, &qpid);
126
+ sigar_ptql_re_impl_set(sigar, NULL, NULL);
127
+ sigar_ptql_query_destroy(query);
128
+ if (status == SIGAR_OK) {
129
+ return qpid;
130
+ }
131
+ else {
132
+ RB_SIGAR_RAISE(sigar_strerror(sigar, status));
133
+ }
134
+ }
135
+ else {
136
+ RB_SIGAR_RAISE(error.message);
137
+ }
138
+ }
139
+ }
140
+ return NUM2UINT(obj);
141
+ }
142
+
143
+ static void rb_sigar_free(void *obj)
144
+ {
145
+ xfree(obj);
146
+ }
147
+
148
+ static void rb_sigar_close(rb_sigar_t *rbsigar)
149
+ {
150
+ sigar_close(rbsigar->sigar);
151
+ rb_sigar_free(rbsigar);
152
+ }
153
+
154
+ static void rb_sigar_mark(rb_sigar_t *rbsigar)
155
+ {
156
+ }
157
+
158
+ static VALUE rb_sigar_new(VALUE module)
159
+ {
160
+ rb_sigar_t *rbsigar;
161
+ rbsigar = ALLOC(rb_sigar_t);
162
+ sigar_open(&(rbsigar->sigar));
163
+ return Data_Wrap_Struct(module, rb_sigar_mark, rb_sigar_close, rbsigar);
164
+ }
165
+
166
+ static VALUE rb_sigar_format_size(VALUE rclass, VALUE size)
167
+ {
168
+ char buffer[56];
169
+ return rb_str_new2(sigar_format_size(NUM2LL(size), buffer));
170
+ }
171
+
172
+ static VALUE rb_sigar_net_interface_flags_to_s(VALUE rclass, VALUE flags)
173
+ {
174
+ char buffer[1024];
175
+ return rb_str_new2(sigar_net_interface_flags_to_string(NUM2LL(flags), buffer));
176
+ }
177
+
178
+ static VALUE rb_sigar_net_connection_type_to_s(VALUE rclass, VALUE type)
179
+ {
180
+ return rb_str_new2(sigar_net_connection_type_get(NUM2INT(type)));
181
+ }
182
+
183
+ static VALUE rb_sigar_net_connection_state_to_s(VALUE rclass, VALUE state)
184
+ {
185
+ return rb_str_new2(sigar_net_connection_state_get(NUM2INT(state)));
186
+ }
187
+
188
+ static VALUE rb_sigar_net_address_to_string(sigar_net_address_t *address)
189
+ {
190
+ char addr_str[SIGAR_INET6_ADDRSTRLEN];
191
+ sigar_net_address_to_string(NULL, address, addr_str);
192
+ return rb_str_new2(addr_str);
193
+ }
194
+
195
+ static VALUE rb_sigar_net_scope_to_s(VALUE rclass, VALUE type)
196
+ {
197
+ return rb_str_new2(sigar_net_scope_to_string(NUM2INT(type)));
198
+ }
199
+
200
+ #define rb_sigar_net_address_to_s(a) rb_sigar_net_address_to_string(&a)
201
+
202
+ static VALUE rb_sigar_new_list(char *data, unsigned long number,
203
+ int size, VALUE rclass)
204
+ {
205
+ unsigned long i;
206
+ VALUE av = rb_ary_new2(number);
207
+
208
+ for (i=0; i<number; i++, data += size) {
209
+ void *ent = malloc(size);
210
+
211
+ memcpy(ent, data, size);
212
+ rb_ary_push(av, Data_Wrap_Struct(rclass, 0, free, ent));
213
+ }
214
+
215
+ return av;
216
+ }
217
+
218
+ static VALUE rb_sigar_new_strlist(char **data, unsigned long number)
219
+ {
220
+ unsigned long i;
221
+ VALUE av = rb_ary_new2(number);
222
+
223
+ for (i=0; i<number; i++) {
224
+ rb_ary_push(av, rb_str_new2(data[i]));
225
+ }
226
+
227
+ return av;
228
+ }
229
+
230
+ static VALUE rb_sigar_new_intlist(int *data, int number)
231
+ {
232
+ int i;
233
+ VALUE av = rb_ary_new2(number);
234
+
235
+ for (i=0; i<number; i++) {
236
+ rb_ary_push(av, rb_int2inum(data[i]));
237
+ }
238
+
239
+ return av;
240
+ }
241
+
242
+ static VALUE rb_sigar_new_doublelist(double *data, int number)
243
+ {
244
+ int i;
245
+ VALUE av = rb_ary_new2(number);
246
+
247
+ for (i=0; i<number; i++) {
248
+ rb_ary_push(av, rb_float_new(data[i]));
249
+ }
250
+
251
+ return av;
252
+ }
253
+
254
+ static VALUE rb_sigar_net_interface_list(VALUE obj)
255
+ {
256
+ SIGAR_GET;
257
+
258
+ int status;
259
+ sigar_net_interface_list_t iflist;
260
+ VALUE RETVAL;
261
+
262
+ status = sigar_net_interface_list_get(sigar, &iflist);
263
+ if (status != SIGAR_OK) {
264
+ RB_SIGAR_CROAK;
265
+ }
266
+
267
+ RETVAL = rb_sigar_new_strlist(iflist.data, iflist.number);
268
+
269
+ sigar_net_interface_list_destroy(sigar, &iflist);
270
+
271
+ return RETVAL;
272
+ }
273
+
274
+ static int rb_sigar_str2net_address(VALUE bytes, sigar_net_address_t *address)
275
+ {
276
+ long len = RSTRING_LEN(bytes);
277
+
278
+ switch (len) {
279
+ case 4:
280
+ address->family = SIGAR_AF_INET;
281
+ break;
282
+ case 4*4:
283
+ address->family = SIGAR_AF_INET6;
284
+ break;
285
+ default:
286
+ return EINVAL;
287
+ }
288
+
289
+ memcpy(RSTRING_PTR(bytes), &address->addr.in6, len);
290
+
291
+ return SIGAR_OK;
292
+ }
293
+
294
+ static VALUE rb_cSigarNetStat;
295
+
296
+ static VALUE rb_sigar_net_stat_get(VALUE obj, VALUE flags, VALUE bytes, int port)
297
+ {
298
+ SIGAR_GET;
299
+
300
+ int status;
301
+ int has_port = (port != -1);
302
+ sigar_net_stat_t *RETVAL = malloc(sizeof(*RETVAL));
303
+ sigar_net_address_t address;
304
+
305
+ if (has_port) {
306
+ status = rb_sigar_str2net_address(bytes, &address);
307
+ if (status == SIGAR_OK) {
308
+ status = sigar_net_stat_port_get(sigar, RETVAL, NUM2INT(flags),
309
+ &address, port);
310
+ }
311
+ }
312
+ else {
313
+ status = sigar_net_stat_get(sigar, RETVAL, NUM2INT(flags));
314
+ }
315
+
316
+ if (status != SIGAR_OK) {
317
+ free(RETVAL);
318
+ RB_SIGAR_CROAK;
319
+ }
320
+
321
+ return Data_Wrap_Struct(rb_cSigarNetStat, 0, rb_sigar_free, RETVAL);
322
+ }
323
+
324
+ static VALUE rb_sigar_net_stat(VALUE obj, VALUE flags)
325
+ {
326
+ return rb_sigar_net_stat_get(obj, flags, Qnil, -1);
327
+ }
328
+
329
+ static VALUE rb_sigar_net_stat_port(VALUE obj, VALUE flags, VALUE address, VALUE port)
330
+ {
331
+ return rb_sigar_net_stat_get(obj, flags, address, NUM2INT(port));
332
+ }
333
+
334
+ static VALUE rb_sigar_NetStat_tcp_states(VALUE self)
335
+ {
336
+ sigar_net_stat_t *net_stat;
337
+
338
+ Data_Get_Struct(self, sigar_net_stat_t, net_stat);
339
+
340
+ return rb_sigar_new_intlist(&net_stat->tcp_states[0], SIGAR_TCP_UNKNOWN);
341
+ }
342
+
343
+ static VALUE rb_cSigarNetConnection;
344
+
345
+ static VALUE rb_sigar_net_connection_list(VALUE obj, VALUE flags)
346
+ {
347
+ SIGAR_GET;
348
+
349
+ int status;
350
+ sigar_net_connection_list_t connlist;
351
+ VALUE RETVAL;
352
+
353
+ status = sigar_net_connection_list_get(sigar, &connlist, NUM2UINT(flags));
354
+
355
+ if (status != SIGAR_OK) {
356
+ RB_SIGAR_CROAK;
357
+ }
358
+
359
+ RETVAL = rb_sigar_new_list((char *)&connlist.data[0],
360
+ connlist.number,
361
+ sizeof(*connlist.data),
362
+ rb_cSigarNetConnection);
363
+
364
+ sigar_net_connection_list_destroy(sigar, &connlist);
365
+
366
+ return RETVAL;
367
+ }
368
+
369
+ static VALUE rb_sigar_net_services_name(VALUE obj, VALUE protocol, VALUE port)
370
+ {
371
+ SIGAR_GET;
372
+
373
+ char *name;
374
+
375
+ if ((name = sigar_net_services_name_get(sigar, NUM2UINT(protocol), NUM2UINT(port)))) {
376
+ return rb_str_new2(name);
377
+ }
378
+ else {
379
+ return Qnil;
380
+ }
381
+ }
382
+
383
+ static VALUE rb_cSigarCpuInfo;
384
+
385
+ static VALUE rb_sigar_cpu_info_list(VALUE obj)
386
+ {
387
+ SIGAR_GET;
388
+
389
+ int status;
390
+ sigar_cpu_info_list_t cpu_infos;
391
+ VALUE RETVAL;
392
+
393
+ status = sigar_cpu_info_list_get(sigar, &cpu_infos);
394
+ if (status != SIGAR_OK) {
395
+ RB_SIGAR_CROAK;
396
+ }
397
+
398
+ RETVAL = rb_sigar_new_list((char *)&cpu_infos.data[0],
399
+ cpu_infos.number,
400
+ sizeof(*cpu_infos.data),
401
+ rb_cSigarCpuInfo);
402
+
403
+ sigar_cpu_info_list_destroy(sigar, &cpu_infos);
404
+
405
+ return RETVAL;
406
+ }
407
+
408
+ static VALUE rb_sigar_loadavg(VALUE obj)
409
+ {
410
+ SIGAR_GET;
411
+
412
+ int status;
413
+ sigar_loadavg_t loadavg;
414
+
415
+ status = sigar_loadavg_get(sigar, &loadavg);
416
+ if (status != SIGAR_OK) {
417
+ RB_SIGAR_CROAK;
418
+ }
419
+
420
+ return rb_sigar_new_doublelist(&loadavg.loadavg[0], 3);
421
+ }
422
+
423
+ static VALUE rb_cSigarCpuPerc;
424
+
425
+ static VALUE rb_cSigarFileSystem;
426
+
427
+ static VALUE rb_sigar_file_system_list(VALUE obj)
428
+ {
429
+ SIGAR_GET;
430
+
431
+ int status;
432
+ sigar_file_system_list_t fslist;
433
+ VALUE RETVAL;
434
+
435
+ status = sigar_file_system_list_get(sigar, &fslist);
436
+ if (status != SIGAR_OK) {
437
+ RB_SIGAR_CROAK;
438
+ }
439
+
440
+ RETVAL = rb_sigar_new_list((char *)&fslist.data[0],
441
+ fslist.number,
442
+ sizeof(*fslist.data),
443
+ rb_cSigarFileSystem);
444
+
445
+ sigar_file_system_list_destroy(sigar, &fslist);
446
+
447
+ return RETVAL;
448
+ }
449
+
450
+ static VALUE rb_cSigarArp;
451
+
452
+ static VALUE rb_sigar_arp_list(VALUE obj)
453
+ {
454
+ SIGAR_GET;
455
+
456
+ int status;
457
+ sigar_arp_list_t list;
458
+ VALUE RETVAL;
459
+
460
+ status = sigar_arp_list_get(sigar, &list);
461
+ if (status != SIGAR_OK) {
462
+ RB_SIGAR_CROAK;
463
+ }
464
+
465
+ RETVAL = rb_sigar_new_list((char *)&list.data[0],
466
+ list.number,
467
+ sizeof(*list.data),
468
+ rb_cSigarArp);
469
+
470
+ sigar_arp_list_destroy(sigar, &list);
471
+
472
+ return RETVAL;
473
+ }
474
+
475
+ static VALUE rb_cSigarWho;
476
+
477
+ static VALUE rb_sigar_who_list(VALUE obj)
478
+ {
479
+ SIGAR_GET;
480
+
481
+ int status;
482
+ sigar_who_list_t list;
483
+ VALUE RETVAL;
484
+
485
+ status = sigar_who_list_get(sigar, &list);
486
+ if (status != SIGAR_OK) {
487
+ RB_SIGAR_CROAK;
488
+ }
489
+
490
+ RETVAL = rb_sigar_new_list((char *)&list.data[0],
491
+ list.number,
492
+ sizeof(*list.data),
493
+ rb_cSigarWho);
494
+
495
+ sigar_who_list_destroy(sigar, &list);
496
+
497
+ return RETVAL;
498
+ }
499
+
500
+ static VALUE rb_cSigarNetRoute;
501
+
502
+ static VALUE rb_sigar_net_route_list(VALUE obj)
503
+ {
504
+ SIGAR_GET;
505
+
506
+ int status;
507
+ sigar_net_route_list_t list;
508
+ VALUE RETVAL;
509
+
510
+ status = sigar_net_route_list_get(sigar, &list);
511
+ if (status != SIGAR_OK) {
512
+ RB_SIGAR_CROAK;
513
+ }
514
+
515
+ RETVAL = rb_sigar_new_list((char *)&list.data[0],
516
+ list.number,
517
+ sizeof(*list.data),
518
+ rb_cSigarNetRoute);
519
+
520
+ sigar_net_route_list_destroy(sigar, &list);
521
+
522
+ return RETVAL;
523
+ }
524
+
525
+ static VALUE rb_sigar_proc_list(int argc, VALUE *argv, VALUE obj)
526
+ {
527
+ SIGAR_GET;
528
+
529
+ int status;
530
+ sigar_proc_list_t list;
531
+ VALUE RETVAL;
532
+ VALUE vptql;
533
+
534
+ rb_scan_args(argc, argv, "01", &vptql);
535
+ if (NIL_P(vptql)) {
536
+ status = sigar_proc_list_get(sigar, &list);
537
+
538
+ if (status != SIGAR_OK) {
539
+ RB_SIGAR_CROAK;
540
+ }
541
+ }
542
+ else {
543
+ sigar_ptql_query_t *query;
544
+ sigar_ptql_error_t error;
545
+ char *ptql = StringValuePtr(vptql);
546
+
547
+ status = sigar_ptql_query_create(&query, ptql, &error);
548
+
549
+ if (status != SIGAR_OK) {
550
+ RB_SIGAR_RAISE(error.message);
551
+ }
552
+ sigar_ptql_re_impl_set(sigar, NULL, rbsigar_ptql_re_impl);
553
+ status = sigar_ptql_query_find(sigar, query, &list);
554
+ sigar_ptql_re_impl_set(sigar, NULL, NULL);
555
+ sigar_ptql_query_destroy(query);
556
+ if (status != SIGAR_OK) {
557
+ RB_SIGAR_RAISE(sigar_strerror(sigar, status));
558
+ }
559
+ }
560
+
561
+ RETVAL = rb_sigar_new_intlist(&list.data[0],
562
+ list.number);
563
+
564
+ sigar_proc_list_destroy(sigar, &list);
565
+
566
+ return RETVAL;
567
+ }
568
+
569
+ static VALUE rb_sigar_proc_args(VALUE obj, VALUE pid)
570
+ {
571
+ SIGAR_GET;
572
+
573
+ int status;
574
+ sigar_proc_args_t args;
575
+ VALUE RETVAL;
576
+
577
+ status = sigar_proc_args_get(sigar, OBJ2PID(pid), &args);
578
+
579
+ if (status != SIGAR_OK) {
580
+ RB_SIGAR_CROAK;
581
+ }
582
+
583
+ RETVAL = rb_sigar_new_strlist(args.data, args.number);
584
+
585
+ sigar_proc_args_destroy(sigar, &args);
586
+
587
+ return RETVAL;
588
+ }
589
+
590
+ static int rb_sigar_env_getall(void *data,
591
+ const char *key, int klen,
592
+ char *val, int vlen)
593
+ {
594
+ rb_hash_aset(*((VALUE*)data),
595
+ rb_str_new(key, klen),
596
+ rb_str_new(val, vlen));
597
+ return SIGAR_OK;
598
+ }
599
+
600
+ static VALUE rb_sigar_proc_port(VALUE obj, VALUE protocol, VALUE port)
601
+ {
602
+ SIGAR_GET;
603
+
604
+ int status;
605
+ sigar_pid_t RETVAL;
606
+
607
+ status = sigar_proc_port_get(sigar, NUM2INT(protocol), NUM2LL(port), &RETVAL);
608
+ if (status != SIGAR_OK) {
609
+ RB_SIGAR_CROAK;
610
+ }
611
+
612
+ return rb_int2inum(RETVAL);
613
+ }
614
+
615
+ static VALUE rb_sigar_proc_env(VALUE obj, VALUE pid)
616
+ {
617
+ SIGAR_GET;
618
+
619
+ int status;
620
+ sigar_proc_env_t procenv;
621
+ VALUE RETVAL = rb_hash_new();
622
+
623
+ procenv.type = SIGAR_PROC_ENV_ALL;
624
+ procenv.env_getter = rb_sigar_env_getall;
625
+ procenv.data = &RETVAL;
626
+
627
+ status = sigar_proc_env_get(sigar, OBJ2PID(pid), &procenv);
628
+ if (status != SIGAR_OK) {
629
+ RB_SIGAR_CROAK;
630
+ }
631
+
632
+ return RETVAL;
633
+ }
634
+
635
+ VALUE rb = Qnil;
636
+
637
+ static VALUE rb_sigar_fqdn(VALUE obj)
638
+ {
639
+ SIGAR_GET;
640
+
641
+ char fqdn[SIGAR_FQDN_LEN];
642
+ int status;
643
+
644
+ if ((status = sigar_fqdn_get(sigar, fqdn, sizeof(fqdn))) != SIGAR_OK) {
645
+ RB_SIGAR_CROAK;
646
+ }
647
+
648
+ return rb_str_new2(fqdn);
649
+ }
650
+
651
+ #include "./rbsigar_generated.rx"
652
+
653
+ static VALUE rb_sigar_cpu_list(VALUE obj)
654
+ {
655
+ SIGAR_GET;
656
+
657
+ int status;
658
+ sigar_cpu_list_t cpus;
659
+ VALUE RETVAL;
660
+
661
+ status = sigar_cpu_list_get(sigar, &cpus);
662
+ if (status != SIGAR_OK) {
663
+ RB_SIGAR_CROAK;
664
+ }
665
+
666
+ RETVAL = rb_sigar_new_list((char *)&cpus.data[0],
667
+ cpus.number,
668
+ sizeof(*cpus.data),
669
+ rb_cSigarCpu);
670
+
671
+ sigar_cpu_list_destroy(sigar, &cpus);
672
+
673
+ return RETVAL;
674
+ }
675
+
676
+ #define RB_SIGAR_CONST_INT(name) \
677
+ rb_define_const(rclass, #name, INT2FIX(SIGAR_##name))
678
+
679
+ #define RB_SIGAR_DEFINE_CONST_STR(name, value) \
680
+ rb_define_const(rclass, name, rb_obj_freeze(rb_str_new2(value)))
681
+
682
+ #define RB_SIGAR_CONST_STR(name) \
683
+ rb_define_const(rclass, #name, rb_obj_freeze(rb_str_new2(SIGAR_##name)))
684
+
685
+ static void Init_rbsigar_constants(VALUE rclass)
686
+ {
687
+ RB_SIGAR_CONST_INT(FSTYPE_NONE);
688
+ RB_SIGAR_CONST_INT(FSTYPE_LOCAL_DISK);
689
+ RB_SIGAR_CONST_INT(FSTYPE_NETWORK);
690
+ RB_SIGAR_CONST_INT(FSTYPE_RAM_DISK);
691
+ RB_SIGAR_CONST_INT(FSTYPE_CDROM);
692
+ RB_SIGAR_CONST_INT(FSTYPE_SWAP);
693
+
694
+ RB_SIGAR_CONST_INT(IFF_UP);
695
+ RB_SIGAR_CONST_INT(IFF_BROADCAST);
696
+ RB_SIGAR_CONST_INT(IFF_DEBUG);
697
+ RB_SIGAR_CONST_INT(IFF_LOOPBACK);
698
+ RB_SIGAR_CONST_INT(IFF_POINTOPOINT);
699
+ RB_SIGAR_CONST_INT(IFF_NOTRAILERS);
700
+ RB_SIGAR_CONST_INT(IFF_RUNNING);
701
+ RB_SIGAR_CONST_INT(IFF_NOARP);
702
+ RB_SIGAR_CONST_INT(IFF_PROMISC);
703
+ RB_SIGAR_CONST_INT(IFF_ALLMULTI);
704
+ RB_SIGAR_CONST_INT(IFF_MULTICAST);
705
+ RB_SIGAR_CONST_INT(IFF_SLAVE);
706
+ RB_SIGAR_CONST_INT(IFF_MASTER);
707
+ RB_SIGAR_CONST_INT(IFF_DYNAMIC);
708
+
709
+ RB_SIGAR_CONST_INT(NETCONN_CLIENT);
710
+ RB_SIGAR_CONST_INT(NETCONN_SERVER);
711
+ RB_SIGAR_CONST_INT(NETCONN_TCP);
712
+ RB_SIGAR_CONST_INT(NETCONN_UDP);
713
+ RB_SIGAR_CONST_INT(NETCONN_RAW);
714
+ RB_SIGAR_CONST_INT(NETCONN_UNIX);
715
+
716
+ RB_SIGAR_CONST_INT(TCP_ESTABLISHED);
717
+ RB_SIGAR_CONST_INT(TCP_SYN_SENT);
718
+ RB_SIGAR_CONST_INT(TCP_SYN_RECV);
719
+ RB_SIGAR_CONST_INT(TCP_FIN_WAIT1);
720
+ RB_SIGAR_CONST_INT(TCP_FIN_WAIT2);
721
+ RB_SIGAR_CONST_INT(TCP_TIME_WAIT);
722
+ RB_SIGAR_CONST_INT(TCP_CLOSE);
723
+ RB_SIGAR_CONST_INT(TCP_CLOSE_WAIT);
724
+ RB_SIGAR_CONST_INT(TCP_LAST_ACK);
725
+ RB_SIGAR_CONST_INT(TCP_LISTEN);
726
+ RB_SIGAR_CONST_INT(TCP_CLOSING);
727
+ RB_SIGAR_CONST_INT(TCP_IDLE);
728
+ RB_SIGAR_CONST_INT(TCP_BOUND);
729
+ RB_SIGAR_CONST_INT(TCP_UNKNOWN);
730
+
731
+ RB_SIGAR_CONST_INT(RTF_UP);
732
+ RB_SIGAR_CONST_INT(RTF_GATEWAY);
733
+ RB_SIGAR_CONST_INT(RTF_HOST);
734
+
735
+ RB_SIGAR_CONST_STR(NULL_HWADDR);
736
+ }
737
+
738
+ static void Init_rbsigar_version(VALUE rclass)
739
+ {
740
+ sigar_version_t *sv = sigar_version_get();
741
+ RB_SIGAR_DEFINE_CONST_STR("BUILD_DATE", sv->build_date);
742
+ RB_SIGAR_DEFINE_CONST_STR("SCM_REVISION", sv->scm_revision);
743
+ RB_SIGAR_DEFINE_CONST_STR("VERSION", sv->version);
744
+ }
745
+
746
+ void Init_sigar(void)
747
+ {
748
+ VALUE rclass = rb_define_class("Sigar", rb_cObject);
749
+
750
+ rb_define_method(rclass, "cpu_info_list", rb_sigar_cpu_info_list, 0);
751
+ rb_define_method(rclass, "cpu_list", rb_sigar_cpu_list, 0);
752
+ rb_define_method(rclass, "loadavg", rb_sigar_loadavg, 0);
753
+ rb_define_method(rclass, "file_system_list", rb_sigar_file_system_list, 0);
754
+ rb_define_method(rclass, "net_connection_list", rb_sigar_net_connection_list, 1);
755
+ rb_define_method(rclass, "net_interface_list", rb_sigar_net_interface_list, 0);
756
+ rb_define_method(rclass, "net_services_name", rb_sigar_net_services_name, 2);
757
+ rb_define_method(rclass, "net_stat", rb_sigar_net_stat, 1);
758
+ rb_define_method(rclass, "net_stat_port", rb_sigar_net_stat_port, 3);
759
+ rb_define_method(rclass, "net_route_list", rb_sigar_net_route_list, 0);
760
+ rb_define_method(rclass, "arp_list", rb_sigar_arp_list, 0);
761
+ rb_define_method(rclass, "who_list", rb_sigar_who_list, 0);
762
+ rb_define_method(rclass, "proc_list", rb_sigar_proc_list, -1);
763
+ rb_define_method(rclass, "proc_args", rb_sigar_proc_args, 1);
764
+ rb_define_method(rclass, "proc_env", rb_sigar_proc_env, 1);
765
+ rb_define_method(rclass, "proc_port", rb_sigar_proc_port, 2);
766
+ rb_define_method(rclass, "fqdn", rb_sigar_fqdn, 0);
767
+
768
+ rb_define_singleton_method(rclass, "new", rb_sigar_new, 0);
769
+ rb_define_singleton_method(rclass, "format_size", rb_sigar_format_size, 1);
770
+ rb_define_singleton_method(rclass, "net_interface_flags_to_s",
771
+ rb_sigar_net_interface_flags_to_s, 1);
772
+ rb_define_singleton_method(rclass, "net_scope_to_s",
773
+ rb_sigar_net_scope_to_s, 1);
774
+ rb_define_singleton_method(rclass, "net_connection_type_to_s",
775
+ rb_sigar_net_connection_type_to_s, 1);
776
+ rb_define_singleton_method(rclass, "net_connection_state_to_s",
777
+ rb_sigar_net_connection_state_to_s, 1);
778
+
779
+ Init_rbsigar_constants(rclass);
780
+ Init_rbsigar_version(rclass);
781
+
782
+ /* generated */
783
+ rb_sigar_define_module_methods(rclass);
784
+ rb_define_method(rb_cSigarNetStat, "tcp_states", rb_sigar_NetStat_tcp_states, 0);
785
+ }