[erlang-questions] General help with unix sockets

Michael Santos michael.santos@REDACTED
Thu Jun 9 15:03:43 CEST 2011


On Thu, Jun 09, 2011 at 12:19:42PM +0100, Paul G Webster wrote:
> Good day,
> 
> I was wondering if anyone could lend a hand; I am trying to use
> erlang to connect to a unix socket '/var/pexim.sock' I spied out
> 'procket' it looks good but I am a little to new to erlang to figure
> out howto actually use the toolkit to connect..
> 
> Would anyone be able to give me a hand; it does not even need to be
> procket .. just a simple connection script for a unix socket
> 
> If you could help it would be excellent
> 
> p.s. If this actually ends up on the list twice; my apologies :)

There are a few ways to connect to Unix sockets from Erlang. I responded
to your other email privately but for the archives my blog has some info
about it:

http://listincomprehension.com/2010/12/unix-sockets.html

Assuming that /var/pexim.sock is a stream socket (is that path right?) and
you're using procket, the steps are similar to opening a socket in C.
The layout of a struct sockaddr_un will depend on your OS. For example,
it's defined in /usr/include/linux/un.h as:

    #define UNIX_PATH_MAX   108
    
    struct sockaddr_un {
        sa_family_t sun_family; /* AF_UNIX */
        char sun_path[UNIX_PATH_MAX];   /* pathname */
    };

So the code to open the socket would look something like (untested):

    Path = <<"/var/pexim.sock">>,
    PF_LOCAL = 1,

    % Get a Unix stream socket fd
    {ok, Socket} = procket:socket(local, stream, 0),
    Len = 108 - byte_size(Path),

    % Linux sockaddr_un
    Sun = <<PF_LOCAL/native,
            Path/binary,
            0:(Len*8)>>,

    ok = procket:connect(Socket, Sun),

    {ok, Buf} = procket:read(Socket, 16#FFFF),
    ok = procket:write(Socket, Buf),

    ok = procket:close().

I've left out the portability stuff for running on both BSD/Linux.

Hope that helps!



More information about the erlang-questions mailing list