- # 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()