diff options
Diffstat (limited to 'maildrop/tempfile.C')
| -rw-r--r-- | maildrop/tempfile.C | 106 | 
1 files changed, 106 insertions, 0 deletions
| diff --git a/maildrop/tempfile.C b/maildrop/tempfile.C new file mode 100644 index 0000000..6af120c --- /dev/null +++ b/maildrop/tempfile.C @@ -0,0 +1,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(); +} | 
