From: Fiona Ebner <f.ebner@proxmox.com>
To: Wolfgang Bumiller <w.bumiller@proxmox.com>
Cc: pve-devel@lists.proxmox.com
Subject: Re: [pve-devel] [PATCH common v3 1/2] systemd: add sd_notify() helper
Date: Wed, 29 Oct 2025 10:16:55 +0100 [thread overview]
Message-ID: <45e140a2-8944-4018-82a1-626da3cf77d7@proxmox.com> (raw)
In-Reply-To: <clmaws4vmhld4o2mvsp2a7kqbqeytupcgdbg3ejul7mg774vga@5nm4lyhxprdm>
Am 28.10.25 um 3:58 PM schrieb Wolfgang Bumiller:
> On Tue, Oct 07, 2025 at 02:25:00PM +0200, Fiona Ebner wrote:
>> @@ -282,4 +285,32 @@ sub write_ini {
>> file_set_contents($filename, $content);
>> }
>>
>> +# This is a pure Perl reimplementation of systemd's sd_notify() as defined in systemd/sd-daemon.h
>> +sub sd_notify {
>> + my ($unset_environment, $state) = @_;
>> +
>> + my $socket_path = $ENV{NOTIFY_SOCKET};
>
> Technically this could be an abstract socket. Should be enough to just
>
> $socket_path =~ s/^@/\0/;
Will do in v4!
>
>> +
>> + my $socket = IO::Socket::UNIX->new(
>> + Type => SOCK_DGRAM(),
>> + Peer => $socket_path,
>> + ) or die "unable to connect to socket $socket_path to notify systemd - $IO::Socket::errstr\n";
>> +
>> + # we won't be reading from the socket
>> + $socket->shutdown(SHUT_RD);
>> +
>> + my $sent = 0;
>> + my $total = length($state);
>> + while ($sent < $total) {
>> + my $res = $socket->send($state);
>> + die "sending to $socket_path failed - $!" if !$res && $! != EINTR;
>> + $sent += $res if $res;
>
> ^ This is a datagram socket. Systemd expects a single datagram.
> The code sort of makes it look like you're trying doing a `write_all()`
> style send (without actually changing what it sent in between calls
> which wouldn't return zero).
> Trying to continue sending in a fragmented way won't work anyway.
> (Otherwise it would be rather cumbersome, since the protocol also allows
> adding things like file descriptors to store in the fd registry; data
> and metadata need to come in one nice bundle)
>
> The example code in the referenced man page errors out with `-EPROTO` if
> the length does not match, so we could do that as well.
>
> So basically, only an EINTR loop makes sense here.
Yes, I messed that up. Thank you for the explanation and suggestions!
>
>> + }
>> + $socket->flush();
>
> This should not be necessary, this is not buffered I/O.
Ack!
>> +
>> + close($socket);
>> +
>> + delete($ENV{NOTIFY_SOCKET}) if $unset_environment;
>
> Why is this part of this function, though?
Because I wanted to match the signature of the original sd_notify(), but
actually it already doesn't match because of the return value. I guess
I'll drop it for now since the examples in 'man 3 sd_notify' also don't
have it. If a future caller needs it, it could also unset the variable
itself.
_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel
next prev parent reply other threads:[~2025-10-29 9:16 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-10-07 12:24 [pve-devel] [PATCH-SERIES common/qemu-server v3 0/2] migration: conntrack: fix race adding dbus-vmstate object to QEMU Fiona Ebner
2025-10-07 12:25 ` [pve-devel] [PATCH common v3 1/2] systemd: add sd_notify() helper Fiona Ebner
2025-10-28 14:58 ` Wolfgang Bumiller
2025-10-29 9:16 ` Fiona Ebner [this message]
2025-10-07 12:25 ` [pve-devel] [PATCH qemu-server v3 2/2] migration: conntrack: avoid crash when dbus-vmstate object cannot be added (quickly enough) Fiona Ebner
2025-10-15 8:15 ` [pve-devel] [PATCH-SERIES common/qemu-server v3 0/2] migration: conntrack: fix race adding dbus-vmstate object to QEMU Fiona Ebner
2025-10-28 13:41 ` Fiona Ebner
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=45e140a2-8944-4018-82a1-626da3cf77d7@proxmox.com \
--to=f.ebner@proxmox.com \
--cc=pve-devel@lists.proxmox.com \
--cc=w.bumiller@proxmox.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox