93 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Factor
		
	
	
			
		
		
	
	
			93 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Factor
		
	
	
| ! Copyright (C) 2005, 2010 Slava Pestov.
 | |
| ! Copyright (C) 2008 Eduardo Cavazos.
 | |
| ! See http://factorcode.org/license.txt for BSD license.
 | |
| USING: accessors alien.c-types alien.syntax byte-arrays classes.struct
 | |
| combinators.short-circuit combinators.smart generalizations kernel
 | |
| libc locals math sequences sequences.generalizations strings system
 | |
| unix.ffi vocabs.loader ;
 | |
| IN: unix
 | |
| 
 | |
| ERROR: unix-system-call-error args errno message word ;
 | |
| 
 | |
| : unix-call-failed? ( ret -- ? )
 | |
|     {
 | |
|         [ { [ integer? ] [ 0 < ] } 1&& ]
 | |
|         [ not ]
 | |
|     } 1|| ;
 | |
| 
 | |
| MACRO:: unix-system-call ( quot -- quot )
 | |
|     quot inputs :> n
 | |
|     quot first :> word
 | |
|     0 :> ret!
 | |
|     f :> failed!
 | |
|     [
 | |
|         [
 | |
|             n ndup quot call ret!
 | |
|             ret {
 | |
|                 [ unix-call-failed? dup failed! ]
 | |
|                 [ drop errno EINTR = ]
 | |
|             } 1&&
 | |
|         ] loop
 | |
|         failed [
 | |
|             n narray
 | |
|             errno dup strerror
 | |
|             word unix-system-call-error
 | |
|         ] [
 | |
|             n ndrop
 | |
|             ret
 | |
|         ] if
 | |
|     ] ;
 | |
| 
 | |
| MACRO:: unix-system-call-allow-eintr ( quot -- quot )
 | |
|     quot inputs :> n
 | |
|     quot first :> word
 | |
|     0 :> ret!
 | |
|     [
 | |
|         n ndup quot call ret!
 | |
|         ret unix-call-failed? [
 | |
|             ! Bug #908
 | |
|             ! Allow EINTR for close(2)
 | |
|             errno EINTR = [
 | |
|                 n narray
 | |
|                 errno dup strerror
 | |
|                 word unix-system-call-error
 | |
|             ] unless
 | |
|         ] [
 | |
|             n ndrop
 | |
|             ret
 | |
|         ] if
 | |
|     ] ;
 | |
| 
 | |
| HOOK: open-file os ( path flags mode -- fd )
 | |
| 
 | |
| : close-file ( fd -- ) [ close ] unix-system-call-allow-eintr drop ;
 | |
| 
 | |
| FUNCTION: int _exit ( int status )
 | |
| 
 | |
| M: unix open-file [ open ] unix-system-call ;
 | |
| 
 | |
| : make-fifo ( path mode -- ) [ mkfifo ] unix-system-call drop ;
 | |
| 
 | |
| : truncate-file ( path n -- ) [ truncate ] unix-system-call drop ;
 | |
| 
 | |
| : touch ( filename -- ) f [ utime ] unix-system-call drop ;
 | |
| 
 | |
| : change-file-times ( filename access modification -- )
 | |
|     utimbuf <struct>
 | |
|         swap >>modtime
 | |
|         swap >>actime
 | |
|         [ utime ] unix-system-call drop ;
 | |
| 
 | |
| : (read-symbolic-link) ( path bufsiz -- path' )
 | |
|     dup <byte-array> 3dup swap [ readlink ] unix-system-call
 | |
|     pick dupd < [ head >string 2nip ] [
 | |
|         2nip 2 * (read-symbolic-link)
 | |
|     ] if ;
 | |
| 
 | |
| : read-symbolic-link ( path -- path )
 | |
|     4096 (read-symbolic-link) ;
 | |
| 
 | |
| : unlink-file ( path -- ) [ unlink ] unix-system-call drop ;
 | |
| 
 | |
| { "unix" "debugger" } "unix.debugger" require-when
 |