diff options
| -rw-r--r-- | man/seatd.1.scd | 5 | ||||
| -rw-r--r-- | seatd/seatd.c | 18 | 
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));  | 
