anchor.diff:  -export([tsp/1, tsp/2, tsf/1]).
   -export([check_body/1]).
   -export([millis/0, millis_diff/2, hours/1, minutes/1, seconds/1, sleep/1]).
  --export([oscmd/1, has_ipv6_support/1]).
  +-export([oscmd/1, has_ipv6_support/0, has_ipv6_support/1, print_system_info/1]).
  +-export([run_on_os/2, run_on_windows/1]).
   -export([ensure_started/1]).
   -export([non_pc_tc_maybe_skip/4, os_based_skip/1, skip/3, fail/3]).
   -export([flush/0]).
  
positive.code: 	"~n   Host: ~p"
  	"~n   Port: ~p"
  	"~n   Opts: ~p", [Host, Port, Opts]),
      case gen_tcp:connect(Host,Port, Opts) of
  	{ok, Socket} ->
  	    tsp("connect success"),
  	    {ok, Socket};
  	{error, nxdomain} ->
  	    tsp("connect error nxdomain when opts: ~p", [Opts]),
  	    connect(ip_comm, Host, Port, lists:delete(inet6, Opts));
  	{error, eafnosupport}  ->
  	    tsp("connect error eafnosupport when opts: ~p", [Opts]),
  	    connect(ip_comm, Host, Port, lists:delete(inet6, Opts));
  	{error, econnreset} ->
  	    tsp("connect error econnreset when opts: ~p", [Opts]),
  	    connect(ip_comm, Host, Port, lists:delete(inet6, Opts));
  	{error, enetunreach}  ->
  	    tsp("connect error eafnosupport when opts: ~p", [Opts]),
  	    connect(ip_comm, Host, Port, lists:delete(inet6, Opts));
  	{error, {enfile,_}} ->
  	    tsp("connect error enfile when opts: ~p", [Opts]),
  	    {error, enfile};
  	Error ->
  	    tsp("Unexpected error: "
  		"~n   Error: ~p"
  		"~nwhen"
  		"~n   Host:  ~p"
  		"~n   Port:  ~p"
  		"~n   Opts:  ~p"
  		"~n", [Error, Host, Port, Opts]),
  	    Error
      end.
  
  
  send(ssl, Socket, Data) ->
      ssl:send(Socket, Data);
  
negative.code: oscmd(Cmd) ->
    string:strip(os:cmd(Cmd), right, $\n).
  
  
  print_system_info([]) ->
      do_print_system_info("System Info");
  print_system_info(Prefix) when is_list(Prefix) ->
      NewPrefix = lists:flatten(io_lib:format("~s: System Info", [Prefix])), 
      do_print_system_info(NewPrefix).
  
  do_print_system_info(Prefix) ->
      tsp("~s => "
  	"~n"
  	"~n   OS Type:            ~p"
  	"~n   OS version:         ~p"
  	"~n   Sys Arch:           ~p"
  	"~n   CPU Topology:       ~p"
  	"~n   Num logical procs:  ~p"
  	"~n   SMP support:        ~p"
  	"~n   Num schedulers:     ~p"
  	"~n   Scheduler bindings: ~p"
  	"~n   Wordsize:           ~p"
  	"~n~n", [Prefix, 
  		 os:type(), os:version(), 
  		 erlang:system_info(system_architecture),
  		 erlang:system_info(cpu_topology),
  		 erlang:system_info(logical_processors),
  		 erlang:system_info(smp_support),
  		 erlang:system_info(schedulers),
  		 erlang:system_info(scheduler_bindings),
  		 erlang:system_info(wordsize)]),
      ok.
      
      
  run_on_windows(Fun) ->
      run_on_os(windows, Fun).
  
  run_on_os(windows, Fun) ->
      case os:type() of
  	{win32, _} ->
  	    Fun();
  	_ ->
  	    ok
      end.
  	    
      
  %% -- Misc node operation wrapper functions --
  
  start_node(Name) ->
  