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 library(socket).
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 module list?
As you say, it is too late by the point, because the socket has already been created with the AF_INET domain.
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?
The current 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 nbio_connect.
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 pl_connect to nbio_get_sockaddr, although that would involve changing the argument type of the latter (from sockaddr_in * to sockaddr*).