From b61d63f43f28d2ec94f750753b1d6d4748fd944b Mon Sep 17 00:00:00 2001 From: Paul Sladen Date: Tue, 2 Sep 2008 11:47:39 +0300 Subject: Added --root option to use afc2, expand README --- README | 103 ++++++++++++++++++++++++++++++++++++++++++++++++++++++------ src/ifuse.c | 33 +++++++++++++++++-- 2 files changed, 124 insertions(+), 12 deletions(-) diff --git a/README b/README index ee724f8..bce0808 100644 --- a/README +++ b/README @@ -1,6 +1,10 @@ INSTALLATION ================================================================================ +For: + Apple iPhone/iPod Touch 1.0/1.1/1.1.1/1.2/1.3/2.0+ + + iPod USB cable + You must have: libgnutls-dev libusb-dev @@ -17,25 +21,106 @@ To compile run: ./autogen.sh ./configure make - sudo make install (if you want to install it into your system directories) - libiphone-initconf (as the user you intend to user the library) + sudo make install # (if you want to install it into your system directories) + libiphone-initconf # (as the user you intend to user the library) + +On Ubuntu/Debian, you can do: + sudo apt-get install build-essential automake autoconf \ + libgnutls-dev libusb-dev libfuse-dev libglib2.0-dev libxml2-dev USAGE ================================================================================ -IMPORTANT: Before using the library you must run "libiphone-initconf". It will -generate keys and a host id for your system. It only needs to be run once but -it MUST be run. +Now comes the fun bit! + +== Generating keys == + +IMPORTANT: Before using the library you must run "libiphone-initconf" +as your own user (not root). It will generate keys and a host id for your +system to be able to communicate with 'lockdownd' on the iPhone. + +It will probably take 5-10 minutes, but thankfully only needs to be +run _once_. It MUST be run otherwise communication will not work: + + libiphone-initconf + +The generated keys are saved in '~/.config/libiphone/' in your home directory. + +== Tools == -There are currently 2 executables iphoneclient and ifuse, located in src/. +There are currently two more executables 'ifuse' and 'iphoneclient', +both located in src/. -iphoneclient is a basic commandline interface, it just runs a few various operations. + +=== iFuse === + +This is probably what you're after; this mounts a view of your +iPhone/iPod Touch's filesystem over the USB interface using the native +Apple protocol (AFC/"com.apple.afc"). ifuse is a Fuse filesystem which allows you to mount your iPhone to a directory like this: - ./src/ifuse mountpoint + ./src/ifuse -s To unmount: - umount mountpoint + umount + +(nb: '-s' is to force single-threaded mode, as ifuse maybe unstable without it). + +Eg: + mkdir ~/iphone + + ifuse ~/iphone -s + ls -l ~/iphone + ... + umount ~/iphone + +Currently ifuse (via the AFC protocol) only gives access to the +'/var/root/Media/' chroot on the iPhone (containing music/pictures). + +If you have a device that has been jailedbreaked then an additional +("com.apple.afc2") service will have been installed, without the chroot. +On jailbroken devices only, you can do: + + ifuse ~/iphone --root -s + +And this will mount a full view of the iPhone's filesystem. + + +==== Setting up FUSE ==== + +Note that on some systems, you may have to load the 'fuse' kernel +module first and to ensure that you are a member of the 'fuse' group: + + sudo modprobe fuse + sudo adduser $USER fuse + +You can check your membership of the 'fuse' group with: + + id | grep fuse && echo yes! || echo not yet... + +If you have just added yourself, you will need to logout and log back +in for the group change to become visible. + + +=== iphoneclient === + +'iphoneclient' is a basic commandline interface for testing, it just +runs a few various test operations such as attempting to view/create a +test file in the iPhone, but is mainly a developer tool. + + +== Who/what/where? == + +wiki: + http://matt.colyer.name/projects/iphone-linux/index.php?title=Main_Page + +code: + git clone http://git.matt.colyer.name/2008/libiphone/ + +mailing list: + http://lists.mattcolyer.com/listinfo.cgi/iphone-linux-dev-mattcolyer.com +updated: + 2008-09-02 diff --git a/src/ifuse.c b/src/ifuse.c index ad34eb5..aef24bd 100644 --- a/src/ifuse.c +++ b/src/ifuse.c @@ -169,7 +169,7 @@ static int ifuse_release(const char *path, struct fuse_file_info *fi) return 0; } -void *ifuse_init(struct fuse_conn_info *conn) +void *ifuse_init_with_service(struct fuse_conn_info *conn, const char *service_name) { int port = 0; iphone_afc_client_t afc = NULL; @@ -191,7 +191,7 @@ void *ifuse_init(struct fuse_conn_info *conn) return NULL; } - if (IPHONE_E_SUCCESS == iphone_lckd_start_service(control, "com.apple.afc", &port) && !port) { + if (IPHONE_E_SUCCESS == iphone_lckd_start_service(control, service_name, &port) && !port) { iphone_lckd_free_client(control); iphone_free_device(phone); fprintf(stderr, "Something went wrong when starting AFC."); @@ -298,6 +298,16 @@ int ifuse_mkdir(const char *dir, mode_t ignored) return -1; } +void *ifuse_init_normal(struct fuse_conn_info *conn) +{ + return ifuse_init_with_service(conn, "com.apple.afc"); +} + +void *ifuse_init_jailbroken(struct fuse_conn_info *conn) +{ + return ifuse_init_with_service(conn, "com.apple.afc2"); +} + static struct fuse_operations ifuse_oper = { .getattr = ifuse_getattr, .statfs = ifuse_statfs, @@ -314,11 +324,28 @@ static struct fuse_operations ifuse_oper = { .rename = ifuse_rename, .fsync = ifuse_fsync, .release = ifuse_release, - .init = ifuse_init, + .init = ifuse_init_normal, .destroy = ifuse_cleanup }; int main(int argc, char *argv[]) { + char **ammended_argv; + int i, j; + + // Parse extra options + if (argc > 2 && (ammended_argv = malloc((argc + 1) * sizeof(*ammended_argv)))) { + for (i = j = 0; ammended_argv[j] = argv[i], i < argc; i++) { + // Try to use the (jailbroken) com.apple.afc2 if requested by the user + if (argv[i] && (!strcmp("--root", argv[i]) || !strcmp("--afc2", argv[i]))) { + ifuse_oper.init = ifuse_init_jailbroken; + continue; + } + j++; + } + argv = ammended_argv; + argc = j; + } + return fuse_main(argc, argv, &ifuse_oper, NULL); } -- cgit v1.1-32-gdbae