anchor.diff:  	{Name,Val} when is_atom(Name) -> con_add(Name, Val, R, Opts, As);
   	_ -> {error, badarg}
       end;
  -con_opt([], R, _) ->
  +con_opt([], #connect_opts{} = R, _) ->
       {ok, R}.
   
  -con_add(Name, Val, R, Opts, AllOpts) ->
  +con_add(Name, Val, #connect_opts{} = R, Opts, AllOpts) ->
       case add_opt(Name, Val, R#connect_opts.opts, AllOpts) of
   	{ok, SOpts} ->
   	    con_opt(Opts, R#connect_opts { opts = SOpts }, AllOpts);
  
positive.code: 	Error -> Error
      end.
  
  udp_opt([{raw,A,B,C}|Opts], R, As) ->
      udp_opt([{raw,{A,B,C}}|Opts], R, As);
  udp_opt([Opt | Opts], R, As) ->
      case Opt of
  	{ip,IP}     ->  udp_opt(Opts, R#udp_opts { ifaddr = IP }, As);
  	{ifaddr,IP} ->  udp_opt(Opts, R#udp_opts { ifaddr = IP }, As);
  
negative.code: 	{Name,Val} when is_atom(Name) -> list_add(Name, Val, R, Opts, As);
  	_ -> {error, badarg}
      end;
  list_opt([], #listen_opts{} = R, _SockOpts) ->
      {ok, R}.
  
  list_add(Name, Val, #listen_opts{} = R, Opts, As) ->
      case add_opt(Name, Val, R#listen_opts.opts, As) of
  	{ok, SOpts} ->
  	    list_opt(Opts, R#listen_opts { opts = SOpts }, As);
  