Fix build on FreeBSD

- Make sure CMake always finds absolute paths for Cairo, Pango and GdkPixbuf
- Add forgotten json-c include path to swaymsg/CMakeLists.txt
- Disable -Werror because of assert warnings
- Add correct /proc/pid/file path for FreeBSD
- Use libepoll-shim on FreeBSD
- Only use Linux capabilities on, well, Linux
This commit is contained in:
Greg V 2016-12-08 15:34:08 +03:00
parent d93e53fd4b
commit da26d69cb1
11 changed files with 127 additions and 103 deletions

View file

@ -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

View file

@ -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) {

View file

@ -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)) {

View file

@ -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);