aboutsummaryrefslogtreecommitdiff
path: root/sway
diff options
context:
space:
mode:
Diffstat (limited to 'sway')
-rw-r--r--sway/CMakeLists.txt5
-rw-r--r--sway/ipc-server.c5
-rw-r--r--sway/main.c2
-rw-r--r--sway/security.c4
4 files changed, 15 insertions, 1 deletions
diff --git a/sway/CMakeLists.txt b/sway/CMakeLists.txt
index d1afadb6..4532a6c3 100644
--- a/sway/CMakeLists.txt
+++ b/sway/CMakeLists.txt
@@ -55,9 +55,12 @@ target_link_libraries(sway
${PANGO_LIBRARIES}
${JSONC_LIBRARIES}
m
- cap
)
+if (CMAKE_SYSTEM_NAME STREQUAL Linux)
+ target_link_libraries(sway cap)
+endif (CMAKE_SYSTEM_NAME STREQUAL Linux)
+
install(
TARGETS sway
RUNTIME
diff --git a/sway/ipc-server.c b/sway/ipc-server.c
index 815b232b..de72beca 100644
--- a/sway/ipc-server.c
+++ b/sway/ipc-server.c
@@ -126,6 +126,8 @@ struct sockaddr_un *ipc_user_sockaddr(void) {
}
static pid_t get_client_pid(int client_fd) {
+// FreeBSD supports getting uid/gid, but not pid
+#ifdef __linux__
struct ucred ucred;
socklen_t len = sizeof(struct ucred);
@@ -134,6 +136,9 @@ static pid_t get_client_pid(int client_fd) {
}
return ucred.pid;
+#else
+ return -1;
+#endif
}
int ipc_handle_connection(int fd, uint32_t mask, void *data) {
diff --git a/sway/main.c b/sway/main.c
index eb103a1e..157c61b3 100644
--- a/sway/main.c
+++ b/sway/main.c
@@ -152,6 +152,7 @@ static void security_sanity_check() {
sway_log(L_ERROR,
"!! DANGER !! /proc is not available - sway CANNOT enforce security rules!");
}
+#ifdef __linux__
cap_flag_value_t v;
cap_t cap = cap_get_proc();
if (!cap || cap_get_flag(cap, CAP_SYS_PTRACE, CAP_PERMITTED, &v) != 0 || v != CAP_SET) {
@@ -161,6 +162,7 @@ static void security_sanity_check() {
if (cap) {
cap_free(cap);
}
+#endif
if (!stat(SYSCONFDIR "/sway", &s)) {
if (s.st_uid != 0 || s.st_gid != 0
|| (s.st_mode & S_IWGRP) || (s.st_mode & S_IWOTH)) {
diff --git a/sway/security.c b/sway/security.c
index f16fdd1f..9cccd62e 100644
--- a/sway/security.c
+++ b/sway/security.c
@@ -28,7 +28,11 @@ struct command_policy *alloc_command_policy(const char *command) {
}
enum secure_feature get_feature_policy(pid_t pid) {
+#ifdef __FreeBSD__
+ const char *fmt = "/proc/%d/file";
+#else
const char *fmt = "/proc/%d/exe";
+#endif
int pathlen = snprintf(NULL, 0, fmt, pid);
char *path = malloc(pathlen + 1);
snprintf(path, pathlen + 1, fmt, pid);