blob: 6af120cd450eaa180b01c735568b687401bee97a (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
|
#include "config.h"
#include "tempfile.h"
#include "funcs.h"
#include "mio.h"
TempFile::TempFile() :
#if SHARED_TEMPDIR
fp(0),
#endif
filename(0), fd(-1), do_remove(0)
{
constructed();
}
TempFile::~TempFile()
{
destroying();
Close();
if (filename)
{
delete[] filename;
filename=0;
}
}
int TempFile::Open(const char *fname, int flags, mode_t mode)
{
Close();
name(fname);
fd=mopen(fname, flags, mode);
if ( fd < 0 )
name(0);
else
descriptor(fd);
return (fd);
}
#if SHARED_TEMPDIR
int TempFile::Open()
{
Close();
fp=tmpfile();
if (fp == 0) return (-1);
fd=fileno(fp);
return (fd);
}
#endif
void TempFile::name(const char *fname)
{
do_remove=0;
if (filename)
delete[] filename;
if (!fname)
{
filename=0;
return;
}
filename=new char[strlen(fname)+1];
if (!filename) outofmem();
strcpy(filename, fname);
do_remove=1;
}
void TempFile::Close()
{
if (fd >= 0)
{
close(fd);
fd= -1;
}
#if SHARED_TEMPDIR
if (fp)
{
fclose(fp);
fp=0;
}
#endif
if (do_remove)
{
unlink(filename);
do_remove=0;
}
}
void TempFile::cleanup()
{
Close();
}
// When forked, the child process should just close the descriptor, do NOT
// remove the file!
void TempFile::forked()
{
do_remove=0;
Close();
}
|