#include <stdio.h>
#include <fcntl.h>

int main( int argc, char *argv[] )
{
	int ftarget;
	int fsrc;
	
	char *target;
	char *src;

	int rc;

	if( argc != 3 ) {
		printf( "Usage: patchfile <file to patch> <file to insert>\n" );
		return 0;
	}

	src = (char *)malloc( 128 * 1024 );
	target = (char *)malloc( 4 * 1024 * 1024 );

	ftarget = open( argv[1], O_RDONLY );
	if( ftarget == -1 ) {
		perror( "open image" );
		return 0;
	}

	rc = read( ftarget, target, 4 * 1024 * 1024 );
	if( rc == -1 ) {
		perror( "read image" );
		return 0;
	}
	if( rc != 4 * 1024 * 1024 ) {
		printf( "Short read on image\n" );
		return 0;
	}
	close( ftarget );


	fsrc = open( argv[2], O_RDONLY );
	if( fsrc == -1 ) {
		perror( "open ipl" );
		return 0;
	}

	rc = read( fsrc, src, 128 * 1024 );
	if( rc == -1 ) {
		perror( "read ipl" );
		return 0;
	}
	if( rc != 128 * 1024 ) {
		printf( "Short read on ipl\n" );
		return 0;
	}
	close( fsrc );

	memcpy( target+(4*1024*1024)-(128*1024), src, 128*1024 );

	ftarget = open( argv[1], O_WRONLY|O_CREAT|O_TRUNC );
	if( ftarget == -1 ) {
		perror( "open image write" );
		return 0;
	}

	rc = write( ftarget, target, 4 * 1024 * 1024 );
	if( rc == -1 ) {
		perror( "write image" );
		return 0;
	}

	if( rc != 4*1024*1024 ) {
		printf( "Short write on target\n" );
		return 0;
	}

	close( ftarget );

	return 0;
}
