git.videolan.org
/
vlc.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (from parent 1:
fcf05b2
)
Linux: do not hardcode libvlc.so, use address space match instead
author
Rémi Denis-Courmont
<remi@remlab.net>
Wed, 13 Jan 2010 17:10:49 +0000
(19:10 +0200)
committer
Rémi Denis-Courmont
<remi@remlab.net>
Wed, 13 Jan 2010 17:11:09 +0000
(19:11 +0200)
src/misc/linux_specific.c
patch
|
blob
|
history
diff --git
a/src/misc/linux_specific.c
b/src/misc/linux_specific.c
index
79c8807
..
57b0805
100644
(file)
--- a/
src/misc/linux_specific.c
+++ b/
src/misc/linux_specific.c
@@
-31,6
+31,7
@@
#if 0
#include <assert.h>
#include <pthread.h>
#if 0
#include <assert.h>
#include <pthread.h>
+#include <limits.h>
static void set_libvlc_path (void)
{
static void set_libvlc_path (void)
{
@@
-45,29
+46,34
@@
static void set_libvlc_path (void)
if (maps == NULL)
return;
if (maps == NULL)
return;
+ char *line = NULL;
+ size_t linelen = 0;
+ uintptr_t needle = (uintptr_t)set_libvlc_path;
+
for (;;)
{
for (;;)
{
- char buf[5000], *dir, *end;
-
- if (fgets (buf, sizeof (buf), maps) == NULL)
+ ssize_t len = getline (&line, &linelen, maps);
+ if (len == -1)
break;
break;
- dir = strchr (buf, '/');
+ void *start, *end;
+ if (sscanf (line, "%p-%p", &start, &end) < 2)
+ continue;
+ if (needle < (uintptr_t)start || (uintptr_t)end <= needle)
+ continue;
+ char *dir = strchr (line, '/');
if (dir == NULL)
continue;
if (dir == NULL)
continue;
-
end = strrchr (dir
, '/');
+
char *file = strrchr (line
, '/');
if (end == NULL)
continue;
if (end == NULL)
continue;
- if (strncmp (end + 1, "libvlc.so.", 10))
- continue;
-
- *end = '\0';
+ *file = '\0';
printf ("libvlc at %s\n", dir);
if (strlen (dir) < sizeof (libvlc_path))
strcpy (libvlc_path, dir);
break;
}
printf ("libvlc at %s\n", dir);
if (strlen (dir) < sizeof (libvlc_path))
strcpy (libvlc_path, dir);
break;
}
-
+ free (line);
fclose (maps);
}
#endif
fclose (maps);
}
#endif