+ /* Open source file. */
+ src = filesys_open (filename);
+ if (src == NULL)
+ PANIC ("%s: open failed", filename);
+ size = file_length (src);
+
+ /* Open target disk. */
+ dst = disk_get (1, 0);
+ if (dst == NULL)
+ PANIC ("couldn't open target disk (hdc or hd1:0)");
+ if (size + DISK_SECTOR_SIZE > (off_t) disk_size (dst) * DISK_SECTOR_SIZE)
+ PANIC ("target disk is too small for %lld-byte file",
+ (unsigned long long) size);
+
+ /* Write size to sector 0. */
+ *(uint32_t *) buffer = size;
+ disk_write (dst, 0, buffer);
+
+ /* Do copy. */
+ sector = 1;
+ while (size > 0)
+ {
+ int chunk_size = size > DISK_SECTOR_SIZE ? DISK_SECTOR_SIZE : size;
+ if (file_read (src, buffer, chunk_size) != chunk_size)
+ PANIC ("%s: read failed with %lld bytes unread",
+ filename, (unsigned long long) size);
+ disk_write (dst, sector++, buffer);
+ size -= chunk_size;