forked from Imagelibrary/littlefs
Fixes to use lfs_filebd on windows platforms
There are two issues, when using the file-based block device emulation on Windows Platforms: 1. There is no fsync implementation available. This needs to be mapped to a Windows-specific FlushFileBuffers system call. 2. The block device file needs to be opened as binary file (O_BINARY) The corresponding flag is not required for Linux.
This commit is contained in:
committed by
Christopher Haster
parent
9c7e232086
commit
1e038c81fc
@@ -10,6 +10,10 @@
|
|||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
#include <windows.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
int lfs_filebd_createcfg(const struct lfs_config *cfg, const char *path,
|
int lfs_filebd_createcfg(const struct lfs_config *cfg, const char *path,
|
||||||
const struct lfs_filebd_config *bdcfg) {
|
const struct lfs_filebd_config *bdcfg) {
|
||||||
LFS_FILEBD_TRACE("lfs_filebd_createcfg(%p {.context=%p, "
|
LFS_FILEBD_TRACE("lfs_filebd_createcfg(%p {.context=%p, "
|
||||||
@@ -27,7 +31,12 @@ int lfs_filebd_createcfg(const struct lfs_config *cfg, const char *path,
|
|||||||
bd->cfg = bdcfg;
|
bd->cfg = bdcfg;
|
||||||
|
|
||||||
// open file
|
// open file
|
||||||
|
#ifdef _WIN32
|
||||||
|
bd->fd = open(path, O_RDWR | O_CREAT | O_BINARY, 0666);
|
||||||
|
#else
|
||||||
bd->fd = open(path, O_RDWR | O_CREAT, 0666);
|
bd->fd = open(path, O_RDWR | O_CREAT, 0666);
|
||||||
|
#endif
|
||||||
|
|
||||||
if (bd->fd < 0) {
|
if (bd->fd < 0) {
|
||||||
int err = -errno;
|
int err = -errno;
|
||||||
LFS_FILEBD_TRACE("lfs_filebd_createcfg -> %d", err);
|
LFS_FILEBD_TRACE("lfs_filebd_createcfg -> %d", err);
|
||||||
@@ -193,7 +202,11 @@ int lfs_filebd_sync(const struct lfs_config *cfg) {
|
|||||||
LFS_FILEBD_TRACE("lfs_filebd_sync(%p)", (void*)cfg);
|
LFS_FILEBD_TRACE("lfs_filebd_sync(%p)", (void*)cfg);
|
||||||
// file sync
|
// file sync
|
||||||
lfs_filebd_t *bd = cfg->context;
|
lfs_filebd_t *bd = cfg->context;
|
||||||
|
#ifdef _WIN32
|
||||||
|
int err = FlushFileBuffers((HANDLE) _get_osfhandle(fd)) ? 0 : -1;
|
||||||
|
#else
|
||||||
int err = fsync(bd->fd);
|
int err = fsync(bd->fd);
|
||||||
|
#endif
|
||||||
if (err) {
|
if (err) {
|
||||||
err = -errno;
|
err = -errno;
|
||||||
LFS_FILEBD_TRACE("lfs_filebd_sync -> %d", 0);
|
LFS_FILEBD_TRACE("lfs_filebd_sync -> %d", 0);
|
||||||
|
|||||||
Reference in New Issue
Block a user