Fix image_to_usb.sh, build_image.sh
image_to_usb.sh didn't handle the case where the devices were being
automounted.
build_image.sh didn't handle the case where the version string > ~14
characters.
Review URL: http://chromereview.prom.corp.google.com/1173161
git-svn-id: svn://chrome-svn/chromeos/trunk@108 06c00378-0e64-4dae-be16-12b19f9950a1
diff --git a/file_copy.py b/file_copy.py
new file mode 100755
index 0000000..33a693b
--- /dev/null
+++ b/file_copy.py
@@ -0,0 +1,100 @@
+#!/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)
+
+ t2 = time.time()
+
+ os.close(if_fd)
+ os.close(of_fd)
+
+ # 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)