Skip to content

@NicolasT /punch.py
Created

Embed URL

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Using FALLOC_FL_PUNCH_HOLE from Python
import ctypes
import ctypes.util
c_off_t = ctypes.c_int64
def make_fallocate():
libc_name = ctypes.util.find_library('c')
libc = ctypes.CDLL(libc_name)
_fallocate = libc.fallocate
_fallocate.restype = ctypes.c_int
_fallocate.argtypes = [ctypes.c_int, ctypes.c_int, c_off_t, c_off_t]
del libc
del libc_name
def fallocate(fd, mode, offset, len_):
res = _fallocate(fd.fileno(), mode, offset, len_)
if res != 0:
raise IOError(res, 'fallocate')
return fallocate
fallocate = make_fallocate()
del make_fallocate
FALLOC_FL_KEEP_SIZE = 0x01
FALLOC_FL_PUNCH_HOLE = 0x02
def main(db):
orig_data = ''.join(chr(i) for i in xrange(10))
format_ = lambda s: [ord(c) for c in s]
with open(db, 'w') as fd:
fd.write(orig_data)
with open(db, 'r') as fd:
data = fd.read()
print 'Original value:', format_(data)
print 'Punching hole at offset 2, length 3'
with open(db, 'a') as fd:
fallocate(fd, FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE, 2, 3)
print 'Reading file'
with open(db, 'r') as fd:
data = fd.read()
print 'New value:', format_(data)
if __name__ == '__main__':
main('punch.db')
@krichter722

That a great piece of code. Unfortunately I don't understand it in details so well that I could enhance it with my feature request personally, which is to allow to pipe input on the command line into the python script and get the result as a file. I'd be very happy to see that realized.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Something went wrong with that request. Please try again.