unix-compat 0.7.3 → 0.7.4
raw patch · 8 files changed
+61/−67 lines, 8 filesdep ~directorydep ~time
Dependency ranges changed: directory, time
Files
- CHANGELOG.md +6/−0
- cbits/mktemp.c +24/−8
- include/HsUnixCompat.h +0/−2
- src/System/PosixCompat/Extensions.hsc +4/−4
- src/System/PosixCompat/Files.hsc +2/−2
- src/System/PosixCompat/Process.hs +8/−1
- src/System/PosixCompat/Temp.hs +2/−2
- unix-compat.cabal +15/−48
CHANGELOG.md view
@@ -1,3 +1,9 @@+## Version 0.7.4 (2025-03-27)++ - Add `wasm32-wasi` support+ ([PR #16](https://github.com/haskell-pkg-janitors/unix-compat/pull/16)).+- Tested with GHC 8.0 - 9.12.+ ## Version 0.7.3 (2024-10-11) - Fix `sysmacros.h` include for GNU/Hurd
cbits/mktemp.c view
@@ -41,13 +41,21 @@ #include <stdlib.h> #include <string.h> #include <unistd.h>++#if defined(__wasm__)+#include <sys/random.h>+#else #include <windows.h> #include <wincrypt.h> -static int random(uint32_t *);+#define open _open+#define stat _stat+#endif++static int unixcompat_random(uint32_t *); static int _gettemp(char *, int *); -static const unsigned char padchar[] =+static const char padchar[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; int unixcompat_mkstemp(char *path)@@ -64,7 +72,7 @@ { char *start, *trv, *suffp, *carryp; char *pad;- struct _stat sbuf;+ struct stat sbuf; int rval; uint32_t randidx, randval; char carrybuf[MAXPATHLEN];@@ -84,7 +92,7 @@ /* Fill space with random characters */ while (trv >= path && *trv == 'X') {- if (!random(&randval)) {+ if (!unixcompat_random(&randval)) { /* this should never happen */ errno = EIO; return 0;@@ -104,7 +112,7 @@ for (; trv > path; --trv) { if (*trv == '/') { *trv = '\0';- rval = _stat(path, &sbuf);+ rval = stat(path, &sbuf); *trv = '/'; if (rval != 0) return (0);@@ -120,11 +128,11 @@ for (;;) { if (doopen) { if ((*doopen =- _open(path, O_CREAT|O_EXCL|O_RDWR, 0600)) >= 0)+ open(path, O_CREAT|O_EXCL|O_RDWR, 0600)) >= 0) return (1); if (errno != EEXIST) return (0);- } else if (_stat(path, &sbuf))+ } else if (stat(path, &sbuf)) return (errno == ENOENT); /* If we have a collision, cycle through the space of filenames */@@ -154,8 +162,15 @@ /*NOTREACHED*/ } -static int random(uint32_t *value)+#if defined(__wasm__)+static int unixcompat_random(uint32_t *value) {+ int r = getentropy(value, sizeof(uint32_t));+ return r == 0 ? 1 : 0;+}+#else+static int unixcompat_random(uint32_t *value)+{ /* This handle is never released. Windows will clean up when the process * exits. Python takes this approach when emulating /dev/urandom, and if * it's good enough for them, then it's good enough for us. */@@ -171,3 +186,4 @@ return 1; }+#endif
include/HsUnixCompat.h view
@@ -4,5 +4,3 @@ unsigned int unix_major(dev_t dev); unsigned int unix_minor(dev_t dev); dev_t unix_makedev(unsigned int maj, unsigned int min);--#define NEED_setSymbolicLinkOwnerAndGroup !HAVE_LCHOWN
src/System/PosixCompat/Extensions.hsc view
@@ -12,7 +12,7 @@ ) where -#ifndef mingw32_HOST_OS+#if !(defined(mingw32_HOST_OS) || defined(wasm32_HOST_ARCH)) #include "HsUnixCompat.h" #endif @@ -27,7 +27,7 @@ -- -- The portable implementation always returns @0@. deviceMajor :: DeviceID -> CMajor-#ifdef mingw32_HOST_OS+#if defined(mingw32_HOST_OS) || defined(wasm32_HOST_ARCH) deviceMajor _ = 0 #else deviceMajor dev = unix_major dev@@ -39,7 +39,7 @@ -- -- The portable implementation always returns @0@. deviceMinor :: DeviceID -> CMinor-#ifdef mingw32_HOST_OS+#if defined(mingw32_HOST_OS) || defined(wasm32_HOST_ARCH) deviceMinor _ = 0 #else deviceMinor dev = unix_minor dev@@ -49,7 +49,7 @@ -- | Creates a 'DeviceID' for a device file given a major and minor number. makeDeviceID :: CMajor -> CMinor -> DeviceID-#ifdef mingw32_HOST_OS+#if defined(mingw32_HOST_OS) || defined(wasm32_HOST_ARCH) makeDeviceID _ _ = 0 #else makeDeviceID ma mi = unix_makedev ma mi
src/System/PosixCompat/Files.hsc view
@@ -106,11 +106,11 @@ #ifndef mingw32_HOST_OS -#include "HsUnixCompat.h"+#include "HsUnixConfig.h" import System.Posix.Files -#if NEED_setSymbolicLinkOwnerAndGroup+#if !HAVE_LCHOWN import System.PosixCompat.Types setSymbolicLinkOwnerAndGroup :: FilePath -> UserID -> GroupID -> IO ()
src/System/PosixCompat/Process.hs view
@@ -8,13 +8,20 @@ getProcessID ) where -#ifdef mingw32_HOST_OS+#if defined(mingw32_HOST_OS) import System.Posix.Types (ProcessID) import System.Win32.Process (getCurrentProcessId) getProcessID :: IO ProcessID getProcessID = fromIntegral <$> getCurrentProcessId++#elif defined(wasm32_HOST_ARCH)++import System.Posix.Types (ProcessID)++getProcessID :: IO ProcessID+getProcessID = pure 1 #else
src/System/PosixCompat/Temp.hs view
@@ -11,13 +11,13 @@ mkstemp ) where -#ifndef mingw32_HOST_OS+#if !(defined(mingw32_HOST_OS) || defined(wasm32_HOST_ARCH)) -- Re-export unix package import System.Posix.Temp #elif defined(__GLASGOW_HASKELL__)--- Windows w/ GHC, we have fdToHandle so we+-- Window/WASM w/ GHC, we have fdToHandle so we -- can use our own implementation of mkstemp. import System.IO (Handle)
unix-compat.cabal view
@@ -1,6 +1,6 @@-cabal-version: >= 1.10+cabal-version: 1.18 name: unix-compat-version: 0.7.3+version: 0.7.4 synopsis: Portable POSIX-compatibility layer. description: This package provides portable implementations of parts of the unix package. This package re-exports the unix@@ -16,9 +16,10 @@ build-type: Simple tested-with:+ GHC == 9.12.2 GHC == 9.10.1- GHC == 9.8.2- GHC == 9.6.6+ GHC == 9.8.4+ GHC == 9.6.7 GHC == 9.4.8 GHC == 9.2.8 GHC == 9.0.2@@ -29,7 +30,7 @@ GHC == 8.2.2 GHC == 8.0.2 -extra-source-files:+extra-doc-files: CHANGELOG.md source-repository head@@ -60,17 +61,20 @@ build-depends: Win32 >= 2.5.0.0 && < 3 build-depends: directory >= 1.3.1 && < 1.4 build-depends: filepath >= 1.4.1.0 && < 1.6- build-depends: time >= 1.6.0.1 && < 1.13+ build-depends: time >= 1.6.0.1 && < 1.15 other-modules: System.PosixCompat.Internal.Time else build-depends: unix >= 2.7.2.0 && < 2.9- include-dirs: include- includes: HsUnixCompat.h- install-includes: HsUnixCompat.h- c-sources: cbits/HsUnixCompat.c+ if arch(wasm32)+ c-sources: cbits/mktemp.c+ else+ include-dirs: include+ includes: HsUnixCompat.h+ install-includes: HsUnixCompat.h+ c-sources: cbits/HsUnixCompat.c if os(solaris) cc-options: -DSOLARIS @@ -89,53 +93,16 @@ LinksSpec ProcessSpec - -- ghc-options:- -- -Wall- -- -fwarn-tabs- -- -funbox-strict-fields- -- -threaded- -- -fno-warn-unused-do-bind- -- -fno-warn-type-defaults-- -- extensions:- -- OverloadedStrings- -- ExtendedDefaultRules-- -- if flag(lifted)- -- cpp-options: -DLIFTED- build-depends: unix-compat , base , monad-parallel- , hspec+ , hspec >= 2.5.5 , HUnit , directory >= 1.3.1.0 -- directory-1.3.1.0 adds createFileLink , extra , temporary-- if os(windows)- -- c-sources:- -- cbits/HsUname.c- -- cbits/mktemp.c-- -- extra-libraries: msvcrt- -- build-depends: Win32 >= 2.5.0.0- build-depends: time- build-depends: directory-- -- other-modules:- -- System.PosixCompat.Internal.Time-- else- -- build-depends: unix >= 2.4 && < 2.9- -- include-dirs: include- -- includes: HsUnixCompat.h- -- install-includes: HsUnixCompat.h- -- c-sources: cbits/HsUnixCompat.c- if os(solaris)- cc-options: -DSOLARIS default-language: Haskell2010 ghc-options: