diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/AFC.h | 5 | ||||
-rw-r--r-- | src/Makefile.am | 7 | ||||
-rw-r--r-- | src/ifuse.c | 135 |
3 files changed, 140 insertions, 7 deletions
@@ -10,6 +10,7 @@ #include <string.h> #include <stdio.h> #include <stdlib.h> +#include <sys/stat.h> typedef struct { //const uint32 header1 = 0x36414643; // '6AFC' or 'CFA6' when sent ;) @@ -38,10 +39,6 @@ typedef struct __AFCToken { char *token; } AFCToken; -enum { - S_IFREG = 0, - S_IFDIR = 1 -}; enum { AFC_FILE_READ = 0x00000002, diff --git a/src/Makefile.am b/src/Makefile.am index cb05d95..ed1ae59 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,5 +1,6 @@ -AM_CFLAGS = `xml2-config --cflags` -AM_LDFLAGS = `xml2-config --libs` -lusb -lgnutls +AM_CFLAGS = `xml2-config --cflags` `pkg-config fuse --cflags` `pkg-config glib-2.0 --cflags` -g +AM_LDFLAGS = `xml2-config --libs` `pkg-config fuse --libs` `pkg-config glib-2.0 --libs` -lusb -lgnutls -bin_PROGRAMS = iphoneclient +bin_PROGRAMS = iphoneclient ifuse iphoneclient_SOURCES = usbmux.c main.c iphone.c plist.c lockdown.c AFC.c +ifuse_SOURCES = ifuse.c usbmux.c iphone.c plist.c lockdown.c AFC.c diff --git a/src/ifuse.c b/src/ifuse.c new file mode 100644 index 0000000..eb124af --- /dev/null +++ b/src/ifuse.c @@ -0,0 +1,135 @@ +#define FUSE_USE_VERSION 26 + +#include <fuse.h> +#include <stdio.h> +#include <string.h> +#include <errno.h> +#include <fcntl.h> +#include <usb.h> +#include <libxml/parser.h> +#include <libxml/tree.h> +#include <glib.h> + +#include "usbmux.h" +#include "iphone.h" +#include "plist.h" +#include "lockdown.h" +#include "AFC.h" + + +AFClient *afc; +GHashTable *file_handles; +int fh_index = 0; + +int debug = 0; + +static int ifuse_getattr(const char *path, struct stat *stbuf) { + int res = 0; + AFCFile *file; + + memset(stbuf, 0, sizeof(struct stat)); + file = afc_get_file_info(afc, path); + if (!file){ + res = -ENOENT; + } + + stbuf->st_mode = file->type | 0444; + stbuf->st_size = file->size; + //stbuf->st_nlink = 2; + + return res; +} + +static int ifuse_readdir(const char *path, void *buf, fuse_fill_dir_t filler, + off_t offset, struct fuse_file_info *fi) { + int i; + char **dirs, **filename; + + dirs = afc_get_dir_list(afc, path); + for (i = 0; strcmp(dirs[i], ""); i++) { + filler(buf, dirs[i], NULL, 0); + } + + free_dictionary(dirs); + + return 0; +} + +static int ifuse_open(const char *path, struct fuse_file_info *fi) { + AFCFile *file; + + if((fi->flags & 3) != O_RDONLY) + return -EACCES; + + file = afc_open_file(afc, path, AFC_FILE_READ); + + fh_index++; + fi->fh = fh_index; + g_hash_table_insert(file_handles, &fh_index, file); + + return 0; +} + +static int ifuse_read(const char *path, char *buf, size_t size, off_t offset, + struct fuse_file_info *fi) { + int bytes; + AFCFile *file; + + file = g_hash_table_lookup(file_handles, &(fi->fh)); + if (!file){ + return -ENOENT; + } + + bytes = afc_read_file(afc, file, buf, size); + + return bytes; +} + +void ifuse_init(struct fuse_conn_info *conn) { + char *response = (char*)malloc(sizeof(char) * 2048); + int bytes = 0, port = 0, i = 0; + + file_handles = g_hash_table_new(g_int_hash, g_int_equal); + + iPhone *phone = get_iPhone(); + if (!phone){ + fprintf(stderr, "No iPhone found, is it connected?\n"); + return -1; + } + + lockdownd_client *control = new_lockdownd_client(phone); + if (!lockdownd_hello(control)) { + fprintf(stderr, "Something went wrong in the lockdownd client.\n"); + return -1; + } + + //if (!lockdownd_start_SSL_session(control, "29942970-207913891623273984")) { + fprintf(stderr, "Something went wrong in GnuTLS.\n"); + return -1; + } + + port = lockdownd_start_service(control, "com.apple.afc"); + if (!port) { + fprintf(stderr, "Something went wrong when starting AFC."); + } + + afc = afc_connect(phone, 3432, port); + +} + +void ifuse_cleanup() { + afc_disconnect(afc); +} + +static struct fuse_operations ifuse_oper = { + .getattr = ifuse_getattr, + .readdir = ifuse_readdir, + .open = ifuse_open, + .read = ifuse_read, + .init = ifuse_init, + .destroy = ifuse_cleanup +}; + +int main(int argc, char *argv[]) { + return fuse_main(argc, argv, &ifuse_oper, NULL); +} |