summaryrefslogtreecommitdiffstats
path: root/maildrop/tempfile.C
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();
}