From de374325783da5f55e59fd674372af4c4e837790 Mon Sep 17 00:00:00 2001 From: Dylan Araps Date: Mon, 2 Mar 2026 14:31:27 +0200 Subject: platform/bsd.h: initial BSD platform support. Untested... based on how other file managers do it. Related: #3 --- dfm.c | 5 +-- platform/apple.h | 65 -------------------------------------- platform/bsd.h | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 99 insertions(+), 67 deletions(-) delete mode 100644 platform/apple.h create mode 100644 platform/bsd.h diff --git a/dfm.c b/dfm.c index d6b6612..d0c7509 100644 --- a/dfm.c +++ b/dfm.c @@ -66,8 +66,9 @@ #if defined(__linux__) #include "platform/linux.h" -#elif defined(__APPLE__) -#include "platform/apple.h" +#elif defined(__APPLE__) || defined(__FreeBSD__) || defined(__NetBSD__) ||\ + defined(__OpenBSD__) || defined(__DragonFly__) +#include "platform/bsd.h" #else #include "platform/posix.h" #endif diff --git a/platform/apple.h b/platform/apple.h deleted file mode 100644 index 180c4f6..0000000 --- a/platform/apple.h +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright (c) 2026 Dylan Araps - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -#ifndef DFM_PLATFORM_APPLE_H -#define DFM_PLATFORM_APPLE_H - -#include - -#define ST_ATIM st_atimespec.tv_sec -#define ST_MTIM st_mtimespec.tv_sec -#define ST_CTIM st_ctimespec.tv_sec - -struct platform { - void *_pad; -}; - -static inline int -fs_watch_init(struct platform *p) -{ - (void) p; - return 0; -} - -static inline void -fs_watch(struct platform *p, const char *s) -{ - (void) p; - (void) s; -} - -static inline int -fs_watch_pump(struct platform *p, const char **s, size_t *l) -{ - (void) p; - (void) s; - (void) l; - return 0; -} - -static inline void -fs_watch_free(struct platform *p) -{ - (void) p; -} - -#endif // DFM_PLATFORM_APPLE_H - diff --git a/platform/bsd.h b/platform/bsd.h new file mode 100644 index 0000000..7a03700 --- /dev/null +++ b/platform/bsd.h @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2026 Dylan Araps + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +#ifndef DFM_PLATFORM_BSD_H +#define DFM_PLATFORM_BSD_H + +#include +#include +#include +#include +#include +#include +#include + +#include "../lib/util.h" + +#define ST_ATIM st_atimespec.tv_sec +#define ST_MTIM st_mtimespec.tv_sec +#define ST_CTIM st_ctimespec.tv_sec + +struct platform { + int kq; + int dfd; + struct kevent ev; +}; + +static inline int +fs_watch_init(struct platform *p) +{ + p->dfd = -1; + p->kq = kqueue(); + return p->kq; +} + +static inline void +fs_watch(struct platform *p, const char *path) +{ + if (p->dfd != -1) { + close(p->dfd); + p->dfd = -1; + } + p->dfd = open(path, O_EVTONLY); + if (p->dfd == -1) return; + EV_SET(&p->ev, p->dfd, + EVFILT_VNODE, EV_ADD|EV_CLEAR, + NOTE_WRITE|NOTE_DELETE|NOTE_RENAME|NOTE_ATTRIB, 0, NULL); + kevent(p->kq, &p->ev, 1, NULL, 0, NULL); +} + +static inline int +fs_watch_pump(struct platform *p, const char **s, size_t *l) +{ + *s = NULL; + *l = 0; + if (p->kq == -1 || p->dfd == -1) + return 0; + struct kevent o; + struct timespec ts = {0, 0}; + int n = kevent(p->kq, NULL, 0, &o, 1, &ts); + if (n <= 0) return 0; + if (o.flags & EV_ERROR) return '!'; + if (o.fflags & NOTE_DELETE) return '-'; + if (o.fflags & NOTE_RENAME) return '~'; + if (o.fflags & NOTE_ATTRIB) return '~'; + if (o.fflags & NOTE_WRITE) return '+'; + return 0; +} + +static inline void +fs_watch_free(struct platform *p) +{ + if (p->dfd != -1) close(p->dfd); + if (p->kq != -1) close(p->kq); +} + +#define FS_WATCH 1 + +#endif // DFM_PLATFORM_BSD_H -- cgit v1.2.3