Is there a built-in predicate in SWI to make a connection to an AF_UNIX socket? I tried searching around, but the only function I see providing that is in XPCE, but that isn’t actually exported.
Right. Should be added …
I started making my own foreign wrapper, but if it’s desired, I can make a PR to add it to
I noticed when running under windows the new predicates return false, don’t you think it would be better to throw an exception?
Oh right, thanks, I meant to change that; thanks for the catch!
Thanks. Probably a resource error, but Jan or Paulo may think of a better error.
Considering the ISO Prolog standard classification of errors,
resource_error/1 is the sensible choice.
The current policy is not to implement predicates that cannot be realised on some platform. That allows for
:- if(current_predate(unix_socket/2)). ... :- else. ... :- endif.
As these beans are known as unix domain sockets I think I have a preference for that name (
unix_domain_socket). An alternative could be
tcp_bind(unix_domain(File))? (or are we too late in that case, I don’t have the API in my head).
Sure, that was going to be my initial approach, but I wasn’t sure how to conditionally export the predicates from socket.pl. In this case, would I do something like
:- if current_prolog_flag(windows, false). :- export([unix_socket/1, unix_connect/2]). : endif. instead of having the predicates in the
As you say, it is too late by the point, because the socket has already been created with the
This should do:
:- if(current_predicate(unix_socket/1)). :- export(( unix_socket/1, unix_connect/1)). :- endif.
Do we really need a separate unix_connect/1?
tcp_connect assumes the address is an inet address, but I could presumably change that to do things differently depending on the type of either the socket given to it or the address.
Updated; now there’s just one new predicated added,
unix_domain_socket/1 (which doesn’t exist on Windows) and
tcp_connect/2 now checks whether its first argument is an
AF_UNIX socket or otherwise to determine how to construct the
sockaddr to pass to
Currently, I’ve made all the changes in
socket.c, but presumably some of the logic could be moved to
nonblockio.c instead (i.e. move all the logic from
nbio_get_sockaddr, although that would involve changing the argument type of the latter (from
sockaddr_in * to