Am 12.07.2013 13:04, schrieb Łukasz Stelmach: > Receive file descriptors of open sockets from systemd instead of > creating them. > > Signed-off-by: Łukasz Stelmach <l.stelm...@samsung.com> > Cc: Kyungmin Park <kyungmin.p...@samsung.com> > Cc: MyungJoo Ham <myungjoo....@samsung.com> > Cc: Piort Bereza <p.ber...@samsung.com> > Cc: Karol Lewandowski <k.lewando...@samsung.com> > Cc: Lennart Poettering <lenn...@poettering.net> > Cc: Zbigniew Jędrzejewski-Szmek <zbys...@in.waw.pl> > Cc: Peter Hutterer <peter.hutte...@who-t.net> > Cc: walter harms <wha...@bfs.de> > Cc: Alan Coopersmith <alan.coopersm...@oracle.com> > --- > Xtrans.c | 69 > +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- > 1 file changed, 68 insertions(+), 1 deletion(-) > > diff --git a/Xtrans.c b/Xtrans.c > index 5860f3a..fb6541d 100644 > --- a/Xtrans.c > +++ b/Xtrans.c > @@ -48,6 +48,9 @@ from The Open Group. > */ > > #include <ctype.h> > +#ifdef HAVE_SYSTEMD > +#include <systemd/sd-daemon.h> > +#endif > > /* > * The transport table contains a definition for every transport (protocol) > @@ -1053,6 +1056,10 @@ TRANS(MakeAllCOTSServerListeners) (char *port, int > *partial, int *count_ret, > #if defined(IPv6) && defined(AF_INET6) > int ipv6_succ = 0; > #endif > +#ifdef HAVE_SYSTEMD > + int systemd_listen_fds; > +#endif /* HAVE_SYSTEMD */ > + > prmsg (2,"MakeAllCOTSServerListeners(%s,%p)\n", > port ? port : "NULL", ciptrs_ret); > > @@ -1068,13 +1075,73 @@ TRANS(MakeAllCOTSServerListeners) (char *port, int > *partial, int *count_ret, > temp_ciptrs[(*count_ret)++] = ciptr; > } > #endif > +#ifdef HAVE_SYSTEMD > + systemd_listen_fds = sd_listen_fds(1); > + if (systemd_listen_fds < 0) > + { > + return -1; > + } > + else if (systemd_listen_fds > 0) > + { > + snprintf(buffer, sizeof(buffer), ":%s", port);
maybe i missed something .. the only use of buffer i could find is in the memset() at the end ? > + for (i = 0; i < systemd_listen_fds; i++) > + { > + struct sockaddr_storage a; > + int ti; > + const char* tn; > + socklen_t al; > + > + al = sizeof(a); > + if (getsockname(i + SD_LISTEN_FDS_START, (struct sockaddr*)&a, &al) > < 0) > + return -1; > + > + switch (a.ss_family) > + { > + case AF_UNIX: > + ti = TRANS_SOCKET_UNIX_INDEX; > + if (*((struct sockaddr_un*)&a)->sun_path == '\0' && > + al > sizeof(sa_family_t)) > + tn = "local"; > + else > + tn = "unix"; > + break; > + case AF_INET: > + ti = TRANS_SOCKET_INET_INDEX; > + tn = "inet"; > + break; > +#if defined(IPv6) && defined(AF_INET6) > + case AF_INET6: > + ti = TRANS_SOCKET_INET6_INDEX; > + tn = "inet6"; > + break; > +#endif /* IPv6 */ > + default: > + return -1; > + } > + > + if ((ciptr = TRANS(ReopenCOTSServer)(ti, i + SD_LISTEN_FDS_START, > + port))==NULL) > + prmsg (1, "MakeAllCOTSServerListeners:" > + "Got NULL while trying to reopen socket received from > systemd.\n"); > + else > + { > + prmsg (5, "MakeAllCOTSServerListeners: received listener for > %s, %d\n", > + tn, ciptr->fd); > + temp_ciptrs[(*count_ret)++] = ciptr; > + TRANS(Received)(tn); > + } > + } > + memset(buffer, 0, sizeof(buffer)); > + } > +#endif /* HAVE_SYSTEMD */ perhaps you can make it in its own function (or prepare that it can easily be done). just my 2 cents, wh > > for (i = 0; i < NUMTRANS; i++) > { > Xtransport *trans = Xtransports[i].transport; > unsigned int flags = 0; > > - if (trans->flags&TRANS_ALIAS || trans->flags&TRANS_NOLISTEN) > + if (trans->flags&TRANS_ALIAS || trans->flags&TRANS_NOLISTEN || > + trans->flags&TRANS_RECEIVED) > continue; > > snprintf(buffer, sizeof(buffer), "%s/:%s", _______________________________________________ xorg-devel@lists.x.org: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel