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;...@@ -50,10 +50,13 @@ typedef SSIZE_T ssize_t;
5050
51#endif51#endif
5252
53#if defined(ZIG_OS_LINUX)53#if defined(ZIG_OS_LINUX) || defined(ZIG_OS_FREEBSD)
54#include <link.h>54#include <link.h>
55#endif55#endif
5656
57#if defined(ZIG_OS_FREEBSD)
58#include <sys/sysctl.h>
59#endif
5760
58#if defined(__MACH__)61#if defined(__MACH__)
59#include <mach/clock.h>62#include <mach/clock.h>
...@@ -75,7 +78,9 @@ static clock_serv_t cclock;...@@ -75,7 +78,9 @@ static clock_serv_t cclock;
75#if defined(__APPLE__) && !defined(environ)78#if defined(__APPLE__) && !defined(environ)
76#include <crt_externs.h>79#include <crt_externs.h>
77#define environ (*_NSGetEnviron())80#define environ (*_NSGetEnviron())
78#endif 81#elif defined(ZIG_OS_FREEBSD)
82extern char **environ;
83#endif
7984
80#if defined(ZIG_OS_POSIX)85#if defined(ZIG_OS_POSIX)
81static void populate_termination(Termination *term, int status) {86static void populate_termination(Termination *term, int status) {
...@@ -1442,6 +1447,15 @@ Error os_self_exe_path(Buf *out_path) {...@@ -1442,6 +1447,15 @@ Error os_self_exe_path(Buf *out_path) {
1442 }1447 }
1443 buf_resize(out_path, amt);1448 buf_resize(out_path, amt);
1444 return ErrorNone;1449 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;
1445#endif1459#endif
1446 return ErrorFileNotFound;1460 return ErrorFileNotFound;
1447}1461}
...@@ -1747,7 +1761,7 @@ Error os_get_app_data_dir(Buf *out_path, const char *appname) {...@@ -1747,7 +1761,7 @@ Error os_get_app_data_dir(Buf *out_path, const char *appname) {
1747 buf_resize(out_path, 0);1761 buf_resize(out_path, 0);
1748 buf_appendf(out_path, "%s/Library/Application Support/%s", home_dir, appname);1762 buf_appendf(out_path, "%s/Library/Application Support/%s", home_dir, appname);
1749 return ErrorNone;1763 return ErrorNone;
1750#elif defined(ZIG_OS_LINUX)1764#elif defined(ZIG_OS_POSIX)
1751 const char *home_dir = getenv("HOME");1765 const char *home_dir = getenv("HOME");
1752 if (home_dir == nullptr) {1766 if (home_dir == nullptr) {
1753 // TODO use /etc/passwd1767 // TODO use /etc/passwd
...@@ -1760,7 +1774,7 @@ Error os_get_app_data_dir(Buf *out_path, const char *appname) {...@@ -1760,7 +1774,7 @@ Error os_get_app_data_dir(Buf *out_path, const char *appname) {
1760}1774}
17611775
17621776
1763#if defined(ZIG_OS_LINUX)1777#if defined(ZIG_OS_LINUX) || defined(ZIG_OS_FREEBSD)
1764static int self_exe_shared_libs_callback(struct dl_phdr_info *info, size_t size, void *data) {1778static int self_exe_shared_libs_callback(struct dl_phdr_info *info, size_t size, void *data) {
1765 ZigList<Buf *> *libs = reinterpret_cast< ZigList<Buf *> *>(data);1779 ZigList<Buf *> *libs = reinterpret_cast< ZigList<Buf *> *>(data);
1766 if (info->dlpi_name[0] == '/') {1780 if (info->dlpi_name[0] == '/') {
...@@ -1771,7 +1785,7 @@ static int self_exe_shared_libs_callback(struct dl_phdr_info *info, size_t size,...@@ -1771,7 +1785,7 @@ static int self_exe_shared_libs_callback(struct dl_phdr_info *info, size_t size,
1771#endif1785#endif
17721786
1773Error os_self_exe_shared_libs(ZigList<Buf *> &paths) {1787Error os_self_exe_shared_libs(ZigList<Buf *> &paths) {
1774#if defined(ZIG_OS_LINUX)1788#if defined(ZIG_OS_LINUX) || defined(ZIG_OS_FREEBSD)
1775 paths.resize(0);1789 paths.resize(0);
1776 dl_iterate_phdr(self_exe_shared_libs_callback, &paths);1790 dl_iterate_phdr(self_exe_shared_libs_callback, &paths);
1777 return ErrorNone;1791 return ErrorNone;
...@@ -1940,7 +1954,7 @@ Error os_file_mtime(OsFile file, OsTimeStamp *mtime) {...@@ -1940,7 +1954,7 @@ Error os_file_mtime(OsFile file, OsTimeStamp *mtime) {
1940 mtime->sec = (((ULONGLONG) last_write_time.dwHighDateTime) << 32) + last_write_time.dwLowDateTime;1954 mtime->sec = (((ULONGLONG) last_write_time.dwHighDateTime) << 32) + last_write_time.dwLowDateTime;
1941 mtime->nsec = 0;1955 mtime->nsec = 0;
1942 return ErrorNone;1956 return ErrorNone;
1943#elif defined(ZIG_OS_LINUX)1957#elif defined(ZIG_OS_LINUX) || defined(ZIG_OS_FREEBSD)
1944 struct stat statbuf;1958 struct stat statbuf;
1945 if (fstat(file, &statbuf) == -1)1959 if (fstat(file, &statbuf) == -1)
1946 return ErrorFileSystem;1960 return ErrorFileSystem;
src/os.hpp+2
...@@ -24,6 +24,8 @@...@@ -24,6 +24,8 @@
24#define ZIG_OS_WINDOWS24#define ZIG_OS_WINDOWS
25#elif defined(__linux__)25#elif defined(__linux__)
26#define ZIG_OS_LINUX26#define ZIG_OS_LINUX
27#elif defined(__FreeBSD__)
28#define ZIG_OS_FREEBSD
27#else29#else
28#define ZIG_OS_UNKNOWN30#define ZIG_OS_UNKNOWN
29#endif31#endif