authorgravatar for greg@unrelenting.technologyGreg V <greg@unrelenting.technology> 2018-10-17 16:48:17+03:00
committergravatar for greg@unrelenting.technologyGreg V <greg@unrelenting.technology> 2018-10-20 15:15:01+03:00
log9a541c12140e8768fabbbd8834cd0e1570df344b
tree715a67bdbc12fd9c57ae4f7da93191d4a7cbbf38
parent24e54799fddf7c88e0feebeeef6ac2cc2f6543a0

Add FreeBSD support to os.cpp


2 files changed, 22 insertions(+), 6 deletions(-)

src/os.cpp+20-6
......@@ -50,10 +50,13 @@ typedef SSIZE_T ssize_t;
5050
5151#endif
5252
53#if defined(ZIG_OS_LINUX)
53#if defined(ZIG_OS_LINUX) || defined(ZIG_OS_FREEBSD)
5454#include <link.h>
5555#endif
5656
57#if defined(ZIG_OS_FREEBSD)
58#include <sys/sysctl.h>
59#endif
5760
5861#if defined(__MACH__)
5962#include <mach/clock.h>
......@@ -75,7 +78,9 @@ static clock_serv_t cclock;
7578#if defined(__APPLE__) && !defined(environ)
7679#include <crt_externs.h>
7780#define environ (*_NSGetEnviron())
78#endif
81#elif defined(ZIG_OS_FREEBSD)
82extern char **environ;
83#endif
7984
8085#if defined(ZIG_OS_POSIX)
8186static void populate_termination(Termination *term, int status) {
......@@ -1442,6 +1447,15 @@ Error os_self_exe_path(Buf *out_path) {
14421447 }
14431448 buf_resize(out_path, amt);
14441449 return ErrorNone;
1450#elif defined(ZIG_OS_FREEBSD)
1451 buf_resize(out_path, PATH_MAX);
1452 int mib[4] = { CTL_KERN, KERN_PROC, KERN_PROC_PATHNAME, -1 };
1453 size_t cb = PATH_MAX;
1454 if (sysctl(mib, 4, buf_ptr(out_path), &cb, nullptr, 0) != 0) {
1455 return ErrorUnexpected;
1456 }
1457 buf_resize(out_path, cb);
1458 return ErrorNone;
14451459#endif
14461460 return ErrorFileNotFound;
14471461}
......@@ -1747,7 +1761,7 @@ Error os_get_app_data_dir(Buf *out_path, const char *appname) {
17471761 buf_resize(out_path, 0);
17481762 buf_appendf(out_path, "%s/Library/Application Support/%s", home_dir, appname);
17491763 return ErrorNone;
1750#elif defined(ZIG_OS_LINUX)
1764#elif defined(ZIG_OS_POSIX)
17511765 const char *home_dir = getenv("HOME");
17521766 if (home_dir == nullptr) {
17531767 // TODO use /etc/passwd
......@@ -1760,7 +1774,7 @@ Error os_get_app_data_dir(Buf *out_path, const char *appname) {
17601774}
17611775
17621776
1763#if defined(ZIG_OS_LINUX)
1777#if defined(ZIG_OS_LINUX) || defined(ZIG_OS_FREEBSD)
17641778static int self_exe_shared_libs_callback(struct dl_phdr_info *info, size_t size, void *data) {
17651779 ZigList<Buf *> *libs = reinterpret_cast< ZigList<Buf *> *>(data);
17661780 if (info->dlpi_name[0] == '/') {
......@@ -1771,7 +1785,7 @@ static int self_exe_shared_libs_callback(struct dl_phdr_info *info, size_t size,
17711785#endif
17721786
17731787Error os_self_exe_shared_libs(ZigList<Buf *> &paths) {
1774#if defined(ZIG_OS_LINUX)
1788#if defined(ZIG_OS_LINUX) || defined(ZIG_OS_FREEBSD)
17751789 paths.resize(0);
17761790 dl_iterate_phdr(self_exe_shared_libs_callback, &paths);
17771791 return ErrorNone;
......@@ -1940,7 +1954,7 @@ Error os_file_mtime(OsFile file, OsTimeStamp *mtime) {
19401954 mtime->sec = (((ULONGLONG) last_write_time.dwHighDateTime) << 32) + last_write_time.dwLowDateTime;
19411955 mtime->nsec = 0;
19421956 return ErrorNone;
1943#elif defined(ZIG_OS_LINUX)
1957#elif defined(ZIG_OS_LINUX) || defined(ZIG_OS_FREEBSD)
19441958 struct stat statbuf;
19451959 if (fstat(file, &statbuf) == -1)
19461960 return ErrorFileSystem;
src/os.hpp+2
......@@ -24,6 +24,8 @@
2424#define ZIG_OS_WINDOWS
2525#elif defined(__linux__)
2626#define ZIG_OS_LINUX
27#elif defined(__FreeBSD__)
28#define ZIG_OS_FREEBSD
2729#else
2830#define ZIG_OS_UNKNOWN
2931#endif