static int vfs_fat_close(void* ctx, int fd);
static int vfs_fat_fstat(void* ctx, int fd, struct stat * st);
static int vfs_fat_stat(void* ctx, const char * path, struct stat * st);
+static int vfs_fat_fsync(void* ctx, int fd);
static int vfs_fat_link(void* ctx, const char* n1, const char* n2);
static int vfs_fat_unlink(void* ctx, const char *path);
static int vfs_fat_rename(void* ctx, const char *src, const char *dst);
.close_p = &vfs_fat_close,
.fstat_p = &vfs_fat_fstat,
.stat_p = &vfs_fat_stat,
+ .fsync_p = &vfs_fat_fsync,
.link_p = &vfs_fat_link,
.unlink_p = &vfs_fat_unlink,
.rename_p = &vfs_fat_rename,
return read;
}
+static int vfs_fat_fsync(void* ctx, int fd)
+{
+ vfs_fat_ctx_t* fat_ctx = (vfs_fat_ctx_t*) ctx;
+ _lock_acquire(&fat_ctx->lock);
+ FIL* file = &fat_ctx->files[fd];
+ FRESULT res = f_sync(file);
+ int rc = 0;
+ if (res != FR_OK) {
+ ESP_LOGD(TAG, "%s: fresult=%d", __func__, res);
+ errno = fresult_to_errno(res);
+ rc = -1;
+ }
+ _lock_release(&fat_ctx->lock);
+ return rc;
+}
+
static int vfs_fat_close(void* ctx, int fd)
{
vfs_fat_ctx_t* fat_ctx = (vfs_fat_ctx_t*) ctx;
va_end(args);
return ret;
}
+
+int fsync(int fd)
+{
+ const vfs_entry_t* vfs = get_vfs_for_fd(fd);
+ struct _reent* r = __getreent();
+ if (vfs == NULL) {
+ __errno_r(r) = EBADF;
+ return -1;
+ }
+ int local_fd = translate_fd(vfs, fd);
+ int ret;
+ CHECK_AND_CALL(ret, r, vfs, fsync, local_fd);
+ return ret;
+}