From 5e6ec3987e902aa471b96911545906f55ef41c58 Mon Sep 17 00:00:00 2001 From: Doug MacEachern Date: Mon, 1 Feb 2010 20:45:49 -0800 Subject: [PATCH] (SIGAR-199) add arp_list Erlang binding --- bindings/erl/c_src/sigar_drv.c | 28 ++++++++++++++++++++++++++++ bindings/erl/examples/arp.erl | 16 ++++++++++++++++ bindings/erl/src/sigar.erl | 4 ++++ 3 files changed, 48 insertions(+) create mode 100755 bindings/erl/examples/arp.erl diff --git a/bindings/erl/c_src/sigar_drv.c b/bindings/erl/c_src/sigar_drv.c index c125dbd4..f208d11c 100644 --- a/bindings/erl/c_src/sigar_drv.c +++ b/bindings/erl/c_src/sigar_drv.c @@ -305,6 +305,31 @@ static void esigar_cpu_info_list_get(ErlDrvPort port, sigar_t *sigar) ESIGAR_SEND(port, &x); } +static void esigar_arp_list_get(ErlDrvPort port, sigar_t *sigar) +{ + int status; + ei_x_buff x; + sigar_arp_list_t list; + + ei_x_new_with_version(&x); + + if ((status = sigar_arp_list_get(sigar, &list) == SIGAR_OK)) { + ESIGAR_OK(&x); + + esigar_to_list(&x, + (char *)&list.data[0], list.number, + sizeof(*list.data), + (esigar_encoder_func_t)esigar_encode_arp); + + sigar_arp_list_destroy(sigar, &list); + } + else { + ESIGAR_ERROR(&x, sigar, status); + } + + ESIGAR_SEND(port, &x); +} + static void esigar_who_list_get(ErlDrvPort port, sigar_t *sigar) { int status; @@ -354,6 +379,9 @@ static void outputv(ErlDrvData handle, ErlIOVec *ev) { case ESIGAR_CPU_INFO_LIST: esigar_cpu_info_list_get(port, sigar); break; + case ESIGAR_ARP_LIST: + esigar_arp_list_get(port, sigar); + break; case ESIGAR_WHO_LIST: esigar_who_list_get(port, sigar); break; diff --git a/bindings/erl/examples/arp.erl b/bindings/erl/examples/arp.erl new file mode 100755 index 00000000..f408ed60 --- /dev/null +++ b/bindings/erl/examples/arp.erl @@ -0,0 +1,16 @@ +#!/usr/bin/env escript +%%! -pz ebin +-include(sigar). + +main(_) -> + {ok, S} = sigar:start(), + {ok, List} = sigar:arp_list(S), + lists:map( + fun(Arp) -> + lists:map( + fun(K) -> + io:format("~s\t", [sigar:get_value(K, Arp)]) end, + [address, hwaddr, type, ifname]), + io:format("~n") + end, List), + sigar:stop(S). diff --git a/bindings/erl/src/sigar.erl b/bindings/erl/src/sigar.erl index 6e4e4974..fff5a66a 100644 --- a/bindings/erl/src/sigar.erl +++ b/bindings/erl/src/sigar.erl @@ -12,6 +12,7 @@ net_route_list/1, file_system_list/1, cpu_info_list/1, + arp_list/1, who_list/1]). -define(NETCONN_CLIENT, 0x01). @@ -51,6 +52,9 @@ file_system_list({sigar, S}) -> cpu_info_list({sigar, S}) -> do_command(S, ?CPU_INFO_LIST). +arp_list({sigar, S}) -> + do_command(S, ?ARP_LIST). + who_list({sigar, S}) -> do_command(S, ?WHO_LIST).