add net_stat_port wrapper
This commit is contained in:
		
							parent
							
								
									961e5fc959
								
							
						
					
					
						commit
						6921e887e0
					
				@ -17,6 +17,7 @@
 | 
				
			|||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <ruby.h>
 | 
					#include <ruby.h>
 | 
				
			||||||
 | 
					#include <errno.h>
 | 
				
			||||||
#include "sigar.h"
 | 
					#include "sigar.h"
 | 
				
			||||||
#include "sigar_fileinfo.h"
 | 
					#include "sigar_fileinfo.h"
 | 
				
			||||||
#include "sigar_format.h"
 | 
					#include "sigar_format.h"
 | 
				
			||||||
@ -138,18 +139,42 @@ static VALUE rb_sigar_net_interface_list(VALUE obj)
 | 
				
			|||||||
    return RETVAL;
 | 
					    return RETVAL;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int rb_sigar_str2net_address(VALUE bytes, sigar_net_address_t *address)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    long len = RSTRING(bytes)->len;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    switch (len) {
 | 
				
			||||||
 | 
					      case 4:
 | 
				
			||||||
 | 
					        address->family = SIGAR_AF_INET;
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					      case 4*4:
 | 
				
			||||||
 | 
					        address->family = SIGAR_AF_INET6;
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					      default:
 | 
				
			||||||
 | 
					        return EINVAL;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    memcpy(RSTRING(bytes)->ptr, &address->addr.in6, len);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return SIGAR_OK;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static VALUE rb_cSigarNetStat;
 | 
					static VALUE rb_cSigarNetStat;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static VALUE rb_sigar_net_stat_get(VALUE obj, VALUE flags, VALUE address, int port)
 | 
					static VALUE rb_sigar_net_stat_get(VALUE obj, VALUE flags, VALUE bytes, int port)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    int status;
 | 
					    int status;
 | 
				
			||||||
    int has_port = (port != -1);
 | 
					    int has_port = (port != -1);
 | 
				
			||||||
    sigar_t *sigar = rb_sigar_get(obj);
 | 
					    sigar_t *sigar = rb_sigar_get(obj);
 | 
				
			||||||
    sigar_net_stat_t *RETVAL = malloc(sizeof(*RETVAL));
 | 
					    sigar_net_stat_t *RETVAL = malloc(sizeof(*RETVAL));
 | 
				
			||||||
 | 
					    sigar_net_address_t address;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (has_port) {
 | 
					    if (has_port) {
 | 
				
			||||||
        /*XXX*/
 | 
					        status = rb_sigar_str2net_address(bytes, &address);
 | 
				
			||||||
        status = SIGAR_ENOTIMPL;
 | 
					        if (status == SIGAR_OK) {
 | 
				
			||||||
 | 
					            status = sigar_net_stat_port_get(sigar, RETVAL, NUM2INT(flags),
 | 
				
			||||||
 | 
					                                             &address, port);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    else {
 | 
					    else {
 | 
				
			||||||
        status = sigar_net_stat_get(sigar, RETVAL, NUM2INT(flags));
 | 
					        status = sigar_net_stat_get(sigar, RETVAL, NUM2INT(flags));
 | 
				
			||||||
@ -168,6 +193,11 @@ static VALUE rb_sigar_net_stat(VALUE obj, VALUE flags)
 | 
				
			|||||||
    return rb_sigar_net_stat_get(obj, flags, Qnil, -1);
 | 
					    return rb_sigar_net_stat_get(obj, flags, Qnil, -1);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static VALUE rb_sigar_net_stat_port(VALUE obj, VALUE flags, VALUE address, VALUE port)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    return rb_sigar_net_stat_get(obj, flags, address, NUM2INT(port));
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static VALUE rb_sigar_NetStat_tcp_states(VALUE self)
 | 
					static VALUE rb_sigar_NetStat_tcp_states(VALUE self)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    sigar_net_stat_t *net_stat;
 | 
					    sigar_net_stat_t *net_stat;
 | 
				
			||||||
@ -401,6 +431,7 @@ void Init_rbsigar(void)
 | 
				
			|||||||
    rb_define_method(rclass, "net_interface_list", rb_sigar_net_interface_list, 0);
 | 
					    rb_define_method(rclass, "net_interface_list", rb_sigar_net_interface_list, 0);
 | 
				
			||||||
    rb_define_method(rclass, "net_services_name", rb_sigar_net_services_name, 2);
 | 
					    rb_define_method(rclass, "net_services_name", rb_sigar_net_services_name, 2);
 | 
				
			||||||
    rb_define_method(rclass, "net_stat", rb_sigar_net_stat, 1);
 | 
					    rb_define_method(rclass, "net_stat", rb_sigar_net_stat, 1);
 | 
				
			||||||
 | 
					    rb_define_method(rclass, "net_stat_port", rb_sigar_net_stat_port, 3);
 | 
				
			||||||
    rb_define_method(rclass, "who_list", rb_sigar_who_list, 0);
 | 
					    rb_define_method(rclass, "who_list", rb_sigar_who_list, 0);
 | 
				
			||||||
    rb_define_method(rclass, "proc_args", rb_sigar_proc_args, 1);
 | 
					    rb_define_method(rclass, "proc_args", rb_sigar_proc_args, 1);
 | 
				
			||||||
    rb_define_method(rclass, "proc_env", rb_sigar_proc_env, 1);
 | 
					    rb_define_method(rclass, "proc_env", rb_sigar_proc_env, 1);
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user