diff options
| -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  }; | 
