aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKenny Levinsen <kl@kl.wtf>2021-04-20 22:54:30 +0200
committerKenny Levinsen <kl@kl.wtf>2021-08-06 01:15:55 +0200
commit312d6906aef9c9ae7aba62f0ad60c83bb5f95b00 (patch)
treecaf08883d992acc9eb3ee05fd9bd5c36adecf5a4
parentd03e9d1c35b491851c7097dd7b42faa02c9ff96f (diff)
seatd: s6-style readiness notification support
This adds the ability to specify the number of an fd that is inherited by the process as open. Once seatd is read to serve requests, it will write a single newline and close the fd.
-rw-r--r--man/seatd.1.scd5
-rw-r--r--seatd/seatd.c18
2 files changed, 22 insertions, 1 deletions
diff --git a/man/seatd.1.scd b/man/seatd.1.scd
index ab79ee1..5945782 100644
--- a/man/seatd.1.scd
+++ b/man/seatd.1.scd
@@ -13,6 +13,11 @@ seatd - A seat management daemon
*-h*
Show help message and quit.
+*-n*
+ FD to notify readiness on. A single newline will be written and the fd
+ closed when seatd is ready to serve requests. This is compatible with
+ s6's notification protocol.
+
*-u <user>*
User to own the seatd socket.
diff --git a/seatd/seatd.c b/seatd/seatd.c
index 278f857..420847d 100644
--- a/seatd/seatd.c
+++ b/seatd/seatd.c
@@ -70,6 +70,7 @@ int main(int argc, char *argv[]) {
const char *usage = "Usage: seatd [options]\n"
"\n"
" -h Show this help message\n"
+ " -n <fd> FD to notify readiness on\n"
" -u <user> User to own the seatd socket\n"
" -g <group> Group to own the seatd socket\n"
" -s <path> Where to create the seatd socket\n"
@@ -78,9 +79,17 @@ int main(int argc, char *argv[]) {
int c;
int uid = 0, gid = 0;
+ int readiness = -1;
const char *socket_path = getenv("SEATD_SOCK");
- while ((c = getopt(argc, argv, "vhs:g:u:")) != -1) {
+ while ((c = getopt(argc, argv, "vhn:s:g:u:")) != -1) {
switch (c) {
+ case 'n':
+ readiness = atoi(optarg);
+ if (readiness < 0) {
+ fprintf(stderr, "Invalid readiness fd: %s\n", optarg);
+ return 1;
+ }
+ break;
case 's':
socket_path = optarg;
break;
@@ -149,6 +158,13 @@ int main(int argc, char *argv[]) {
log_info("seatd started");
+ if (readiness != -1) {
+ if (write(readiness, "\n", 1) == -1) {
+ log_errorf("Could not write readiness signal: %s\n", strerror(errno));
+ }
+ close(readiness);
+ }
+
while (server.running) {
if (poller_poll(&server.poller) == -1) {
log_errorf("Poller failed: %s", strerror(errno));