Re: Problem with sd_listen_fds(0)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Do, 27.06.19 13:44, Mantas Mikulėnas (grawity@xxxxxxxxx) wrote:

> On Thu, Jun 27, 2019 at 1:29 PM Donat Zenichev <donat.zenichev@xxxxxxxxx>
> wrote:
>
> > Hi systemd community.
> > Recently I've come accross one interesting problem with API of systemd.
> > The problem is that, I'm not able to read commands comming to the AF_UNIX
> > socket, that was created by systemd and passed to my program using
> > sd_listen_fds(0) function.
> >
> > What actually program requires, is AF_UNIX (AF_LOCAL) socket of type
> > SOCK_STREAM.
> > In case if I create this socket manually, using socket(AF_LOCAL,
> > SOCK_STREAM, 0) function, it works out as expected.
> >
> > But, when I create a socket using systemd socket unit, reading fails with
> > "-1" return value.
> >
> > What I actually do, is that I check if there are some sockets created for
> > me using sd_listen_fds(0), and in case it returns 1 (so 1 socket created),
> > program goes further and sets a file descriptor value to fd =
> > SD_LISTEN_FDS_START + 0;
> > Since the SD_LISTEN_FDS_START is pre-defined to value '3', my file
> > descriptor will always be '3'.
> >
> > But when it comes to reading, with read() function, it fails with the
> > errno EINVAL - Invalid argument.
> > It's not a matter of a other parameters than a file descriptor, since with
> > manual creation of socket it works out as I said.
> >
> > An initializing of the socket descriptor, when creating it by systemd
> > passes as normal, so program starts.
> > But any further command received on fd fails with '-1' return value.
> >
>
> As this is a stream socket, by default the program will receive the
> *listener* socket. Systemd will start your service as soon as someone
> connects, but your program still needs to accept() each connection first.

Addendum: you can set Accept=true in the socket unit file. If you do,
then systemd will accept the connection and spawn a new instance of
your service for each connection. For that to work you need to name
your service unit file foo@.service (if you socket unit file is called
foo.socket), i.e. the "@" indicates it's a service that shall be
instantiated multiple times.

Lennart

--
Lennart Poettering, Berlin
_______________________________________________
systemd-devel mailing list
systemd-devel@xxxxxxxxxxxxxxxxxxxxx
https://lists.freedesktop.org/mailman/listinfo/systemd-devel




[Index of Archives]     [LARTC]     [Bugtraq]     [Yosemite Forum]     [Photo]

  Powered by Linux