From 30b2c4394fdea8aa9ec8a577247369d752383a20 Mon Sep 17 00:00:00 2001
From: Daira Hopwood <daira@jacaranda.org>
Date: Tue, 11 Aug 2015 15:43:01 +0100
Subject: [PATCH] Add fileutil.get_pathinfo function.

Signed-off-by: Daira Hopwood <daira@jacaranda.org>
---
 src/allmydata/util/fileutil.py | 25 ++++++++++++++++++++++++-
 1 file changed, 24 insertions(+), 1 deletion(-)

diff --git a/src/allmydata/util/fileutil.py b/src/allmydata/util/fileutil.py
index 133d2271..6b1a9fea 100644
--- a/src/allmydata/util/fileutil.py
+++ b/src/allmydata/util/fileutil.py
@@ -3,7 +3,8 @@ Futz with files like a pro.
 """
 
 import sys, exceptions, os, stat, tempfile, time, binascii
-from errno import EEXIST
+from collections import namedtuple
+from errno import EEXIST, ENOENT
 
 from twisted.python import log
 
@@ -622,3 +623,25 @@ else:
             rename_no_overwrite(replacement_path, replaced_path)
         except EnvironmentError:
             reraise(ConflictError)
+
+
+PathInfo = namedtuple('PathInfo', 'isdir isfile islink exists')
+
+def get_pathinfo(path_u):
+    precondition(isinstance(path_u, unicode), path_u)
+
+    # note: symlinks to directories are both islink and isdir
+    try:
+        statinfo = os.lstat(path_u)
+        mode = statinfo.st_mode
+        return PathInfo(isdir =stat.S_ISDIR(mode),
+                        isfile=stat.S_ISREG(mode),
+                        islink=stat.S_ISLNK(mode),
+                        exists=True)
+    except OSError as e:
+        if e.errno == ENOENT:
+            return PathInfo(isdir=False,
+                            isfile=False,
+                            islink=False,
+                            exists=False)
+        raise
-- 
2.45.2