Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'features/org.eclipse.equinox.executable.feature/library/eclipseMozilla.c')
-rw-r--r--features/org.eclipse.equinox.executable.feature/library/eclipseMozilla.c300
1 files changed, 300 insertions, 0 deletions
diff --git a/features/org.eclipse.equinox.executable.feature/library/eclipseMozilla.c b/features/org.eclipse.equinox.executable.feature/library/eclipseMozilla.c
new file mode 100644
index 000000000..a599589d5
--- /dev/null
+++ b/features/org.eclipse.equinox.executable.feature/library/eclipseMozilla.c
@@ -0,0 +1,300 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2011 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>
+
+static char* prefixes[] = {
+ "xulrunner-1",
+ "mozilla-seamonkey-1",
+ "seamonkey-1",
+ "mozilla-1",
+ "mozilla-firefox-2",
+ "firefox-2",
+ "mozilla-firefox-3",
+ "firefox-3",
+ NULL
+};
+static const int XULRUNNER_INDEX = 0;
+
+/* Filter function used by fixEnvForMozilla() for finding directories
+ * with a desired prefix.
+ */
+int filter(const struct dirent *dir)
+{
+#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 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 */
+
+ int dirLength = strlen(dirname);
+ 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)
+ {
+ int index = 0;
+ char* prefix = prefixes [index];
+ while (prefix != NULL)
+ {
+ if (strstr(path, prefix))
+ {
+ grePath = strdup(path);
+ break;
+ }
+ prefix = prefixes [++index];
+ }
+ }
+ }
+ fclose(file);
+ }
+ }
+
+ /* Try some common installation locations. */
+ if (grePath == NULL)
+ {
+ /* try xulrunner-1*, mozilla-1*, firefox-2/3*, seamonkey-1* 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 choose XULRunner
+ * any time one is found
+ */
+ 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 defined (SOLARIS)
+ if (grePath == NULL)
+ {
+ /* some other typical installation locations */
+ char* dirs[] = {
+ "/usr/sfw/lib/mozilla/", /* Solaris location */
+ "/usr/lib/firefox/", /* OpenSolaris location */
+ NULL
+ };
+
+ /*
+ * 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";
+
+ 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++];
+ }
+ }
+#endif // SOLARIS
+ }
+
+ if (grePath != NULL)
+ {
+ /* If grePath contains "xulrunner" then do not change the LD_LIBRARY_PATH,
+ * since it is likely that a xulrunner (not a mozilla or firefox)
+ * will be found at runtime. Note that MOZILLA_FIVE_HOME is still
+ * updated if grePath contains "xul" since this variable can act as
+ * a backup GRE to try if an initially-detected one fails to load.
+ */
+ if (!strstr(grePath, "xulrunner")) {
+ 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 */

Back to the top