about summary refs log tree commit diff
path: root/src/util.hh
diff options
context:
space:
mode:
Diffstat (limited to 'src/util.hh')
-rw-r--r--src/util.hh82
1 files changed, 82 insertions, 0 deletions
diff --git a/src/util.hh b/src/util.hh
index 8d82c80c14b4..fb405b0f1200 100644
--- a/src/util.hh
+++ b/src/util.hh
@@ -1,7 +1,15 @@
 #ifndef __UTIL_H
 #define __UTIL_H
 
+#include <string>
 #include <vector>
+#include <sstream>
+
+#include <unistd.h>
+
+extern "C" {
+#include "md5.h"
+}
 
 using namespace std;
 
@@ -31,4 +39,78 @@ public:
 typedef vector<string> Strings;
 
 
+/* !!! the following shouldn't be here; abuse of the preprocessor */
+
+
+/* The canonical system name, as returned by config.guess. */ 
+static string thisSystem = SYSTEM;
+
+
+/* The prefix of the Nix installation, and the environment variable
+   that can be used to override the default. */
+static string nixHomeDir = "/nix";
+static string nixHomeDirEnvVar = "NIX";
+
+
+string absPath(string filename, string dir = "")
+{
+    if (filename[0] != '/') {
+        if (dir == "") {
+            char buf[PATH_MAX];
+            if (!getcwd(buf, sizeof(buf)))
+                throw Error("cannot get cwd");
+            dir = buf;
+        }
+        filename = dir + "/" + filename;
+        /* !!! canonicalise */
+        char resolved[PATH_MAX];
+        if (!realpath(filename.c_str(), resolved))
+            throw Error("cannot canonicalise path " + filename);
+        filename = resolved;
+    }
+    return filename;
+}
+
+
+string printHash(unsigned char * buf)
+{
+    ostringstream str;
+    for (int i = 0; i < 16; i++) {
+        str.fill('0');
+        str.width(2);
+        str << hex << (int) buf[i];
+    }
+    return str.str();
+}
+
+    
+/* Verify that a reference is valid (that is, is a MD5 hash code). */
+void checkHash(const string & s)
+{
+    string err = "invalid reference: " + s;
+    if (s.length() != 32)
+        throw BadRefError(err);
+    for (int i = 0; i < 32; i++) {
+        char c = s[i];
+        if (!((c >= '0' && c <= '9') ||
+              (c >= 'a' && c <= 'f')))
+            throw BadRefError(err);
+    }
+}
+
+
+/* Compute the MD5 hash of a file. */
+string hashFile(string filename)
+{
+    unsigned char hash[16];
+    FILE * file = fopen(filename.c_str(), "rb");
+    if (!file)
+        throw BadRefError("file `" + filename + "' does not exist");
+    int err = md5_stream(file, hash);
+    fclose(file);
+    if (err) throw BadRefError("cannot hash file");
+    return printHash(hash);
+}
+
+
 #endif /* !__UTIL_H */