[libbluray-devel] [PATCH 3/3] bd_open(): convert /dev/ nodes to mount point (Linux only)

Rafaël Carré funman at videolan.org
Tue Dec 27 20:44:03 CET 2011


---
 src/libbluray/bluray.c |   55 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 55 insertions(+), 0 deletions(-)

diff --git a/src/libbluray/bluray.c b/src/libbluray/bluray.c
index e733381..68f86e6 100644
--- a/src/libbluray/bluray.c
+++ b/src/libbluray/bluray.c
@@ -46,6 +46,10 @@
 #include <stdlib.h>
 #include <inttypes.h>
 #include <string.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
 
 typedef int     (*fptr_int)();
 typedef int32_t (*fptr_int32)();
@@ -907,6 +911,54 @@ static void _fill_disc_info(BLURAY *bd)
     }
 }
 
+#ifdef __linux__
+/*
+ * Replace device node (/dev/sr0) by mount point
+ * Implemented on Linux only at the moment, could be added for other OS
+ */
+static void get_mount_point(BLURAY *bd)
+{
+    struct stat st;
+    stat(bd->device_path, &st);
+
+    /* If it's a directory, all is good */
+    if (S_ISDIR(st.st_mode))
+        return;
+
+    char *line = NULL;
+    size_t len = 0;
+    size_t devlen = strlen(bd->device_path);
+
+    FILE *f = fopen("/proc/mounts", "r");
+    if (!f)
+        return;
+
+    while (getline(&line, &len, f) != -1) {
+        if (strncmp(line, bd->device_path, devlen))
+            continue;
+
+        /* if device is not followed immediately by a space it's not the one */
+        /* e.g. when looking for "/dev/sda1", "/dev/sda XXX" won't match */
+        char *space = strchr(line, ' ');
+        if (space != &line[devlen])
+            continue;
+
+        space = strchr(space + 1, ' '); /* space points just after the mount dir */
+        if (!space) /* corrupted line ? */
+            break;
+
+        *space = '\0';
+        /* FIXME : spaces (at least) are octal escaped */
+        free(bd->device_path);
+        bd->device_path = strdup(&line[devlen+1]);
+        break;
+    }
+
+    free(line);
+    fclose(f);
+}
+#endif
+
 /*
  * open / close
  */
@@ -923,6 +975,9 @@ BLURAY *bd_open(const char* device_path, const char* keyfile_path)
     BD_DEBUG(DBG_BLURAY, "libbluray version "BLURAY_VERSION_STRING"\n");
 
     bd->device_path = strdup(device_path);
+#ifdef __linux__
+    get_mount_point(bd);
+#endif
 
     _libaacs_open(bd, keyfile_path);
 
-- 
1.7.7.3


More information about the libbluray-devel mailing list