Index: test/DefaultBtProgressInfoFileTest.cc =================================================================== --- test/DefaultBtProgressInfoFileTest.cc (revision 12) +++ test/DefaultBtProgressInfoFileTest.cc (revision 17) @@ -1,3 +1,4 @@ +#include #include "DefaultBtProgressInfoFile.h" #include "DefaultBtContext.h" #include "Option.h" Index: test/FileTest.cc =================================================================== --- test/FileTest.cc (revision 12) +++ test/FileTest.cc (revision 17) @@ -18,6 +18,7 @@ CPPUNIT_TEST(testMkdir); CPPUNIT_TEST(testGetDirname); CPPUNIT_TEST(testGetBasename); + CPPUNIT_TEST(testRenameTo); CPPUNIT_TEST_SUITE_END(); private: @@ -33,6 +34,7 @@ void testMkdir(); void testGetDirname(); void testGetBasename(); + void testRenameTo(); }; @@ -132,3 +134,23 @@ File f("/tmp/dist/aria2.tar.bz2"); CPPUNIT_ASSERT_EQUAL(string("aria2.tar.bz2"), f.getBasename()); } + +void FileTest::testRenameTo() +{ + string fname = "FileTest_testRenameTo.txt"; + ofstream of(fname.c_str()); + of.close(); + + File f(fname); + string fnameTo = "FileTest_testRenameTo_dest.txt"; + CPPUNIT_ASSERT(f.renameTo(fnameTo)); + CPPUNIT_ASSERT(f.exists()); + CPPUNIT_ASSERT(!File(fname).exists()); + CPPUNIT_ASSERT_EQUAL(fnameTo, f.getBasename()); + + // to see renameTo() work even when the destination file exists + of.open(fname.c_str()); + of.close(); + + CPPUNIT_ASSERT(f.renameTo(fname)); +} Index: test/HttpHeaderProcessorTest.cc =================================================================== --- test/HttpHeaderProcessorTest.cc (revision 12) +++ test/HttpHeaderProcessorTest.cc (revision 17) @@ -105,7 +105,7 @@ CPPUNIT_ASSERT_EQUAL(string("200"), status); CPPUNIT_ASSERT_EQUAL(string("Mon, 25 Jun 2007 16:04:59 GMT"), header->getFirst("Date")); CPPUNIT_ASSERT_EQUAL(string("Apache/2.2.3 (Debian)"), header->getFirst("Server")); - CPPUNIT_ASSERT_EQUAL(9187LL, header->getFirstAsLLInt("Content-Length")); + CPPUNIT_ASSERT_EQUAL((int64_t)9187LL, header->getFirstAsLLInt("Content-Length")); CPPUNIT_ASSERT_EQUAL(string("text/html; charset=UTF-8"), header->getFirst("Content-Type")); } Index: ChangeLog =================================================================== --- ChangeLog (revision 12) +++ ChangeLog (revision 17) @@ -1,3 +1,22 @@ +2007-09-15 Tatsuhiro Tsujikawa + + Fixed: control file cannot be saved in the second attempt because of + the nature of win32's rename() function. + * src/File.{h, cc} (renameTo): New function. Thanks to Ross. + * src/DefaultBtProgressInfoFile.cc: Use File::renameTo() + * src/SegmentMan.cc: Use File::renameTo() + * test/FileTest.cc (testRenameTo): Added. + +2007-09-14 Tatsuhiro Tsujikawa + + Fixed the compilation error on 64bit platform. + * test/HttpHeaderProcessorTest.cc + +2007-09-12 Tatsuhiro Tsujikawa + + Merged Ross's patch that fixes compilation problem in MinGW + * test/DefaultBtProgressInfoFileTest.cc + 2007-09-09 Tatsuhiro Tsujikawa Updated fr.po by sebone Index: src/DefaultBtProgressInfoFile.cc =================================================================== --- src/DefaultBtProgressInfoFile.cc (revision 12) +++ src/DefaultBtProgressInfoFile.cc (revision 17) @@ -92,7 +92,7 @@ filename.c_str(), strerror(errno)); } - if(rename(filenameTemp.c_str(), filename.c_str()) == -1) { + if(!File(filenameTemp).renameTo(filename)) { throw new DlAbortEx(EX_SEGMENT_FILE_WRITE, filename.c_str(), strerror(errno)); } Index: src/File.cc =================================================================== --- src/File.cc (revision 12) +++ src/File.cc (revision 17) @@ -37,6 +37,11 @@ #include "a2io.h" #include +#ifdef __MINGW32__ +# define WIN32_LEAN_AND_MEAN +# include +#endif // __MINGW32__ + File::File(const string& name):name(name) {} File::~File() {} @@ -140,3 +145,21 @@ { return File(filename).isDir(); } + +bool File::renameTo(const string& dest) +{ +#ifdef __MINGW32__ + /* MinGW's rename() doesn't delete an existing destination */ + if (_access(dest.c_str(), 0) == 0) { + if (_unlink(dest.c_str()) != 0) { + return false; + } + } +#endif // __MINGW32__ + if(rename(name.c_str(), dest.c_str()) == 0) { + name = dest; + return true; + } else { + return false; + } +} Index: src/SegmentMan.cc =================================================================== --- src/SegmentMan.cc (revision 12) +++ src/SegmentMan.cc (revision 17) @@ -143,7 +143,7 @@ segFilename.c_str(), strerror(errno)); } - if(rename(segFilenameTemp.c_str(), segFilename.c_str()) == -1) { + if(!File(segFilenameTemp).renameTo(segFilename)) { throw new DlAbortEx(EX_SEGMENT_FILE_WRITE, segFilename.c_str(), strerror(errno)); } Index: src/File.h =================================================================== --- src/File.h (revision 12) +++ src/File.h (revision 17) @@ -96,6 +96,8 @@ string getDirname() const; static bool isDir(const string& filename); + + bool renameTo(const string& dest); }; #endif // _D_FILE_H_ Index: test/File.h =================================================================== --- test/FileTest.cc 2007-10-04 22:35:10.008500000 -0700 +++ test/FileTest.cc 2007-10-05 07:18:48.133500000 -0700 @@ -1,3 +1,4 @@ +#include #include "File.h" #include #include