#! /bin/bash
# Copyright (C) 2010 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+
# ------
#
# Version : Syno + version du script tuXtremMerge utilisé
# -------
#
# Date : 2011-05-25
# -----
#
# Author : Zakhar (ubuntu-fr)
# ------
#
# Contributor :  // Ajouter votre nom si vous contribuez et redistribuez //
# -----------
#  stadros83 @ ubuntu.fr : début des tests Synology 1010+
#    - 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 !
#
# History :
# ---------
#  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.0.1"

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

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 -j96  -N4 "$FIRST_SOURCE_FILE_NAME" )
    high=$( command od -An -vtu4 -j100 -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 )

. "${THIS_SCRIPT_DIR}/tuXtremMerge"