system-fileio 0.3.8 → 0.3.9
raw patch · 4 files changed
+39/−9 lines, 4 files
Files
- lib/Filesystem.hs +3/−2
- lib/hssystemfileio-unix.c +32/−3
- lib/hssystemfileio-unix.h +2/−2
- system-fileio.cabal +2/−2
lib/Filesystem.hs view
@@ -307,8 +307,9 @@ #else listDirectory root = Exc.bracket alloc free list where alloc = do- dirent <- c_alloc_dirent dir <- openDir root+ let Dir _ dirp = dir+ dirent <- c_alloc_dirent dirp return (dirent, dir) free (dirent, dir) = do c_free_dirent dirent@@ -356,7 +357,7 @@ c_closedir :: Ptr () -> IO CInt foreign import ccall unsafe "hssystemfileio_alloc_dirent"- c_alloc_dirent :: IO (Ptr ())+ c_alloc_dirent :: Ptr () -> IO (Ptr ()) foreign import ccall unsafe "hssystemfileio_free_dirent" c_free_dirent :: Ptr () -> IO ()
lib/hssystemfileio-unix.c view
@@ -1,15 +1,43 @@ #include "hssystemfileio-unix.h" +/* Enable POSIX-compliant readdir_r on Solaris */+#define _POSIX_PTHREAD_SEMANTICS++/* Enable dirfd() */+#define _BSD_SOURCE++#include <dirent.h> #include <errno.h>+#include <stddef.h> #include <stdlib.h> #include <sys/stat.h> #include <sys/types.h> #include <unistd.h> struct dirent *-hssystemfileio_alloc_dirent()+hssystemfileio_alloc_dirent(void *void_dir) {- return malloc(sizeof (struct dirent));+ DIR *dir = (DIR *)void_dir;+ long name_max;+ size_t name_end;+ + name_max = fpathconf(dirfd(dir), _PC_NAME_MAX);+ if (name_max == -1)+ {+#if defined(NAME_MAX) && NAME_MAX > 255+ name_max = NAME_MAX;+#else+ name_max = 4096;+#endif+ }+ + name_end = (size_t)offsetof(struct dirent, d_name) + name_max + 1;+ if (name_end > sizeof(struct dirent))+ {+ return malloc(name_end);+ }+ + return malloc(sizeof(struct dirent)); } void@@ -19,9 +47,10 @@ } int-hssystemfileio_readdir(DIR *dir, struct dirent *dirent)+hssystemfileio_readdir(void *void_dir, struct dirent *dirent) { struct dirent *dirent_result;+ DIR *dir = (DIR *)void_dir; while (1) { int rc = readdir_r(dir, dirent, &dirent_result);
lib/hssystemfileio-unix.h view
@@ -1,7 +1,7 @@ #ifndef HSSYSTEMFILEIO_UNIX_H #define HSSYSTEMFILEIO_UNIX_H -#include <dirent.h>+struct dirent; struct dirent * hssystemfileio_alloc_dirent();@@ -10,7 +10,7 @@ hssystemfileio_free_dirent(struct dirent *); int-hssystemfileio_readdir(DIR *dir, struct dirent *dirent);+hssystemfileio_readdir(void *dir, struct dirent *dirent); char * hssystemfileio_dirent_name(struct dirent *dirent);
system-fileio.cabal view
@@ -1,5 +1,5 @@ name: system-fileio-version: 0.3.8+version: 0.3.9 license: MIT license-file: license.txt author: John Millikin <jmillikin@gmail.com>@@ -42,7 +42,7 @@ source-repository this type: bazaar location: https://john-millikin.com/branches/system-fileio/0.3/- tag: system-fileio_0.3.8+ tag: system-fileio_0.3.9 library ghc-options: -Wall -O2