/* $Id: rev.c,v 1.1 2007-05-06 16:03:10 gophi Exp $ */

#include <assert.h>
#include <stdio.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mman.h>

int main(int ac, char * const av[])
{
	char *name1, *name2;
	int fd1, fd2;
	char *f1, *f2;
	struct stat st;
	off_t i;

	assert(ac == 3);

	name1 = av[1];
	name2 = av[2];

	unlink(name2);

	assert((fd1 = open(name1, O_RDONLY)) != -1);
	assert((fd2 = open(name2, O_RDWR | O_CREAT, 0644)) != -1);

	assert(fstat(fd1, &st) != -1);
	assert(ftruncate(fd2, st.st_size) != -1);

	assert((f1 = (char *) mmap(NULL, st.st_size, PROT_READ, MAP_SHARED, fd1, 0)) != MAP_FAILED);
	assert((f2 = (char *) mmap(NULL, st.st_size, PROT_WRITE, MAP_SHARED, fd2, 0)) != MAP_FAILED);

	for (i = 0; i < st.st_size; ++i)
		f2[st.st_size - i - 1] = f1[i];

	assert(munmap(f2, st.st_size) != -1);
	assert(munmap(f1, st.st_size) != -1);

	assert(close(fd2) != -1);
	assert(close(fd1) != -1);

	return 0;
}
