[libbluray-devel] Move mount point resolving to separate file
hpi1
git at videolan.org
Fri Nov 28 11:03:47 CET 2014
libbluray | branch: master | hpi1 <hpi1 at anonymous.org> | Tue Nov 25 11:36:39 2014 +0200| [213f7c301d8f861259ed18aa99cc80e6b47f236f] | committer: hpi1
Move mount point resolving to separate file
> http://git.videolan.org/gitweb.cgi/libbluray.git/?a=commit;h=213f7c301d8f861259ed18aa99cc80e6b47f236f
---
src/Makefile.am | 10 ++++--
src/file/mount.c | 63 +++++++++++++++++++++++++++++++++++
src/file/mount.h | 31 +++++++++++++++++
src/file/mount_darwin.c | 59 ++++++++++++++++++++++++++++++++
src/libbluray/bluray.c | 85 ++---------------------------------------------
5 files changed, 162 insertions(+), 86 deletions(-)
diff --git a/src/Makefile.am b/src/Makefile.am
index b262117..e48eca1 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -74,6 +74,7 @@ libbluray_la_SOURCES = \
file/file.c \
file/dirs.h \
file/dl.h \
+ file/mount.h \
file/filesystem.h \
file/filesystem.c \
file/libaacs.h \
@@ -102,20 +103,23 @@ libbluray_la_SOURCES+= \
file/file_posix.c \
file/dir_posix.c \
file/dl_posix.c \
- file/dirs_darwin.c
+ file/dirs_darwin.c \
+ file/mount_darwin.c
else
if HAVE_WIN32
libbluray_la_SOURCES+= \
file/file_win32.c \
file/dir_win32.c \
file/dl_win32.c \
- file/dirs_win32.c
+ file/dirs_win32.c \
+ file/mount.c
else
libbluray_la_SOURCES+= \
file/file_posix.c \
file/dir_posix.c \
file/dl_posix.c \
- file/dirs_xdg.c
+ file/dirs_xdg.c \
+ file/mount.c
endif
endif
diff --git a/src/file/mount.c b/src/file/mount.c
new file mode 100644
index 0000000..d6703fd
--- /dev/null
+++ b/src/file/mount.c
@@ -0,0 +1,63 @@
+/*
+ * This file is part of libbluray
+ * Copyright (C) 2014 VideoLAN
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+
+#include "mount.h"
+
+#include "util/strutl.h"
+
+#ifdef HAVE_MNTENT_H
+#include <string.h>
+#include <sys/stat.h>
+#include <mntent.h>
+#endif
+
+char *mount_get_mountpoint(const char *device_path)
+{
+#ifdef HAVE_MNTENT_H
+ struct stat st;
+ if (stat (device_path, &st) ) {
+ return str_dup(device_path);
+ }
+
+ /* If it's a directory, all is good */
+ if (S_ISDIR(st.st_mode)) {
+ return str_dup(device_path);
+ }
+
+ FILE *f = setmntent ("/proc/self/mounts", "r");
+ if (f) {
+ struct mntent* m;
+#ifdef HAVE_GETMNTENT_R
+ struct mntent mbuf;
+ char buf [8192];
+ while ((m = getmntent_r (f, &mbuf, buf, sizeof(buf))) != NULL) {
+#else
+ while ((m = getmntent (f)) != NULL) {
+#endif
+ if (!strcmp (m->mnt_fsname, device_path)) {
+ endmntent (f);
+ return str_dup (m->mnt_dir);
+ }
+ }
+ endmntent (f);
+ }
+#endif /* HAVE_MNTENT_H */
+
+ return str_dup(device_path);
+}
diff --git a/src/file/mount.h b/src/file/mount.h
new file mode 100644
index 0000000..904b737
--- /dev/null
+++ b/src/file/mount.h
@@ -0,0 +1,31 @@
+/*
+ * This file is part of libbluray
+ * Copyright (C) 2014 VideoLAN
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef BD_MOUNT_H_
+#define BD_MOUNT_H_
+
+#include "util/attributes.h"
+
+/*
+ * Resolve device node (/dev/sr0) to mount point
+ * Implemented on Linux and MacOSX
+ */
+BD_PRIVATE char *mount_get_mountpoint(const char *device_path);
+
+#endif /* BD_MOUNT_H_ */
diff --git a/src/file/mount_darwin.c b/src/file/mount_darwin.c
new file mode 100644
index 0000000..deb790e
--- /dev/null
+++ b/src/file/mount_darwin.c
@@ -0,0 +1,59 @@
+/*
+ * This file is part of libbluray
+ * Copyright (C) 2014 VideoLAN
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+
+#include "mount.h"
+
+#include "util/strutl.h"
+
+#include <string.h>
+
+#define _DARWIN_C_SOURCE
+#include <sys/stat.h>
+#include <sys/param.h>
+#include <sys/ucred.h>
+#include <sys/mount.h>
+
+char *mount_get_mountpoint(const char *device_path)
+{
+ struct stat st;
+ if (stat (device_path, &st) ) {
+ return str_dup(device_path);
+ }
+
+ /* If it's a directory, all is good */
+ if (S_ISDIR(st.st_mode)) {
+ return str_dup(device_path);
+ }
+
+ struct statfs mbuf[128];
+ int fs_count;
+
+ if ( (fs_count = getfsstat (NULL, 0, MNT_NOWAIT)) != -1 ) {
+
+ getfsstat (mbuf, fs_count * sizeof(mbuf[0]), MNT_NOWAIT);
+
+ for ( int i = 0; i < fs_count; ++i) {
+ if (!strcmp (mbuf[i].f_mntfromname, device_path)) {
+ return str_dup (mbuf[i].f_mntonname);
+ }
+ }
+ }
+
+ return str_dup (device_path);
+}
diff --git a/src/libbluray/bluray.c b/src/libbluray/bluray.c
index 3980039..db6a3a5 100644
--- a/src/libbluray/bluray.c
+++ b/src/libbluray/bluray.c
@@ -43,6 +43,7 @@
#include "decoders/m2ts_filter.h"
#include "decoders/overlay.h"
#include "file/file.h"
+#include "file/mount.h"
#ifdef USING_BDJAVA
#include "bdj/bdj.h"
#endif
@@ -55,19 +56,6 @@
#include <inttypes.h>
#include <string.h>
-#ifdef HAVE_MNTENT_H
-#include <sys/stat.h>
-#include <mntent.h>
-#endif
-
-#ifdef __APPLE__
-#define _DARWIN_C_SOURCE
-#include <sys/stat.h>
-#include <sys/param.h>
-#include <sys/ucred.h>
-#include <sys/mount.h>
-#endif
-
#define MAX_EVENTS 31 /* 2^n - 1 */
typedef struct bd_event_queue_s {
@@ -1346,71 +1334,6 @@ static void _storage_free(BLURAY *bd)
#define _storage_free(bd) do{}while(0)
#endif
-#ifdef HAVE_MNTENT_H
-/*
- * Replace device node (/dev/sr0) by mount point
- * Implemented on Linux and MacOSX
- */
-static void get_mount_point(BLURAY *bd)
-{
- struct stat st;
- if (stat (bd->device_path, &st) )
- return;
-
- /* If it's a directory, all is good */
- if (S_ISDIR(st.st_mode))
- return;
-
- FILE *f = setmntent ("/proc/self/mounts", "r");
- if (!f)
- return;
-
- struct mntent* m;
-#ifdef HAVE_GETMNTENT_R
- struct mntent mbuf;
- char buf [8192];
- while ((m = getmntent_r (f, &mbuf, buf, sizeof(buf))) != NULL) {
-#else
- while ((m = getmntent (f)) != NULL) {
-#endif
- if (!strcmp (m->mnt_fsname, bd->device_path)) {
- free(bd->device_path);
- bd->device_path = str_dup (m->mnt_dir);
- break;
- }
- }
- endmntent (f);
-}
-#endif
-#ifdef __APPLE__
-static void get_mount_point(BLURAY *bd)
-{
- struct stat st;
- if (stat (bd->device_path, &st) )
- return;
-
- /* If it's a directory, all is good */
- if (S_ISDIR(st.st_mode))
- return;
-
- struct statfs mbuf[128];
- int fs_count;
-
- if ( (fs_count = getfsstat (NULL, 0, MNT_NOWAIT)) == -1 ) {
- return;
- }
-
- getfsstat (mbuf, fs_count * sizeof(mbuf[0]), MNT_NOWAIT);
-
- for ( int i = 0; i < fs_count; ++i) {
- if (!strcmp (mbuf[i].f_mntfromname, bd->device_path)) {
- free(bd->device_path);
- bd->device_path = str_dup (mbuf[i].f_mntonname);
- }
- }
-}
-#endif
-
/*
* open / close
*/
@@ -1438,11 +1361,7 @@ BLURAY *bd_open(const char* device_path, const char* keyfile_path)
return NULL;
}
- bd->device_path = str_dup(device_path);
-
-#if (defined HAVE_MNTENT_H || defined __APPLE__)
- get_mount_point(bd);
-#endif
+ bd->device_path = mount_get_mountpoint(device_path);
_libaacs_init(bd, keyfile_path);
More information about the libbluray-devel
mailing list