File: tempfile.C

package info (click to toggle)
maildrop 0.54a-2
  • links: PTS
  • area: main
  • in suites: slink
  • size: 872 kB
  • ctags: 883
  • sloc: cpp: 8,469; ansic: 658; sh: 327; makefile: 82
file content (90 lines) | stat: -rw-r--r-- 1,795 bytes parent folder | download
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
/* DSTART                                                                    */
/*                                                                           */
/*           maildrop - mail delivery agent with filtering abilities         */
/*                                                                           */
/*  Copyright 1998, Double Precision Inc.                                    */
/*                                                                           */
/*  This program is distributed under the terms of the GNU General Public    */
/*  License. See COPYING for additional information.                         */
/* DEND                                                                      */
#include	"tempfile.h"
#include	"funcs.h"
#include	"mio.h"

static const char rcsid[]="$Id: tempfile.C 1.1 1998/04/16 23:53:22 mrsam Exp $";

TempFile::TempFile() : 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);
}

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 (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();
}