packages feed

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