diff --git a/basis/http/server/static/static.factor b/basis/http/server/static/static.factor
index 3e3307033a..3edcfe81cd 100644
--- a/basis/http/server/static/static.factor
+++ b/basis/http/server/static/static.factor
@@ -59,8 +59,8 @@ TUPLE: file-responder root hook special allow-listings ;
\ serve-file NOTICE add-input-logging
-: file. ( name dirp -- )
- [ "/" append ] when
+: file. ( name -- )
+ dup link-info directory? [ "/" append ] when
dup escape-string write ;
: directory. ( path -- )
@@ -68,7 +68,7 @@ TUPLE: file-responder root hook special allow-listings ;
[
file-name escape-string write
]
[
- directory sort-keys
+ directory-files
[ - file.
] assoc-each
] bi
diff --git a/basis/io/monitors/recursive/recursive.factor b/basis/io/monitors/recursive/recursive.factor
index 383e166214..3cecee2b1e 100644
--- a/basis/io/monitors/recursive/recursive.factor
+++ b/basis/io/monitors/recursive/recursive.factor
@@ -19,11 +19,13 @@ DEFER: add-child-monitor
: add-child-monitors ( path -- )
#! We yield since this directory scan might take a while.
- directory* [ first add-child-monitor ] each yield ;
+ [
+ [ add-child-monitor ] each yield
+ ] with-directory-files ;
: add-child-monitor ( path -- )
notify? [ dup { +add-file+ } monitor tget queue-change ] when
- qualify-path dup link-info type>> +directory+ eq? [
+ qualify-path dup link-info directory? [
[ add-child-monitors ]
[
[
diff --git a/basis/io/unix/files/files.factor b/basis/io/unix/files/files.factor
index af023e3f13..67da640b71 100644
--- a/basis/io/unix/files/files.factor
+++ b/basis/io/unix/files/files.factor
@@ -6,7 +6,7 @@ math.bitwise byte-arrays alien combinators calendar
io.encodings.binary accessors sequences strings system
io.files.private destructors vocabs.loader calendar.unix
unix.stat alien.c-types arrays unix.users unix.groups
-environment ;
+environment fry io.encodings.utf8 alien.strings ;
IN: io.unix.files
M: unix cwd ( -- path )
@@ -138,6 +138,27 @@ os {
{ linux [ ] }
} case
+: with-unix-directory ( path quot -- )
+ [ opendir dup [ (io-error) ] unless ] dip
+ dupd curry swap '[ _ closedir io-error ] [ ] cleanup ; inline
+
+: find-next-file ( DIR* -- byte-array )
+ "dirent"
+ f
+ [ readdir_r 0 = [ (io-error) ] unless ] 2keep
+ *void* [ drop f ] unless ;
+
+M: unix >directory-entry ( byte-array -- directory-entry )
+ [ dirent-d_name utf8 alien>string ]
+ [ dirent-d_type ] bi directory-entry boa ;
+
+M: unix (directory-entries) ( path -- seq )
+ [
+ '[ _ find-next-file dup ]
+ [ >directory-entry ]
+ [ drop ] produce
+ ] with-unix-directory ;
+
> os-env ;
METHOD: expand { glob-expr }
expr>>
dup "*" =
- [ drop current-directory get directory [ first ] map ]
+ [ drop current-directory get directory-files ]
[ ]
if ;
diff --git a/extra/webapps/wiki/wiki.factor b/extra/webapps/wiki/wiki.factor
index 16c51a876b..b833cc8cc2 100644
--- a/extra/webapps/wiki/wiki.factor
+++ b/extra/webapps/wiki/wiki.factor
@@ -374,15 +374,16 @@ M: revision feed-entry-url id>> revision-url ;
{ wiki "wiki-common" } >>template ;
: init-wiki ( -- )
- "resource:extra/webapps/wiki/initial-content" directory* keys
- [
- dup file-name ".txt" ?tail [
- swap ascii file-contents
- f
- swap >>content
- swap >>title
- "slava" >>author
- now >>date
- add-revision
- ] [ 2drop ] if
- ] each ;
+ "resource:extra/webapps/wiki/initial-content" [
+ [
+ dup ".txt" ?tail [
+ swap ascii file-contents
+ f
+ swap >>content
+ swap >>title
+ "slava" >>author
+ now >>date
+ add-revision
+ ] [ 2drop ] if
+ ] each
+ ] with-directory-files ;