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