#!/usr/bin/perl

use strict;
use File::Copy;
use Getopt::Long;
use File::Basename;

my $cmd;
my $oui;
my $iab;

GetOptions ('iab=s' => \$iab,
	    'oui=s' => \$oui,
    ) or die 'bad options';

my $address = shift;
my $infile = shift;
my $outfile = shift;

if (!defined($address) || !defined($infile)) {
	print "Usage: $0 [--iab=a8c | --oui=abcdef ] address infile [outfile]\n";
	print "          iab is 12-bit and address is 28-bit e.g. --iab=a8c 1234567\n";
	print "          oui is 24-bit and address is 40-bit e.g. --oui=abcdef 123456789a\n";
	print "\n";
	print "          if outfile is not specified, for infile foo.bin outfile will be\n";
	print "          foo-[macaddress].bin e.g:\n";
        print "          for --iab=a8c 1234567 foo.bin -> foo-0050c2a8c1234567.bin\n";
        print "          for --oui=abcdef 123456789a foo.bin -> foo-abcdef123456789a.bin\n";
	exit;
}

my $mac_h;
my $mac_l;

if(defined($iab)) {
    $iab = hex($iab);
    $address = hex($address);
    $mac_h = 0x0050C200 | ($iab >> 4);
    $mac_l = (($iab & 0xf) << 28) | $address;
} else {
    $address =~ /(.*?)(.{0,8})$/;
    my ($addr_h, $addr_l) = ($1, $2);
    if(!$addr_h) { $addr_h = 0 };
    $oui = hex($oui);
    $addr_l = hex($addr_l);
    $addr_h = hex($addr_h);
    $mac_h = ($oui << 8) | $addr_h;
    $mac_l = $addr_l;
}

printf("mach %x macl %x\n", $mac_h, $mac_l);

my @words;
for(my $i=0; $i<4; $i++) {
    push @words, ($mac_l >> ($i * 8)) & 0xff;
}
for(my $i=0; $i<4; $i++) {
    push @words, ($mac_h >> ($i * 8)) & 0xff;
}
reverse @words;
#foreach my $byte (@words) {
#    printf("%02X",$byte);
#}
#print "\n";

if(!defined($outfile))
{
    my $basename = basename($infile,(".bin"));
    $outfile = sprintf("-%08x%08x.bin",$mac_h, $mac_l);
    $outfile = $basename . $outfile;
    print "outfile $outfile\n";
}

copy($infile, $outfile) or die("Couldn't copy $infile to $outfile");
$cmd = sprintf("echo -n -e '\\x%02X\\x%02X\\x%02X\\x%02X\\x%02X\\x%02X\\x%02X\\x%02X' | dd of=$outfile bs=1 seek=122872 conv=notrunc",
	       $words[7],$words[6],$words[5],$words[4],
	       $words[3],$words[2],$words[1],$words[0]);

print "$cmd\n";
system("bash -c \"$cmd\"");