# HG changeset patch # User Stu Tomlinson # Date 1164473243 0 # Node ID 78cab68de4633b0813f97b0c1939878156e4070b # Parent 8c5c4d7d53a500371373f1fc724009b1a0ebac6b [gaim-migrate @ 17818] Add fallback binary relocation support (copied from gtk gaim). This might make Alver's IRIX build work. committer: Tailor Script diff -r 8c5c4d7d53a5 -r 78cab68de463 console/gntgaim.c --- 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,