blob: 8599b84eefad06f0299266646f1e75ca1b126a2b [file] [log] [blame] [edit]
#!/usr/bin/env python
# This program operates much like dd, but with two important differences:
# 1. Many features lacking
# 2. seek_bytes= param can specify seek offset in bytes, not block size
import os
import sys
import time
def parseNumber(numstr):
if numstr.endswith("GB"):
return int(numstr[:-2]) * 1000 * 1000 * 1000
if numstr.endswith("MB"):
return int(numstr[:-2]) * 1000 * 1000
if numstr.endswith("kB"):
return int(numstr[:-2]) * 1000
if numstr.endswith("G"):
return int(numstr[:-1]) * 1024 * 1024 * 1024
if numstr.endswith("M"):
return int(numstr[:-1]) * 1024 * 1024
if numstr.endswith("K"):
return int(numstr[:-1]) * 1024
if numstr.endswith("b"):
return int(numstr[:-1]) * 512
if numstr.endswith("w"):
return int(numstr[:-1]) * 2
if numstr.endswith("c"):
return int(numstr[:-1])
if not numstr.isdigit():
print >> sys.stderr, "Don't know how to parse number", numstr
sys.exit(1)
return int(numstr)
def main(argv):
arg_if = ""
arg_of = ""
arg_bs = 512
arg_seek = -1
arg_seek_bytes = -1
for i in argv:
if i.startswith("if="):
arg_if=i[3:]
elif i.startswith("of="):
arg_of=i[3:]
elif i.startswith("bs="):
arg_bs=parseNumber(i[3:])
elif i.startswith("seek="):
arg_seek=int(i[5:])
elif i.startswith("seek_bytes="):
arg_seek_bytes=parseNumber(i[11:])
if arg_seek >= 0 and arg_seek_bytes >= 0:
print >> sys.stderr, "you can't specify seek= and seek_bytes="
sys.exit(1)
seek_bytes = 0
if arg_seek >= 0:
seek_bytes = arg_seek * arg_bs
elif arg_seek_bytes >= 0:
seek_bytes = arg_seek_bytes
if_fd = 0
of_fd = 1
if len(arg_if) != 0:
print >> sys.stderr, "opening for read", arg_if
if_fd = os.open(arg_if, os.O_RDONLY)
if len(arg_of) != 0:
print >> sys.stderr, "opening for write", arg_of
of_fd = os.open(arg_of, os.O_WRONLY | os.O_TRUNC | os.O_CREAT)
if arg_seek_bytes > 0:
print >> sys.stderr, "seeking to", seek_bytes, "bytes in output file"
os.lseek(of_fd, seek_bytes, os.SEEK_SET)
bytes_copied = 0
t1 = time.time()
buf = os.read(if_fd, arg_bs)
while len(buf) > 0:
bytes_written = 0
while bytes_written < len(buf):
bytes_written += os.write(of_fd, buf[bytes_written:])
bytes_copied += bytes_written
buf = os.read(if_fd, arg_bs)
os.close(if_fd)
os.close(of_fd)
t2 = time.time()
# print timing info
print >> sys.stderr, 'copy %d bytes took %0.3f s' % (bytes_copied, t2 - t1)
print >> sys.stderr, 'speed: %0.1f MB/s' % \
((bytes_copied / 1000000) / (t2 - t1))
if __name__ == '__main__':
main(sys.argv)