better tmp dir selection
This commit is contained in:
parent
9d19e344d3
commit
347badf770
8 changed files with 83 additions and 52 deletions
|
@ -6,7 +6,9 @@
|
|||
#define PFAEDLE_DEF_H_
|
||||
|
||||
#include <unistd.h>
|
||||
#include <string>
|
||||
#include "util/log/Log.h"
|
||||
#include "util/Misc.h"
|
||||
#include "util/geo/Geo.h"
|
||||
#include "util/geo/PolyLine.h"
|
||||
|
||||
|
@ -34,6 +36,7 @@ namespace pfaedle {
|
|||
// _____________________________________________________________________________
|
||||
inline std::string getTmpFName(std::string dir, std::string postf) {
|
||||
if (postf.size()) postf = "-" + postf;
|
||||
if (!dir.size()) dir = util::getTmpDir();
|
||||
if (dir.size() && dir.back() != '/') dir = dir + "/";
|
||||
|
||||
std::string f = dir + ".pfaedle-tmp" + postf;
|
||||
|
@ -55,6 +58,6 @@ inline std::string getTmpFName(std::string dir, std::string postf) {
|
|||
return f;
|
||||
}
|
||||
|
||||
}
|
||||
} // namespace pfaedle
|
||||
|
||||
#endif // PFAEDLE_DEF_H_
|
||||
|
|
|
@ -30,6 +30,29 @@
|
|||
#include "util/geo/output/GeoJsonOutput.h"
|
||||
#include "util/json/Writer.h"
|
||||
#include "util/log/Log.h"
|
||||
#include "util/Misc.h"
|
||||
|
||||
#ifndef HOME_VAR
|
||||
#define HOME_VAR "HOME"
|
||||
#endif
|
||||
#ifndef XDG_DATA_HOME_SUFFIX
|
||||
#define XDG_DATA_HOME_SUFFIX "/.local/share"
|
||||
#endif
|
||||
#ifndef XDG_CONFIG_HOME_SUFFIX
|
||||
#define XDG_CONFIG_HOME_SUFFIX "/.config"
|
||||
#endif
|
||||
#ifndef XDG_CACHE_HOME_SUFFIX
|
||||
#define XDG_CACHE_HOME_SUFFIX "/.cache"
|
||||
#endif
|
||||
#ifndef XDG_DATA_DIRS_DEFAULT
|
||||
#define XDG_DATA_DIRS_DEFAULT "/usr/local/share"
|
||||
#endif
|
||||
#ifndef XDG_CONFIG_DIRS_DEFAULT
|
||||
#define XDG_CONFIG_DIRS_DEFAULT "/etc"
|
||||
#endif
|
||||
#ifndef CFG_FILE_NAME
|
||||
#define CFG_FILE_NAME "pfaedle.cfg"
|
||||
#endif
|
||||
|
||||
using pfaedle::router::MOTs;
|
||||
using pfaedle::osm::BBoxIdx;
|
||||
|
@ -316,25 +339,6 @@ std::vector<std::string> getCfgPaths(const Config& cfg) {
|
|||
if (cfg.configPaths.size()) return cfg.configPaths;
|
||||
std::vector<std::string> ret;
|
||||
|
||||
// parse implicit paths
|
||||
const char* homedir = 0;
|
||||
char* buf = 0;
|
||||
|
||||
if ((homedir = getenv("HOME")) == 0) {
|
||||
homedir = "";
|
||||
struct passwd pwd;
|
||||
struct passwd* result;
|
||||
size_t bufsize;
|
||||
bufsize = sysconf(_SC_GETPW_R_SIZE_MAX);
|
||||
if (bufsize == static_cast<size_t>(-1)) bufsize = 0x4000;
|
||||
buf = static_cast<char*>(malloc(bufsize));
|
||||
if (buf != 0) {
|
||||
getpwuid_r(getuid(), &pwd, buf, bufsize, &result);
|
||||
if (result != NULL) homedir = result->pw_dir;
|
||||
}
|
||||
}
|
||||
|
||||
if (buf) free(buf);
|
||||
|
||||
// install prefix global configuration path, if available
|
||||
{
|
||||
|
@ -352,7 +356,7 @@ std::vector<std::string> getCfgPaths(const Config& cfg) {
|
|||
|
||||
// local user configuration path, if available
|
||||
{
|
||||
auto path = std::string(homedir) + XDG_CONFIG_HOME_SUFFIX + "/" +
|
||||
auto path = util::getHomeDir() + XDG_CONFIG_HOME_SUFFIX + "/" +
|
||||
"pfaedle" + "/" + CFG_FILE_NAME;
|
||||
std::ifstream is(path);
|
||||
|
||||
|
@ -363,6 +367,8 @@ std::vector<std::string> getCfgPaths(const Config& cfg) {
|
|||
}
|
||||
}
|
||||
|
||||
// free this here, as we use homedir in the block above
|
||||
|
||||
// CWD
|
||||
{
|
||||
char cwd[PATH_MAX];
|
||||
|
|
|
@ -5,36 +5,13 @@
|
|||
#ifndef PFAEDLE_CONFIG_MOTCONFIGREADER_H_
|
||||
#define PFAEDLE_CONFIG_MOTCONFIGREADER_H_
|
||||
|
||||
#include "pfaedle/_config.h"
|
||||
|
||||
#ifndef HOME_VAR
|
||||
#define HOME_VAR "HOME"
|
||||
#endif
|
||||
#ifndef XDG_DATA_HOME_SUFFIX
|
||||
#define XDG_DATA_HOME_SUFFIX "/.local/share"
|
||||
#endif
|
||||
#ifndef XDG_CONFIG_HOME_SUFFIX
|
||||
#define XDG_CONFIG_HOME_SUFFIX "/.config"
|
||||
#endif
|
||||
#ifndef XDG_CACHE_HOME_SUFFIX
|
||||
#define XDG_CACHE_HOME_SUFFIX "/.cache"
|
||||
#endif
|
||||
#ifndef XDG_DATA_DIRS_DEFAULT
|
||||
#define XDG_DATA_DIRS_DEFAULT "/usr/local/share"
|
||||
#endif
|
||||
#ifndef XDG_CONFIG_DIRS_DEFAULT
|
||||
#define XDG_CONFIG_DIRS_DEFAULT "/etc"
|
||||
#endif
|
||||
#ifndef CFG_FILE_NAME
|
||||
#define CFG_FILE_NAME "pfaedle.cfg"
|
||||
#endif
|
||||
|
||||
#include <unordered_map>
|
||||
#include <vector>
|
||||
#include <set>
|
||||
#include <string>
|
||||
#include <unordered_map>
|
||||
#include <vector>
|
||||
#include "ad/cppgtfs/gtfs/Route.h"
|
||||
#include "configparser/ConfigFileParser.h"
|
||||
#include "pfaedle/_config.h"
|
||||
#include "pfaedle/config/MotConfig.h"
|
||||
#include "pfaedle/osm/OsmBuilder.h"
|
||||
|
||||
|
|
|
@ -11,7 +11,6 @@
|
|||
#include <set>
|
||||
#include <sstream>
|
||||
#include <string>
|
||||
#include <string>
|
||||
#include "ad/cppgtfs/gtfs/Shape.h"
|
||||
#include "ad/cppgtfs/gtfs/flat/Shape.h"
|
||||
#include "pfaedle/Def.h"
|
||||
|
|
|
@ -2,6 +2,8 @@
|
|||
// Chair of Algorithms and Data Structures.
|
||||
// Authors: Patrick Brosi <brosi@informatik.uni-freiburg.de>
|
||||
|
||||
#include <string>
|
||||
|
||||
// ____________________________________________________________________________
|
||||
template <typename T>
|
||||
ShapeContainer<T>::ShapeContainer() {
|
||||
|
|
|
@ -271,15 +271,14 @@ uint32_t OsmIdSet::hash(uint32_t in, int i) const {
|
|||
|
||||
// _____________________________________________________________________________
|
||||
int OsmIdSet::openTmpFile() const {
|
||||
const std::string& fname = getTmpFName(_tmpPath, "");
|
||||
const std::string& fname = getTmpFName("", "");
|
||||
int file = open(fname.c_str(), O_RDWR | O_CREAT, 0666);
|
||||
|
||||
// immediately unlink
|
||||
unlink(fname.c_str());
|
||||
|
||||
if (file < 0) {
|
||||
std::cerr << "Could not open temporary file " << fname
|
||||
<< std::endl;
|
||||
std::cerr << "Could not open temporary file " << fname << std::endl;
|
||||
exit(1);
|
||||
}
|
||||
|
||||
|
|
|
@ -34,7 +34,6 @@ static const size_t OBUFFER_S = 8 * 1024 * 1024;
|
|||
class OsmIdSet {
|
||||
public:
|
||||
OsmIdSet();
|
||||
OsmIdSet(const std::string& tmpPath) : _tmpPath(tmpPath) {};
|
||||
~OsmIdSet();
|
||||
|
||||
// Add an OSM id
|
||||
|
|
|
@ -6,8 +6,12 @@
|
|||
#define UTIL_MISC_H_
|
||||
|
||||
#include <cmath>
|
||||
#include <cstring>
|
||||
#include <chrono>
|
||||
#include <sstream>
|
||||
#include <unistd.h>
|
||||
#include <sys/types.h>
|
||||
#include <pwd.h>
|
||||
|
||||
#define UNUSED(expr) do { (void)(expr); } while (0)
|
||||
#define TIME() std::chrono::high_resolution_clock::now()
|
||||
|
@ -85,6 +89,48 @@ inline double atof(const char* p, uint8_t mn) {
|
|||
// _____________________________________________________________________________
|
||||
inline double atof(const char* p) { return atof(p, 38); }
|
||||
|
||||
// _____________________________________________________________________________
|
||||
inline std::string getHomeDir() {
|
||||
// parse implicit paths
|
||||
const char* homedir = 0;
|
||||
char* buf = 0;
|
||||
|
||||
if ((homedir = getenv("HOME")) == 0) {
|
||||
homedir = "";
|
||||
struct passwd pwd;
|
||||
struct passwd* result;
|
||||
size_t bufsize;
|
||||
bufsize = sysconf(_SC_GETPW_R_SIZE_MAX);
|
||||
if (bufsize == static_cast<size_t>(-1)) bufsize = 0x4000;
|
||||
buf = static_cast<char*>(malloc(bufsize));
|
||||
if (buf != 0) {
|
||||
getpwuid_r(getuid(), &pwd, buf, bufsize, &result);
|
||||
if (result != NULL) homedir = result->pw_dir;
|
||||
}
|
||||
}
|
||||
|
||||
std::string ret(homedir);
|
||||
if (buf) free(buf);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
// _____________________________________________________________________________
|
||||
inline std::string getTmpDir() {
|
||||
// first, check if an env variable is set
|
||||
const char* tmpdir = getenv("TMPDIR");
|
||||
if (std::strlen(tmpdir)) return std::string(tmpdir);
|
||||
|
||||
// second, check if /tmp is writable
|
||||
if (access("/tmp/", W_OK) == 0) return "/tmp";
|
||||
|
||||
// third, check if the cwd is writable
|
||||
if (access(".", W_OK) == 0) return ".";
|
||||
|
||||
// lastly, return the users home directory as a fallback
|
||||
return getHomeDir();
|
||||
}
|
||||
|
||||
} // namespace util
|
||||
|
||||
#endif // UTIL_MISC_H_
|
||||
|
|
Loading…
Reference in a new issue