X-Git-Url: https://pd.if.org/git/?p=pdclib;a=blobdiff_plain;f=functions%2Fstdio%2Frename.c;h=0c30b1e78cd9f8db37c1b2bc34e78e7c7175d872;hp=8e2d3e0bb0306daa0a541208e030a95cae38e8b0;hb=da0f3f353d417fed71f358a48d5d5394145e460d;hpb=8130f23f1b48ba7fc0d22365bb38dcd396144911 diff --git a/functions/stdio/rename.c b/functions/stdio/rename.c index 8e2d3e0..0c30b1e 100644 --- a/functions/stdio/rename.c +++ b/functions/stdio/rename.c @@ -1,5 +1,3 @@ -/* $Id$ */ - /* rename( const char *, const char * ) This file is part of the Public Domain C Library (PDCLib). @@ -9,27 +7,77 @@ #include #ifndef REGTEST -#include <_PDCLIB_glue.h> +#include "_PDCLIB_glue.h" + +#include + +extern _PDCLIB_file_t * _PDCLIB_filelist; int rename( const char * old, const char * new ) { - /* TODO: Search open file list, flush and close file */ + FILE * current = _PDCLIB_filelist; + while ( current != NULL ) + { + if ( ( current->filename != NULL ) && ( strcmp( current->filename, old ) == 0 ) ) + { + /* File of that name currently open. Do not rename. */ + return EOF; + } + current = current->next; + } return _PDCLIB_rename( old, new ); } #endif #ifdef TEST -#include <_PDCLIB_test.h> +#include "_PDCLIB_test.h" + +#include int main( void ) { -#ifndef REGTEST - TESTCASE( NO_TESTDRIVER ); -#else - puts( "No testing of rename() - test driver does not know internals of system function." ); -#endif + FILE * file; + remove( testfile1 ); + remove( testfile2 ); + /* make sure that neither file exists */ + TESTCASE( fopen( testfile1, "r" ) == NULL ); + TESTCASE( fopen( testfile2, "r" ) == NULL ); + /* rename file 1 to file 2 - expected to fail */ + TESTCASE( rename( testfile1, testfile2 ) != 0 ); + /* create file 1 */ + TESTCASE( ( file = fopen( testfile1, "w" ) ) != NULL ); + TESTCASE( fputs( "x", file ) != EOF ); + TESTCASE( fclose( file ) == 0 ); + /* check that file 1 exists */ + TESTCASE( ( file = fopen( testfile1, "r" ) ) != NULL ); + TESTCASE( fclose( file ) == 0 ); + /* rename file 1 to file 2 */ + TESTCASE( rename( testfile1, testfile2 ) == 0 ); + /* check that file 2 exists, file 1 does not */ + TESTCASE( fopen( testfile1, "r" ) == NULL ); + TESTCASE( ( file = fopen( testfile2, "r" ) ) != NULL ); + TESTCASE( fclose( file ) == 0 ); + /* create another file 1 */ + TESTCASE( ( file = fopen( testfile1, "w" ) ) != NULL ); + TESTCASE( fputs( "x", file ) != EOF ); + TESTCASE( fclose( file ) == 0 ); + /* check that file 1 exists */ + TESTCASE( ( file = fopen( testfile1, "r" ) ) != NULL ); + TESTCASE( fclose( file ) == 0 ); + /* rename file 1 to file 2 - expected to fail, see comment in + _PDCLIB_rename() itself. + */ + /* NOREG as glibc overwrites existing destination file. */ + TESTCASE_NOREG( rename( testfile1, testfile2 ) != 0 ); + /* remove both files */ + TESTCASE( remove( testfile1 ) == 0 ); + TESTCASE( remove( testfile2 ) == 0 ); + /* check that they're gone */ + TESTCASE( fopen( testfile1, "r" ) == NULL ); + TESTCASE( fopen( testfile2, "r" ) == NULL ); return TEST_RESULTS; } #endif +