module system/posix-xsi/file
/**
* Generate a new, not existing file name.
*/
strategies
/**
* Safe, mkstemp based, creation of temporary file
*
* @type _ -> (String, FileDescr)
*/
new-temp-file =
<conc-strings> (<temp-dir>, "/StrategoXT")
; mkstemp
/**
* Safe, mkdtemp based, creation of temporary directory
*
* @type _ -> String
*/
new-temp-dir =
<conc-strings> (<temp-dir>, "/StrategoXT")
; mkdtemp
strategies
temp-dir =
<getenv> "TMPDIR"
<+ P_tmpdir
P_tmpdir =
prim("SSL_P_tmpdir")
/**
* Creates a unique temporary file
*
* returns a fd if succesful, fails on error
* @type String -> String * Int
*/
mkstemp =
<conc-strings> (<id>, "XXXXXX") => template
; prim("SSL_mkstemp", template)
<+ <perror; fail> "SSL/mkstemp"
/**
* Creates a unique temporary directory
*
* returns a fd if succesful, fails on error
* @type String -> String
*/
mkdtemp =
<conc-strings> (<id>, "XXXXXX") => template
; prim("SSL_mkdtemp", template)
<+ <perror; fail> "SSL/mkdtemp"
strategies
/**
* rename renames a file, moving it between directories if required.
* Any other hard links to the file (as created using link(2)) are unaffected.
*
* If newpath already exists it will be atomically replaced (subject to a
* few conditions ~ see ERRORS below), so that there is no point at which
* another process attempting to access newpath will find it missing.
*
* If newpath exists but the operation fails for some reason rename guarantees
* to leave an instance of newpath in place.
*
* From 0.9.4 this implementation copies the file if the primitive rename
* fails because of an XDEV error.
*/
rename-file =
?(oldname, newname)
; ( prim("SSL_rename", oldname, newname)
<+ ( get-last-error => ErrorNumber(<EXDEV> ())
< <copy-file> (oldname, newname)
; <remove-file> oldname
+ fail
)
)
/**
* Copy a file using memory mapped I/O.
*
* If newname is a directory the file is copied to a file in the directory
* with the same base name as the old file.
*/
copy-file =
?(oldname, newname)
; where(
if <file-exists; filemode; isdir> newname then
<concat-strings>[newname, "/", <base-filename> oldname]
else !newname end => newname'
)
; prim("SSL_copy", oldname, newname')
fdcopy =
?(fdin, fdout); prim("SSL_fdcopy", fdin, fdout)