! Copyright (C) 2005, 2008 Slava Pestov. ! See http://factorcode.org/license.txt for BSD license. 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 ; IN: io.unix.files M: unix cwd ( -- path ) MAXPATHLEN [ ] keep getcwd [ (io-error) ] unless* ; M: unix cd ( path -- ) [ chdir ] unix-system-call drop ; : read-flags O_RDONLY ; inline : open-read ( path -- fd ) O_RDONLY file-mode open-file ; M: unix (file-reader) ( path -- stream ) open-read init-fd ; : write-flags { O_WRONLY O_CREAT O_TRUNC } flags ; inline : open-write ( path -- fd ) write-flags file-mode open-file ; M: unix (file-writer) ( path -- stream ) open-write init-fd ; : append-flags { O_WRONLY O_APPEND O_CREAT } flags ; inline : open-append ( path -- fd ) [ append-flags file-mode open-file |dispose dup 0 SEEK_END lseek io-error ] with-destructors ; M: unix (file-appender) ( path -- stream ) open-append init-fd ; : touch-mode ( -- n ) { O_WRONLY O_APPEND O_CREAT O_EXCL } flags ; foldable M: unix touch-file ( path -- ) normalize-path dup exists? [ touch ] [ touch-mode file-mode open-file close-file ] if ; M: unix move-file ( from to -- ) [ normalize-path ] bi@ rename io-error ; M: unix delete-file ( path -- ) normalize-path unlink-file ; M: unix make-directory ( path -- ) normalize-path OCT: 777 mkdir io-error ; M: unix delete-directory ( path -- ) normalize-path rmdir io-error ; : (copy-file) ( from to -- ) dup parent-directory make-directories binary [ swap binary [ swap stream-copy ] with-disposal ] with-disposal ; M: unix copy-file ( from to -- ) [ normalize-path ] bi@ [ (copy-file) ] [ 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 ; : 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 ; M: unix file-info ( path -- info ) normalize-path file-status stat>file-info ; M: unix link-info ( path -- info ) normalize-path link-status stat>file-info ; M: unix make-link ( path1 path2 -- ) normalize-path symlink io-error ; M: unix read-link ( path -- path' ) normalize-path read-symbolic-link ;