added TempFile class
This commit is contained in:
parent
ac869479e7
commit
1435101bb6
@ -1,5 +1,5 @@
|
|||||||
#ifndef lint
|
#ifndef lint
|
||||||
static char rcsid[] = "@(#$Id: pathut.cpp,v 1.12 2006-12-14 13:53:43 dockes Exp $ (C) 2004 J.F.Dockes";
|
static char rcsid[] = "@(#$Id: pathut.cpp,v 1.13 2006-12-16 15:31:51 dockes Exp $ (C) 2004 J.F.Dockes";
|
||||||
#endif
|
#endif
|
||||||
/*
|
/*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
@ -20,6 +20,7 @@ static char rcsid[] = "@(#$Id: pathut.cpp,v 1.12 2006-12-14 13:53:43 dockes Exp
|
|||||||
|
|
||||||
#ifndef TEST_PATHUT
|
#ifndef TEST_PATHUT
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
#include <fcntl.h>
|
||||||
#include <sys/param.h>
|
#include <sys/param.h>
|
||||||
#include <pwd.h>
|
#include <pwd.h>
|
||||||
|
|
||||||
@ -34,45 +35,85 @@ using std::stack;
|
|||||||
|
|
||||||
#include "pathut.h"
|
#include "pathut.h"
|
||||||
|
|
||||||
bool maketmpdir(string& tdir, string& reason)
|
static const char *tmplocation()
|
||||||
{
|
{
|
||||||
const char *tmpdir = getenv("RECOLL_TMPDIR");
|
const char *tmpdir = getenv("RECOLL_TMPDIR");
|
||||||
if (!tmpdir)
|
if (!tmpdir)
|
||||||
tmpdir = getenv("TMPDIR");
|
tmpdir = getenv("TMPDIR");
|
||||||
if (!tmpdir)
|
if (!tmpdir)
|
||||||
tmpdir = "/tmp";
|
tmpdir = "/tmp";
|
||||||
tdir = path_cat(tmpdir, "rcltmpXXXXXX");
|
return tmpdir;
|
||||||
|
}
|
||||||
|
|
||||||
{
|
bool maketmpdir(string& tdir, string& reason)
|
||||||
char *cp = strdup(tdir.c_str());
|
{
|
||||||
if (!cp) {
|
tdir = path_cat(tmplocation(), "rcltmpXXXXXX");
|
||||||
reason = "maketmpdir: out of memory (for file name !)\n";
|
|
||||||
tdir.erase();
|
char *cp = strdup(tdir.c_str());
|
||||||
return false;
|
if (!cp) {
|
||||||
}
|
reason = "maketmpdir: out of memory (for file name !)\n";
|
||||||
#ifdef HAVE_MKDTEMP
|
tdir.erase();
|
||||||
if (!mkdtemp(cp)) {
|
return false;
|
||||||
#else
|
|
||||||
if (!mktemp(cp)) {
|
|
||||||
#endif // HAVE_MKDTEMP
|
|
||||||
free(cp);
|
|
||||||
reason = "maketmpdir: mktemp failed\n";
|
|
||||||
tdir.erase();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
tdir = cp;
|
|
||||||
free(cp);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!
|
||||||
|
#ifdef HAVE_MKDTEMP
|
||||||
|
mkdtemp(cp)
|
||||||
|
#else
|
||||||
|
mktemp(cp)
|
||||||
|
#endif // HAVE_MKDTEMP
|
||||||
|
) {
|
||||||
|
free(cp);
|
||||||
|
reason = "maketmpdir: mktemp failed\n";
|
||||||
|
tdir.erase();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
tdir = cp;
|
||||||
|
free(cp);
|
||||||
|
|
||||||
#ifndef HAVE_MKDTEMP
|
#ifndef HAVE_MKDTEMP
|
||||||
if (mkdir(tdir.c_str(), 0700) < 0) {
|
if (mkdir(tdir.c_str(), 0700) < 0) {
|
||||||
reason = string("maketmpdir: mkdir ) + tdir : " failed";
|
reason = string("maketmpdir: mkdir ") + tdir + " failed";
|
||||||
tdir.erase();
|
tdir.erase();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TempFileInternal::TempFileInternal(const string& suffix)
|
||||||
|
{
|
||||||
|
string filename = path_cat(tmplocation(), "rcltmpfXXXXXX");
|
||||||
|
char *cp = strdup(filename.c_str());
|
||||||
|
if (!cp) {
|
||||||
|
m_reason = "Out of memory (for file name !)\n";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!mktemp(cp)) {
|
||||||
|
free(cp);
|
||||||
|
m_reason = "maketmpdir: mktemp failed\n";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
filename = cp;
|
||||||
|
free(cp);
|
||||||
|
|
||||||
|
// Yea not right
|
||||||
|
m_filename = filename + suffix;
|
||||||
|
if (close(open(m_filename.c_str(), O_CREAT|O_EXCL, 0600)) != 0) {
|
||||||
|
m_reason = string("Could not open/create") + m_filename;
|
||||||
|
m_filename.erase();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TempFileInternal::~TempFileInternal()
|
||||||
|
{
|
||||||
|
if (!m_filename.empty())
|
||||||
|
unlink(m_filename.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void path_catslash(std::string &s) {
|
void path_catslash(std::string &s) {
|
||||||
if (s.empty() || s[s.length() - 1] != '/')
|
if (s.empty() || s[s.length() - 1] != '/')
|
||||||
s += '/';
|
s += '/';
|
||||||
|
|||||||
@ -16,10 +16,11 @@
|
|||||||
*/
|
*/
|
||||||
#ifndef _PATHUT_H_INCLUDED_
|
#ifndef _PATHUT_H_INCLUDED_
|
||||||
#define _PATHUT_H_INCLUDED_
|
#define _PATHUT_H_INCLUDED_
|
||||||
/* @(#$Id: pathut.h,v 1.10 2006-12-14 13:53:43 dockes Exp $ (C) 2004 J.F.Dockes */
|
/* @(#$Id: pathut.h,v 1.11 2006-12-16 15:31:51 dockes Exp $ (C) 2004 J.F.Dockes */
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <list>
|
#include <list>
|
||||||
|
#include "refcntr.h"
|
||||||
|
|
||||||
#ifndef NO_NAMESPACES
|
#ifndef NO_NAMESPACES
|
||||||
using std::string;
|
using std::string;
|
||||||
@ -54,4 +55,19 @@ extern bool path_isdir(const string& path);
|
|||||||
/// Create temporary directory
|
/// Create temporary directory
|
||||||
extern bool maketmpdir(string& tdir, string& reason);
|
extern bool maketmpdir(string& tdir, string& reason);
|
||||||
|
|
||||||
|
/// Temporary file class
|
||||||
|
class TempFileInternal {
|
||||||
|
public:
|
||||||
|
TempFileInternal(const string& suffix);
|
||||||
|
~TempFileInternal();
|
||||||
|
const char *filename() {return m_filename.c_str();}
|
||||||
|
const string &getreason() {return m_reason;}
|
||||||
|
bool ok() {return !m_filename.empty();}
|
||||||
|
private:
|
||||||
|
string m_filename;
|
||||||
|
string m_reason;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef RefCntr<TempFileInternal> TempFile;
|
||||||
|
|
||||||
#endif /* _PATHUT_H_INCLUDED_ */
|
#endif /* _PATHUT_H_INCLUDED_ */
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user