summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Makefile.am2
-rw-r--r--configure.ac8
-rw-r--r--fdi/30-ifuse.fdi46
-rw-r--r--fdi/Makefile.am4
-rw-r--r--src/Makefile.am2
-rw-r--r--src/ifuse.c125
6 files changed, 103 insertions, 84 deletions
diff --git a/Makefile.am b/Makefile.am
index 70e1c93..e015eec 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -1,5 +1,5 @@
AUTOMAKE_OPTIONS = foreign
-SUBDIRS = src fdi
+SUBDIRS = src
DISTCHECK_CONFIGURE_FLAGS = --disable-root-sbin
diff --git a/configure.ac b/configure.ac
index 3d013be..f9fdc8e 100644
--- a/configure.ac
+++ b/configure.ac
@@ -34,10 +34,4 @@ AC_FUNC_MALLOC
AC_FUNC_REALLOC
AC_CHECK_FUNCS([strcasecmp strdup strerror strndup])
-AC_ARG_ENABLE([root-sbin],
- AS_HELP_STRING([--disable-root-sbin],
- [Don't install mount helper in /sbin]),
- [without_root_sbin=yes],[without_root_sbin=no])
-AM_CONDITIONAL([WITHOUT_ROOT_SBIN], test "x$without_root_sbin" = "xyes")
-
-AC_OUTPUT(Makefile src/Makefile fdi/Makefile)
+AC_OUTPUT(Makefile src/Makefile)
diff --git a/fdi/30-ifuse.fdi b/fdi/30-ifuse.fdi
deleted file mode 100644
index 5a47d15..0000000
--- a/fdi/30-ifuse.fdi
+++ /dev/null
@@ -1,46 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<deviceinfo version="0.2">
- <device>
- <match key="info.subsystem" string="usb_device">
- <match key="usb_device.vendor_id" int="0x5ac">
- <match key="usb_device.product_id" compare_ge="0x1290">
- <match key="usb_device.product_id" compare_le="0x1294">
- <append key="info.capabilities" type="strlist">block</append>
- <append key="info.capabilities" type="strlist">storage</append>
- <merge key="storage.hotpluggable" type="bool">false</merge>
- <merge key="storage.removable" type="bool">true</merge>
- <merge key="storage.requires_eject" type="bool">false</merge>
- <merge key="storage.automount_enabled_hint" type="bool">true</merge>
- <!-- This also applies to the iPhone as it has the same filesystem structure -->
- <merge key="storage.model" type="string">iPod</merge>
- <merge key="storage.vendor" type="copy_property">usb_device.vendor</merge>
- <merge key="storage.serial" type="copy_property">usb_device.serial</merge>
- <merge key="storage.orginating_device" type="copy_property">/org/freedesktop/Hal/devices/computer</merge>
- <append key="block.device" type="copy_property">linux.device_file</append>
- <merge key="block.storage_device" type="copy_property">info.udi</merge>
- </match>
- </match>
- </match>
- </match>
- <match key="info.subsystem" string="usb">
- <match key="usb.vendor_id" int="0x5ac">
- <match key="usb.product_id" compare_ge="0x1290">
- <match key="usb.product_id" compare_le="0x1294">
- <match key="usb.interface.number" int="0x1">
- <append key="info.capabilities" type="strlist">block</append>
- <append key="info.capabilities" type="strlist">volume</append>
- <merge key="info.category" type="string">volume</merge>
- <append key="block.device" type="copy_property">@info.parent:linux.device_file</append>
- <merge key="block.storage_device" type="copy_property">@info.parent:info.udi</merge>
- <merge key="volume.mount.valid_options" type="strlist">allow_other</merge>
- <append key="volume.fstype" type="string">fuse.ifuse</append>
- <append key="volume.fsusage" type="string">filesystem</append>
- <append key="volume.label" type="copy_property">@info.parent:usb_device.product</append>
- <append key="volume.uuid" type="copy_property">@info.parent:usb_device.serial</append>
- </match>
- </match>
- </match>
- </match>
- </match>
- </device>
-</deviceinfo>
diff --git a/fdi/Makefile.am b/fdi/Makefile.am
deleted file mode 100644
index adfa88c..0000000
--- a/fdi/Makefile.am
+++ /dev/null
@@ -1,4 +0,0 @@
-freedesktopfdidir=$(prefix)/share/hal/fdi/information/20thirdparty
-freedesktopfdi_DATA=30-ifuse.fdi
-
-EXTRA_DIST=$(freedesktopfdi_DATA)
diff --git a/src/Makefile.am b/src/Makefile.am
index 59cb4ba..63988d4 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1,6 +1,6 @@
AM_CFLAGS = $(libglib2_CFLAGS) $(libfuse_CFLAGS) $(libiphone_CFLAGS) -g
AM_LDFLAGS = $(libglib2_LIBS) $(libfuse_LIBS) $(libiphone_LIBS)
-bin_PROGRAMS = ifuse
+bin_PROGRAMS = ifuse
ifuse_SOURCES = ifuse.c
diff --git a/src/ifuse.c b/src/ifuse.c
index bf5f9aa..7c510e2 100644
--- a/src/ifuse.c
+++ b/src/ifuse.c
@@ -21,6 +21,10 @@
#define FUSE_USE_VERSION 26
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif /* HAVE_CONFIG_H */
+
#include <fuse.h>
#include <stdio.h>
#include <string.h>
@@ -45,6 +49,30 @@ lockdownd_client_t control = NULL;
int debug = 0;
+static struct {
+ char *mount_point;
+ char *device_uuid;
+} opts;
+
+enum {
+ KEY_HELP = 1,
+ KEY_VERSION,
+ KEY_ROOT,
+ KEY_UUID,
+ KEY_DEBUG
+};
+
+static struct fuse_opt ifuse_opts[] = {
+ FUSE_OPT_KEY("-V", KEY_VERSION),
+ FUSE_OPT_KEY("--version", KEY_VERSION),
+ FUSE_OPT_KEY("-h", KEY_HELP),
+ FUSE_OPT_KEY("--help", KEY_HELP),
+ FUSE_OPT_KEY("--uuid=", KEY_UUID),
+ FUSE_OPT_KEY("--root", KEY_ROOT),
+ FUSE_OPT_KEY("--debug", KEY_DEBUG),
+ FUSE_OPT_END
+};
+
static void free_dictionary(char **dictionary)
{
int i = 0;
@@ -543,57 +571,104 @@ static struct fuse_operations ifuse_oper = {
.destroy = ifuse_cleanup
};
+static void print_usage()
+{
+ fprintf(stderr, "Usage: ifuse <mount_point> [OPTIONS]\n");
+ fprintf(stderr, "Mount filesystem of an iPhone/iPod Touch.\n\n");
+ fprintf(stderr, " -o opt,[opt...]\tmount options\n");
+ fprintf(stderr, " -u, --uuid UUID\tmount specific device by its 40-digit device UUID\n");
+ fprintf(stderr, " -h, --help\t\tprint usage information\n");
+ fprintf(stderr, " -V, --version\t\tprint version\n");
+ fprintf(stderr, " --root\t\tmount root file system (jailbroken device required)\n");
+ fprintf(stderr, " --debug\t\tenable libiphone communication debugging\n");
+ fprintf(stderr, "\n");
+ fprintf(stderr, "Example:\n\n");
+ fprintf(stderr, " $ ifuse /media/iPhone --root\n\n");
+ fprintf(stderr, " This mounts the root filesystem of the first attached device on\n");
+ fprintf(stderr, " this computer in the directory /media/iPhone.\n");
+ fprintf(stderr, "\n");
+}
+
static int ifuse_opt_proc(void *data, const char *arg, int key, struct fuse_args *outargs)
{
char *tmp;
static int option_num = 0;
- (void) data;
+ int res = 1;
switch (key) {
+ case KEY_UUID:
+ opts.device_uuid = strdup(arg+7);
+ res = 0;
+ break;
+ case KEY_DEBUG:
+ iphone_set_debug_mask(DBGMASK_ALL);
+ iphone_set_debug_level(1);
+ res = 0;
+ break;
+ case KEY_ROOT:
+ ifuse_oper.init = ifuse_init_jailbroken;
+ res = 0;
+ break;
+ case KEY_HELP:
+ print_usage();
+ exit(1);
+ case KEY_VERSION:
+ fprintf(stderr, "%s version %s\n", PACKAGE_NAME, PACKAGE_VERSION);
+ exit(0);
case FUSE_OPT_KEY_OPT:
- if (strcmp(arg, "allow_other") == 0 || strcmp(arg, "-d") == 0 || strcmp(arg, "-s") == 0)
- return 1;
- else if (strcmp(arg, "--root") == 0) {
- ifuse_oper.init = ifuse_init_jailbroken;
- return 0;
- } else if (strcmp(arg, "--debug") == 0) {
- iphone_set_debug_mask(DBGMASK_ALL);
- iphone_set_debug_level(1);
- return 0;
- } else
- return 0;
+ /* ignore other options and pass them to fuse_main later */
break;
case FUSE_OPT_KEY_NONOPT:
+ if(option_num == 0) {
+ opts.mount_point = strdup(arg);
+ }
+ if(option_num == 1) {
+ /* compatibility to older style which passed a device file option first */
+ free(opts.mount_point);
+ opts.mount_point = strdup(arg);
+ }
option_num++;
-
- // Throw the first nameless option away (the mountpoint)
- if (option_num == 1)
- return 0;
- else
- return 1;
+ break;
}
- return 1;
+ return res;
}
int main(int argc, char *argv[])
{
char **ammended_argv;
- int i, j;
struct fuse_args args = FUSE_ARGS_INIT(argc, argv);
+ struct stat mst;
- if (fuse_opt_parse(&args, NULL, NULL, ifuse_opt_proc) == -1) {
+ memset(&opts, 0, sizeof(opts));
+
+ if (fuse_opt_parse(&args, NULL, ifuse_opts, ifuse_opt_proc) == -1) {
return -1;
}
fuse_opt_add_arg(&args, "-oallow_other");
- if (argc < 2) {
- fprintf(stderr, "A path to the USB device must be specified\n");
+ if (!opts.mount_point) {
+ fprintf(stderr, "ERROR: No mount point specified\n");
+ return -1;
+ }
+
+ if (opts.device_uuid && strlen(opts.device_uuid) != 40) {
+ fprintf(stderr, "Invalid device UUID specified, length needs to be 40 characters\n");
+ return -1;
+ }
+
+ if (stat(opts.mount_point, &mst) < 0) {
+ if (errno == ENOENT) {
+ fprintf(stderr, "ERROR: the mount point specified does not exist\n");
+ return -1;
+ }
+
+ fprintf(stderr, "There was an error accessing the mount point: %s\n", strerror(errno));
return -1;
}
- iphone_get_device(&phone);
+ iphone_device_new(&phone, opts.device_uuid ? opts.device_uuid : NULL);
if (!phone) {
- fprintf(stderr, "No iPhone found, is it connected?\n");
+ fprintf(stderr, "No device found, is it connected?\n");
fprintf(stderr, "If it is make sure that your user has permissions to access the raw usb device.\n");
fprintf(stderr, "If you're still having issues try unplugging the device and reconnecting it.\n");
return 0;