blob: 04d30fabf192d8a0414e0e600d4d7a9a0afbda43 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2005 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
/* Eclipse Mozilla Utility Methods */
#ifdef MOZILLA_FIX
#include "eclipseMozilla.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.h>
#include <sys/stat.h>
/* Filter function used by fixEnvForMozilla() for finding directories
* with a desired prefix.
*/
int filter(const struct dirent *dir)
{
char* prefixes[] = {
"xulrunner-",
"mozilla-seamonkey-",
"seamonkey-",
"mozilla-",
"mozilla-firefox-",
"firefox-",
NULL
};
int XULRUNNER_INDEX = 0;
#if defined(__amd64__) || defined(__x86_64__) || defined(__powerpc64__)
char* root = "/usr/lib64/";
#else
char* root = "/usr/lib/";
#endif
#if defined (SOLARIS)
/*
* The solaris compiler does not do static linking, so just check
* for a common lib to ensure that the install seems valid.
*/
char* testlib = "/libxpcom.so";
#else
/* Ensure that the install is dynamically-linked and is built with GTK2 */
char* testlib = "/components/libwidget_gtk2.so";
#endif
struct stat buf;
int index = 0;
char* dirname = (char *)dir->d_name;
char* prefix = prefixes [index];
while (prefix != NULL)
{
int prefixLength = strlen(prefix);
if (strncmp(dirname, prefix, prefixLength) == 0)
{
if (index == XULRUNNER_INDEX) return 1; /* include in scandir result */
/* Check if the first character following the prefix is a numeric digit.
* This ensures that the suffix represents a version number like
* "mozilla-1.7.3", and not a different product like "mozilla-thunderbird".
*/
int dirLength = strlen(dirname);
if ('0' <= dirname[prefixLength] && dirname[prefixLength] <= '9') {
/* If a xulrunner install is found then success is immediate since
* xulrunner always provides an embeddable GRE.
*/
if (index == XULRUNNER_INDEX) return 1; /* include in scandir result */
char* testpath = malloc (strlen(root) + dirLength + strlen(testlib) + 1);
strcpy(testpath, root);
strcat(testpath, dirname);
strcat(testpath, testlib);
int success = stat(testpath, &buf) == 0;
free(testpath);
if (success)
{
return 1; /* include in scandir result */
}
}
}
prefix = prefixes [++index];
}
return 0; /* exclude from scandir result */
}
#if defined (SOLARIS)
/*
* A replacement for
* scandir(const char *dir, struct dirent ***namelist, filter, alphasort);
* because scandir & alphasort don't exist on Solaris 9.
* Return the dirent->d_name that was sorted the highest according to strcoll,
* or NULL on error or if no entries matched the filter.
* The caller is responsible for freeing the returned string
*/
char * scan(const char * path) {
DIR *dir = NULL;
struct dirent * entry = NULL;
char * candidate = NULL;
if ((dir = opendir(path)) == NULL) {
return NULL;
}
while ((entry = readdir(dir)) != NULL) {
if (filter(entry)) {
if (candidate == NULL) {
candidate = strdup(entry->d_name);
} else if (strcoll(candidate, entry->d_name) < 0) {
free(candidate);
candidate = strdup(entry->d_name);
}
}
}
closedir(dir);
return candidate;
}
#endif
/* Set the environmnent required by the SWT Browser widget to bind to Mozilla.
* The SWT Browser widget relies on Mozilla on Linux. The LD_LIBRARY_PATH
* and the Mozilla environment variable MOZILLA_FIVE_HOME must point
* to the installation directory of Mozilla.
*
* 1. Use the location set by MOZILLA_FIVE_HOME if it is defined
* 2. Parse the file /etc/gre.conf if it is defined. This file is
* set by the RedtHat RPM manager.
* 3. Try some common installation locations.
*/
void fixEnvForMozilla() {
static int fixed = 0;
if (fixed) return;
{
char *ldPath = (char*)getenv("LD_LIBRARY_PATH");
char *mozillaFiveHome = (char*)getenv("MOZILLA_FIVE_HOME");
char *grePath = NULL; /* Gecko Runtime Environment Location */
fixed = 1;
/* Always dup the string so we can free later */
if (ldPath != NULL) ldPath = strdup(ldPath);
else ldPath = strdup("");
/* MOZILLA_FIVE_HOME (if defined) points to the Mozilla
* install directory. Don't look any further if it is set.
*/
if (mozillaFiveHome != NULL)
{
grePath = strdup(mozillaFiveHome);
}
/* The file gre.conf (if available) points to the
* Mozilla install directory. Don't look any further if
* it is set.
*/
if (grePath == NULL)
{
struct stat buf;
FILE *file = NULL;
#if defined(__amd64__) || defined(__x86_64__) || defined(__powerpc64__)
if (stat("/etc/gre64.conf", &buf) == 0)
{
file = fopen("/etc/gre64.conf", "r");
}
else if (stat("/etc/gre.d/gre64.conf", &buf) == 0)
{
file = fopen("/etc/gre.d/gre64.conf", "r");
} else
#endif
if (stat("/etc/gre.conf", &buf) == 0)
{
file = fopen("/etc/gre.conf", "r");
}
else if (stat("/etc/gre.d/gre.conf", &buf) == 0)
{
file = fopen("/etc/gre.d/gre.conf", "r");
}
if (file != NULL)
{
char buffer[1024];
char path[1024];
while (fgets(buffer, 1024, file) != NULL)
{
if (sscanf(buffer, "GRE_PATH=%s", path) == 1)
{
grePath = strdup(path);
break;
}
}
fclose(file);
}
}
/* Try some common installation locations. */
if (grePath == NULL)
{
/* try xulrunner-*, mozilla-*, firefox-* directories in /usr/lib/ */
#if defined(__amd64__) || defined(__x86_64__) || defined(__powerpc64__)
char* dir = "/usr/lib64/";
#else
char* dir = "/usr/lib/";
#endif
#if defined (SOLARIS)
char * name = scan(dir);
if (name != NULL) {
#else
struct dirent **namelist;
int i;
int count = scandir(dir, &namelist, filter, alphasort);
if (count > 0)
{
/* count-1 is used below in an attempt to get the matched directory
* with the latest version number.
*/
char* name = namelist [count - 1]->d_name;
#endif
grePath = malloc (strlen(dir) + strlen(name) + 1);
strcpy(grePath, dir);
strcat(grePath, name);
#if defined (SOLARIS)
free(name);
#else
for (i = 0; i < count; i++) {
free(namelist [i]);
}
free(namelist);
#endif
}
if (grePath == NULL)
{
/* some other typical installation locations */
char* dirs[] = {
#if defined(__amd64__) || defined(__x86_64__) || defined(__powerpc64__)
"/usr/lib64/xulrunner/",
"/usr/lib64/mozilla-firefox/",
"/usr/lib64/firefox/",
"/usr/lib64/mozilla-seamonkey/",
"/usr/lib64/seamonkey/",
"/usr/lib64/mozilla/",
#endif
#if defined (SOLARIS)
"/usr/sfw/lib/xulrunner/",
"/usr/sfw/lib/mozilla-firefox/",
"/usr/sfw/lib/firefox/",
"/usr/sfw/lib/mozilla/",
"/usr/sfw/lib/mozilla-seamonkey/",
"/usr/sfw/lib/seamonkey/",
#endif
"/usr/lib/xulrunner/",
"/usr/lib/mozilla-firefox/",
"/usr/lib/firefox/",
"/usr/lib/mozilla-seamonkey/",
"/usr/lib/seamonkey/",
"/usr/lib/mozilla/",
"/usr/local/xulrunner/",
"/opt/xulrunner/",
"/usr/local/mozilla-firefox/",
"/usr/local/firefox/",
"/opt/mozilla-firefox/",
"/opt/firefox/",
"/usr/local/mozilla-seamonkey/",
"/usr/local/seamonkey/",
"/opt/mozilla-seamonkey/",
"/opt/seamonkey/",
"/usr/local/mozilla/",
"/opt/mozilla/",
NULL
};
#if defined (SOLARIS)
/*
* The solaris compiler does not do static linking, so just check
* for a common lib to ensure that the install seems valid.
*/
char* testlib = "libxpcom.so";
#else
/* Ensure that the install is dynamically-linked and is built with GTK2 */
char* testlib = "components/libwidget_gtk2.so";
#endif
struct stat buf;
int index = 0;
char* dir = dirs [index++];
while (dir != NULL)
{
char* testpath = malloc (strlen(dir) + strlen(testlib) + 1);
strcpy(testpath, dir);
strcat(testpath, testlib);
int success = stat(testpath, &buf) == 0;
free(testpath);
if (success)
{
grePath = strdup(dir);
break;
}
dir = dirs [index++];
}
}
}
if (grePath != NULL)
{
ldPath = (char*)realloc(ldPath, strlen(ldPath) + strlen(grePath) + 2);
if (strlen(ldPath) > 0) strcat(ldPath, ":");
strcat(ldPath, grePath);
setenv("LD_LIBRARY_PATH", ldPath, 1);
if (mozillaFiveHome == NULL) setenv("MOZILLA_FIVE_HOME", grePath, 1);
free(grePath);
}
free(ldPath);
}
}
#endif /* MOZILLA_FIX */