#! /bin/bash
# Copyright (C) 2010-2011 Zakhar for ubuntu-fr

# 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.

# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.

# The text of the GNU General Public License is available at
# http://www.gnu.org/licenses/gpl-2.0.html; if you cannot access it,
# write to the Free Software Foundation, Inc., 51 Franklin Street,
# Fifth Floor, Boston, MA 02110-1301 USA.
#===========================================================

# Fonction :
# ----------
#  - Ce script fonctionne avec tuXtremMerge
#  - Il vise à remplacer les fonctions qui n'existent pas sur
#    Busybox 1.16.1 utilisé sur les Synology DS1010+
#  - Ce script fonctionne également sur Ubuntu (Lucid)... puisque
#    c'est ainsi que je le teste !.. Mais il alourdirait inutilement
#    les traitements puisque certaines commandes existantes sont réécrites
#    en shell, donc plus lent, sujet à des bugs, etc...
#    Par conséquent ça a été séparé expressément.
#
# Usage :
# -------
#  busyXtremMerge Nom_Du_Fichier_NNN.xtm
#   (N'importe lequel des fichiers fonctionne : 001 ou autre)
#
# Tested : Testé sur Synology DS1010+, DS411+
# ------
#
# Version : Syno + version du script tuXtremMerge utilisé
# -------
#
# Date : 2011-09-24
# -----
#
# Author : Zakhar (ubuntu-fr)
# ------
#
# Contributor :  // Ajouter votre nom si vous contribuez et redistribuez //
# -----------
#  stadros83 @ ubuntu.fr : début des tests Synology DS1010+
#    - problèmes readlink sur Synology 1010+ (pas d'option -f)
#            => retrait de readlink et remplacement par une fonction shell 
#    - problème od (commande inexistante)
#            => Installation par une commande Syno : ipkg install textutils
#    - problème du -B (option inexistante)
#            => Supression de "du". En réalité pour homogénéiser, on utilise
#               stat -c%s partout
#    - problème stat -c (option inexistante)
#            => Remplacé par un ls avec découpage du résultat
#    - problème pas de support du "process substitution"
#            => le md5sum qui se servait de cela est donc remplacé par un
#               md5sum "pipé" avec un grep
#    - problème pas de ibs/obs sur la commande dd
#            => Nouveaux algorithmes avec uniquement des bs dans le programme
#               commun... et en plus c'est (un peu) plus rapide !
#  zootroopa @ ubuntu.fr : début des tests Synology DS411+
#    - problème sur la commande od qui ne travaille pas en 64bits. Du coup tout
#               fichier supérieur à 4Go posait problème.
#            => Contournement par 2 od sur 32bits (confirmé stadros83)
#    - problème non lié à busyXtremMerge, tee "de base" est buggé. La version
#               dans coreutils marche très bien et semble apporter des textutils
#               à niveau... à vérifier !
#
# History :
# ---------
#  1.1.0
#  - Adaptations pour support des .exe et tuXtremMerge version 1.7.0
#  1.0.3
#  - Vérification qu'on a au moins une version suffisante de tuXtremMerge, en
#    l'occurrence pour cette 1.0.3 il faut la 1.6.2 au moins
#  - Suite à simplification dans le md5sum du programme commun (suppression du
#    "process substitution") on n'a plus besoin du contournement md5sum
#  1.0.2
#  - Contournement pour od en 64bits
#  1.0.1
#  - au lieu de passer par une variable, on utilise "command" pour invoquer
#    le md5sum qui a été "masqué" par la fonction du même nom.
#  1.0.0
#  - Nouveaux algorithmes (main script) pour les dd sans ibs/obs
#  - Contournement pour l'inexistence du "process substitution"
#  - Remplacement du stat -c%s par une fonction (ls + tr + cut)
#  - Suppression du (homogénéisation)
#  0.9.0
#  - readlink ne se comporte pas pareil sur Synology 1010+
#  - Retrait de readlink, remplacé par la fonction shell readlnk

#==========================================================
#  Messages and Error codes.
#+ This way it is easyier, if somebody would like to localise
readonly MSG_BUSY_VERSION="busyXtremMerge (turbo XTM), contournements pour Busybox, version 1.1.0"

#==========================================================
# Fonctions de remplacement des commandes déficientes !

# Remplace readlink qui n'a pas le même comportement partout
# Par ex. sur Synology 1010+ tournant sous Busybox 1.16.1, l'option -f n'existe pas
# Retourne l'emplacement absolu du fichier en le déréférençant éventuellement
# Readlink est toujours utilisé dans le script principal sous cette forme :
# readlink -f Nom_Fichier
# On ne tient donc compte que tu deuxième argument

readlink()
{
  if [ -h "$2" ]; then  # C'est un lien symbolique !
    temp=$( ls -l "$2" )
    target=${temp#* -> }
    if [ -h "$target" ]; then  # Recursif...
      pushd $(dirname "$target") >/dev/null
      target=$(readlnk "$target")
      popd >/dev/null
    fi
  else
    target="$2"
  fi
  # Ici la variable "target" vaut soit $2 soit le déréférencement
  temp=$(cd $(dirname "$target"); pwd)
  if [ "$temp" != '/' ]; then # On rajoute / au dirname, sauf pour root
    temp="${temp}/"
  fi
  echo -n "${temp}${target##*/}"
}


# Remplace stat qui n'a pas le même comportement sur les anciens Busybox
# Par ex. sur Synology 1010+ tournant sous Busybox 1.16.1, l'option -c n'existe pas
# C'est moche, mais on remplace donc par un ls + cut
# On utilise le 2ème paramètre car c'est toujours utilisé stat -c%s fichier

stat()
{
  ls -l "$2" | tr -s [:blank:] | cut -d' ' -f 5
}


# md5sum fonctionne correctement... mais pas le "process substitution"
# Or on l'utilise dans la version standard pour éviter d'avoir utiliser 
# des fichiers temporaires. Ici, on remplace ça par un md5sum 
# "classique" suivi d'un grep sur la signature à trouver.

# Supprimé en 1.0.3 car c'est reporté ainsi dans le "commun"
#md5sum()
#{
#  command md5sum | grep -iq "$( echo $this_file_MD5 )"
#}


# Test pour voir si ça va plus vite ainsi pour le dernier fichier
#dd()
#{
#  if [ ${2:3} -le 4096 ]; then
#    command dd "$@"
#  else
#    blocks=$(( ${2:3} / 4096 ))
#    last=$(( ${2:3} % 4096 ))
#    command dd "${1}" bs=4096 count=${blocks} &&\
#    command dd "${1}" bs=1    count=${last} skip=$(( ${2:3} - ${last} ))
#  fi
#}


# Contournement du od qui ne travaille pas sur 64bits et donc problème
# pour les fichiers de plus de 4G
od()
{
  if [ ${2} = '-vtu8' ]; then
    low=$(  command od -An -vtu4 -j$(( ${EXE_OFFSET} + 96 ))  -N4 "$FIRST_SOURCE_FILE_NAME" )
    high=$( command od -An -vtu4 -j$(( ${EXE_OFFSET} + 100 )) -N4 "$FIRST_SOURCE_FILE_NAME" )
    echo $(( high * 4294967296 + low ))
  else
    command od "$@"
  fi
}

#==========================================================
# Et on source le script standard
# S'il n'est pas mis dans le même chemin, il faut donc changer la commande

THIS_SCRIPT_DIR=$( dirname $0 )

if [ -f "${THIS_SCRIPT_DIR}/tuXtremMerge" ]; then
  main_version=$( grep 'readonly MSG_VERSION=' "${THIS_SCRIPT_DIR}/tuXtremMerge" | sed 's/.*version //;s/"//' )
  if [[ "${main_version}" < '1.7.0' ]]; then
    echo "La version ${main_version} de 'tuXtremMerge' est insuffisante, il vous faut au moins la version 1.7.0"
  else
    . "${THIS_SCRIPT_DIR}/tuXtremMerge"
  fi
else
  echo -e "Script 'tuXtremMerge' non trouvé, il doit être dans le même répertoire que ce présent script."
fi