From 6ac4c9900ff18eba3ea5f88fd31eca385f24d2fe Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Wed, 30 Mar 2005 00:58:22 +0000 Subject: [PATCH] comitting initial unix I/O rewrite work --- library/bootstrap/boot-stage3.factor | 2 +- library/unix/files.factor | 31 ++++++++++ library/unix/io.factor | 15 +++++ library/unix/syscalls.factor | 92 ++++++++++++++++++++++++++++ 4 files changed, 139 insertions(+), 1 deletion(-) create mode 100644 library/unix/files.factor create mode 100644 library/unix/io.factor create mode 100644 library/unix/syscalls.factor diff --git a/library/bootstrap/boot-stage3.factor b/library/bootstrap/boot-stage3.factor index 757f707cf8..181c833d73 100644 --- a/library/bootstrap/boot-stage3.factor +++ b/library/bootstrap/boot-stage3.factor @@ -22,6 +22,7 @@ t [ "/library/in-thread.factor" "/library/random.factor" + "/library/io/buffer.factor" "/library/io/network.factor" "/library/io/logging.factor" "/library/io/stdio-binary.factor" @@ -102,7 +103,6 @@ t [ ] pull-in os "win32" = [ - "/library/io/buffer.factor" "/library/win32/win32-io.factor" "/library/win32/win32-errors.factor" "/library/win32/winsock.factor" diff --git a/library/unix/files.factor b/library/unix/files.factor new file mode 100644 index 0000000000..175ccfe847 --- /dev/null +++ b/library/unix/files.factor @@ -0,0 +1,31 @@ +! Copyright (C) 2005 Slava Pestov. +! See http://factor.sf.net/license.txt for BSD license. +IN: files +USING: alien kernel math namespaces ; + +: cd ( dir -- ) + "void" "libc" "chdir" [ "char*" ] alien-invoke ; + +: stat ( path -- [ dir? mode size mtime ] ) + tuck sys-stat 0 < [ + drop f + ] [ + [ + dup stat-mode dup S_ISDIR , + S_IFMT bitnot bitand , + dup stat-size , + stat-mtime , + ] make-list + ] ifte ; + +: (directory) ( path -- list ) + sys-opendir [ + [ + [ dirent-name , ] [ dup sys-readdir null>f ] while + ] make-list swap sys-closedir + ] [ + [ ] + ] ifte* ; + +: cwd ( -- str ) + dup 255 sys-getcwd io-error string-box-value ; diff --git a/library/unix/io.factor b/library/unix/io.factor new file mode 100644 index 0000000000..2de29ae793 --- /dev/null +++ b/library/unix/io.factor @@ -0,0 +1,15 @@ +! Copyright (C) 2005 Slava Pestov. +! See http://factor.sf.net/license.txt for BSD license. +IN: io-internals +USING: errors kernel math ; + +: file-mode OCT: 0600 ; + +: io-error ( n -- ) 0 < [ errno strerror throw ] when ; + +: open-read ( path -- fd ) + O_RDONLY file-mode sys-open dup io-error ; + +: open-write ( path -- fd ) + O_WRONLY O_CREAT bitor O_TRUNC bitor file-mode sys-open + dup io-error ; diff --git a/library/unix/syscalls.factor b/library/unix/syscalls.factor new file mode 100644 index 0000000000..ee579ea48a --- /dev/null +++ b/library/unix/syscalls.factor @@ -0,0 +1,92 @@ +! Copyright (C) 2005 Slava Pestov. +! See http://factor.sf.net/license.txt for BSD license. +IN: io-internals +USING: alien errors kernel math namespaces ; + +ALIAS: ulonglong off_t +ALIAS: long ssize_t +ALIAS: ulong size_t + +BEGIN-STRUCT: stat + FIELD: uint dev + FIELD: uint ino + FIELD: ushort mode + FIELD: ushort nlink + FIELD: uint uid + FIELD: uint gid + FIELD: uint rdev + FIELD: ulong atime + FIELD: ulong atimensec + FIELD: ulong mtime + FIELD: ulong mtimensec + FIELD: ulong ctime + FIELD: ulong ctimensec + FIELD: off_t size + FIELD: off_t blocks + FIELD: uint blksize + FIELD: uint flags + FIELD: uint gen + + FIELD: uint padding + FIELD: ulonglong padding + FIELD: ulonglong padding +END-STRUCT + +: S_IFMT OCT: 0170000 ; inline +: S_ISDIR ( m -- ? ) OCT: 0170000 bitand OCT: 0040000 = ; inline + +: sys-stat ( path stat -- n ) + "int" "libc" "stat" [ "char*" "stat*" ] alien-invoke ; + +: sys-opendir ( path -- dir* ) + "void*" "libc" "opendir" [ "char*" ] alien-invoke ; + +BEGIN-STRUCT: dirent + FIELD: uint fileno + FIELD: ushort reclen + FIELD: uchar type + FIELD: uchar namlen + FIELD: uchar256 name +END-STRUCT + +: sys-readdir ( dir* -- dirent* ) + "dirent*" "libc" "readdir" [ "void*" ] alien-invoke ; + +: sys-closedir ( dir* -- ) + "void" "libc" "closedir" [ "void*" ] alien-invoke ; + +BEGIN-STRUCT: string-box + FIELD: uchar256 value +END-STRUCT + +: errno ( -- n ) + "int" "libc" "errno" alien-global ; + +: strerror ( n -- str ) + "char*" "libc" "strerror" [ "int" ] alien-invoke ; + +: sys-getcwd ( str len -- n ) + "int" "libc" "getcwd" [ "string-box*" "uint" ] alien-invoke ; + +: O_RDONLY HEX: 0000 ; +: O_WRONLY HEX: 0001 ; +: O_RDWR HEX: 0002 ; +: O_CREAT HEX: 0200 ; +: O_TRUNC HEX: 0400 ; + +: sys-open ( path flags prot -- fd ) + "int" "libc" "open" [ "char*" "int" "int" ] alien-invoke ; + +: sys-close ( fd -- ) + "void" "libc" "close" [ "int" ] alien-invoke ; + +: sys-read ( fd buf nbytes -- n ) + "ssize_t" "libc" "read" [ "int" "void*" "size_t" ] alien-invoke ; + +: sys-write ( fd buf nbytes -- n ) + "ssize_t" "libc" "write" [ "int" "void*" "size_t" ] alien-invoke ; + +: MSG_OOB HEX: 1 ; + +: sys-recv ( fd buf nbytes flags -- ) + "ssize_t" "libc" "read" [ "int" "void*" "size_t" "int" ] alien-invoke ;