On 1/31/23 18:28, Richard W.M. Jones wrote:
> On Tue, Jan 31, 2023 at 10:29:00AM -0600, Eric Blake wrote:
>> On Mon, Jan 30, 2023 at 10:55:20PM +0000, Richard W.M. Jones wrote:
>>> To allow us to name the socket passed down to the NBD server when
>>> calling nbd_connect_systemd_socket_activation(3), we need to add the
>>> field to the handle and add access functions.
>>> ---
>>>  generator/API.ml | 49 ++++++++++++++++++++++++++++++++++++++++++
>>>  lib/handle.c     | 56 ++++++++++++++++++++++++++++++++++++++++++++++++
>>>  lib/internal.h   |  1 +
>>>  3 files changed, 106 insertions(+)
>>>
>>> diff --git a/generator/API.ml b/generator/API.ml
>>> index 25a612a2e8..08fc80960b 100644
>>> --- a/generator/API.ml
>>> +++ b/generator/API.ml
>>> @@ -2036,15 +2036,62 @@   "connect_systemd_socket_activation", {
>>>  
>>>  When the NBD handle is closed the server subprocess
>>>  is killed.
>>> +
>>> +=head3 Socket name
>>> +
>>> +The socket activation protocol lets you optionally give
>>> +the socket a name.  If used, the name is passed to the
>>> +NBD server using the C<LISTEN_FDNAMES> environment
>>> +variable.  To provide a socket name, call
>>> +L<nbd_set_socket_activation_name(3)> before calling
>>> +the connect function.
>>
>> This creates an implicit client-side stateful API: to pass socket
>> names, you must call two APIs in the correct sequence:
>>
>> nbd_set_socket_activation_name (h, "foo");
>> nbd_connect_systemd_socket_activation (h, argv);
>>
>> I can live with that design, but I recall Laszlo questioning in the
>> past if we always need to force this stateful design onto clients, or
>> if it would be easier to instead add a alternative API that takes the
>> socket name as an additional parameter, in one shot:
>>
>> nbd_connect_systemd_named_socket_activation (h, "foo", argv);
> 
> While I'm not totally opposed to this, I would say a few things:
> 
>  - the API is already stateful, even used in the most basic way,
>    eg you must connect before you can do other things

This subthread is quite funny to me because I have mostly accepted the
reasoning behind the API being such as it is :) Thank you, Eric, for
remembering my qualms.

>  - having the state modified by various nbd_set_* calls allows us to
>    easily add more variants, instead of having to create a
>    combinatorial future set of nbd_connect_systemd_*_socket_activation
>    calls
> 
> So I would lean towards my design.  (Also it's the same thing we
> already do, eg. for opt mode).

"Combinatorial explosion" was certainly my thought here, too!

I guess the ship has sailed; upon seeing this patch, I only said,
"hrmpf, another knob, okay". It's consistent with the status quo.

Laszlo


> 
>>> +int
>>> +nbd_unlocked_set_socket_activation_name (struct nbd_handle *h,
>>> +                                         const char *name)
>>> +{
>>> +  size_t i, len;
>>> +  char *new_name;
>>> +
>>> +  len = strlen (name);
>>> +
>>> +  /* Setting it to empty string stores NULL in the handle. */
>>> +  if (len == 0) {
>>> +    free (h->sa_name);
>>> +    h->sa_name = NULL;
>>> +    return 0;
>>> +  }
>>> +
>>> +  /* Check the proposed name is short and alphanumeric. */
>>> +  if (len > 32) {
>>> +    set_error (ENAMETOOLONG, "socket activation name should be "
>>> +               "<= 32 characters");
>>
>> I don't mind keeping us strict to start with and loosening it later if
>> someone demonstrates why it is needed.  But systemd documents a larger
>> set of possible names:
>>
>> https://www.freedesktop.org/software/systemd/man/sd_pid_notify_with_fds.html
>>
>> FDNAME=…
>>
>>     When used in combination with FDSTORE=1, specifies a name for the
>>     submitted file descriptors. When used with FDSTOREREMOVE=1,
>>     specifies the name for the file descriptors to remove. This name
>>     is passed to the service during activation, and may be queried
>>     using sd_listen_fds_with_names(3). File descriptors submitted
>>     without this field set, will implicitly get the name "stored"
>>     assigned. Note that, if multiple file descriptors are submitted at
>>     once, the specified name will be assigned to all of them. In order
>>     to assign different names to submitted file descriptors, submit
>>     them in separate invocations of sd_pid_notify_with_fds(). The name
>>     may consist of arbitrary ASCII characters except control
>>     characters or ":". It may not be longer than 255 characters. If a
>>     submitted name does not follow these restrictions, it is ignored.
> 
> I didn't know about this documentation before.
> 
> Arbitrary ASCII characters doesn't sound that great though.  I'm sure
> that q-s-d will want its own much more strict limitations, eg. I
> assume you can't possibly support any characters which are meaningful
> to JSON / QMP.  Any thoughts on that?
> 
> Rich.
> 

_______________________________________________
Libguestfs mailing list
Libguestfs@redhat.com
https://listman.redhat.com/mailman/listinfo/libguestfs

Reply via email to