Index: trunk/packages/sipb-xen-dom0/files/usr/sbin/sipb-xen-losetup
===================================================================
--- trunk/packages/sipb-xen-dom0/files/usr/sbin/sipb-xen-losetup	(revision 449)
+++ trunk/packages/sipb-xen-dom0/files/usr/sbin/sipb-xen-losetup	(revision 449)
@@ -0,0 +1,39 @@
+#!/usr/bin/env python2.5
+
+import sys
+import os
+from subprocess import call
+
+def losetup(source, offset=0):
+  # XXX we avoid colliding with other instances of ourself,
+  #     but when it comes to other loop-device users we just
+  #     pick a range things don't seem to use and hope...
+  lockfilename = '/tmp/losetup.lock'
+  os.close(os.open(lockfilename, os.O_CREAT+os.O_EXCL)) #lock
+  try:
+    loopdevice = None
+    for i in xrange(32,60): # totally arbitrary, just looks to be unused on black-mesa
+      filename = '/dev/loop%d'%i
+      if 0 == len(file(filename).read(1)):
+        loopdevice = filename # it's empty
+        break
+    if loopdevice is not None:
+      call(['losetup', '-o', str(offset), loopdevice, source])
+    else:
+      raise RuntimeError('out of loop devices for copying VM image: too many at once?')
+  finally:
+    os.unlink(lockfilename) #unlock
+  return loopdevice
+
+def main(*argv):
+  args = argv[1:]
+  os.environ['PATH'] = '/usr/sbin:/usr/bin:/sbin:/bin'
+  if not (1 <= len(args) <= 2):
+    print >>sys.stderr, 'usage: %s sourcedevice [offset]' % argv[0]
+    print >>sys.stderr, 'prints resulting loopback device; don\'t forget to losetup -d'
+    return 2
+  print losetup(*args)
+  return 0
+
+if __name__ == '__main__':
+  sys.exit(main(*sys.argv))
Index: trunk/packages/sipb-xen-guest-installer/files/usr/sbin/sipb-xen-lvcopy
===================================================================
--- trunk/packages/sipb-xen-guest-installer/files/usr/sbin/sipb-xen-lvcopy	(revision 448)
+++ trunk/packages/sipb-xen-guest-installer/files/usr/sbin/sipb-xen-lvcopy	(revision 449)
@@ -9,25 +9,6 @@
 
 def losetup(source, offset=0):
-  # XXX we avoid colliding with other instances of ourself,
-  #     but when it comes to other loop-device users we just
-  #     pick a range things don't seem to use and hope...
-  lockfilename = '/tmp/losetup.lock'
-  os.close(os.open(lockfilename, os.O_CREAT+os.O_EXCL)) #lock
-  try:
-    loopdevice = None
-    for i in xrange(32,60): # totally arbitrary, just looks to be unused on black-mesa
-      filename = '/dev/loop%d'%i
-      if 0 == len(file(filename).read(1)):
-        loopdevice = filename # it's empty
-        break
-    if loopdevice is not None:
-      call(['losetup', '-o', str(offset), loopdevice, source])
-    else:
-      raise RuntimeError('out of loop devices for copying VM image: too many at once?')
-  finally:
-    os.unlink(lockfilename) #unlock
-  return loopdevice
-  # XX this means we can duplicate 28 at once.  Since it takes around 30s,
-  # this seems like an adequate capacity.
+  p = Popen(['sipb-xen-losetup', source, str(offset)], stdout=PIPE)
+  return p.communicate()[0].strip()
 
 def frob_copy_in_vm(target, *args):
