<HTML><HEAD><TITLE>Samsung Enterprise Portal mySingle</TITLE>
<META content="text/html; charset=euc-kr" http-equiv=Content-Type>
<STYLE id=mysingle_style type=text/css>P {
        MARGIN-BOTTOM: 5px; FONT-SIZE: 9pt; FONT-FAMILY: ±¼¸²Ã¼, arial; MARGIN-TOP: 5px
}
TD {
        MARGIN-BOTTOM: 5px; FONT-SIZE: 9pt; FONT-FAMILY: ±¼¸²Ã¼, arial; MARGIN-TOP: 5px
}
LI {
        MARGIN-BOTTOM: 5px; FONT-SIZE: 9pt; FONT-FAMILY: ±¼¸²Ã¼, arial; MARGIN-TOP: 5px
}
BODY {
        FONT-SIZE: 9pt; FONT-FAMILY: ±¼¸²Ã¼, arial; MARGIN: 10px; LINE-HEIGHT: 1.4
}
</STYLE>

<META content=IE=5 http-equiv=X-UA-Compatible>
<META content=IE=5 http-equiv=X-UA-Compatible>
<META name=GENERATOR content="MSHTML 11.00.9600.18098"></HEAD>
<BODY>
<P>This patch set did not consider the socket activation.<BR>So the fd is the unbind, no listen fd. The name was needed for the bind().<BR>However socket activation seems to be good point.<BR>If i am considering a socket activation, as you said wl_display_add_socket_fd () is only wl_event_loop_add_fd () and wl_list_insert () just needed.</P>
<P> </P>
<P>------- <B>Original Message</B> -------</P>
<P><B>Sender</B> : Pekka Paalanen<ppaalanen@gmail.com></P>
<P><B>Date</B> : 2015-12-14 19:42 (GMT+09:00)</P>
<P><B>Title</B> : Re: [PATCH wayland v3 6/7] server: Add new API for adding a socket with an existing fd</P>
<P> </P>On Mon,  7 Dec 2015 22:49:18 -0800<BR>Bryce Harrington <BRYCE@OSG.SAMSUNG.COM>wrote:<BR><BR>> Currently the server can add a socket by name.  To support an embedded<BR>> compositor in a Simplified Mandatory Access Control Kernel (Smack)<BR>> enabled environment, the embedded compositor should use the socket that<BR>> it gets from the system or session compositor.<BR>> <BR>> Signed-off-by: Bryce Harrington <BRYCE@OSG.SAMSUNG.COM><BR>> Cc: Sung-Jin Park <SJ76.PARK@SAMSUNG.COM><BR>> Cc: Sangjin Lee <LSJ119@SAMSUNG.COM><BR>> ---<BR>>  src/wayland-server-core.h |  3 +++<BR>>  src/wayland-server.c      | 46 ++++++++++++++++++++++++++++++++++++++++++++++<BR>>  2 files changed, 49 insertions(+)<BR>> <BR>> diff --git a/src/wayland-server-core.h b/src/wayland-server-core.h<BR>> index 85b4b9e..530053b 100644<BR>> --- a/src/wayland-server-core.h<BR>> +++ b/src/wayland-server-core.h<BR>> @@ -128,6 +128,9 @@ wl_display_get_event_loop(struct wl_display *display);<BR>>  int<BR>>  wl_display_add_socket(struct wl_display *display, const char *name);<BR>>  <BR>> +int<BR>> +wl_display_add_socket_fd(struct wl_display *display, const char *name, int sock_fd);<BR>> +<BR>>  const char *<BR>>  wl_display_add_socket_auto(struct wl_display *display);<BR>>  <BR><BR>Hi,<BR><BR>this is looking better, but there are still issues with 'name' and what<BR>this function should actually do.<BR><BR>The use case you describe sounds very similar to socket activation. We<BR>can hit both with the same nice and clean API addition.<BR><BR>> diff --git a/src/wayland-server.c b/src/wayland-server.c<BR>> index 7c25858..baea832 100644<BR>> --- a/src/wayland-server.c<BR>> +++ b/src/wayland-server.c<BR>> @@ -1201,6 +1201,52 @@ wl_display_add_socket_auto(struct wl_display *display)<BR>>   return NULL;<BR>>  }<BR>>  <BR><BR>This new function is missing documentation.<BR><BR>> +WL_EXPORT int<BR>> +wl_display_add_socket_fd(struct wl_display *display, const char *name, int sock_fd)<BR>> +{<BR><BR>Why 'name' when all you have is an fd to an already open socket?<BR><BR>> + struct wl_socket *s;<BR>> + struct stat buf;<BR>> +<BR>> + /* Require a valid fd or fail */<BR>> + if (sock_fd < 0 || fstat(sock_fd, &buf) < 0 || !S_ISSOCK(buf.st_mode)) {<BR>> + return -1;<BR>> + }<BR>> +<BR>> + s = wl_socket_alloc();<BR>> + if (s == NULL)<BR>> + return -1;<BR>> +<BR>> + if (name == NULL)<BR>> + name = getenv("WAYLAND_DISPLAY");<BR>> + if (name == NULL)<BR>> + name = "wayland-0";<BR><BR>If you don't know the name, guessing it like this is harmful. You<BR>cannot know you guessed right, because the socket is *already* open.<BR><BR>> +<BR>> + if (wl_socket_init_for_display_name(s, name) < 0) {<BR><BR>You cannot call this function, the socket is already open.<BR><BR>wl_socket_init_for_display_name() makes the assumption that the socket<BR>will be created in $XDG_RUNTIME_DIR/$name which I think in your use<BR>case will never be true.<BR><BR>> + wl_socket_destroy(s);<BR>> + return -1;<BR>> + }<BR>> +<BR>> + if (wl_socket_lock(s) < 0) {<BR><BR>You cannot call wl_socket_lock(), because the socket has already been<BR>created and opened. If the process that provided you the open socket fd<BR>did locking properly, then this call would fail always. But, it most<BR>likely does not fail because:<BR><BR>- whatever creates the socket file descriptor for you is not locking<BR>  properly, or does not need this kind of lock file<BR><BR>- you do not know the lock file name; you guess something in the above,<BR>  but that is most likely wrong; it will conflict with the normal<BR>  socket creation code, possibly causing failures elsewhere or in other<BR>  compositors<BR><BR>Whatever originally creates the socket file must take care of locking.<BR>It cannot be done here.<BR><BR>> + wl_socket_destroy(s);<BR>> + return -1;<BR>> + }<BR>> +<BR>> + /* Reuse the existing fd */<BR>> + s->fd = sock_fd;<BR>> + if (wl_os_set_cloexec_or_close(s->fd) < 0) {<BR><BR>I think we should require that the caller already ensured the fd is<BR>properly CLOEXEC. This can be done purely by documentation.<BR><BR>In this function, we have no guarantees what is going on in the process<BR>with respect to threads and forking, so there is no way we can<BR>guarantee that setting CLOEXEC cannot race.<BR><BR>If we push the responsibility of CLOEXEC to the caller, the caller can<BR>either provide the guarantees itself or require its caller to provide<BR>them. The caller can use recvmsg(MSG_CMSG_CLOEXEC) for instance to<BR>guarantee that the fd has CLOEXEC already when it appears in this<BR>process.<BR><BR>> + wl_log("could not set cloexec on provided fd\n");<BR>> + wl_socket_destroy(s);<BR>> + return -1;<BR>> + }<BR>> +<BR>> + if (_wl_display_bind_socket_source(display, s) < 0) {<BR><BR>_wl_display_bind_socket_source() calls bind() on the given sock_fd and<BR>the guessed, likely incorrect socket name.<BR><BR>I think bind() is what will actually create the socket file in the file<BR>system. I'm not sure I understood your use case right, but it seems you<BR>want to create the socket file outside of libwayland-server. Therefore<BR>calling bind() seems wrong: either it should fail with EINVAL or it<BR>creates the socket contrary to your expectations. That's my<BR>understanding from the bind(2) manual. In any case, calling bind()<BR>twice seems like it would be a bug.<BR><BR>> + wl_socket_destroy(s);<BR>> + return -1;<BR>> + }<BR>> +<BR>> + return 0;<BR>> +}<BR>> +<BR><BR>Right, I think the lack of documentation of what this new function<BR>does, assumes and requires shows up in the code as confusion about what<BR>operations should be done here and what are the caller's<BR>responsibilities. These need to be clarified.<BR><BR>You state your goal to be "Allow passing fd when adding socket for<BR>display", for "handing out file descriptors for sockets". To me this<BR>implies, that the API should be the following:<BR><BR>WL_EXPORT int<BR>wl_display_add_socket_fd(struct wl_display *display, int sock_fd)<BR><BR>Where sock_fd is a file descriptor for an open socket already bound to<BR>a socket file. If we are thinking about systemd, the sock_fd would have<BR>already had listen() called on it too, so that socket activation worked<BR>[1].<BR><BR>We do not want any systemd dependencies in libwayland, but supporting<BR>socket activation would obviously be a good thing. So,<BR>wl_display_add_socket_fd() should be designed to support that use case<BR>too. It's not hard: just assume that bind() and listen() have already<BR>been called, and don't call them again.<BR><BR>So what are we left with in wl_display_add_socket_fd()? Just<BR>wl_event_loop_add_fd() and wl_list_insert(), it seems. Everything else<BR>should be done by the caller.<BR><BR><BR>Thanks,<BR>pq<BR><BR>[1] http://0pointer.de/blog/projects/socket-activation.html<BR>
<TABLE id=confidentialsignimg>
<TBODY>
<TR>
<TD NAMO_LOCK>
<P><IMG border=0 src="cid:Z5JE7EUABGFC@namo.co.kr"></P></TD></TR></TBODY></TABLE></BODY></HTML><img src='http://ext.samsung.net/mailcheck/SeenTimeChecker?do=b6ee01ef39bdd5c06ffc1a014d0d5390419240d3d74469d2d261643f4e17952232c2d5b092db2212f255f74e40bd48632fd4ff3ea410d012fea75954dce1604da728c55b39cc59eacf878f9a26ce15a0' border=0 width=0 height=0 style='display:none'>