#!/bin/sh
# ***************************************************************************
# *                                                                         *
# *                                                                         *
# *   Copyright (C) 2008 by Robert Hogan                                    *
# *   robert@roberthogan.net                                                *
# *                                                                         *
# *   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.                          *
# *                                                                         *
# *   You should have received a copy of the GNU General Public License     *
# *   along with this program; if not, write to the                         *
# *   Free Software Foundation, Inc.,                                       *
#*   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
# ***************************************************************************
# *                                                                         *
# *   This is a modified version of a source file from the Tor project.     *
# *   Original copyright information follows:                               *
# ***************************************************************************
# Wrapper script for use of the torsocks(8) transparent socksification library
#
# There are three forms of usage for this script:
#
# /usr/local/bin/torsocks program [program arguments...]
#
# This form sets the users LD_PRELOAD environment variable so that torsocks(8)
# will be loaded to socksify the application then executes the specified 
# program (with the provided arguments). The following simple example might 
# be used to telnet to www.foo.org via a torsocks.conf(5) configured socks server:
#
# /usr/local/bin/torsocks telnet www.foo.org
#
# The second form allows for torsocks(8) to be switched on and off for a
# session (that is, it adds and removes torsocks from the LD_PRELOAD environment
# variable). This form must be _sourced_ into the user's existing session
# (and will only work with bourne shell users):
#
# . /usr/local/bin/torsocks on
# telnet www.foo.org 
# . /usr/local/bin/torsocks off
# 
# Or
# 
# source /usr/local/bin/torsocks on
# telnet www.foo.org
# source /usr/local/bin/torsocks off
#
# The third form creates a new shell with LD_PRELOAD set and is achieved
# simply by running the script with no arguments 
# 
# /usr/local/bin/torsocks
#
# When finished the user can simply terminate the shell with 'exit'
# 
# This script is originally from the debian torsocks package by
# Tamas Szerb <toma@rulez.org>
# Modified by Robert Hogan <robert@roberthogan.net> April 16th 2006

set_id () {
    echo "ERROR: $1 is set${2}id. torsocks will not work on a set${2}id executable." >&2
    exit 1
}

if [ $# = 0 ] ; then
   echo "$0: insufficient arguments"
   exit
fi

LIBDIR="/usr/local/lib/torsocks"
LIB_NAME="libtorsocks"
SHLIB_EXT="so"
SHLIB="${LIBDIR}/${LIB_NAME}.${SHLIB_EXT}.0.0"

# Ensure libtorsocks exists,
if [ ! -f $SHLIB ]; then
   echo "$0: $SHLIB does not exist! Try re-installing torsocks."
   exit
fi

case "$1" in
  on)
    if [ -z "$LD_PRELOAD" ]
      then
        export LD_PRELOAD="${SHLIB}"
      else
        echo $LD_PRELOAD | grep -q "${SHLIB}" || \
        export LD_PRELOAD="${SHLIB} $LD_PRELOAD"
    fi
    # FIXME: This env variable is only meaningful on Mac OSX, so it would be better
    #        not to set it at all on other platforms.
    export DYLD_FORCE_FLAT_NAMESPACE=1
  ;;
  off)
    #replace '/' with '\/' in /usr/local
    # escprefix=`echo '/usr/local' |sed 's/\\//\\\\\//g'`
    # export LD_PRELOAD=`echo -n $LD_PRELOAD | sed "s/$escprefix\/lib\/torsocks\/libtorsocks.so \?//"`
    export LD_PRELOAD=`echo -n $LD_PRELOAD | sed "s#/usr/local/lib/torsocks/libtorsocks\.so *##"`
    if [ -z "$LD_PRELOAD" ]
      then
        unset LD_PRELOAD
        # FIXME: This env variable is only meaningful on Mac OSX, so it would be better
        #        not to set it at all on other platforms.
        unset DYLD_FORCE_FLAT_NAMESPACE=1
    fi
  ;;
  show|sh)
    echo "LD_PRELOAD=\"$LD_PRELOAD\""
  ;;
  -h|-?)
      echo "$0: Please see torsocks(1) or read comment at top of $0"
   ;;
  *)
    if [ -z "$LD_PRELOAD" ]
    then
      export LD_PRELOAD="${SHLIB}"
    else
      echo $LD_PRELOAD | grep -q "${SHLIB}" || \
      export LD_PRELOAD="${SHLIB} $LD_PRELOAD"
    fi
    export DYLD_FORCE_FLAT_NAMESPACE=1

    if [ $# = 0 ]
    then
      ${SHELL:-/bin/sh}
    fi

    if [ $# -gt 0 ]
    then
      if [ -u `which "$1"` ]; then
          set_id $1 u
      elif [ -g `which "$1"` ]; then
          set_id $1 g
      fi
      exec "$@"
    fi
  ;;
esac

#EOF
