[systemd-devel] sd_is_socket_unix() only returns true for full path ?
Nicolas Pillot
nicolas.pillot at gmail.com
Sat Mar 2 22:40:14 UTC 2024
Hello
I am working on socket activation in user units, with a working
directory, executable and socket all in /tmp. And i either think there
might be a bug, or the documentation is not as precise as it can be.
The documentation man 3 sd_is_socket_unix speaks about path, but does
not mention if path must be absolute, only or if it can be relative. I
am using version 247.3-7+deb11u4
1) I expected sd_is_socket_unix to return true for each kind of path :
As far as i see, the function returns true only for absolute path. If
that is the desired behaviour, some additionnal precision could be
added to the manpage. If not, then there might be a but or oversight.
2) i expected the program to not be re-ran since it exited
successfully (restart = no, which is the default value anyway) : but
the program is run 5 times, up to the limit
It is my first project with systemd socket activation, so i might have
missed something.
Thanks in advance,
Nicolas
===== Program =====
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <systemd/sd-daemon.h>
void test_path(int i, char * path) {
printf("%s = %i\n", path, sd_is_socket_unix(i, SOCK_STREAM, 1, path, 0));
}
int main(int argc, char *argv[]) {
system("pwd");
system("ls -l sd*");
int n = sd_listen_fds(0);
for (int i=SD_LISTEN_FDS_START; i <SD_LISTEN_FDS_START+n; i++) {
test_path(i, "sd_test");
test_path(i, "./sd_test");
test_path(i, "/tmp/sd_test");
}
return 0;
}
===== Compilation =====
gcc -o /tmp/sd a.c -l systemd
===== ~/.config/systemd/user/sd_test.socket =====
[Socket]
ListenStream=/tmp/sd_test
SocketMode=0600
===== ~/.config/systemd/user/sd_test.service =====
[Service]
Type=simple
ExecStart=/tmp/sd
WorkingDirectory=/tmp
Restart=no
===== Running =====
echo "foo" | socat - UNIX-CONNECT:/tmp/sd_test
===== Journalctl =====
systemd[529]: Listening on sd_test.socket.
systemd[529]: Started sd_test.service.
sd[212261]: /tmp
sd[212263]: -rwxr-xr-x 1 user user 16816 Mar 2 23:04 sd
sd[212263]: srw------- 1 user user 0 Mar 2 23:04 sd_test
sd[212260]: sd_test = 0
sd[212260]: ./sd_test = 0
sd[212260]: /tmp/sd_test = 1
systemd[529]: sd_test.service: Succeeded.
systemd[529]: Started sd_test.service.
sd[212265]: /tmp
sd[212267]: -rwxr-xr-x 1 user user 16816 Mar 2 23:04 sd
sd[212267]: srw------- 1 user user 0 Mar 2 23:04 sd_test
sd[212264]: sd_test = 0
sd[212264]: ./sd_test = 0
sd[212264]: /tmp/sd_test = 1
systemd[529]: sd_test.service: Succeeded.
systemd[529]: Started sd_test.service.
sd[212269]: /tmp
sd[212271]: -rwxr-xr-x 1 user user 16816 Mar 2 23:04 sd
sd[212271]: srw------- 1 user user 0 Mar 2 23:04 sd_test
sd[212268]: sd_test = 0
sd[212268]: ./sd_test = 0
sd[212268]: /tmp/sd_test = 1
systemd[529]: sd_test.service: Succeeded.
systemd[529]: Started sd_test.service.
sd[212273]: /tmp
sd[212275]: -rwxr-xr-x 1 user user 16816 Mar 2 23:04 sd
sd[212275]: srw------- 1 user user 0 Mar 2 23:04 sd_test
sd[212272]: sd_test = 0
sd[212272]: ./sd_test = 0
sd[212272]: /tmp/sd_test = 1
systemd[529]: sd_test.service: Succeeded.
systemd[529]: Started sd_test.service.
sd[212277]: /tmp
sd[212279]: -rwxr-xr-x 1 user user 16816 Mar 2 23:04 sd
sd[212279]: srw------- 1 user user 0 Mar 2 23:04 sd_test
sd[212276]: sd_test = 0
sd[212276]: ./sd_test = 0
sd[212276]: /tmp/sd_test = 1
systemd[529]: sd_test.service: Succeeded.
systemd[529]: sd_test.service: Start request repeated too quickly.
systemd[529]: sd_test.service: Failed with result 'start-limit-hit'.
systemd[529]: Failed to start sd_test.service.
systemd[529]: sd_test.socket: Failed with result 'service-start-limit-hit'.
More information about the systemd-devel
mailing list