108 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Factor
		
	
	
		
			Executable File
		
	
			
		
		
	
	
			108 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Factor
		
	
	
		
			Executable File
		
	
| ! 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 [ <byte-array> ] 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 <fd> init-fd <input-port> ;
 | |
| 
 | |
| : 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 <fd> init-fd <output-port> ;
 | |
| 
 | |
| : 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 <fd> init-fd <output-port> ;
 | |
| 
 | |
| : 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 <file-writer> [
 | |
|         swap binary <file-reader> [
 | |
|             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 ; |