#include <unistd.h>
#include <stdlib.h>
#include <sys/uio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
                            
//#define BINSECT 2352
//#define ISOOFS 16
#define BINSECT 2332
#define ISOOFS 8
#define NBINSECT (65536 / BINSECT)
#define BUFSIZE (NBINSECT * BINSECT)

char buf[BUFSIZE];
struct iovec iov[NBINSECT];

int main(int argc, char ** argv)
{
	int f, g, i, r, w;

	if (argc != 3)
		exit(2);
		
	f = open(argv[1], O_RDONLY);
	g = open(argv[2], O_WRONLY | O_CREAT | O_EXCL, 0666);
	
	for (i = 0; i < NBINSECT; i++) {
		iov[i].iov_base = buf + i*BINSECT + ISOOFS;
		iov[i].iov_len = 2048;
	}

	while (( r = read(f, buf, BUFSIZE) )) {
//		write(4, buf + 16 * BINSECT, BINSECT);
//		exit(0);
		int n = r / BINSECT;
		if (r % BINSECT) {
			write(2, "Warning: incomplete sector read\n", 32);
		}
		w = writev(g, iov, n);
		if (w < n * 2048) {
			write(2, "Error: short write\n", 19);
			exit(1);
		}
	}
	exit(0);
}
/*
	ssize_t write(int fd, const void *buf, size_t count);
	ssize_t readv(int fd, const struct iovec *iov, int iovcnt);
	ssize_t writev(int fd, const struct iovec *iov, int iovcnt);
*/