aboutsummaryrefslogtreecommitdiff
path: root/src/libutil/util.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/libutil/util.cc')
-rw-r--r--src/libutil/util.cc59
1 files changed, 36 insertions, 23 deletions
diff --git a/src/libutil/util.cc b/src/libutil/util.cc
index 32c8fce9a..9adaac40d 100644
--- a/src/libutil/util.cc
+++ b/src/libutil/util.cc
@@ -7,11 +7,8 @@
#include <sstream>
#include <cstring>
-#include <sys/stat.h>
#include <sys/wait.h>
-#include <sys/types.h>
#include <fcntl.h>
-#include <unistd.h>
#include <limits.h>
#include "util.hh"
@@ -23,7 +20,8 @@ extern char * * environ;
namespace nix {
-BaseError::BaseError(const format & f)
+BaseError::BaseError(const format & f, unsigned int status)
+ : status(status)
{
err = f.str();
}
@@ -149,6 +147,15 @@ string baseNameOf(const Path & path)
}
+struct stat lstat(const Path & path)
+{
+ struct stat st;
+ if (lstat(path.c_str(), &st))
+ throw SysError(format("getting status of `%1%'") % path);
+ return st;
+}
+
+
bool pathExists(const Path & path)
{
int res;
@@ -164,9 +171,7 @@ bool pathExists(const Path & path)
Path readLink(const Path & path)
{
checkInterrupt();
- struct stat st;
- if (lstat(path.c_str(), &st))
- throw SysError(format("getting status of `%1%'") % path);
+ struct stat st = lstat(path);
if (!S_ISLNK(st.st_mode))
throw Error(format("`%1%' is not a symlink") % path);
char buf[st.st_size];
@@ -178,9 +183,7 @@ Path readLink(const Path & path)
bool isLink(const Path & path)
{
- struct stat st;
- if (lstat(path.c_str(), &st))
- throw SysError(format("getting status of `%1%'") % path);
+ struct stat st = lstat(path);
return S_ISLNK(st.st_mode);
}
@@ -228,13 +231,12 @@ string readFile(const Path & path)
}
-void writeFile(const Path & path, const string & s, bool doFsync)
+void writeFile(const Path & path, const string & s)
{
AutoCloseFD fd = open(path.c_str(), O_WRONLY | O_TRUNC | O_CREAT, 0666);
if (fd == -1)
throw SysError(format("opening file `%1%'") % path);
writeFull(fd, (unsigned char *) s.c_str(), s.size());
- if (doFsync) fsync(fd);
}
@@ -270,9 +272,7 @@ static void _computePathSize(const Path & path,
{
checkInterrupt();
- struct stat st;
- if (lstat(path.c_str(), &st))
- throw SysError(format("getting attributes of path `%1%'") % path);
+ struct stat st = lstat(path);
bytes += st.st_size;
blocks += st.st_blocks;
@@ -302,9 +302,7 @@ static void _deletePath(const Path & path, unsigned long long & bytesFreed,
printMsg(lvlVomit, format("%1%") % path);
- struct stat st;
- if (lstat(path.c_str(), &st))
- throw SysError(format("getting attributes of path `%1%'") % path);
+ struct stat st = lstat(path);
if (!S_ISDIR(st.st_mode) && st.st_nlink == 1) {
bytesFreed += st.st_size;
@@ -351,9 +349,7 @@ void makePathReadOnly(const Path & path)
{
checkInterrupt();
- struct stat st;
- if (lstat(path.c_str(), &st))
- throw SysError(format("getting attributes of path `%1%'") % path);
+ struct stat st = lstat(path);
if (!S_ISLNK(st.st_mode) && (st.st_mode & S_IWUSR)) {
if (chmod(path.c_str(), st.st_mode & ~S_IWUSR) == -1)
@@ -412,12 +408,18 @@ Paths createDirs(const Path & path)
{
Paths created;
if (path == "/") return created;
- if (!pathExists(path)) {
+
+ struct stat st;
+ if (lstat(path.c_str(), &st) == -1) {
created = createDirs(dirOf(path));
- if (mkdir(path.c_str(), 0777) == -1)
+ if (mkdir(path.c_str(), 0777) == -1 && errno != EEXIST)
throw SysError(format("creating directory `%1%'") % path);
+ st = lstat(path);
created.push_back(path);
}
+
+ if (!S_ISDIR(st.st_mode)) throw Error(format("`%1%' is not a directory") % path);
+
return created;
}
@@ -976,6 +978,17 @@ Strings tokenizeString(const string & s, const string & separators)
}
+string concatStringsSep(const string & sep, const Strings & ss)
+{
+ string s;
+ foreach (Strings::const_iterator, i, ss) {
+ if (s.size() != 0) s += sep;
+ s += *i;
+ }
+ return s;
+}
+
+
string statusToString(int status)
{
if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) {