[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

[et-mgmt-tools] [PATCH] Add utility function for stat() of disks



# HG changeset patch
# User john levon sun com
# Date 1228937605 28800
# Node ID 8638073ea45665c7531931515636a862f684c2a5
# Parent  e9045f3ae5b2243a9ee00f0913c2dcefdddd7c36
Add utility function for stat() of disks

Signed-off-by: John Levon <john levon sun com>

diff --git a/virtinst/CloneManager.py b/virtinst/CloneManager.py
--- a/virtinst/CloneManager.py
+++ b/virtinst/CloneManager.py
@@ -19,7 +19,6 @@
 # MA 02110-1301 USA.
 
 import os
-import stat
 import libxml2
 import logging
 import urlgrabber.progress as progress
@@ -394,13 +393,9 @@ class CloneDesign(object):
         logging.debug("original device list: %s" % (lst))
 
         for i in lst:
-            mode = os.stat(i)[stat.ST_MODE]
-            if stat.S_ISBLK(mode):
-                size.append(_util.blkdev_size(i))
-                typ.append(False)
-            elif stat.S_ISREG(mode):
-                size.append(os.path.getsize(i))
-                typ.append(True)
+            (t, sz) = _util.stat_disk(i)
+            typ.append(t)
+            size.append(sz)
         logging.debug("original device size: %s" % (size))
         logging.debug("original device type: %s" % (typ))
 
@@ -443,18 +438,9 @@ class CloneDesign(object):
         typ  = []
 
         for i in cln_dev_lst:
-            if os.path.exists(i) ==  False:
-                size.append(0)
-                # if not exists, create file necessary
-                typ.append(True)
-                continue
-            mode = os.stat(i)[stat.ST_MODE]
-            if stat.S_ISBLK(mode):
-                size.append(_util.blkdev_size(i))
-                typ.append(False)
-            elif stat.S_ISREG(mode):
-                size.append(os.path.getsize(i))
-                typ.append(True)
+            (t, sz) = _util.stat_disk(i)
+            typ.append(t)
+            size.append(sz)
 
         logging.debug("clone device list: %s" % (cln_dev_lst))
         logging.debug("clone device size: %s" % (size))
diff --git a/virtinst/_util.py b/virtinst/_util.py
--- a/virtinst/_util.py
+++ b/virtinst/_util.py
@@ -23,10 +23,30 @@
 # not be used by clients.
 #
 
+import stat
 import os
 
 from virtinst import util
 
+def stat_disk(path):
+    """Returns the tuple (isreg, size)."""
+    if not os.path.exists(path):
+        return True, 0
+
+    mode = os.stat(path)[stat.ST_MODE]
+   
+    # os.path.getsize('/dev/..') can be zero on some platforms
+    if stat.S_ISBLK(mode):
+        fd = os.open(path, os.O_RDONLY)
+        # os.SEEK_END is not present on all systems
+        size = os.lseek(fd, 0, 2)
+        os.close(fd)
+        return False, size
+    elif stat.S_ISREG(mode):
+        return True, os.path.getsize(path)
+
+    return True, 0
+  
 def blkdev_size(path):
     """Return the size of the block device.  We can't use os.stat() as
     that returns zero on many platforms."""


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]