#!/bin/sh

patched="false"

process() {
	DIFF=`diff opera opera_patched`
	if [ "$DIFF" = "" ]; then
		#patch failed, clean-up: remove opera_patched if present
		if [ -f "opera_patched" ]; then
			rm opera_patched
		fi
		
		echo "--: Search pattern couldn't be found. File NOT patched."
		echo "    Your Opera files have been restored to their previous state.\n"
	else
		#patch successful, rename files
		if [ -f "opera_unpatched" ]; then
			rm opera_unpatched
		fi
		mv opera opera_unpatched
		mv opera_patched opera
		chmod +x opera
		
		patched="true"

		echo "--: Opera patching completed successfully!"
		echo "    Your original Opera file is now 'opera_unpatched'\n"
	fi
}

cd /usr/lib/opera/10.00

#remove 'opera_patched' if present to avoid any problems
if [ -f "opera_patched" ]; then
	rm opera_patched
fi

#check if 32/64bit
opera=`opera --full-version | grep "x86_64"`
if [ "$opera" = "" ]; then
	# 32 bit found
	echo "--: 32 bit version of Opera found\n"

	# method 1
	if [ "$patched" = "false" ]; then
		echo "--: Attempting method 1"
		perl -pe 'BEGIN{binmode(STDIN); binmode(STDOUT);};  s/(\xB8\x2A\x00\x00\x00\x89\x44\x24\x04\x8B\x45\x08\x89\x04\x24\xE8.{4}\xC9\x85\xC0)\x0F\x95\xC0(\x0F\xB6\xC0\xC3)/\1\xB0\x01\x90\2/' opera > opera_patched
		process
	fi
	
	# method 2
	if [ "$patched" = "false" ]; then
		echo "--: Attempting method 2"
		perl -pe 'BEGIN{binmode(STDIN); binmode(STDOUT);};  s/(\x8B\x45\x08\x89\x4C\x24\x14\x89\x54\x24\x10\x89\x04\x24\xE8.{4}\xC9\x85\xC0)\x0F\x95\xC0(\x0F\xB6\xC0\xC3)/\1\xB0\x01\x90\2/' opera > opera_patched
		process
	fi
else
	# 64 bit found
	echo "--: 64 bit version of Opera found\n"
	
	# method 1
	if [ "$patched" = "false" ]; then
		echo "--: Attempting method 1"
		perl -pe 'BEGIN{binmode(STDIN); binmode(STDOUT);};  s/(\xBE\x2B\x00\x00\x00\xE8.{4}\x48\x85\xC0)\x0F\x95\xC0(\x48\x83\xC4\x08\xC3)/\1\xB0\x01\x90\2/' opera > opera_patched
		process
	fi
fi


