summaryrefslogtreecommitdiff
path: root/src/fib_freebsd.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/fib_freebsd.erl')
-rw-r--r--src/fib_freebsd.erl35
1 files changed, 35 insertions, 0 deletions
diff --git a/src/fib_freebsd.erl b/src/fib_freebsd.erl
new file mode 100644
index 0000000..b85d458
--- /dev/null
+++ b/src/fib_freebsd.erl
@@ -0,0 +1,35 @@
+-module(fib_freebsd).
+-behaviour(fib_behaviour).
+-export([default_table/0, current_table/0, tables/0]).
+-export([list/1]).
+
+default_table() ->
+ 1.
+
+current_table() ->
+ case os:cmd("sysctl net.my_fibnum") of
+ [$n, $e, $t, $., $m, $y, $_, $f, $i, $n, $b, $u, $m, $:, $\s | Rest] ->
+ {ok, list_to_integer(string:trim(Rest))};
+ _ ->
+ error
+ end.
+
+tables() ->
+ case os:cmd("sysctl net.fibs") of
+ [$n, $e, $t, $., $f, $i, $b, $s, $:, $\s | Rest] ->
+ Count = list_to_integer(string:trim(Rest)),
+ {ok, lists:seq(1, Count)};
+ _ ->
+ error
+ end.
+
+list(Table) ->
+ case lists:member(fib:tables(), Table) of
+ true ->
+ do_list(Table);
+ _ ->
+ {error, {no_table, Table}}
+ end.
+
+do_list(Table) ->
+ os:cmd(["setfib ", Table, " netstat -rn"]).