summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Matt Colyer2008-07-30 09:42:15 -0700
committerGravatar Matt Colyer2008-07-30 09:42:15 -0700
commited6e6e57a819c78b888b1b71056ccc4ebb40434f (patch)
tree68ce222301295e9768939e5bf018daf51b741c28
parent3dc130f3049e250b2d5c0b48af1995fda2fad3d4 (diff)
downloadlibimobiledevice-ed6e6e57a819c78b888b1b71056ccc4ebb40434f.tar.gz
libimobiledevice-ed6e6e57a819c78b888b1b71056ccc4ebb40434f.tar.bz2
Added beginnings of a fuse fs, right now it's read only and terribly fragile.
-rw-r--r--src/AFC.h5
-rw-r--r--src/Makefile.am7
-rw-r--r--src/ifuse.c135
3 files changed, 140 insertions, 7 deletions
diff --git a/src/AFC.h b/src/AFC.h
index 787b9fe..6e1bf77 100644
--- a/src/AFC.h
+++ b/src/AFC.h
@@ -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);
+}