aboutsummaryrefslogtreecommitdiff
path: root/seatd/seatd.c
diff options
context:
space:
mode:
authorKenny Levinsen <kl@kl.wtf>2022-02-26 20:25:22 +0100
committerKenny Levinsen <kl@kl.wtf>2022-02-26 22:25:27 +0100
commit0d6bdf4f01e5be10c29dd786f2531b96e1d935cd (patch)
treee22953c2104de4e05214ebf5a6859cd224642b3a /seatd/seatd.c
parent466efea49bc6ab5672555c31f04b39741c502c70 (diff)
seatd: Remove runtime socket path configuration
Configurable socket paths exist mainly to facilitate multiple parallel seatd instances. However, the only valid use-case for running multiple instances of seatd is testing during development, which can just as well be done by changing SEATD_DEFAULTPATH at compile-time for test builds. Remove the command-line argument in seatd for runtime configuration of socket path, hardcode the socket path in seatd-launch, and change seatd unlink/chmod/chown code to not run when started by seatd-launch. This means that seatd-launch will now fail to start seatd if another seatd instance is already running. The unlink code still runs when seatd is started normally to assist in system crash recovery, but this may be removed later if we deem it unnecessary.
Diffstat (limited to 'seatd/seatd.c')
-rw-r--r--seatd/seatd.c53
1 files changed, 37 insertions, 16 deletions
diff --git a/seatd/seatd.c b/seatd/seatd.c
index ef6c781..f6bad9b 100644
--- a/seatd/seatd.c
+++ b/seatd/seatd.c
@@ -40,15 +40,15 @@ static int open_socket(const char *path, int uid, int gid) {
goto error;
}
if (uid != -1 || gid != -1) {
+ if (chmod(path, 0770) == -1) {
+ log_errorf("Could not chmod socket: %s", strerror(errno));
+ goto error;
+ }
if (chown(path, uid, gid) == -1) {
log_errorf("Could not chown socket to uid %d, gid %d: %s", uid, gid,
strerror(errno));
goto error;
}
- if (chmod(path, 0770) == -1) {
- log_errorf("Could not chmod socket: %s", strerror(errno));
- goto error;
- }
}
return fd;
error:
@@ -63,7 +63,6 @@ int main(int argc, char *argv[]) {
" -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"
" -l <loglevel> Log-level, one of debug, info, error or silent\n"
" -v Show the version number\n"
"\n";
@@ -71,9 +70,10 @@ int main(int argc, char *argv[]) {
int c;
int uid = -1, gid = -1;
int readiness = -1;
+ bool unlink_existing_socket = true;
+ bool chown_socket = true;
enum libseat_log_level level = LIBSEAT_LOG_LEVEL_ERROR;
- const char *socket_path = SEATD_DEFAULTPATH;
- while ((c = getopt(argc, argv, "vhn:s:g:u:l:")) != -1) {
+ while ((c = getopt(argc, argv, "vhn:g:u:l:z")) != -1) {
switch (c) {
case 'n':
readiness = atoi(optarg);
@@ -82,10 +82,11 @@ int main(int argc, char *argv[]) {
return 1;
}
break;
- case 's':
- socket_path = optarg;
- break;
case 'u': {
+ if (!chown_socket) {
+ fprintf(stderr, "-u/-g and -z are mutually exclusive\n");
+ return 1;
+ }
struct passwd *pw = getpwnam(optarg);
if (pw == NULL) {
fprintf(stderr, "Could not find user by name '%s'.\n", optarg);
@@ -96,6 +97,10 @@ int main(int argc, char *argv[]) {
break;
}
case 'g': {
+ if (!chown_socket) {
+ fprintf(stderr, "-u/-g and -z are mutually exclusive\n");
+ return 1;
+ }
struct group *gr = getgrnam(optarg);
if (gr == NULL) {
fprintf(stderr, "Could not find group by name '%s'.\n", optarg);
@@ -119,6 +124,17 @@ int main(int argc, char *argv[]) {
return 1;
}
break;
+ case 'z':
+ // Running under seatd-launch. We do not unlink files
+ // to protect against multiple instances, and
+ // seatd-launch takes care of ownership.
+ if (uid != -1 || gid != -1) {
+ fprintf(stderr, "-u/-g and -z are mutually exclusive\n");
+ return 1;
+ }
+ unlink_existing_socket = false;
+ chown_socket = false;
+ break;
case 'v':
printf("seatd version %s\n", SEATD_VERSION);
return 0;
@@ -137,14 +153,19 @@ int main(int argc, char *argv[]) {
libseat_set_log_level(level);
struct stat st;
- if (stat(socket_path, &st) == 0) {
+ if (lstat(SEATD_DEFAULTPATH, &st) == 0) {
if (!S_ISSOCK(st.st_mode)) {
log_errorf("Non-socket file found at socket path %s, refusing to start",
- socket_path);
+ SEATD_DEFAULTPATH);
+ return 1;
+ } else if (!unlink_existing_socket) {
+ log_errorf("Socket file found at socket path %s, refusing to start",
+ SEATD_DEFAULTPATH);
return 1;
} else {
- log_infof("Removing leftover socket at %s", socket_path);
- if (unlink(socket_path) == -1) {
+ // We only do this if the socket path is not user specified
+ log_infof("Removing leftover socket at %s", SEATD_DEFAULTPATH);
+ if (unlink(SEATD_DEFAULTPATH) == -1) {
log_errorf("Could not remove leftover socket: %s", strerror(errno));
return 1;
}
@@ -158,7 +179,7 @@ int main(int argc, char *argv[]) {
}
int ret = 1;
- int socket_fd = open_socket(socket_path, uid, gid);
+ int socket_fd = open_socket(SEATD_DEFAULTPATH, uid, gid);
if (socket_fd == -1) {
log_error("Could not create server socket");
goto error_server;
@@ -189,7 +210,7 @@ int main(int argc, char *argv[]) {
ret = 0;
error_socket:
- if (unlink(socket_path) == -1) {
+ if (unlink(SEATD_DEFAULTPATH) == -1) {
log_errorf("Could not remove socket: %s", strerror(errno));
}
error_server: