From: Rémi Denis-Courmont Date: Wed, 13 Jan 2010 17:10:49 +0000 (+0200) Subject: Linux: do not hardcode libvlc.so, use address space match instead X-Git-Tag: 1.1.0-ff~1252 X-Git-Url: http://git.videolan.org/gitweb.cgi/vlc.git/?p=vlc.git;p=vlc.git;a=commitdiff_plain;h=79399150ff84330eadf9fb1c88c81f7ccdb5a235;hp=fcf05b24781d8a02b0172951d8b3b5b94bdefa38 Linux: do not hardcode libvlc.so, use address space match instead --- diff --git a/src/misc/linux_specific.c b/src/misc/linux_specific.c index 79c880742b..57b0805b77 100644 --- a/src/misc/linux_specific.c +++ b/src/misc/linux_specific.c @@ -31,6 +31,7 @@ #if 0 #include #include +#include static void set_libvlc_path (void) { @@ -45,29 +46,34 @@ static void set_libvlc_path (void) if (maps == NULL) return; + char *line = NULL; + size_t linelen = 0; + uintptr_t needle = (uintptr_t)set_libvlc_path; + for (;;) { - char buf[5000], *dir, *end; - - if (fgets (buf, sizeof (buf), maps) == NULL) + ssize_t len = getline (&line, &linelen, maps); + if (len == -1) 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; - end = strrchr (dir, '/'); + char *file = strrchr (line, '/'); 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; } - + free (line); fclose (maps); } #endif