summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Paul Sladen2008-09-02 11:47:39 +0300
committerGravatar Matt Colyer2008-09-02 08:37:31 -0700
commitb61d63f43f28d2ec94f750753b1d6d4748fd944b (patch)
tree3c47416eddb02704486f3b1a53d0fc2957710985
parent2b05e48cb4a90dfc94ff584124f08e431398bb1a (diff)
downloadlibplist-b61d63f43f28d2ec94f750753b1d6d4748fd944b.tar.gz
libplist-b61d63f43f28d2ec94f750753b1d6d4748fd944b.tar.bz2
Added --root option to use afc2, expand README
-rw-r--r--README103
-rw-r--r--src/ifuse.c33
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 <mountpoint> -s
To unmount:
- umount mountpoint
+ umount <mountpoint>
+
+(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);
}