extern struct _PDCLIB_file_t * _PDCLIB_filelist;
/* This is an example implementation of tmpfile() fit for use with POSIX
- POSIX kernels.
+ kernels.
*/
struct _PDCLIB_file_t * tmpfile( void )
{
/* This is the chosen way to get high-quality randomness. Replace as
appropriate.
*/
- FILE * randomsource = fopen( "/dev/urandom", "rb" );
+ FILE * randomsource = fopen( "/proc/sys/kernel/random/uuid", "rb" );
char filename[ L_tmpnam ];
_PDCLIB_fd_t fd;
if ( randomsource == NULL )
use high-quality randomness instead of a pseudo-random sequence to
generate the filename candidate, which is *also* platform-dependent.
*/
- uint32_t random;
- fscanf( randomsource, "%" SCNu32, &random );
- sprintf( filename, "/tmp/%010" PRNu32 ".tmp", random );
+ unsigned int random;
+ fscanf( randomsource, "%u", &random );
+ sprintf( filename, "/tmp/%u.tmp", random );
/* Check if file of this name exists. Note that fopen() is a very weak
check, which does not take e.g. access permissions into account
(file might exist but not readable). Replace with something more
close( fd );
return NULL;
}
- rc->status = _PDCLIB_filemode( "wb+" ) | _PDCLIB_LIBBUFFER | _IOLBF | _PDCLIB_DELONCLOSE;
+ rc->status = _PDCLIB_filemode( "wb+" ) | _IOLBF | _PDCLIB_DELONCLOSE;
rc->handle = fd;
rc->ungetbuf = (unsigned char *)rc + sizeof( struct _PDCLIB_file_t );
rc->filename = (char *)rc->ungetbuf + _PDCLIB_UNGETCBUFSIZE;
#ifdef TEST
#include <_PDCLIB_test.h>
+#include <string.h>
int main()
{
- TESTCASE( NO_TESTDRIVER );
+ FILE * fh;
+#ifndef REGTEST
+ char filename[ L_tmpnam ];
+ FILE * fhtest;
+#endif
+ TESTCASE( ( fh = tmpfile() ) != NULL );
+ TESTCASE( fputc( 'x', fh ) == 'x' );
+ /* Checking that file is actually there */
+ TESTCASE_NOREG( strcpy( filename, fh->filename ) == filename );
+ TESTCASE_NOREG( ( fhtest = fopen( filename, "r" ) ) != NULL );
+ TESTCASE_NOREG( fclose( fhtest ) == 0 );
+ /* Closing tmpfile */
+ TESTCASE( fclose( fh ) == 0 );
+ /* Checking that file was deleted */
+ TESTCASE_NOREG( fopen( filename, "r" ) == NULL );
return TEST_RESULTS;
}