[libbdplus-devel] [Git][videolan/libbdplus][master] 2 commits: Silence double error message (and implicit-fallthrough warning)
Administrator
gitlab at videolan.org
Wed Dec 5 19:23:05 CET 2018
Administrator pushed to branch master at VideoLAN / libbdplus
Commits:
20e7b3f3 by anonymous at 2018-11-27T11:43:45Z
Silence double error message (and implicit-fallthrough warning)
- - - - -
1dea3255 by anonymous at 2018-11-27T11:46:43Z
merge file/ changed from libbluray
Fixes path issues in Win32
- - - - -
12 changed files:
- ChangeLog
- Makefile.am
- src/file/configfile.c
- src/file/configfile.h
- src/file/file_default.c → src/file/file.c
- src/file/file.h
- − src/file/file_default.h
- + src/file/file_posix.c
- + src/file/file_win32.c
- src/libbdplus/bdplus.c
- src/libbdplus/bdsvm/trap.c
- src/libbdplus/internal.c
Changes:
=====================================
ChangeLog
=====================================
@@ -1,3 +1,5 @@
+- Fix config path charset issues in Win32
+- Use BDPLUS_DEBUG_FILE environment variable for log file.
- Export API functions automatically when creating Windows dll.
- Improve Windows compatibility.
- Improve error resilience and stability.
=====================================
Makefile.am
=====================================
@@ -40,8 +40,8 @@ libbdplus_la_SOURCES=\
src/libbdplus/bdsvm/sha1.c \
src/file/dirs.h \
src/file/file.h \
+ src/file/file.c \
src/file/filesystem.h \
- src/file/file_default.c \
src/file/file_default.h \
src/file/configfile.c \
src/file/configfile.h \
@@ -67,6 +67,14 @@ libbdplus_la_SOURCES+= \
endif
endif
+if HAVE_WIN32
+libbdplus_la_SOURCES+= \
+ src/file/file_win32.c
+else
+libbdplus_la_SOURCES+= \
+ src/file/file_posix.c
+endif
+
pkginclude_HEADERS = \
src/libbdplus/bdplus.h \
src/libbdplus/bdplus-version.h
=====================================
src/file/configfile.c
=====================================
@@ -23,22 +23,17 @@
#include "configfile.h"
+#include "file.h"
#include "dirs.h"
#include "util/logging.h"
#include "util/macro.h"
#include "util/strutl.h"
-#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
-#ifdef _WIN32
-# define mkdir(p,m) win32_mkdir(p)
-#endif
-
-
#define BDPLUS_DIR "bdplus"
@@ -46,41 +41,6 @@
#define MAX_FILE_SIZE 0xffffff
-int file_mkpath(const char *path)
-{
- struct stat s;
- int result = 1;
- char *dir = str_dup(path);
- char *end = dir;
-
- if (!dir) {
- return -1;
- }
-
- while (*end == '/')
- end++;
-
- while ((end = strchr(end, '/'))) {
- *end = 0;
-
- if (stat(dir, &s) != 0 || !S_ISDIR(s.st_mode)) {
- BD_DEBUG(DBG_FILE, "Creating directory %s\n", dir);
-
- if (mkdir(dir, S_IRWXU|S_IRWXG|S_IRWXO) == -1) {
- BD_DEBUG(DBG_FILE | DBG_CRIT, "Error creating directory %s\n", dir);
- result = 0;
- break;
- }
- }
-
- *end++ = '/';
- }
-
- free(dir);
-
- return result;
-}
-
char *file_get_cache_dir(void)
{
char *cache = file_get_cache_home();
@@ -90,9 +50,9 @@ char *file_get_cache_dir(void)
return NULL;
}
- dir = str_printf("%s/%s", cache, BDPLUS_DIR);
+ dir = str_printf("%s/%s/", cache, BDPLUS_DIR);
X_FREE(cache);
- file_mkpath(dir);
+ file_mkdirs(dir);
return dir;
}
@@ -100,16 +60,16 @@ char *file_get_cache_dir(void)
static char *_probe_config_dir(const char *base, const char *vm, const char *file)
{
char *dir = str_printf("%s/%s/%s/%s", base, BDPLUS_DIR, vm, file);
- FILE *fp;
+ BDPLUS_FILE_H *fp;
if (!dir) {
return NULL;
}
- fp = fopen(dir, "r");
+ fp = file_open_default()(NULL, dir);
if (fp) {
- fclose(fp);
+ file_close(fp);
*(strrchr(dir, '/') + 1) = 0;
BD_DEBUG(DBG_BDPLUS, "Found VM config from %s\n", dir);
return dir;
@@ -156,38 +116,36 @@ char *file_get_config_dir(const char *file)
return NULL;
}
-static char *_load_fp(FILE *fp, uint32_t *p_size)
+static char *_load_fp(BDPLUS_FILE_H *fp, uint32_t *p_size)
{
char *data = NULL;
- long file_size, read_size;
+ int64_t size, read_size;
- fseek(fp, 0, SEEK_END);
- file_size = ftell(fp);
- fseek(fp, 0, SEEK_SET);
+ size = file_size(fp);
- if (file_size < MIN_FILE_SIZE || file_size > MAX_FILE_SIZE) {
+ if (size < MIN_FILE_SIZE || size > MAX_FILE_SIZE) {
BD_DEBUG(DBG_FILE, "Invalid file size\n");
return NULL;
}
- data = malloc(file_size + 1);
+ data = malloc(size + 1);
if (!data) {
BD_DEBUG(DBG_FILE, "Out of memory\n");
return NULL;
}
- read_size = fread(data, 1, file_size, fp);
+ read_size = file_read(fp, (void *)data, size);
- if (read_size != file_size) {
+ if (read_size != size) {
BD_DEBUG(DBG_FILE, "Error reading file\n");
free(data);
return NULL;
}
- data[file_size] = 0;
+ data[size] = 0;
if (p_size) {
- *p_size = file_size;
+ *p_size = size;
}
return data;
@@ -196,13 +154,13 @@ static char *_load_fp(FILE *fp, uint32_t *p_size)
char *file_load(const char *path, uint32_t *p_size)
{
char *mem;
- FILE *fp;
+ BDPLUS_FILE_H *fp;
if (!path) {
return NULL;
}
- fp = fopen(path, "rb");
+ fp = file_open_default()(NULL, path);
if (!fp) {
BD_DEBUG(DBG_FILE | DBG_CRIT, "Error loading %s\n", path);
@@ -211,7 +169,7 @@ char *file_load(const char *path, uint32_t *p_size)
mem = _load_fp(fp, p_size);
- fclose(fp);
+ file_close(fp);
return mem;
}
=====================================
src/file/configfile.h
=====================================
@@ -25,8 +25,6 @@
#include <stdint.h>
#include <stdio.h>
-BD_PRIVATE int file_mkpath(const char *path);
-
BD_PRIVATE char * file_get_cache_dir(void) BD_ATTR_MALLOC;
BD_PRIVATE char * file_get_config_dir(const char *file) BD_ATTR_MALLOC;
=====================================
src/file/file_default.c → src/file/file.c
=====================================
@@ -1,6 +1,6 @@
/*
- * This file is part of libaacs
- * Copyright (C) 2015 VideoLAN
+ * This file is part of libbluray
+ * Copyright (C) 2014 Petri Hintukainen
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -21,72 +21,73 @@
#include "config.h"
#endif
-#include "file_default.h"
-
#include "file.h"
+#include "util/logging.h"
#include "util/macro.h"
#include "util/strutl.h"
-#include "util/logging.h"
-#include <stdio.h>
-#include <stdlib.h>
+#include <stdio.h> // SEEK_*
+#include <string.h> // strchr
-#if defined(__MINGW32__)
-/* fseeko64() prototypes from stdio.h */
-# undef __STRICT_ANSI__
-# define fseeko fseeko64
-#endif
-static void _file_close(BDPLUS_FILE_H *file)
+int64_t file_size(BD_FILE_H *fp)
{
- if (file) {
- fclose((FILE *)file->internal);
- X_FREE(file);
+ int64_t pos = file_tell(fp);
+ int64_t res1 = file_seek(fp, 0, SEEK_END);
+ int64_t length = file_tell(fp);
+ int64_t res2 = file_seek(fp, pos, SEEK_SET);
+
+ if (res1 < 0 || res2 < 0 || pos < 0 || length < 0) {
+ return -1;
}
-}
-static int64_t _file_seek(BDPLUS_FILE_H *file, int64_t offset, int32_t origin)
-{
- return fseeko((FILE *)file->internal, offset, origin);
+ return length;
}
-static int64_t _file_read(BDPLUS_FILE_H *file, uint8_t *buf, int64_t size)
+int file_mkdirs(const char *path)
{
- return fread(buf, 1, size, (FILE *)file->internal);
-}
+ int result = 0;
+ char *dir = str_dup(path);
+ char *end = dir;
+ char *p;
-BDPLUS_FILE_H *file_open_default(void *handle, const char* file_name)
-{
- const char *device_root = handle;
- char *file_path;
- BDPLUS_FILE_H *file;
- FILE *fp;
-
- file_path = str_printf("%s"DIR_SEP"%s", device_root, file_name);
- if (!file_path) {
- BD_DEBUG(DBG_CRIT, "out of memory\n");
- return NULL;
+ if (!dir) {
+ return -1;
}
- fp = fopen(file_path, "rb");
- X_FREE(file_path);
-
- if (!fp) {
- return NULL;
+ /* strip file name */
+ if (!(end = strrchr(end, DIR_SEP_CHAR))) {
+ X_FREE(dir);
+ return -1;
}
-
- file = calloc(1, sizeof(BDPLUS_FILE_H));
- if (!file) {
- BD_DEBUG(DBG_CRIT, "out of memory\n");
- fclose(fp);
- return NULL;
+ *end = 0;
+
+ /* tokenize, stop to first existing dir */
+ while ((p = strrchr(dir, DIR_SEP_CHAR))) {
+ if (!file_path_exists(dir)) {
+ break;
+ }
+ *p = 0;
}
- file->internal = fp;
- file->close = _file_close;
- file->seek = _file_seek;
- file->read = _file_read;
+ /* create missing dirs */
+ p = dir;
+ while (p < end) {
+
+ /* concatenate next non-existing dir */
+ while (*p) p++;
+ if (p >= end) break;
+ *p = DIR_SEP_CHAR;
+
+ result = file_mkdir(dir);
+ if (result < 0) {
+ BD_DEBUG(DBG_FILE | DBG_CRIT, "Error creating directory %s\n", dir);
+ break;
+ }
+ BD_DEBUG(DBG_FILE, " created directory %s\n", dir);
+ }
- return file;
+ X_FREE(dir);
+ return result;
}
=====================================
src/file/file.h
=====================================
@@ -35,25 +35,45 @@
# define DIR_SEP_CHAR '/'
#endif
+typedef BDPLUS_FILE_H BD_FILE_H;
+typedef BDPLUS_FILE_OPEN BD_FILE_OPEN;
+
/*
* file access
*/
-static inline void file_close(BDPLUS_FILE_H *fp)
+static inline void file_close(BD_FILE_H *fp)
{
fp->close(fp);
}
-static inline BD_USED int64_t file_seek(BDPLUS_FILE_H *fp, int64_t offset, int32_t origin)
+static inline int64_t file_tell(BD_FILE_H *fp)
+{
+ return fp->tell(fp);
+}
+
+static inline BD_USED int64_t file_seek(BD_FILE_H *fp, int64_t offset, int32_t origin)
{
return fp->seek(fp, offset, origin);
}
-static inline BD_USED size_t file_read(BDPLUS_FILE_H *fp, uint8_t *buf, size_t size)
+static inline BD_USED size_t file_read(BD_FILE_H *fp, uint8_t *buf, size_t size)
{
return (size_t)fp->read(fp, buf, (int64_t)size);
}
#define file_open(cfg, fname) (cfg->fopen(cfg->fopen_handle, fname))
+BD_PRIVATE int64_t file_size(BD_FILE_H *fp);
+
+BD_PRIVATE BDPLUS_FILE_OPEN file_open_default(void);
+
+/*
+ * local filesystem
+ */
+
+BD_PRIVATE int file_path_exists(const char *path);
+BD_PRIVATE int file_mkdir(const char *dir);
+BD_PRIVATE int file_mkdirs(const char *path);
+
#endif /* FILE_H_ */
=====================================
src/file/file_default.h deleted
=====================================
@@ -1,28 +0,0 @@
-/*
- * This file is part of libbdplus
- * Copyright (C) 2015 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 FILE_DEFAULT_H_
-#define FILE_DEFAULT_H_
-
-#include "util/attributes.h"
-
-struct bdplus_file;
-BD_PRIVATE struct bdplus_file *file_open_default(void *root_path, const char *file_name);
-
-#endif /* FILE_DEFAULT_H_ */
=====================================
src/file/file_posix.c
=====================================
@@ -0,0 +1,157 @@
+/*
+ * This file is part of libbluray
+ * Copyright (C) 2009-2010 Obliter0n
+ * Copyright (C) 2009-2010 John Stebbins
+ * Copyright (C) 2010-2015 Petri Hintukainen
+ *
+ * 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/>.
+ */
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "file.h"
+#include "util/macro.h"
+#include "util/logging.h"
+
+#include <errno.h>
+#include <inttypes.h>
+#include <stdio.h> // remove()
+#include <stdlib.h>
+#include <string.h>
+
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+#ifdef __ANDROID__
+# undef lseek
+# define lseek lseek64
+# undef off_t
+# define off_t off64_t
+#endif
+
+static void _file_close(BD_FILE_H *file)
+{
+ if (file) {
+ if (close((int)(intptr_t)file->internal)) {
+ BD_DEBUG(DBG_CRIT | DBG_FILE, "Error closing POSIX file (%p)\n", (void*)file);
+ }
+
+ BD_DEBUG(DBG_FILE, "Closed POSIX file (%p)\n", (void*)file);
+
+ X_FREE(file);
+ }
+}
+
+static int64_t _file_seek(BD_FILE_H *file, int64_t offset, int32_t origin)
+{
+ off_t result = lseek((int)(intptr_t)file->internal, offset, origin);
+ if (result == (off_t)-1) {
+ BD_DEBUG(DBG_FILE, "lseek() failed (%p)\n", (void*)file);
+ return -1;
+ }
+ return (int64_t)result;
+}
+
+static int64_t _file_tell(BD_FILE_H *file)
+{
+ return _file_seek(file, 0, SEEK_CUR);
+}
+
+static int64_t _file_read(BD_FILE_H *file, uint8_t *buf, int64_t size)
+{
+ ssize_t got, result;
+
+ if (size <= 0 || size >= BD_MAX_SSIZE) {
+ BD_DEBUG(DBG_FILE | DBG_CRIT, "Ignoring invalid read of size %"PRId64" (%p)\n", size, (void*)file);
+ return 0;
+ }
+
+ for (got = 0; got < (ssize_t)size; got += result) {
+ result = read((int)(intptr_t)file->internal, buf + got, size - got);
+ if (result < 0) {
+ if (errno != EINTR) {
+ BD_DEBUG(DBG_FILE, "read() failed (%p)\n", (void*)file);
+ break;
+ }
+ result = 0;
+ } else if (result == 0) {
+ // hit EOF.
+ break;
+ }
+ }
+ return (int64_t)got;
+}
+
+static BD_FILE_H *_file_open(void *handle, const char* filename)
+{
+ BD_FILE_H *file;
+ int fd = -1;
+ int flags = 0;
+ int mode = 0;
+ (void)handle;
+
+ flags = O_RDONLY;
+
+#ifdef O_CLOEXEC
+ flags |= O_CLOEXEC;
+#endif
+#ifdef O_BINARY
+ flags |= O_BINARY;
+#endif
+
+ if ((fd = open(filename, flags, mode)) < 0) {
+ BD_DEBUG(DBG_FILE, "Error opening file %s\n", filename);
+ return NULL;
+ }
+
+ file = calloc(1, sizeof(BD_FILE_H));
+ if (!file) {
+ close(fd);
+ BD_DEBUG(DBG_FILE, "Error opening file %s (out of memory)\n", filename);
+ return NULL;
+ }
+
+ file->close = _file_close;
+ file->seek = _file_seek;
+ file->read = _file_read;
+ file->tell = _file_tell;
+
+ file->internal = (void*)(intptr_t)fd;
+
+ BD_DEBUG(DBG_FILE, "Opened POSIX file %s (%p)\n", filename, (void*)file);
+ return file;
+}
+
+BD_FILE_H* (*file_open)(void *handle, const char* filename) = _file_open;
+
+BD_FILE_OPEN file_open_default(void)
+{
+ return _file_open;
+}
+
+int file_path_exists(const char *path)
+{
+ struct stat s;
+ return stat(path, &s);
+}
+
+int file_mkdir(const char *dir)
+{
+ return mkdir(dir, S_IRWXU);
+}
=====================================
src/file/file_win32.c
=====================================
@@ -0,0 +1,151 @@
+/*
+ * This file is part of libbluray
+ * Copyright (C) 2009-2010 Obliter0n
+ * Copyright (C) 2009-2010 John Stebbins
+ *
+ * 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/>.
+ */
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#if defined(__MINGW32__)
+/* ftello64() and fseeko64() prototypes from stdio.h */
+# undef __STRICT_ANSI__
+#endif
+
+#include "file.h"
+#include "util/macro.h"
+#include "util/logging.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <inttypes.h>
+
+#include <windows.h>
+
+static void _file_close(BD_FILE_H *file)
+{
+ if (file) {
+ if (fclose((FILE *)file->internal)) {
+ BD_DEBUG(DBG_FILE | DBG_CRIT, "Error closing WIN32 file (%p)\n", (void*)file);
+ }
+
+ BD_DEBUG(DBG_FILE, "Closed WIN32 file (%p)\n", (void*)file);
+
+ X_FREE(file);
+ }
+}
+
+static int64_t _file_seek(BD_FILE_H *file, int64_t offset, int32_t origin)
+{
+#if defined(__MINGW32__)
+ return fseeko64((FILE *)file->internal, offset, origin);
+#else
+ return _fseeki64((FILE *)file->internal, offset, origin);
+#endif
+}
+
+static int64_t _file_tell(BD_FILE_H *file)
+{
+#if defined(__MINGW32__)
+ return ftello64((FILE *)file->internal);
+#else
+ return _ftelli64((FILE *)file->internal);
+#endif
+}
+
+static int64_t _file_read(BD_FILE_H *file, uint8_t *buf, int64_t size)
+{
+ if (size > 0 && size < BD_MAX_SSIZE) {
+ return (int64_t)fread(buf, 1, (size_t)size, (FILE *)file->internal);
+ }
+
+ BD_DEBUG(DBG_FILE | DBG_CRIT, "Ignoring invalid read of size %"PRId64" (%p)\n", size, (void*)file);
+ return 0;
+}
+
+static BD_FILE_H *_file_open(void *handle, const char* filename)
+{
+ BD_FILE_H *file;
+ FILE *fp;
+ wchar_t wfilename[MAX_PATH], wmode[8];
+ const char *mode = "rb";
+ (void)handle;
+
+ if (!MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, filename, -1, wfilename, MAX_PATH) ||
+ !MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, mode, -1, wmode, 8)) {
+
+ BD_DEBUG(DBG_FILE, "Error opening file %s\n", filename);
+ return NULL;
+ }
+
+ fp = _wfopen(wfilename, wmode);
+ if (!fp) {
+ BD_DEBUG(DBG_FILE, "Error opening file %s\n", filename);
+ return NULL;
+ }
+
+ file = calloc(1, sizeof(BD_FILE_H));
+ if (!file) {
+ BD_DEBUG(DBG_FILE | DBG_CRIT, "Error opening file %s (out of memory)\n", filename);
+ fclose(fp);
+ return NULL;
+ }
+
+ file->internal = fp;
+ file->close = _file_close;
+ file->seek = _file_seek;
+ file->read = _file_read;
+ file->tell = _file_tell;
+
+ BD_DEBUG(DBG_FILE, "Opened WIN32 file %s (%p)\n", filename, (void*)file);
+ return file;
+}
+
+BD_FILE_H* (*file_open)(void *handle, const char* filename) = _file_open;
+
+BD_FILE_OPEN file_open_default(void)
+{
+ return _file_open;
+}
+
+int file_path_exists(const char *path)
+{
+ wchar_t wpath[MAX_PATH];
+
+ if (!MultiByteToWideChar(CP_UTF8, 0, path, -1, wpath, MAX_PATH)) {
+ return -1;
+ }
+
+ DWORD dwAttrib = GetFileAttributesW(wpath);
+ if (dwAttrib != INVALID_FILE_ATTRIBUTES) {
+ return 0;
+ }
+ return -1;
+}
+
+int file_mkdir(const char *dir)
+{
+ wchar_t wdir[MAX_PATH];
+
+ if (!MultiByteToWideChar(CP_UTF8, 0, dir, -1, wdir, MAX_PATH)) {
+ return -1;
+ }
+ if (!CreateDirectoryW(wdir, NULL))
+ return -1;
+ return 0;
+}
=====================================
src/libbdplus/bdplus.c
=====================================
@@ -36,7 +36,7 @@
#include "util/mutex.h"
#include "util/strutl.h"
#include "file/configfile.h"
-#include "file/file_default.h"
+#include "file/file.h"
#include <string.h>
#include <stdlib.h>
@@ -114,7 +114,7 @@ static void _save_slots(bdplus_t *plus)
{
char *file_name = _slots_file();
if (file_name) {
- file_mkpath(file_name);
+ file_mkdirs(file_name);
bdplus_save_slots(plus, file_name);
X_FREE(file_name);
}
@@ -164,7 +164,7 @@ bdplus_t *bdplus_init(const char *path, const char *config_path, const uint8_t *
return NULL;
}
plus->config->fopen_handle = plus->device_path;
- plus->config->fopen = file_open_default;
+ plus->config->fopen = file_open_default();
}
plus->mutex = calloc(1, sizeof(BD_MUTEX));
=====================================
src/libbdplus/bdsvm/trap.c
=====================================
@@ -1129,6 +1129,8 @@ uint32_t TRAP_Discovery(bdplus_config_t *config, uint32_t dev, uint32_t qID, uin
break;
} // qID
+ break;
+
default:
BD_DEBUG(DBG_CRIT, "[TRAP] unknown DeviceDiscovery for unknown dev %d: %d\n", dev, qID);
break;
=====================================
src/libbdplus/internal.c
=====================================
@@ -74,7 +74,7 @@ char *bdplus_disc_cache_file(bdplus_t *plus, const char *file)
str_print_hex(vid_str, plus->volumeID, 16);
result = str_printf("%s/%s/%s", base ? base : "/tmp/", vid_str, file);
X_FREE(base);
- file_mkpath(result);
+ file_mkdirs(result);
return result;
}
View it on GitLab: https://code.videolan.org/videolan/libbdplus/compare/c7f1e8bbb22853ffef1feadb100845ae3ad4d562...1dea3255b09505e2d85d7a0b2cd6de94cbfc3386
--
View it on GitLab: https://code.videolan.org/videolan/libbdplus/compare/c7f1e8bbb22853ffef1feadb100845ae3ad4d562...1dea3255b09505e2d85d7a0b2cd6de94cbfc3386
You're receiving this email because of your account on code.videolan.org.
More information about the libbdplus-devel
mailing list