diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/ifuse.c | 33 | 
1 files changed, 30 insertions, 3 deletions
| 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);  } | 
