// Copyright 2005 Ben Hutchings <ben@decadentplace.org.uk>.
// See the file "COPYING" for licence details.

#include "temp_file.hpp"

#include <cassert>
#include <cerrno>
#include <cstdlib>
#include <cstring>
#include <stdexcept>
#include <vector>

#include <fcntl.h>
#include <unistd.h>

#include <glibmm/fileutils.h>

temp_file::temp_file(const std::string & base_name)
{
    fd_ = Glib::file_open_tmp(name_, base_name);
    assert(fd_ >= 0);

    // Workaround bug in glibc <2.2 that may cause the file to be
    // created with lax permissions.
#   ifdef __GLIBC__
#   if !__GLIBC_PREREQ(2, 2)
    if (fchmod(fd_, S_IREAD|S_IWRITE) != 0 || ftruncate(fd_, 0) != 0)
    {
	close(fd_);
	throw std::runtime_error(std::strerror(errno));
    }
#   endif
#   endif
}

temp_file::~temp_file()
{
    close();

    // Don't assert that this is successful.  The file could have
    // been removed by another process.
    unlink(name_.c_str());
}

void temp_file::close()
{
    if (fd_ >= 0)
    {
	int result = ::close(fd_);
	assert(result == 0);
	fd_ = -1;
    }
}
