--- a/src/utils/readfile.cpp
+++ b/src/utils/readfile.cpp
@@ -36,43 +36,11 @@
 #endif /* NO_NAMESPACES */
 
 #include "readfile.h"
+#include "smallut.h"
 
 #ifndef MIN
 #define MIN(A,B) ((A) < (B) ? (A) : (B))
 #endif
-
-static void caterrno(string *reason, const char *what, int _errno)
-{
-    if (reason) {
-	reason->append(what);
-	reason->append(": errno: ");
-	char nbuf[20];
-	sprintf(nbuf, "%d", _errno);
-	reason->append(nbuf);
-	reason->append(" : ");
-#ifdef sun
-	// Note: sun strerror is noted mt-safe ??
-	reason->append(strerror(_errno));
-#else
-#define ERRBUFSZ 200    
-	char errbuf[ERRBUFSZ];
-	// There are 2 versions of strerror_r. 
-	// - The GNU one returns a pointer to the message (maybe
-	//   static storage or supplied buffer).
-        // - The POSIX one always stores in supplied buffer and
-	//   returns 0 on success. As the possibility of error and
-	//   error code are not specified, we're basically doomed
-	//   cause we can't use a test on the 0 value to know if we
-	//   were returned a pointer... 
-	// Also couldn't find an easy way to disable the gnu version without
-	// changing the cxxflags globally, so forget it.
-	// At worse we get no message at all here.
-	errbuf[0] = 0;
-	strerror_r(_errno, errbuf, ERRBUFSZ);
-	reason->append(errbuf);
-#endif
-    }
-}
 
 class FileToString : public FileScanDo {
 public:
@@ -87,7 +55,7 @@
 	try {
 	    m_data.append(buf, cnt);
 	} catch (...) {
-	    caterrno(reason, "append", errno);
+	    catstrerror(reason, "append", errno);
 	    return false;
 	}
 	return true;
@@ -129,7 +97,7 @@
     if (!fn.empty()) {
 	fd = open(fn.c_str(), O_RDONLY|O_STREAMING);
 	if (fd < 0 || fstat(fd, &st) < 0) {
-	    caterrno(reason, "open/stat", errno);
+	    catstrerror(reason, "open/stat", errno);
 	    return false;
 	}
 	noclosing = false;
@@ -146,7 +114,7 @@
     off_t curoffs = 0;
     if (startoffs > 0 && !fn.empty()) {
         if (lseek(fd, startoffs, SEEK_SET) != startoffs) {
-            caterrno(reason, "lseek", errno);
+            catstrerror(reason, "lseek", errno);
             return false;
         }
         curoffs = startoffs;
@@ -165,7 +133,7 @@
         }
 	int n = read(fd, buf, toread);
 	if (n < 0) {
-	    caterrno(reason, "read", errno);
+	    catstrerror(reason, "read", errno);
 	    goto out;
 	}
 	if (n == 0)