From d0809fa25c43d179de621839a7aee2cdc05e3d65 Mon Sep 17 00:00:00 2001 From: Nikias Bassen Date: Fri, 8 May 2009 08:38:29 -0700 Subject: Handle file modes correctly [#4 state:resolved] Signed-off-by: Matt Colyer --- src/ifuse.c | 60 ++++++++++++++++++++++++++++++++++++++---------------------- 1 file changed, 38 insertions(+), 22 deletions(-) (limited to 'src/ifuse.c') diff --git a/src/ifuse.c b/src/ifuse.c index 68fcd5d..3364d35 100644 --- a/src/ifuse.c +++ b/src/ifuse.c @@ -97,36 +97,48 @@ static int ifuse_readdir(const char *path, void *buf, fuse_fill_dir_t filler, of return 0; } -static int ifuse_create(const char *path, mode_t mode, struct fuse_file_info *fi) +static int get_afc_file_mode(iphone_afc_file_mode_t *afc_mode, int flags) { - // exactly the same as open but using a different mode - iphone_afc_file_t file = NULL; - uint32 *argh_filehandle = (uint32 *) malloc(sizeof(uint32)); - iphone_afc_client_t afc = fuse_get_context()->private_data; - - iphone_afc_open_file(afc, path, IPHONE_AFC_FILE_WRITE | IPHONE_AFC_FILE_CREAT, &file); - *argh_filehandle = iphone_afc_get_file_handle(file); - fi->fh = *argh_filehandle; - g_hash_table_insert(file_handles, argh_filehandle, file); + switch (flags & O_ACCMODE) { + case O_RDONLY: + *afc_mode = AFC_FOPEN_RDONLY; + break; + case O_WRONLY: + if ((flags & O_TRUNC) == O_TRUNC) { + *afc_mode = AFC_FOPEN_WRONLY; + } else if ((flags & O_APPEND) == O_APPEND) { + *afc_mode = AFC_FOPEN_APPEND; + } else { + *afc_mode = AFC_FOPEN_RW; + } + break; + case O_RDWR: + if ((flags & O_TRUNC) == O_TRUNC) { + *afc_mode = AFC_FOPEN_WR; + } else if ((flags & O_APPEND) == O_APPEND) { + *afc_mode = AFC_FOPEN_RDAPPEND; + } else { + *afc_mode = AFC_FOPEN_RW; + } + break; + default: + *afc_mode = 0; + return -1; + } return 0; } + static int ifuse_open(const char *path, struct fuse_file_info *fi) { iphone_afc_file_t file = NULL; - uint32 *argh_filehandle = (uint32 *) malloc(sizeof(uint32)); iphone_afc_client_t afc = fuse_get_context()->private_data; - uint32_t mode = 0; iphone_error_t err; - - if ((fi->flags & 3) == O_RDWR) { - mode = IPHONE_AFC_FILE_RW; - } else if ((fi->flags & 3) == O_WRONLY) { - mode = IPHONE_AFC_FILE_WRITE; - } else if ((fi->flags & 3) == O_RDONLY) { - mode = IPHONE_AFC_FILE_READ; - } else { - mode = IPHONE_AFC_FILE_READ; + iphone_afc_file_mode_t mode = 0; + uint32 *argh_filehandle = (uint32 *) malloc(sizeof(uint32)); + + if (get_afc_file_mode(&mode, fi->flags) < 0 || (mode == 0)) { + return -EPERM; } err = iphone_afc_open_file(afc, path, mode, &file); @@ -141,7 +153,6 @@ static int ifuse_open(const char *path, struct fuse_file_info *fi) return -EINVAL; } - *argh_filehandle = iphone_afc_get_file_handle(file); fi->fh = *argh_filehandle; g_hash_table_insert(file_handles, argh_filehandle, file); @@ -149,6 +160,11 @@ static int ifuse_open(const char *path, struct fuse_file_info *fi) return 0; } +static int ifuse_create(const char *path, mode_t mode, struct fuse_file_info *fi) +{ + return ifuse_open(path, fi); +} + static int ifuse_read(const char *path, char *buf, size_t size, off_t offset, struct fuse_file_info *fi) { int bytes = 0; -- cgit v1.1-32-gdbae