changeset 15035:78cab68de463

[gaim-migrate @ 17818] Add fallback binary relocation support (copied from gtk gaim). This might make Alver's IRIX build work. committer: Tailor Script <tailor@pidgin.im>
author Stu Tomlinson <stu@nosnilmot.com>
date Sat, 25 Nov 2006 16:47:23 +0000
parents 8c5c4d7d53a5
children 1c4d0d3f4f5f
files console/gntgaim.c
diffstat 1 files changed, 63 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/console/gntgaim.c	Thu Nov 23 22:35:32 2006 +0000
+++ b/console/gntgaim.c	Sat Nov 25 16:47:23 2006 +0000
@@ -27,6 +27,7 @@
 #include "ft.h"
 #include "log.h"
 #include "notify.h"
+#include "prefix.h"
 #include "prefs.h"
 #include "prpl.h"
 #include "pounce.h"
@@ -156,6 +157,66 @@
 	return &eventloop_ops;
 }
 
+/* This is copied from gtkgaim */
+static char *
+gnt_find_binary_location(void *symbol, void *data)
+{
+	static char *fullname = NULL;
+	static gboolean first = TRUE;
+
+	char *argv0 = data;
+	struct stat st;
+	char *basebuf, *linkbuf, *fullbuf;
+
+	if (!first)
+		/* We've already been through this. */
+		return strdup(fullname);
+
+	first = FALSE;
+
+	if (!argv0)
+		return NULL;
+
+
+	basebuf = g_find_program_in_path(argv0);
+
+	/* But we still need to deal with symbolic links */
+	g_lstat(basebuf, &st);
+	while ((st.st_mode & S_IFLNK) == S_IFLNK) {
+		int written;
+		linkbuf = g_malloc(1024);
+		written = readlink(basebuf, linkbuf, 1024 - 1);
+		if (written == -1)
+		{
+			/* This really shouldn't happen, but do we
+			 * need something better here? */
+			g_free(linkbuf);
+			continue;
+		}
+		linkbuf[written] = '\0';
+		if (linkbuf[0] == G_DIR_SEPARATOR) {
+			/* an absolute path */
+			fullbuf = g_strdup(linkbuf);
+		} else {
+			char *dirbuf = g_path_get_dirname(basebuf);
+			/* a relative path */
+			fullbuf = g_strdup_printf("%s%s%s",
+					dirbuf, G_DIR_SEPARATOR_S,
+					linkbuf);
+			g_free(dirbuf);
+		}
+		/* There's no memory leak here.  Really! */
+		g_free(linkbuf);
+		g_free(basebuf);
+		basebuf = fullbuf;
+		g_lstat(basebuf, &st);
+	}
+
+	fullname = basebuf;
+	return strdup(fullname);
+}
+
+
 /* This is mostly copied from gtkgaim's source tree */
 static void
 show_usage(const char *name, gboolean terse)
@@ -200,6 +261,8 @@
 		{0, 0, 0, 0}
 	};
 
+	gaim_br_set_locate_fallback_func(gnt_find_binary_location, argv[0]);
+
 	/* scan command-line options */
 	opterr = 1;
 	while ((opt = getopt_long(argc, argv,