guile-user
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: request tmpfile(3) wrapping in Guile 1.9 libguile


From: Ken Raeburn
Subject: Re: request tmpfile(3) wrapping in Guile 1.9 libguile
Date: Mon, 8 Feb 2010 10:34:39 -0500

On Feb 8, 2010, at 06:11, Andy Wingo wrote:
> 1. tmpfile(3) returns a FILE*, whereas Guile's fports normally deal in
> file descriptors. Will this be a problem? What about buffering? Do we
> have to fclose() the FILE* to get deletion working?

On POSIX systems you can use fileno().  The automatic deletion is probably 
handled by unlinking the file before returning the file handle.  But you 
probably can't get rid of the FILE* without calling fclose(), which would throw 
away the file and file descriptor.  On most UNIX systems you could probably 
dup() the file descriptor indicated by fileno() and then fclose() the FILE* 
handle, without losing the on-disk temporary file storage.

I don't know if you can use fileno on Windows.  It's also not clear to me from 
a quick look at the MSDN docs on tmpfile() whether the temporary file gets 
deleted if your program changes directories while running.

> 2. Why return 'tmpfile as the name, and not whatever filename one can
> get from the FILE* ?

If the file has been unlinked, the file name isn't going to be useful.  In 
fact, the tmpfile() interface doesn't give you a filename.

> 3. Is tmpfile(3) really needed, if you have mkstemp! and dynamic
> extents? Here's what I use, for example:

But mkstemp doesn't guarantee that no one else will grab the file name in 
between the time mkstemp checks that the file doesn't exist, and when you 
actually open(O_CREAT) it.  Using it can leave you with a race condition such 
that you need to loop generating and then trying filenames; tmpfile hides that 
away from the implementation, at least, or maybe uses more randomness in its 
filenames than mkstemp supports.  (And if you don't use O_EXCL, you may have a 
security problem, too.)

>    (unwind-protect
>     (proc template)
>     (delete-file template))))

Interesting...  A temp-file port type could probably be created that either 
uses tmpfile or unlinks on close or destruction of the port object, couldn't 
it?  I don't know if that would be better or worse than using tmpfile directly. 
 Does the unwind-protect here catch any cases that that would miss?

Ken



reply via email to

[Prev in Thread] Current Thread [Next in Thread]