It was <2013-07-15 pon 17:20>, when walter harms wrote: > can defined(AF_INET6) happen without defined(IPv6) ?
Probably no. However, define(IPv6) need not to be true everytime defined(AF_INET6) is. I can't say anything more, except that this is how it is used everywhere else in the code. > Reviewed-by: [email protected] <[email protected]> > > Am 15.07.2013 10:36, schrieb Łukasz Stelmach: >> Receive file descriptors of open sockets from systemd instead of >> creating them. >> >> Signed-off-by: Łukasz Stelmach <[email protected]> >> Cc: Kyungmin Park <[email protected]> >> Cc: MyungJoo Ham <[email protected]> >> Cc: Piort Bereza <[email protected]> >> Cc: Karol Lewandowski <[email protected]> >> Cc: Lennart Poettering <[email protected]> >> Cc: Zbigniew Jędrzejewski-Szmek <[email protected]> >> Cc: Peter Hutterer <[email protected]> >> Cc: walter harms <[email protected]> >> Cc: Alan Coopersmith <[email protected]> >> --- >> Xtrans.c | 76 >> +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- >> 1 file changed, 75 insertions(+), 1 deletion(-) >> >> diff --git a/Xtrans.c b/Xtrans.c >> index 5860f3a..5e8de4b 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) >> @@ -1037,6 +1040,73 @@ complete_network_count (void) >> } >> >> >> +static int >> +receive_listening_fds(char* port, XtransConnInfo* temp_ciptrs, int* >> count_ret) >> + >> +{ >> +#ifdef HAVE_SYSTEMD >> + XtransConnInfo ciptr; >> + int systemd_listen_fds, i; >> + >> + systemd_listen_fds = sd_listen_fds(1); >> + if (systemd_listen_fds < 0) >> + { >> + return -1; >> + } >> + else if (systemd_listen_fds > 0) >> + { >> + for (i = 0; i < systemd_listen_fds && *count_ret < NUMTRANS; 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, "__receive_listening_fds:" >> + "Got NULL while trying to reopen socket received from >> systemd.\n"); >> + else >> + { >> + prmsg (5, "__receive_listening_fds: received listener for %s, >> %d\n", >> + tn, ciptr->fd); >> + temp_ciptrs[(*count_ret)++] = ciptr; >> + TRANS(Received)(tn); >> + } >> + } >> + } >> +#endif /* HAVE_SYSTEMD */ >> + return 0; >> +} >> + >> #ifdef XQUARTZ_EXPORTS_LAUNCHD_FD >> extern int xquartz_launchd_fd; >> #endif >> @@ -1069,12 +1139,16 @@ TRANS(MakeAllCOTSServerListeners) (char *port, int >> *partial, int *count_ret, >> } >> #endif >> >> + if (receive_listening_fds(port, temp_ciptrs, count_ret) < 0) >> + return -1; >> + >> 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", > -- Łukasz Stelmach Samsung R&D Institute Poland Samsung Electronics _______________________________________________ [email protected]: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel
