/** * \file tempname.C * This file is part of LyX, the document processor. * Licence details can be found in the file COPYING. * * \author Lars Gullik Bjønnes * * Full author contact details are available in file CREDITS. */ #include #include "support/lyxlib.h" #include "support/convert.h" #include "support/filetools.h" #include "support/package.h" #include "debug.h" #include #include #ifdef HAVE_UNISTD_H # include #endif #if !defined(HAVE_MKSTEMP) && defined(HAVE_MKTEMP) # include # ifdef HAVE_SYS_STAT_H # include # endif # ifdef HAVE_IO_H # include # endif # ifdef HAVE_PROCESS_H # include # endif #endif using boost::scoped_array; using std::string; using std::endl; namespace lyx { namespace { inline int make_tempfile(char * templ) { #if defined(HAVE_MKSTEMP) return ::mkstemp(templ); #elif defined(HAVE_MKTEMP) // This probably just barely works... ::mktemp(templ); # if defined (HAVE_OPEN) # if (!defined S_IRUSR) # define S_IRUSR S_IREAD # define S_IWUSR S_IWRITE # endif return ::open(templ, O_RDWR | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR); # elif defined (HAVE__OPEN) return ::_open(templ, _O_RDWR | _O_CREAT | _O_EXCL, _S_IREAD | _S_IWRITE); # else # error No open() function. # endif #else #error FIX FIX FIX #endif } } // namespace anon string const lyx::support::tempName(string const & dir, string const & mask) { string const tmpdir(dir.empty() ? package().temp_dir() : dir); string tmpfl(addName(tmpdir, mask)); #if defined (HAVE_GETPID) tmpfl += convert(getpid()); #elif defined (HAVE__GETPID) tmpfl += convert(_getpid()); #else # error No getpid() function #endif tmpfl += "XXXXXX"; // The supposedly safe mkstemp version scoped_array tmpl(new char[tmpfl.length() + 1]); // + 1 for '\0' tmpfl.copy(tmpl.get(), string::npos); tmpl[tmpfl.length()] = '\0'; // terminator int const tmpf = make_tempfile(tmpl.get()); if (tmpf != -1) { string const t(tmpl.get()); #if defined (HAVE_CLOSE) ::close(tmpf); #elif defined (HAVE__CLOSE) ::_close(tmpf); #else # error No x() function. #endif lyxerr[Debug::FILES] << "Temporary file `" << t << "' created." << endl; return t; } else { lyxerr[Debug::FILES] << "LyX Error: Unable to create temporary file." << endl; return string(); } } } // namespace lyx