summaryrefslogtreecommitdiffstats
path: root/maildrop/tempfile.C
diff options
context:
space:
mode:
Diffstat (limited to 'maildrop/tempfile.C')
-rw-r--r--maildrop/tempfile.C106
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();
+}