Reactos
at master 77 lines 1.7 kB view raw
1// 2// rmtmp.cpp 3// 4// Copyright (c) Microsoft Corporation. All rights reserved. 5// 6// Defines _rmtmp(), which closes and removes all temporary files created by 7// tmpfile() 8// 9#include <corecrt_internal_stdio.h> 10 11 12 13_CRT_LINKER_FORCE_INCLUDE(__acrt_tmpfile_terminator); 14 15 16 17// These definitions will cause this object to be linked in whenever the 18// termination code requires it. 19#ifndef CRTDLL 20 extern "C" { unsigned __acrt_tmpfile_used = 1; } 21#endif 22 23extern "C" { unsigned _tempoff = 1; } 24extern "C" { unsigned _old_pfxlen = 0; } 25 26 27 28// Closes and removes all temporary files created by tmpfile(). Returns the 29// number of streams that were closed. 30extern "C" int __cdecl _rmtmp() 31{ 32 int count = 0; 33 34 __acrt_lock(__acrt_stdio_index_lock); 35 __try 36 { 37 for (int i = 0; i != _nstream; ++i) 38 { 39 __crt_stdio_stream stream(__piob[i]); 40 41 if (!stream.valid()) 42 continue; 43 44 _lock_file(stream.public_stream()); 45 __try 46 { 47 if (!stream.is_in_use()) 48 __leave; 49 50 if (stream->_tmpfname == nullptr) 51 __leave; 52 53 // The stream is still in use. Close it: 54 _fclose_nolock(stream.public_stream()); 55 ++count; 56 } 57 __finally 58 { 59 _unlock_file(stream.public_stream()); 60 } 61 __endtry 62 } 63 } 64 __finally 65 { 66 __acrt_unlock(__acrt_stdio_index_lock); 67 } 68 __endtry 69 70 return count; 71} 72 73extern "C" void __cdecl __acrt_uninitialize_tmpfile() 74{ 75 __acrt_stdio_free_tmpfile_name_buffers_nolock(); 76 _rmtmp(); 77}