}
r = sync_dir(pd);
- if(r) {
- set_error(pd,"Failed to sync parent directory",1);
- return COQUET_RET_VFSERR;
+ if(r != COQUET_RET_OK) {
+ return r;
}
*fd_field = fd;
set_error(pd,"File not open",0);
return COQUET_RET_VFSERR;
}
+
r = close(*fd_field);
if(r==-1) {
set_error(pd,"close failed",1);
return COQUET_RET_VFSERR;
}
+
+ *fd_field = -1;
return COQUET_RET_OK;
}
return COQUET_RET_OK;
}
+static int posix_delete(void *vfs_data, int which_file) {
+ struct posix_data * pd = (struct posix_data *)vfs_data;
+ int *fd, r;
+ char *path;
+
+ fd = file_fd(pd,which_file);
+ if(fd && *fd != -1) {
+ set_error(pd,"trying to delete open file",0);
+ return COQUET_RET_VFSERR;
+ }
+
+ path = filename(pd,which_file);
+ if(path == NULL) {
+ return COQUET_RET_HEAPERR;
+ }
+
+ r = unlink(path);
+ free(path);
+ if(r == -1) {
+ set_error(pd,"delete failed",1);
+ return COQUET_RET_VFSERR;
+ }
+
+ r = sync_dir(pd);
+ if(r != COQUET_RET_OK) {
+ return r;
+ }
+
+ return COQUET_RET_OK;
+}
+
+
vfs_t vfs_posix = {
.make = posix_make,
.start = posix_start,
.close = posix_close,
.write = posix_write,
.read = posix_read,
- .finish = posix_finish
+ .finish = posix_finish,
+ .delete = posix_delete
};
*/
int (*finish)(void *vfs_data);
+ /* Delete the given file. File will be closed.
+ */
+ int (*delete)(void *vfs_data, int which_file);
+
} vfs_t;
#endif