diff options
author | Matt Colyer | 2008-08-07 00:00:12 -0700 |
---|---|---|
committer | Matt Colyer | 2008-08-07 00:00:12 -0700 |
commit | 4c3f86499f8dfe344fb5f92b805e8c090290a79e (patch) | |
tree | bba8b935df1b5ef637065e789a66f7b9fd2888f4 | |
parent | 1c6aa3dd8aa8cd985a63ccbfa3848ebbe52715e1 (diff) | |
download | libplist-4c3f86499f8dfe344fb5f92b805e8c090290a79e.tar.gz libplist-4c3f86499f8dfe344fb5f92b805e8c090290a79e.tar.bz2 |
Added cleanup when closing a file, probably needs a bit more throughness
but its a start.
Added a missing unlock call so you can read a file more than once.
-rw-r--r-- | src/AFC.c | 4 | ||||
-rw-r--r-- | src/ifuse.c | 18 |
2 files changed, 19 insertions, 3 deletions
@@ -423,9 +423,11 @@ int afc_read_file(AFClient *client, AFCFile *file, char *data, int length) { bytes = receive_AFC_data(client, &input); if (bytes < 0) { if (input) free(input); + afc_unlock(client); return -1; } else if (bytes == 0) { if (input) free(input); + afc_unlock(client); return current_count; } else { if (input) { @@ -493,6 +495,4 @@ void afc_close_file(AFClient *client, AFCFile *file) { bytes = receive_AFC_data(client, &buffer); afc_unlock(client); return; - if (buffer) free(buffer); // we're *SUPPOSED* to get an "error" here. } - diff --git a/src/ifuse.c b/src/ifuse.c index a56289d..3d921fd 100644 --- a/src/ifuse.c +++ b/src/ifuse.c @@ -112,10 +112,25 @@ static int ifuse_read(const char *path, char *buf, size_t size, off_t offset, } bytes = afc_read_file(afc, file, buf, size); - return bytes; } +static int ifuse_release(const char *path, struct fuse_file_info *fi){ + AFCFile *file; + AFClient *afc = fuse_get_context()->private_data; + + file = g_hash_table_lookup(file_handles, &(fi->fh)); + if (!file){ + return -ENOENT; + } + afc_close_file(afc, file); + + free(file); + g_hash_table_remove(file_handles, &(fi->fh)); + + return 0; +} + void *ifuse_init(struct fuse_conn_info *conn) { char *response = (char*)malloc(sizeof(char) * 2048); int bytes = 0, port = 0, i = 0; @@ -171,6 +186,7 @@ static struct fuse_operations ifuse_oper = { .readdir = ifuse_readdir, .open = ifuse_open, .read = ifuse_read, + .release = ifuse_release, .init = ifuse_init, .destroy = ifuse_cleanup }; |