diff --git a/extra/io/unix/backend/backend.factor b/extra/io/unix/backend/backend.factor index 08ff526f14..902af8fe0d 100644 --- a/extra/io/unix/backend/backend.factor +++ b/extra/io/unix/backend/backend.factor @@ -1,7 +1,7 @@ ! Copyright (C) 2004, 2008 Slava Pestov. ! See http://factorcode.org/license.txt for BSD license. USING: alien generic assocs kernel kernel.private math -io.nonblocking sequences strings structs sbufs threads unix +io.nonblocking sequences strings structs sbufs threads unix.ffi unix vectors io.buffers io.backend io.encodings math.parser continuations system libc qualified namespaces io.timeouts io.encodings.utf8 accessors ; diff --git a/extra/io/unix/kqueue/kqueue.factor b/extra/io/unix/kqueue/kqueue.factor old mode 100644 new mode 100755 index 8e8fb0ec74..ec82a426d3 --- a/extra/io/unix/kqueue/kqueue.factor +++ b/extra/io/unix/kqueue/kqueue.factor @@ -3,7 +3,7 @@ USING: alien.c-types kernel math math.bitfields namespaces locals accessors combinators threads vectors hashtables sequences assocs continuations sets -unix unix.time unix.kqueue unix.process +unix.ffi unix unix.time unix.kqueue unix.process io.nonblocking io.unix.backend io.launcher io.unix.launcher io.monitors ; IN: io.unix.kqueue diff --git a/extra/io/unix/sockets/sockets.factor b/extra/io/unix/sockets/sockets.factor index b60cb5760e..71edbc5500 100755 --- a/extra/io/unix/sockets/sockets.factor +++ b/extra/io/unix/sockets/sockets.factor @@ -5,7 +5,7 @@ namespaces threads sequences byte-arrays io.nonblocking io.binary io.unix.backend io.streams.duplex io.sockets.impl io.backend io.files io.files.private io.encodings.utf8 math.parser continuations libc combinators system accessors -qualified unix ; +qualified unix.ffi unix ; EXCLUDE: io => read write close ; EXCLUDE: io.sockets => accept ; diff --git a/extra/unix/ffi/ffi.factor b/extra/unix/ffi/ffi.factor index ec3daab880..e39d95dfa3 100644 --- a/extra/unix/ffi/ffi.factor +++ b/extra/unix/ffi/ffi.factor @@ -9,4 +9,7 @@ C-STRUCT: utimbuf { "time_t" "actime" } { "time_t" "modtime" } ; -FUNCTION: int utime ( char* path, utimebuf* buf ) ; \ No newline at end of file +FUNCTION: int utime ( char* path, utimebuf* buf ) ; + +FUNCTION: int err_no ( ) ; +FUNCTION: char* strerror ( int errno ) ; \ No newline at end of file diff --git a/extra/unix/system-call/system-call.factor b/extra/unix/system-call/system-call.factor new file mode 100644 index 0000000000..bfcb9ae6ea --- /dev/null +++ b/extra/unix/system-call/system-call.factor @@ -0,0 +1,15 @@ + +USING: kernel continuations sequences math accessors inference macros + fry arrays.lib unix.ffi ; + +IN: unix.system-call + +ERROR: unix-system-call-error word args message ; + +MACRO: unix-system-call ( quot -- ) + [ ] [ infer in>> ] [ first ] tri + '[ + [ @ dup 0 < [ dup throw ] [ ] if ] + [ drop , narray , swap err_no strerror unix-system-call-error ] + recover + ] ; diff --git a/extra/unix/unix.factor b/extra/unix/unix.factor index f1450a73ae..c68f127226 100755 --- a/extra/unix/unix.factor +++ b/extra/unix/unix.factor @@ -2,8 +2,8 @@ ! See http://factorcode.org/license.txt for BSD license. USING: alien alien.c-types alien.syntax kernel libc structs - math namespaces system combinators vocabs.loader unix.ffi unix.types - qualified ; + math namespaces system combinators vocabs.loader qualified + unix.ffi unix.types unix.system-call ; QUALIFIED: unix.ffi @@ -48,7 +48,6 @@ C-STRUCT: passwd ! ! ! Unix functions LIBRARY: factor -FUNCTION: int err_no ( ) ; FUNCTION: void clear_err_no ( ) ; LIBRARY: libc @@ -100,19 +99,10 @@ FUNCTION: void* mmap ( void* addr, size_t len, int prot, int flags, int fd, off_ FUNCTION: int munmap ( void* addr, size_t len ) ; FUNCTION: uint ntohl ( uint n ) ; FUNCTION: ushort ntohs ( ushort n ) ; -FUNCTION: char* strerror ( int errno ) ; -ERROR: open-error path flags prot message ; +: open ( path flags prot -- int ) [ unix.ffi:open ] unix-system-call ; -: open ( path flags prot -- int ) - 3dup unix.ffi:open - dup 0 >= [ >r 3drop r> ] [ drop err_no strerror open-error ] if ; - -ERROR: utime-error path message ; - -: utime ( path buf -- ) - dupd unix.ffi:utime - 0 = [ drop ] [ err_no strerror utime-error ] if ; +: utime ( path buf -- ) [ unix.ffi:utime ] unix-system-call drop ; FUNCTION: int pclose ( void* file ) ; FUNCTION: int pipe ( int* filedes ) ;