annotate src/prefix.c @ 10253:949b7986f42c

[gaim-migrate @ 11393] Ok, this fixes up the m4 macro to what I think we want. I removed the thread checks, we never use its pthread support. Removed the /proc checks, so method #2 can actually work. Someone might want to check that it does work on a /procless or nonlinux system. So basicly binreloc is always enabled unless you disable it with a configure option, OR unless you set stuff like libdir (again, via configure) to something different than the others, such that deprefixification doesn't make sense (i.e. you're not installing stuff in its standard location within a prefix). committer: Tailor Script <tailor@pidgin.im>
author Tim Ringenbach <marv@pidgin.im>
date Tue, 23 Nov 2004 23:46:13 +0000
parents 645eb9804040
children b98f856e2e5e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
10245
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
1 /*
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
2 * BinReloc - a library for creating relocatable executables
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
3 * Written by: Mike Hearn <mike@theoretic.com>
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
4 * Hongli Lai <h.lai@chello.nl>
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
5 * http://autopackage.org/
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
6 *
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
7 * This source code is public domain. You can relicense this code
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
8 * under whatever license you want.
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
9 *
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
10 * NOTE: if you're using C++ and are getting "undefined reference
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
11 * to br_*", try renaming prefix.c to prefix.cpp
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
12 */
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
13
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
14 /* WARNING, BEFORE YOU MODIFY PREFIX.C:
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
15 *
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
16 * If you make changes to any of the functions in prefix.c, you MUST
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
17 * change the BR_NAMESPACE macro (in prefix.h).
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
18 * This way you can avoid symbol table conflicts with other libraries
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
19 * that also happen to use BinReloc.
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
20 *
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
21 * Example:
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
22 * #define BR_NAMESPACE(funcName) foobar_ ## funcName
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
23 * --> expands br_locate to foobar_br_locate
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
24 */
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
25
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
26 #ifndef _PREFIX_C_
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
27 #define _PREFIX_C_
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
28
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
29 #ifdef HAVE_CONFIG_H
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
30 #include "config.h"
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
31 #endif
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
32
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
33 #ifndef BR_PTHREADS
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
34 /* Change 1 to 0 if you don't want pthread support */
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
35 #define BR_PTHREADS 1
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
36 #endif /* BR_PTHREADS */
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
37
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
38 #include <stdlib.h>
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
39 #include <stdio.h>
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
40 #include <limits.h>
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
41 #include <string.h>
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
42 #include "prefix.h"
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
43
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
44 #ifdef __cplusplus
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
45 extern "C" {
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
46 #endif /* __cplusplus */
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
47
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
48
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
49 #undef NULL
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
50 #define NULL ((void *) 0)
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
51
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
52 #ifdef __GNUC__
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
53 #define br_return_val_if_fail(expr,val) if (!(expr)) {fprintf (stderr, "** BinReloc (%s): assertion %s failed\n", __PRETTY_FUNCTION__, #expr); return val;}
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
54 #else
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
55 #define br_return_val_if_fail(expr,val) if (!(expr)) return val
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
56 #endif /* __GNUC__ */
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
57
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
58
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
59 #ifdef ENABLE_BINRELOC
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
60 #include <sys/types.h>
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
61 #include <sys/stat.h>
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
62 #include <sys/param.h>
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
63 #include <unistd.h>
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
64
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
65
10251
645eb9804040 [gaim-migrate @ 11391]
Tim Ringenbach <marv@pidgin.im>
parents: 10245
diff changeset
66 static br_locate_fallback_func fallback_func = NULL;
645eb9804040 [gaim-migrate @ 11391]
Tim Ringenbach <marv@pidgin.im>
parents: 10245
diff changeset
67 static void *fallback_data = NULL;
645eb9804040 [gaim-migrate @ 11391]
Tim Ringenbach <marv@pidgin.im>
parents: 10245
diff changeset
68 /**
645eb9804040 [gaim-migrate @ 11391]
Tim Ringenbach <marv@pidgin.im>
parents: 10245
diff changeset
69 * br_set_fallback_function:
645eb9804040 [gaim-migrate @ 11391]
Tim Ringenbach <marv@pidgin.im>
parents: 10245
diff changeset
70 * func: A function to call to find the binary.
645eb9804040 [gaim-migrate @ 11391]
Tim Ringenbach <marv@pidgin.im>
parents: 10245
diff changeset
71 * data: User data to pass to func.
645eb9804040 [gaim-migrate @ 11391]
Tim Ringenbach <marv@pidgin.im>
parents: 10245
diff changeset
72 *
645eb9804040 [gaim-migrate @ 11391]
Tim Ringenbach <marv@pidgin.im>
parents: 10245
diff changeset
73 * Sets a function to call to find the path to the binary, in
645eb9804040 [gaim-migrate @ 11391]
Tim Ringenbach <marv@pidgin.im>
parents: 10245
diff changeset
74 * case "/proc/self/maps" can't be opened. The function set should
645eb9804040 [gaim-migrate @ 11391]
Tim Ringenbach <marv@pidgin.im>
parents: 10245
diff changeset
75 * return a string that is safe to free with free().
645eb9804040 [gaim-migrate @ 11391]
Tim Ringenbach <marv@pidgin.im>
parents: 10245
diff changeset
76 */
645eb9804040 [gaim-migrate @ 11391]
Tim Ringenbach <marv@pidgin.im>
parents: 10245
diff changeset
77 void
645eb9804040 [gaim-migrate @ 11391]
Tim Ringenbach <marv@pidgin.im>
parents: 10245
diff changeset
78 br_set_locate_fallback_func (br_locate_fallback_func func, void *data)
645eb9804040 [gaim-migrate @ 11391]
Tim Ringenbach <marv@pidgin.im>
parents: 10245
diff changeset
79 {
645eb9804040 [gaim-migrate @ 11391]
Tim Ringenbach <marv@pidgin.im>
parents: 10245
diff changeset
80 fallback_func = func;
645eb9804040 [gaim-migrate @ 11391]
Tim Ringenbach <marv@pidgin.im>
parents: 10245
diff changeset
81 fallback_data = data;
645eb9804040 [gaim-migrate @ 11391]
Tim Ringenbach <marv@pidgin.im>
parents: 10245
diff changeset
82 }
645eb9804040 [gaim-migrate @ 11391]
Tim Ringenbach <marv@pidgin.im>
parents: 10245
diff changeset
83
645eb9804040 [gaim-migrate @ 11391]
Tim Ringenbach <marv@pidgin.im>
parents: 10245
diff changeset
84
10245
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
85 /**
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
86 * br_locate:
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
87 * symbol: A symbol that belongs to the app/library you want to locate.
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
88 * Returns: A newly allocated string containing the full path of the
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
89 * app/library that func belongs to, or NULL on error. This
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
90 * string should be freed when not when no longer needed.
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
91 *
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
92 * Finds out to which application or library symbol belongs, then locate
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
93 * the full path of that application or library.
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
94 * Note that symbol cannot be a pointer to a function. That will not work.
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
95 *
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
96 * Example:
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
97 * --> main.c
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
98 * #include "prefix.h"
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
99 * #include "libfoo.h"
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
100 *
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
101 * int main (int argc, char *argv[]) {
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
102 * printf ("Full path of this app: %s\n", br_locate (&argc));
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
103 * libfoo_start ();
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
104 * return 0;
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
105 * }
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
106 *
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
107 * --> libfoo.c starts here
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
108 * #include "prefix.h"
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
109 *
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
110 * void libfoo_start () {
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
111 * --> "" is a symbol that belongs to libfoo (because it's called
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
112 * --> from libfoo_start()); that's why this works.
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
113 * printf ("libfoo is located in: %s\n", br_locate (""));
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
114 * }
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
115 */
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
116 char *
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
117 br_locate (void *symbol)
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
118 {
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
119 char line[5000];
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
120 FILE *f;
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
121 char *path;
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
122
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
123 br_return_val_if_fail (symbol != NULL, NULL);
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
124
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
125 f = fopen ("/proc/self/maps", "r");
10251
645eb9804040 [gaim-migrate @ 11391]
Tim Ringenbach <marv@pidgin.im>
parents: 10245
diff changeset
126 if (!f) {
645eb9804040 [gaim-migrate @ 11391]
Tim Ringenbach <marv@pidgin.im>
parents: 10245
diff changeset
127 if (fallback_func)
645eb9804040 [gaim-migrate @ 11391]
Tim Ringenbach <marv@pidgin.im>
parents: 10245
diff changeset
128 return fallback_func(symbol, fallback_data);
645eb9804040 [gaim-migrate @ 11391]
Tim Ringenbach <marv@pidgin.im>
parents: 10245
diff changeset
129 else
645eb9804040 [gaim-migrate @ 11391]
Tim Ringenbach <marv@pidgin.im>
parents: 10245
diff changeset
130 return NULL;
645eb9804040 [gaim-migrate @ 11391]
Tim Ringenbach <marv@pidgin.im>
parents: 10245
diff changeset
131 }
10245
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
132
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
133 while (!feof (f))
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
134 {
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
135 unsigned long start, end;
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
136
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
137 if (!fgets (line, sizeof (line), f))
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
138 continue;
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
139 if (!strstr (line, " r-xp ") || !strchr (line, '/'))
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
140 continue;
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
141
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
142 sscanf (line, "%lx-%lx ", &start, &end);
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
143 if (symbol >= (void *) start && symbol < (void *) end)
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
144 {
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
145 char *tmp;
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
146 size_t len;
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
147
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
148 /* Extract the filename; it is always an absolute path */
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
149 path = strchr (line, '/');
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
150
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
151 /* Get rid of the newline */
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
152 tmp = strrchr (path, '\n');
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
153 if (tmp) *tmp = 0;
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
154
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
155 /* Get rid of "(deleted)" */
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
156 len = strlen (path);
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
157 if (len > 10 && strcmp (path + len - 10, " (deleted)") == 0)
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
158 {
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
159 tmp = path + len - 10;
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
160 *tmp = 0;
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
161 }
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
162
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
163 fclose(f);
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
164 return strdup (path);
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
165 }
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
166 }
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
167
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
168 fclose (f);
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
169 return NULL;
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
170 }
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
171
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
172
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
173 /**
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
174 * br_locate_prefix:
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
175 * symbol: A symbol that belongs to the app/library you want to locate.
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
176 * Returns: A prefix. This string should be freed when no longer needed.
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
177 *
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
178 * Locates the full path of the app/library that symbol belongs to, and return
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
179 * the prefix of that path, or NULL on error.
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
180 * Note that symbol cannot be a pointer to a function. That will not work.
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
181 *
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
182 * Example:
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
183 * --> This application is located in /usr/bin/foo
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
184 * br_locate_prefix (&argc); --> returns: "/usr"
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
185 */
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
186 char *
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
187 br_locate_prefix (void *symbol)
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
188 {
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
189 char *path, *prefix;
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
190
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
191 br_return_val_if_fail (symbol != NULL, NULL);
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
192
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
193 path = br_locate (symbol);
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
194 if (!path) return NULL;
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
195
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
196 prefix = br_extract_prefix (path);
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
197 free (path);
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
198 return prefix;
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
199 }
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
200
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
201
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
202 /**
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
203 * br_prepend_prefix:
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
204 * symbol: A symbol that belongs to the app/library you want to locate.
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
205 * path: The path that you want to prepend the prefix to.
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
206 * Returns: The new path, or NULL on error. This string should be freed when no
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
207 * longer needed.
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
208 *
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
209 * Gets the prefix of the app/library that symbol belongs to. Prepend that prefix to path.
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
210 * Note that symbol cannot be a pointer to a function. That will not work.
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
211 *
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
212 * Example:
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
213 * --> The application is /usr/bin/foo
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
214 * br_prepend_prefix (&argc, "/share/foo/data.png"); --> Returns "/usr/share/foo/data.png"
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
215 */
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
216 char *
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
217 br_prepend_prefix (void *symbol, char *path)
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
218 {
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
219 char *tmp, *newpath;
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
220
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
221 br_return_val_if_fail (symbol != NULL, NULL);
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
222 br_return_val_if_fail (path != NULL, NULL);
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
223
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
224 tmp = br_locate_prefix (symbol);
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
225 if (!tmp) return NULL;
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
226
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
227 if (strcmp (tmp, "/") == 0)
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
228 newpath = strdup (path);
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
229 else
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
230 newpath = br_strcat (tmp, path);
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
231
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
232 /* Get rid of compiler warning ("br_prepend_prefix never used") */
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
233 if (0) br_prepend_prefix (NULL, NULL);
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
234
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
235 free (tmp);
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
236 return newpath;
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
237 }
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
238
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
239 #endif /* ENABLE_BINRELOC */
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
240
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
241
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
242 /* Pthread stuff for thread safetiness */
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
243 #if BR_PTHREADS
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
244
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
245 #include <pthread.h>
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
246
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
247 static pthread_key_t br_thread_key;
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
248 static pthread_once_t br_thread_key_once = PTHREAD_ONCE_INIT;
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
249
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
250
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
251 static void
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
252 br_thread_local_store_fini ()
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
253 {
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
254 char *specific;
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
255
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
256 specific = (char *) pthread_getspecific (br_thread_key);
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
257 if (specific)
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
258 {
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
259 free (specific);
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
260 pthread_setspecific (br_thread_key, NULL);
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
261 }
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
262 pthread_key_delete (br_thread_key);
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
263 br_thread_key = 0;
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
264 }
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
265
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
266
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
267 static void
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
268 br_str_free (void *str)
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
269 {
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
270 if (str)
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
271 free (str);
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
272 }
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
273
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
274
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
275 static void
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
276 br_thread_local_store_init ()
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
277 {
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
278 if (pthread_key_create (&br_thread_key, br_str_free) == 0)
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
279 atexit (br_thread_local_store_fini);
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
280 }
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
281
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
282 #else /* BR_PTHREADS */
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
283
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
284 static char *br_last_value = (char *) NULL;
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
285
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
286 static void
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
287 br_free_last_value ()
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
288 {
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
289 if (br_last_value)
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
290 free (br_last_value);
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
291 }
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
292
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
293 #endif /* BR_PTHREADS */
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
294
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
295
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
296 /**
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
297 * br_thread_local_store:
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
298 * str: A dynamically allocated string.
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
299 * Returns: str. This return value must not be freed.
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
300 *
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
301 * Store str in a thread-local variable and return str. The next
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
302 * you run this function, that variable is freed too.
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
303 * This function is created so you don't have to worry about freeing
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
304 * strings.
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
305 *
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
306 * Example:
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
307 * char *foo;
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
308 * foo = thread_local_store (strdup ("hello")); --> foo == "hello"
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
309 * foo = thread_local_store (strdup ("world")); --> foo == "world"; "hello" is now freed.
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
310 */
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
311 const char *
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
312 br_thread_local_store (char *str)
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
313 {
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
314 #if BR_PTHREADS
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
315 char *specific;
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
316
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
317 pthread_once (&br_thread_key_once, br_thread_local_store_init);
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
318
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
319 specific = (char *) pthread_getspecific (br_thread_key);
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
320 br_str_free (specific);
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
321 pthread_setspecific (br_thread_key, str);
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
322
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
323 #else /* BR_PTHREADS */
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
324 static int initialized = 0;
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
325
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
326 if (!initialized)
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
327 {
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
328 atexit (br_free_last_value);
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
329 initialized = 1;
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
330 }
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
331
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
332 if (br_last_value)
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
333 free (br_last_value);
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
334 br_last_value = str;
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
335 #endif /* BR_PTHREADS */
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
336
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
337 return (const char *) str;
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
338 }
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
339
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
340
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
341 /**
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
342 * br_strcat:
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
343 * str1: A string.
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
344 * str2: Another string.
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
345 * Returns: A newly-allocated string. This string should be freed when no longer needed.
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
346 *
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
347 * Concatenate str1 and str2 to a newly allocated string.
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
348 */
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
349 char *
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
350 br_strcat (const char *str1, const char *str2)
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
351 {
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
352 char *result;
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
353 size_t len1, len2;
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
354
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
355 if (!str1) str1 = "";
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
356 if (!str2) str2 = "";
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
357
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
358 len1 = strlen (str1);
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
359 len2 = strlen (str2);
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
360
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
361 result = (char *) malloc (len1 + len2 + 1);
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
362 memcpy (result, str1, len1);
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
363 memcpy (result + len1, str2, len2);
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
364 result[len1 + len2] = '\0';
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
365
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
366 return result;
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
367 }
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
368
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
369
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
370 /* Emulates glibc's strndup() */
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
371 static char *
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
372 br_strndup (char *str, size_t size)
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
373 {
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
374 char *result = (char *) NULL;
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
375 size_t len;
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
376
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
377 br_return_val_if_fail (str != (char *) NULL, (char *) NULL);
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
378
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
379 len = strlen (str);
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
380 if (!len) return strdup ("");
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
381 if (size > len) size = len;
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
382
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
383 result = (char *) calloc (sizeof (char), len + 1);
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
384 memcpy (result, str, size);
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
385 return result;
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
386 }
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
387
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
388
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
389 /**
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
390 * br_extract_dir:
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
391 * path: A path.
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
392 * Returns: A directory name. This string should be freed when no longer needed.
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
393 *
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
394 * Extracts the directory component of path. Similar to g_dirname() or the dirname
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
395 * commandline application.
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
396 *
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
397 * Example:
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
398 * br_extract_dir ("/usr/local/foobar"); --> Returns: "/usr/local"
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
399 */
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
400 char *
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
401 br_extract_dir (const char *path)
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
402 {
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
403 char *end, *result;
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
404
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
405 br_return_val_if_fail (path != (char *) NULL, (char *) NULL);
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
406
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
407 end = strrchr (path, '/');
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
408 if (!end) return strdup (".");
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
409
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
410 while (end > path && *end == '/')
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
411 end--;
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
412 result = br_strndup ((char *) path, end - path + 1);
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
413 if (!*result)
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
414 {
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
415 free (result);
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
416 return strdup ("/");
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
417 } else
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
418 return result;
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
419 }
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
420
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
421
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
422 /**
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
423 * br_extract_prefix:
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
424 * path: The full path of an executable or library.
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
425 * Returns: The prefix, or NULL on error. This string should be freed when no longer needed.
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
426 *
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
427 * Extracts the prefix from path. This function assumes that your executable
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
428 * or library is installed in an LSB-compatible directory structure.
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
429 *
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
430 * Example:
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
431 * br_extract_prefix ("/usr/bin/gnome-panel"); --> Returns "/usr"
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
432 * br_extract_prefix ("/usr/local/lib/libfoo.so"); --> Returns "/usr/local"
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
433 * br_extract_prefix ("/usr/local/libfoo.so"); --> Returns "/usr"
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
434 */
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
435 char *
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
436 br_extract_prefix (const char *path)
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
437 {
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
438 char *end, *tmp, *result;
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
439
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
440 br_return_val_if_fail (path != (char *) NULL, (char *) NULL);
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
441
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
442 if (!*path) return strdup ("/");
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
443 end = strrchr (path, '/');
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
444 if (!end) return strdup (path);
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
445
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
446 tmp = br_strndup ((char *) path, end - path);
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
447 if (!*tmp)
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
448 {
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
449 free (tmp);
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
450 return strdup ("/");
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
451 }
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
452 end = strrchr (tmp, '/');
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
453 if (!end) return tmp;
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
454
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
455 result = br_strndup (tmp, end - tmp);
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
456 free (tmp);
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
457
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
458 if (!*result)
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
459 {
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
460 free (result);
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
461 result = strdup ("/");
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
462 }
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
463
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
464 return result;
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
465 }
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
466
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
467
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
468 #ifdef __cplusplus
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
469 }
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
470 #endif /* __cplusplus */
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
471
c143a3fac58d [gaim-migrate @ 11385]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
472 #endif /* _PREFIX_C */