#include #include #include #include #include <9p.h> #include #include "common.h" #include "debug.h" #include "utils.h" #include "filepath.h" #include "holemanager.h" #include "rule.h" #include "filehandle.h" #include "fiddata.h" enum { DEBUG_FIDDATA = false }; struct FidData { FileHandle *handle; String *path; }; FidData *fiddata_new(String *path) { FidData *result; assert_valid(path); result = (FidData *)emallocz_fs(sizeof(*result)); result->path = s_clone(path); return result; } FidData *fiddata_charpath_new(char *path) { FidData *result; String *pathstring; assert_valid(path); pathstring = s_copy(path); result = fiddata_new(pathstring); s_free(pathstring); return result; } void fiddata_free(FidData *self) { if(self == nil) { return; } s_free(self->path); fiddata_clear_handle(self); free(self); } FidData *fiddata_copy(FidData *self) { return fiddata_new(self->path); } char *fiddata_path(FidData *self) { assert_valid(self); return s_to_c(self->path); } String *fiddata_path_string(FidData *self) { assert_valid(self); return self->path; } void fiddata_set_path_string(FidData *self, String *path) { assert_valid(self); assert_valid(path); filepath_copy(&(self->path), path); } void fiddata_read(FidData *self, Req *request, HoleManager *holemanager) { assert_valid(self); assert_valid(request); filehandle_read(self->handle, request, holemanager); } void fiddata_write(FidData *self, Req *request) { assert_valid(self); assert_valid(request); filehandle_write(self->handle, request); } void fiddata_clear_handle(FidData *self) { assert_valid(self); fiddata_set_handle(self, nil); } void fiddata_set_handle(FidData *self, FileHandle *handle) { assert_valid(self); filehandle_free(self->handle); self->handle = handle; } int fiddata_isopen(FidData *self) { assert_valid(self); return self->handle != nil; } void fiddata_dump(FidData *self) { assert_valid(self); NOISE(DEBUG_FIDDATA, "fiddata path: %s", s_to_c(self->path)); }