From e0d6aadc8e7c8af2819907f4156f9dd7db7528fc Mon Sep 17 00:00:00 2001
From: Doug Coleman <doug.coleman@gmail.com>
Date: Mon, 6 Oct 2008 17:17:14 -0500
Subject: [PATCH] complete file-info across *bsd, linux

---
 basis/io/unix/files/files.factor           | 71 +++++++++++++++-------
 basis/io/unix/files/freebsd/freebsd.factor | 17 ++++++
 basis/io/unix/files/freebsd/tags.txt       |  1 +
 basis/io/unix/files/macosx/macosx.factor   | 16 +++++
 basis/io/unix/files/macosx/tags.txt        |  1 +
 basis/io/unix/files/netbsd/netbsd.factor   | 17 ++++++
 basis/io/unix/files/netbsd/tags.txt        |  1 +
 basis/io/unix/files/openbsd/openbsd.factor | 17 ++++++
 basis/io/unix/files/openbsd/tags.txt       |  1 +
 basis/io/unix/files/unique/unique.factor   |  2 +
 10 files changed, 123 insertions(+), 21 deletions(-)
 create mode 100644 basis/io/unix/files/freebsd/freebsd.factor
 create mode 100644 basis/io/unix/files/freebsd/tags.txt
 create mode 100644 basis/io/unix/files/macosx/macosx.factor
 create mode 100644 basis/io/unix/files/macosx/tags.txt
 create mode 100644 basis/io/unix/files/netbsd/netbsd.factor
 create mode 100644 basis/io/unix/files/netbsd/tags.txt
 create mode 100644 basis/io/unix/files/openbsd/openbsd.factor
 create mode 100644 basis/io/unix/files/openbsd/tags.txt

diff --git a/basis/io/unix/files/files.factor b/basis/io/unix/files/files.factor
index c6eda50855..4319b6c8de 100644
--- a/basis/io/unix/files/files.factor
+++ b/basis/io/unix/files/files.factor
@@ -4,7 +4,7 @@ USING: io.backend io.ports io.unix.backend io.files io
 unix unix.stat unix.time kernel math continuations
 math.bitwise byte-arrays alien combinators calendar
 io.encodings.binary accessors sequences strings system
-io.files.private destructors ;
+io.files.private destructors vocabs.loader ;
 
 IN: io.unix.files
 
@@ -74,26 +74,14 @@ M: unix copy-file ( from to -- )
     [ swap file-info permissions>> chmod io-error ]
     2bi ;
 
-: stat>type ( stat -- type )
-    stat-st_mode S_IFMT bitand {
-        { S_IFREG [ +regular-file+ ] }
-        { S_IFDIR [ +directory+ ] }
-        { S_IFCHR [ +character-device+ ] }
-        { S_IFBLK [ +block-device+ ] }
-        { S_IFIFO [ +fifo+ ] }
-        { S_IFLNK [ +symbolic-link+ ] }
-        { S_IFSOCK [ +socket+ ] }
-        [ drop +unknown+ ]
-    } case ;
+HOOK: stat>file-info os ( stat -- file-info )
 
-: stat>file-info ( stat -- info )
-    {
-        [ stat>type ]
-        [ stat-st_size ]
-        [ stat-st_mode ]
-        [ stat-st_mtim timespec-sec seconds unix-1970 time+ ]
-    } cleave
-    \ file-info boa ;
+HOOK: stat>type os ( stat -- file-info )
+
+HOOK: new-file-info os ( -- class )
+
+TUPLE: unix-file-info < file-info uid gid dev ino
+nlink rdev blocks blocksize ;
 
 M: unix file-info ( path -- info )
     normalize-path file-status stat>file-info ;
@@ -105,4 +93,45 @@ M: unix make-link ( path1 path2 -- )
     normalize-path symlink io-error ;
 
 M: unix read-link ( path -- path' )
-   normalize-path read-symbolic-link ;
\ No newline at end of file
+   normalize-path read-symbolic-link ;
+
+M: unix new-file-info ( -- class ) unix-file-info new ;
+
+M: unix stat>file-info ( stat -- file-info )
+    [ new-file-info ] dip
+    {
+        [ stat>type >>type ]
+        [ stat-st_size >>size ]
+        [ stat-st_mode >>permissions ]
+        [ stat-st_ctim timespec>unix-time >>created ]
+        [ stat-st_mtim timespec>unix-time >>modified ]
+        [ stat-st_atim timespec>unix-time >>accessed ]
+        [ stat-st_uid >>uid ]
+        [ stat-st_gid >>gid ]
+        [ stat-st_dev >>dev ]
+        [ stat-st_ino >>ino ]
+        [ stat-st_nlink >>nlink ]
+        [ stat-st_rdev >>rdev ]
+        [ stat-st_blocks >>blocks ]
+        [ stat-st_blksize >>blocksize ]
+    } cleave ;
+
+M: unix stat>type ( stat -- type )
+    stat-st_mode S_IFMT bitand {
+        { S_IFREG [ +regular-file+ ] }
+        { S_IFDIR [ +directory+ ] }
+        { S_IFCHR [ +character-device+ ] }
+        { S_IFBLK [ +block-device+ ] }
+        { S_IFIFO [ +fifo+ ] }
+        { S_IFLNK [ +symbolic-link+ ] }
+        { S_IFSOCK [ +socket+ ] }
+        [ drop +unknown+ ]
+    } case ;
+
+! Linux has no extra fields in its stat struct
+os {
+    { macosx  [ "io.unix.files.macosx"  require ] }
+    { freebsd [ "io.unix.files.freebsd" require ] }
+    { netbsd  [ "io.unix.files.netbsd"  require ] }
+    { openbsd [ "io.unix.files.openbsd" require ] }
+} case
diff --git a/basis/io/unix/files/freebsd/freebsd.factor b/basis/io/unix/files/freebsd/freebsd.factor
new file mode 100644
index 0000000000..14d15bc93d
--- /dev/null
+++ b/basis/io/unix/files/freebsd/freebsd.factor
@@ -0,0 +1,17 @@
+! Copyright (C) 2008 Doug Coleman.
+! See http://factorcode.org/license.txt for BSD license.
+USING: kernel alien.syntax math io.unix.files system
+unix.stat accessors combinators calendar ;
+IN: io.unix.files.freebsd
+
+TUPLE: freebsd-file-info < unix-file-info birth-time flags gen ;
+
+M: freebsd new-file-info ( -- class ) freebsd-file-info new ;
+
+M: freebsd stat>file-info ( stat -- file-info )
+    [ call-next-method ] keep
+    {
+        [ stat-st_flags >>flags ]
+        [ stat-st_gen >>gen ]
+        [ stat-st_birthtimepsec timespec>timestamp >>birth-time ]
+    } cleave ;
diff --git a/basis/io/unix/files/freebsd/tags.txt b/basis/io/unix/files/freebsd/tags.txt
new file mode 100644
index 0000000000..6bf68304bb
--- /dev/null
+++ b/basis/io/unix/files/freebsd/tags.txt
@@ -0,0 +1 @@
+unportable
diff --git a/basis/io/unix/files/macosx/macosx.factor b/basis/io/unix/files/macosx/macosx.factor
new file mode 100644
index 0000000000..4173123e45
--- /dev/null
+++ b/basis/io/unix/files/macosx/macosx.factor
@@ -0,0 +1,16 @@
+! Copyright (C) 2008 Doug Coleman.
+! See http://factorcode.org/license.txt for BSD license.
+USING: kernel alien.syntax math io.unix.files system
+unix.stat accessors combinators ;
+IN: io.unix.files.macosx
+
+TUPLE: macosx-file-info < unix-file-info flags gen ;
+
+M: macosx new-file-info ( -- class ) macosx-file-info new ;
+
+M: macosx stat>file-info ( stat -- file-info )
+    [ call-next-method ] keep
+    {
+        [ stat-st_flags >>flags ]
+        [ stat-st_gen >>gen ]
+    } cleave ;
diff --git a/basis/io/unix/files/macosx/tags.txt b/basis/io/unix/files/macosx/tags.txt
new file mode 100644
index 0000000000..6bf68304bb
--- /dev/null
+++ b/basis/io/unix/files/macosx/tags.txt
@@ -0,0 +1 @@
+unportable
diff --git a/basis/io/unix/files/netbsd/netbsd.factor b/basis/io/unix/files/netbsd/netbsd.factor
new file mode 100644
index 0000000000..c61304c128
--- /dev/null
+++ b/basis/io/unix/files/netbsd/netbsd.factor
@@ -0,0 +1,17 @@
+! Copyright (C) 2008 Doug Coleman.
+! See http://factorcode.org/license.txt for BSD license.
+USING: kernel alien.syntax math io.unix.files system
+unix.stat accessors combinators calendar ;
+IN: io.unix.files.netbsd
+
+TUPLE: netbsd-file-info < unix-file-info birth-time flags gen ;
+
+M: netbsd new-file-info ( -- class ) netbsd-file-info new ;
+
+M: netbsd stat>file-info ( stat -- file-info )
+    [ call-next-method ] keep
+    {
+        [ stat-st_flags >>flags ]
+        [ stat-st_gen >>gen ]
+        [ stat-st_birthtim timespec>timestamp >>birth-time ]
+    } cleave ;
diff --git a/basis/io/unix/files/netbsd/tags.txt b/basis/io/unix/files/netbsd/tags.txt
new file mode 100644
index 0000000000..6bf68304bb
--- /dev/null
+++ b/basis/io/unix/files/netbsd/tags.txt
@@ -0,0 +1 @@
+unportable
diff --git a/basis/io/unix/files/openbsd/openbsd.factor b/basis/io/unix/files/openbsd/openbsd.factor
new file mode 100644
index 0000000000..e1473eed4d
--- /dev/null
+++ b/basis/io/unix/files/openbsd/openbsd.factor
@@ -0,0 +1,17 @@
+! Copyright (C) 2008 Doug Coleman.
+! See http://factorcode.org/license.txt for BSD license.
+USING: kernel alien.syntax math io.unix.files system
+unix.stat accessors combinators calendar ;
+IN: io.unix.files.openbsd
+
+TUPLE: openbsd-file-info < unix-file-info birth-time flags gen ;
+
+M: openbsd new-file-info ( -- class ) openbsd-file-info new ;
+
+M: openbsd stat>file-info ( stat -- file-info )
+    [ call-next-method ] keep
+    {
+        [ stat-st_flags >>flags ]
+        [ stat-st_gen >>gen ]
+        [ stat-st_birthtim timespec>timestamp >>birth-time ]
+    } cleave ;
diff --git a/basis/io/unix/files/openbsd/tags.txt b/basis/io/unix/files/openbsd/tags.txt
new file mode 100644
index 0000000000..6bf68304bb
--- /dev/null
+++ b/basis/io/unix/files/openbsd/tags.txt
@@ -0,0 +1 @@
+unportable
diff --git a/basis/io/unix/files/unique/unique.factor b/basis/io/unix/files/unique/unique.factor
index 95e321fd93..e47ac6a2e3 100644
--- a/basis/io/unix/files/unique/unique.factor
+++ b/basis/io/unix/files/unique/unique.factor
@@ -1,3 +1,5 @@
+! Copyright (C) 2008 Doug Coleman.
+! See http://factorcode.org/license.txt for BSD license.
 USING: kernel io.ports io.unix.backend math.bitwise
 unix io.files.unique.backend system ;
 IN: io.unix.files.unique