#!/bin/bash

# rebasesome: used to rebase a set of DLLs within a particular
# directory hierarchy or set of directory hierarchies.  Intended
# to be used to rebase "all the DLLs associated with perl in
# the builddir" and similar.  Don't use to rebase "all the DLLs"
# (e.g. -d /) -- use the rebaseall script instead (and follow its
# instructions).  Also, don't use to rebase an installed perl;
# perlrebase uses a better algorithm.
#
# This script is not installed with msys-perl; instead, perlrebase
# is.
#
# Based on rebaseall, by Jason Tishler
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# A copy of the GNU General Public License can be found at
# http://www.gnu.org/

# Define constants
PATH=/bin
ProgramName=`basename $0`
ProgramOptions='b:o:s:T:vd:'
DefaultBaseAddress=0x70000000
DefaultOffset=0x10000
DefaultVerbose=
DefaultFileList=
DefaultSuffixes='dll|so'

# Define functions
usage()
{
    echo "usage: $ProgramName [-b BaseAddress] [-o Offset] [-s DllSuffix] [-T FileList | -] [-v] [-d Directory -d ...]"
    exit 1
}

cleanup()
{
    rm -f "$TmpFile"
    exit $ExitCode
}

# Set traps
trap cleanup 1 2 15

# Set defaults
BaseAddress=$DefaultBaseAddress
Offset=$DefaultOffset
Verbose=$DefaultVerbose
FileList=$DefaultFileList
Suffixes=$DefaultSuffixes
Dirs=

# Parse command line arguments
while getopts $ProgramOptions Option "$@"
do
    case $Option in
    b)
	BaseAddress=$OPTARG;;
    o)
	Offset=$OPTARG;;
    s)
	Suffixes="$Suffixes|$OPTARG";;
    T)
	FileList="$OPTARG";;
    v)
	Verbose=-v;;
    d)
	Dirs="$Dirs $OPTARG";;
    \?)
	usage;;
    esac
done

# Set temp directory
TmpDir="${TMP:-${TEMP:-/tmp}}"

# Validate temp directory
if [ ! -d "$TmpDir" ]
then
    echo "$ProgramName: '$TmpDir' is not a directory"
    exit 2
fi
if [ ! -w "$TmpDir" ]
then
    echo "$ProgramName: '$TmpDir' is not writable"
    exit 2
fi

# Validate user supplied file list, if necessary
if [ -n "$FileList" -a ! -r "$FileList" -a "$FileList" != - ]
then
    echo "$ProgramName: '$FileList' is not readable"
    exit 2
fi

# Set temp file
TmpFile="$TmpDir/rebase.lst"

# Create rebase list
for f in $Dirs
do
  find $f -type f |
    grep -E "\.($Suffixes)\$" |
    sed -e '/msys-1\.0.*\.dll$/d' -e '/cygwin1\.dll$/d' \
        -e '/cyglsa.*\.dll$/d' >>"$TmpFile"
done

# Append user supplied file list, if any
if [ -n "$FileList" ]
then
    cat "$FileList" >>"$TmpFile"
fi

# Rebase files
rebase $Verbose -b $BaseAddress -o $Offset -T "$TmpFile"
ExitCode=$?

# Clean up
cleanup
