Reactos
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}