Mozilla Start Script for Linux

Posted by: Andrew Smith
Poster contact info: andrew at littlesvr ca
Author: SuSE Team
Originally published: http://www.novell.com/linux/suse/
Software: Linux All, Mozilla 1.7.8

Right I finally went out and found a mozilla script that works. Got it from a SuSE 9.3 installation. (/opt/mozilla/bin/mozilla.sh)

I use slackware but I don't see why this shouldn't work on every distribution.

The problem is that mozilla, when run the second time, will come up with the profile manager and when you click ok give you an error like this:
Mozilla cannot use the profile "default" because it is in use.

The mozilla guys really did a nice job with that browser but i don't know what came over them to make it do this. It does the same whether you installed it from distribution packages or the tarball form mozilla.org

Create this the file /usr/local/bin/mozilla, make it executable and put the following script into it:
#!/bin/sh
#
# The contents of this file are subject to the Netscape Public
# License Version 1.1 (the "License"); you may not use this file
# except in compliance with the License. You may obtain a copy of
# the License at http://www.mozilla.org/NPL/
#
# Software distributed under the License is distributed on an "AS
# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
# implied. See the License for the specific language governing
# rights and limitations under the License.
#
# The Original Code is mozilla.org code.
#
# The Initial Developer of the Original Code is Netscape
# Communications Corporation.  Portions created by Netscape are
# Copyright (C) 1998 Netscape Communications Corporation. All
# Rights Reserved.
#
# Contributor(s): 
#    Wolfgang Rosenauer <wolfgang.rosenauer@suse.com>
#

## 
## Usage:
##
## $ mozilla
##
## This script is meant to run a mozilla program from the mozilla
## rpm installation.
##
## The script will setup all the environment voodoo needed to make
## mozilla work.

cmdname=`basename $0`

## don't leave any core files around
ulimit -c 0

##
## Variables
##
MOZ_DIST_BIN="/usr/local/mozilla"
MOZ_DIST_LIB="/usr/local/mozilla"
MOZ_APPNAME="mozilla"
MOZ_PROFILE=".mozilla"
MOZ_PROGRAM="$MOZ_DIST_LIB/$MOZ_APPNAME-bin"
MOZ_CLIENT_PROGRAM="$MOZ_DIST_LIB/mozilla-xremote-client"

# enigmail should honor env
export ENIGMAIL_PASS_ENV=http_proxy

# configure printers
if [ -z "$MOZILLA_POSTSCRIPT_PRINTER_LIST" ]; then
  test -x /usr/bin/lpstat && \
    /usr/bin/lpstat -h localhost >/dev/null 2>&1 && \
    export MOZILLA_POSTSCRIPT_PRINTER_LIST="default $( \
          lpstat -p | cut -d ' ' -f 2 | tr '\n' ' ' )"
fi

# MOZ_NEWURL can be 
#  overwrite   for loading new URLs in active windows
#  new-window  for opening new windows (default)
#  new-tab     for opening URL in a new tab
if [ -z "$MOZ_NEWURL" ]; then
  MOZ_NEWURL="new-window"
fi

if [ -z "$MOZ_DEBUG" ]; then
  DEBUG=0
else
  DEBUG=$MOZ_DEBUG
fi 
[ $DEBUG -eq 0 ] && DEVNULL="2>/dev/null >/dev/null"


##
## Set MOZILLA_FIVE_HOME
##
MOZILLA_FIVE_HOME="$MOZ_DIST_LIB"
export MOZILLA_FIVE_HOME

##
## Set LD_LIBRARY_PATH
##
if [ "$LD_LIBRARY_PATH" ]
then
  LD_LIBRARY_PATH=$MOZ_DIST_LIB/plugins:$MOZ_DIST_LIB:$LD_LIBRARY_PATH
else
  LD_LIBRARY_PATH=$MOZ_DIST_LIB/plugins:$MOZ_DIST_LIB
fi
export LD_LIBRARY_PATH

## Make sure that we set the plugin path for backwards compatibility
## Set MOZ_PLUGIN_PATH to $HOME/.mozilla/plugins if not set
##
if [ -z "$MOZ_PLUGIN_PATH" ]; then
  export MOZ_PLUGIN_PATH=$MOZILLA_FIVE_HOME/plugins
  if [ "$HOME" ] ; then
    export MOZ_PLUGIN_PATH=$HOME/$MOZ_PROFILE/plugins:$MOZ_PLUGIN_PATH
  fi
fi

## 
## Autodetect language
##
grep -q $HOME/$MOZ_PROFILE $HOME/$MOZ_PROFILE/appreg > /dev/null 2>/dev/null
SET_LANG=$?
if [ "$HOME" -a "$LANG" -a "$SET_LANG" != "0" -a -r "$MOZILLA_FIVE_HOME/chrome/locale.alias" ]; then
    MOZ_LANG=`grep -E "^$LANG[[:space:]]" $MOZILLA_FIVE_HOME/chrome/locale.alias | tr -s "[:blank:]" | cut -f 2`
    for i in "$@";do
        [ "$i" = "-UILocale" ] && MOZ_LANG=""
    done
    if [ "$MOZ_LANG" -a -r "$MOZILLA_FIVE_HOME/chrome/$MOZ_LANG.jar" ]; then
       MOZ_LANG="-UILocale $MOZ_LANG"
    else
       unset MOZ_LANG
    fi
fi


function check_running() {
  if [ "$MOZ_APPNAME" = "mozilla" ]; then
    $MOZ_CLIENT_PROGRAM 'ping()' 2>/dev/null >/dev/null
    RETURN_VAL=$?
    
    if [ "$RETURN_VAL" -eq "2" ]; then
      # not running
      echo 0
      return 0
    elif [ "$RETURN_VAL" -eq "1" ]; then
      # DISPLAY unusable
      echo 2
      return 2
    else
      # running
      echo 1
      return 1
    fi
  else
    echo 0
    return 0
  fi
}

function open_mail() {
    if [ "${ALREADY_RUNNING}" -eq "1" ]; then
      exec $MOZ_CLIENT_PROGRAM 'xfeDoCommand(openInbox)'
    else
      exec $MOZ_PROGRAM "$@"
    fi
}

function open_compose() {
    if [ "${ALREADY_RUNNING}" -eq "1" ]; then
      exec $MOZ_CLIENT_PROGRAM 'xfeDoCommand(composeMessage)'
    else
      exec $MOZ_PROGRAM "$@"
    fi
}


# check to see if there's an already running instance or not
ALREADY_RUNNING=`check_running`

if [ "${ALREADY_RUNNING}" -eq "2" ]; then
  echo "DISPLAY empty or unusable"
  echo "DISPLAY=$DISPLAY"
  exit 1
fi

# debugging output
if [ $DEBUG -ne 0 ]; then
  echo "DEBUG:"
  echo "      MOZ_APPNAME=$MOZ_APPNAME"
  echo "      MOZ_PROFILE=$MOZ_PROFILE"
  echo "MOZILLA_FIVE_HOME=$MOZILLA_FIVE_HOME"
  echo "  LD_LIBRARY_PATH=$LD_LIBRARY_PATH"
  echo "          DISPLAY=$DISPLAY"
  echo "  FONTCONFIG_PATH=$FONTCONFIG_PATH"
  echo "MOZILLA_POSTSCRIPT_PRINTER_LIST=$MOZILLA_POSTSCRIPT_PRINTER_LIST"
  [ "${ALREADY_RUNNING}" -eq "1" ] && \
    echo "using an already running Mozilla"
fi


# If there is no command line argument at all then try to open a new
# window in an already running instance.
if [ "${ALREADY_RUNNING}" -eq "1" ] && [ -z "$1" ]; then
  exec $MOZ_CLIENT_PROGRAM "xfeDoCommand(openBrowser)"
fi

# if there's no command line argument and there's not a running
# instance then just fire up a new copy of the browser
if [ -z "$1" ]; then
  exec $MOZ_PROGRAM
fi

unset RETURN_VAL

# If there's a command line argument but it doesn't begin with a -
# it's probably a url.  Try to send it to a running instance.

USE_EXIST=0
opt="$1"
case "$opt" in
  -mail)
      open_mail ${1+"$@"}
      ;;
  -compose)
      open_compose ${1+"$@"}
      ;;
  -*) ;;
  *) USE_EXIST=1 ;;
esac

if [ "${USE_EXIST}" -eq "1" ] && [ "${ALREADY_RUNNING}" -eq "1" ]; then
  # check to make sure that the command contains at least a :/ in it.
  echo $opt | grep -e ':/' 2>/dev/null > /dev/null
  RETURN_VAL=$?
  if [ "$RETURN_VAL" -eq "1" ]; then
    # if it doesn't begin with a '/' and it exists when the pwd is
    # prepended to it then append the full path
    echo $opt | grep -e '^/' 2>/dev/null > /dev/null
    RETURN_VAL=$?
    if [ "${RETURN_VAL}" -ne "0" ] && [ -e "`pwd`/$opt" ]; then
      opt="`pwd`/$opt"
    fi
  fi
  if [ "$MOZ_NEWURL" = "new-window" -o "$MOZ_NEWURL" = "new-tab" ]; then 
    $MOZ_CLIENT_PROGRAM "openurl($opt,$MOZ_NEWURL)" || \
       exec $MOZ_PROGRAM $MOZ_LANG "$opt"
    exit 0
  else
    $MOZ_CLIENT_PROGRAM "openurl($opt)" || \
       exec $MOZ_PROGRAM $MOZ_LANG "$opt"
    exit 0
  fi
fi

if [ "${USE_EXIST}" -eq "1" ]; then
  echo $opt | grep -e ':/' 2>/dev/null > /dev/null
  RETURN_VAL=$?
  if [ "$RETURN_VAL" -eq "1" ]; then
    echo $opt | grep -e '^/' 2>/dev/null > /dev/null
    RETURN_VAL=$?
    if [ "${RETURN_VAL}" -ne "0" ] && [ -e "`pwd`/$opt" ]; then
      opt="`pwd`/$opt"
    fi
  fi
  exec $MOZ_PROGRAM $MOZ_LANG "$opt"
else
  exec $MOZ_PROGRAM $MOZ_LANG ${1+"$@"}
fi


Note that you might have to change one or two variables. I extracted an official mozilla tarball from mozilla.org into /usr/local/mozilla/ so both my MOZ_DIST_BIN and MOZ_DIST_LIB point there.

Also note that if you already have a mozilla executable in your path you will have a problem. To solve it without deleting files execute /usr/local/bin/mozilla instead of mozilla.

I tested this with opening browser and mail windows, opening urls and files from the command line so I'd say it works pretty well.

Enjoy.