+#!/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))