<div dir="ltr"><div class="gmail_default"><font face="arial, helvetica, sans-serif"><div class="gmail_default">When a AF_LOCAL (a.k.a. AF_UNIX) file descriptor is created externally</div></font><font face="arial, helvetica, sans-serif"><div class="gmail_default">(e.g. Unix Domain Socket) and passed to `gen_tcp:listen(0, [{fd, FD}])`, the</div><div class="gmail_default">present implementation incorrectly assigns the address family to be equal</div><div class="gmail_default">to `inet`, which in the inet_drv driver translats to AF_INET instead</div><div class="gmail_default">of AF_LOCAL (or AF_UNIX), and an `einval` error code is returned.</div><div class="gmail_default"><br></div><div class="gmail_default">This patch fixes this problem such that the file descriptors of the</div><div class="gmail_default">`local` address family are properly supported when such a file descriptor</div><div class="gmail_default">is passed to the inet:fdopen/5, gen_tcp:connect/3, gen_tcp:listen/2, gen_udp:open/2</div><div class="gmail_default">calls via {fd, FD::integer()} option.</div><div class="gmail_default"><br></div><div class="gmail_default">In order to connect a socket to a Unix Domain file descriptor use the following options:</div><div class="gmail_default"><br></div><div class="gmail_default"><div class="gmail_default">    1> FD = ... % Open the AF_LOCAL *server* file descriptor</div><div class="gmail_default">    2> {ok, Sock} = gen_tcp:listen(0, [local, {fd,FD} | OtherOptions]).</div><div class="gmail_default">    % Now use the socket using gen_tcp module:<br></div><div class="gmail_default">    3> gen_tcp:send(Sock, <<"abc">>).</div><div><br></div><div>    FD = ... % Open the AF_LOCAL *client* file descriptor<br></div></div><div class="gmail_default">    2> {ok, Sock} = gen_tcp:connect(0, [local, {fd,FD} | OtherOptions]).</div><div class="gmail_default">    % Now use the socket using gen_tcp module:<br></div><div class="gmail_default">    3> inet:setopts(S, [{active, once}]),<br></div></font><font face="arial, helvetica, sans-serif"><div class="gmail_default">    4> receive Msg -> Msg end.</div><div class="gmail_default">    {tcp,#Port<0.1195>,"abc"}</div><div class="gmail_default">    5> inet:setopts(S, [{active, false}]).</div><div class="gmail_default">    6> gen_tcp:recv(S,0,1000).</div><div class="gmail_default">    {ok,"efg"}</div><div class="gmail_default"><br></div><div class="gmail_default">Note that in case of UDP client in order to preserve the active socket signature {udp, ErlPort, Addr, Port, Data} and passive socket's gen_udp:recv3 return signature ({ok, {Address, Port, Packet}}), the Address on local socket family is a string containing the underlying socket's filename, and Port=0. E.g.:</div><div class="gmail_default"><br></div><div class="gmail_default">    {ok, {"/tmp/test.sock", 0, <<"some data">>}} = gen_udp:recv(S, 0, 1000).</div></font><font face="arial, helvetica, sans-serif"><div class="gmail_default"><br></div></font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">git fetch </font><span style="font-family:arial,helvetica,sans-serif"><a href="https://github.com/saleyn/otp" target="_blank">https://github.com/saleyn/otp</a> uds</span></div><div class="gmail_default"><span style="font-family:arial,helvetica,sans-serif"><br></span></div><div class="gmail_default"><font face="arial, helvetica, sans-serif"><a href="https://github.com/saleyn/otp/compare/erlang:maint...uds" target="_blank">https://github.com/saleyn/otp/compare/erlang:maint...uds</a></font><br></div><div class="gmail_default"><font face="arial, helvetica, sans-serif"><a href="https://github.com/saleyn/otp/compare/erlang:maint...uds.patch" target="_blank">https://github.com/saleyn/otp/compare/erlang:maint...uds.patch</a><br></font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif"><br></font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">A sample project using this patch can be found here: </font><a href="https://github.com/saleyn/euds" target="_blank" style="font-family:arial,helvetica,sans-serif">https://github.com/saleyn/euds</a>. It uses a NIF library to create and FD of AF_LOCAL family, and passes it to either gen_tcp or gen_udp for further handling.</div><div class="gmail_default"><br></div><div class="gmail_default">Regards,</div><div class="gmail_default"><br></div><div class="gmail_default">Serge</div><div class="gmail_default"><font face="arial, helvetica, sans-serif"><br></font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif"><br></font></div></div>