about summary refs log tree commit diff
path: root/src/libutil
diff options
context:
space:
mode:
Diffstat (limited to 'src/libutil')
-rw-r--r--src/libutil/hash.cc39
-rw-r--r--src/libutil/hash.hh19
-rw-r--r--src/libutil/util.cc15
-rw-r--r--src/libutil/util.hh3
4 files changed, 56 insertions, 20 deletions
diff --git a/src/libutil/hash.cc b/src/libutil/hash.cc
index 262dbef20df2..3d20d2d50d50 100644
--- a/src/libutil/hash.cc
+++ b/src/libutil/hash.cc
@@ -282,30 +282,39 @@ Hash hashFile(HashType ht, const Path & path)
 }
 
 
-struct HashSink : Sink
+HashSink::HashSink(HashType ht) : ht(ht)
 {
-    HashType ht;
-    Ctx ctx;
-    virtual void operator ()
-        (const unsigned char * data, unsigned int len)
-    {
-        update(ht, ctx, data, len);
-    }
-};
+    ctx = new Ctx;
+    start(ht, *ctx);
+}
+    
+HashSink::~HashSink()
+{
+    delete ctx;
+}
 
+void HashSink::operator ()
+    (const unsigned char * data, unsigned int len)
+{
+    update(ht, *ctx, data, len);
+}
 
-Hash hashPath(HashType ht, const Path & path, PathFilter & filter)
+Hash HashSink::finish()
 {
-    HashSink sink;
-    sink.ht = ht;
     Hash hash(ht);
-    start(ht, sink.ctx);
-    dumpPath(path, sink, filter);
-    finish(ht, sink.ctx, hash.hash);
+    nix::finish(ht, *ctx, hash.hash);
     return hash;
 }
 
 
+Hash hashPath(HashType ht, const Path & path, PathFilter & filter)
+{
+    HashSink sink(ht);
+    dumpPath(path, sink, filter);
+    return sink.finish();
+}
+
+
 Hash compressHash(const Hash & hash, unsigned int newSize)
 {
     Hash h;
diff --git a/src/libutil/hash.hh b/src/libutil/hash.hh
index 78227fb6a31b..85eb3c1b4d7e 100644
--- a/src/libutil/hash.hh
+++ b/src/libutil/hash.hh
@@ -2,6 +2,7 @@
 #define __HASH_H
 
 #include "types.hh"
+#include "serialise.hh"
 
 
 namespace nix {
@@ -81,7 +82,23 @@ Hash compressHash(const Hash & hash, unsigned int newSize);
 /* Parse a string representing a hash type. */
 HashType parseHashType(const string & s);
 
- 
+
+typedef union Ctx;
+
+class HashSink : public Sink
+{
+private:
+    HashType ht;
+    Ctx * ctx;
+
+public:
+    HashSink(HashType ht);
+    ~HashSink();
+    virtual void operator () (const unsigned char * data, unsigned int len);
+    Hash finish();
+};
+
+
 }
 
     
diff --git a/src/libutil/util.cc b/src/libutil/util.cc
index fb6411408d08..7671c7c7e460 100644
--- a/src/libutil/util.cc
+++ b/src/libutil/util.cc
@@ -761,7 +761,7 @@ void killUser(uid_t uid)
 //////////////////////////////////////////////////////////////////////
 
 
-string runProgram(Path program)
+string runProgram(Path program, bool searchPath, const Strings & args)
 {
     /* Create a pipe. */
     Pipe pipe;
@@ -781,8 +781,17 @@ string runProgram(Path program)
 
             if (dup2(pipe.writeSide, STDOUT_FILENO) == -1)
                 throw SysError("dupping from-hook write side");
-            
-            execl(program.c_str(), program.c_str(), (char *) 0);
+
+            std::vector<const char *> cargs; /* careful with c_str()! */
+            cargs.push_back(program.c_str());
+            for (Strings::const_iterator i = args.begin(); i != args.end(); ++i)
+                cargs.push_back(i->c_str());
+            cargs.push_back(0);
+
+            if (searchPath)
+                execvp(program.c_str(), (char * *) &cargs[0]);
+            else
+                execv(program.c_str(), (char * *) &cargs[0]);
             throw SysError(format("executing `%1%'") % program);
             
         } catch (std::exception & e) {
diff --git a/src/libutil/util.hh b/src/libutil/util.hh
index 1cc97145c1aa..0ebf6f5a5f65 100644
--- a/src/libutil/util.hh
+++ b/src/libutil/util.hh
@@ -231,7 +231,8 @@ void killUser(uid_t uid);
 
 /* Run a program and return its stdout in a string (i.e., like the
    shell backtick operator). */
-string runProgram(Path program);
+string runProgram(Path program, bool searchPath = false,
+    const Strings & args = Strings());
 
 /* Wrapper around _exit() on Unix and ExitProcess() on Windows.  (On
    Cygwin, _exit() doesn't seem to do the right thing.) */