diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..58b2f17
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,34 @@
+# git-ls-files --others --exclude-from=.git/info/exclude
+# Lines that start with '#' are comments.
+# For a project mostly in C, the following would be a good set of
+# exclude patterns (uncomment them if you want to use them):
+*.[oa]
+*~
+*.po
+*.lo
+*.la
+autom4te.cache/*
+*.in
+*/.deps/*
+m4/*
+*.swp
+aclocal.m4
+config.h
+config.log
+config.sub
+config.guess
+config.status
+configure
+depcomp
+install-sh
+compile
+main
+ltmain.sh
+missing
+mkinstalldirs
+libtool
+*Makefile
+stamp-h1
+src/.libs
+src/sbmanager
+data/data.h
diff --git a/AUTHORS b/AUTHORS
new file mode 100644
index 0000000..b818ec5
--- /dev/null
+++ b/AUTHORS
@@ -0,0 +1 @@
+Nikias Bassen
diff --git a/COPYING b/COPYING
new file mode 100644
index 0000000..08ddefd
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,340 @@
+		    GNU GENERAL PUBLIC LICENSE
+		       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+		    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+			    NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+		     END OF TERMS AND CONDITIONS
+
+	    How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License along
+    with this program; if not, write to the Free Software Foundation, Inc.,
+    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.
+
diff --git a/Makefile.am b/Makefile.am
new file mode 100644
index 0000000..4c3e7c3
--- /dev/null
+++ b/Makefile.am
@@ -0,0 +1,4 @@
+AUTOMAKE_OPTIONS = foreign
+ACLOCAL_AMFLAGS = -I m4
+SUBDIRS = src
+
diff --git a/README b/README
new file mode 100644
index 0000000..1658dcd
--- /dev/null
+++ b/README
@@ -0,0 +1,15 @@
+iphoneinstaller
+----------
+
+iphoneinstaller is a tool to interact with the installation_proxy 
+of an iPhone/iPod Touch device allowing to install, upgrade, uninstall,
+archive, restore, and enumerate installed or archived apps.
+
+It makes use of the libiphone library that allows communication
+with the devices.
+
+For more information:
+	http://matt.colyer.name/projects/iphone-linux/
+
+README updated on:
+	2010-01-04
diff --git a/autogen.sh b/autogen.sh
new file mode 100755
index 0000000..cb3887a
--- /dev/null
+++ b/autogen.sh
@@ -0,0 +1,10 @@
+#!/bin/sh
+aclocal -I m4
+libtoolize
+autoheader
+automake --add-missing
+autoconf
+
+if [ -z "$NOCONFIGURE" ]; then
+    ./configure "$@"
+fi
diff --git a/configure.ac b/configure.ac
new file mode 100644
index 0000000..790e004
--- /dev/null
+++ b/configure.ac
@@ -0,0 +1,48 @@
+#                                               -*- Autoconf -*-
+# Process this file with autoconf to produce a configure script.
+
+AC_PREREQ(2.61)
+AC_INIT(iphoneinstaller, 1.0.0, nospam@nowhere.com)
+AM_INIT_AUTOMAKE([dist-bzip2 no-dist-gzip])
+m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES])
+AC_CONFIG_SRCDIR([src/])
+AC_CONFIG_HEADERS([config.h])
+AC_CONFIG_MACRO_DIR([m4])
+
+# Checks for programs.
+AC_PROG_CC
+AM_PROG_CC_C_O
+AC_PROG_LIBTOOL
+
+# Checks for libraries.
+PKG_CHECK_MODULES(libiphone, libiphone-1.0)
+PKG_CHECK_MODULES(libplist, libplist >= 0.15)
+PKG_CHECK_MODULES(libzip, libzip >= 0.8)
+
+# Checks for header files.
+AC_HEADER_STDC
+AC_CHECK_HEADERS([stdint.h stdlib.h string.h])
+
+# Checks for typedefs, structures, and compiler characteristics.
+AC_C_CONST
+AC_TYPE_SIZE_T
+AC_TYPE_SSIZE_T
+AC_TYPE_UINT16_T
+AC_TYPE_UINT32_T
+AC_TYPE_UINT8_T
+
+# Checks for library functions.
+AC_FUNC_MALLOC
+AC_FUNC_REALLOC
+AC_CHECK_FUNCS([strcasecmp strdup strerror strndup])
+
+AS_COMPILER_FLAGS(GLOBAL_CFLAGS, "-Wall -Wextra -Wmissing-declarations -Wredundant-decls -Wshadow -Wpointer-arith  -Wwrite-strings -Wswitch-default -Wno-unused-parameter -Werror -g")
+AC_SUBST(GLOBAL_CFLAGS)
+
+m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])])
+
+AC_OUTPUT([
+Makefile
+src/Makefile
+])
+
diff --git a/m4/as-compiler-flag.m4 b/m4/as-compiler-flag.m4
new file mode 100644
index 0000000..0f660cf
--- /dev/null
+++ b/m4/as-compiler-flag.m4
@@ -0,0 +1,62 @@
+dnl as-compiler-flag.m4 0.1.0
+
+dnl autostars m4 macro for detection of compiler flags
+
+dnl David Schleef <ds@schleef.org>
+
+dnl $Id: as-compiler-flag.m4,v 1.1 2005/12/15 23:35:19 ds Exp $
+
+dnl AS_COMPILER_FLAG(CFLAGS, ACTION-IF-ACCEPTED, [ACTION-IF-NOT-ACCEPTED])
+dnl Tries to compile with the given CFLAGS.
+dnl Runs ACTION-IF-ACCEPTED if the compiler can compile with the flags,
+dnl and ACTION-IF-NOT-ACCEPTED otherwise.
+
+AC_DEFUN([AS_COMPILER_FLAG],
+[
+  AC_MSG_CHECKING([to see if compiler understands $1])
+
+  save_CFLAGS="$CFLAGS"
+  CFLAGS="$CFLAGS $1"
+
+  AC_TRY_COMPILE([ ], [], [flag_ok=yes], [flag_ok=no])
+  CFLAGS="$save_CFLAGS"
+
+  if test "X$flag_ok" = Xyes ; then
+    m4_ifvaln([$2],[$2])
+    true
+  else
+    m4_ifvaln([$3],[$3])
+    true
+  fi
+  AC_MSG_RESULT([$flag_ok])
+])
+
+dnl AS_COMPILER_FLAGS(VAR, FLAGS)
+dnl Tries to compile with the given CFLAGS.
+
+AC_DEFUN([AS_COMPILER_FLAGS],
+[
+  list=$2
+  flags_supported=""
+  flags_unsupported=""
+  AC_MSG_CHECKING([for supported compiler flags])
+  for each in $list
+  do
+    save_CFLAGS="$CFLAGS"
+    CFLAGS="$CFLAGS $each"
+    AC_TRY_COMPILE([ ], [], [flag_ok=yes], [flag_ok=no])
+    CFLAGS="$save_CFLAGS"
+
+    if test "X$flag_ok" = Xyes ; then
+      flags_supported="$flags_supported $each"
+    else
+      flags_unsupported="$flags_unsupported $each"
+    fi
+  done
+  AC_MSG_RESULT([$flags_supported])
+  if test "X$flags_unsupported" != X ; then
+    AC_MSG_WARN([unsupported compiler flags: $flags_unsupported])
+  fi
+  $1="$$1 $flags_supported"
+])
+
diff --git a/src/Makefile.am b/src/Makefile.am
new file mode 100644
index 0000000..028e2e1
--- /dev/null
+++ b/src/Makefile.am
@@ -0,0 +1,17 @@
+AM_CFLAGS =			\
+	$(GLOBAL_CFLAGS)	\
+	$(libiphone_CFLAGS)	\
+	$(libplist_CFLAGS)	\
+	$(libzip_CFLAGS)
+
+AM_LDFLAGS =			\
+	$(libiphone_LIBS)	\
+	$(libplist_LIBS)	\
+	$(libzip_LIBS)
+
+bin_PROGRAMS = iphoneinstaller
+
+iphoneinstaller_SOURCES = iphoneinstaller.c
+iphoneinstaller_CFLAGS = $(AM_CFLAGS)
+iphoneinstaller_LDFLAGS = $(AM_LDFLAGS)
+
diff --git a/src/iphoneinstaller.c b/src/iphoneinstaller.c
new file mode 100644
index 0000000..d3e311c
--- /dev/null
+++ b/src/iphoneinstaller.c
@@ -0,0 +1,982 @@
+/**
+ * iphoneinstaller -- Manage iPhone/iPod apps
+ *
+ * Copyright (C) 2010 Nikias Bassen <nikias@gmx.li>
+ *
+ * Licensed under the GNU General Public License Version 2
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more profile.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 
+ * USA
+ */
+#include <stdlib.h>
+#define _GNU_SOURCE 1
+#define __USE_GNU 1
+#include <stdio.h>
+#include <string.h>
+#include <getopt.h>
+#include <errno.h>
+#include <time.h>
+
+#include <libiphone/libiphone.h>
+#include <libiphone/lockdown.h>
+#include <libiphone/installation_proxy.h>
+#include <libiphone/notification_proxy.h>
+#include <libiphone/afc.h>
+
+#include <plist/plist.h>
+
+#include <zip.h>
+
+const char PKG_PATH[] = "PublicStaging";
+const char APPARCH_PATH[] = "ApplicationArchives";
+
+char *uuid = NULL;
+char *options = NULL;
+char *appid = NULL;
+
+int list_apps_mode = 0;
+int install_mode = 0;
+int uninstall_mode = 0;
+int upgrade_mode = 0;
+int list_archives_mode = 0;
+int archive_mode = 0;
+int restore_mode = 0;
+int remove_archive_mode = 0;
+
+char *last_status = NULL;
+int wait_for_op_complete = 0;
+int notification_expected = 0;
+int op_completed = 0;
+int err_occured = 0;
+int notified = 0;
+
+
+static void notifier(const char *notification)
+{
+	/* printf("notification received: %s\n", notification);*/
+	notified = 1;
+}
+
+static void status_cb(const char *operation, plist_t status)
+{
+	if (status && operation) {
+		plist_t npercent = plist_dict_get_item(status, "PercentComplete");
+		plist_t nstatus = plist_dict_get_item(status, "Status");
+		plist_t nerror = plist_dict_get_item(status, "Error");
+		int percent = 0;
+		char *status_msg = NULL;
+		if (npercent) {
+			uint64_t val = 0;
+			plist_get_uint_val(npercent, &val);
+			percent = val;
+		}
+		if (nstatus) {
+			plist_get_string_val(nstatus, &status_msg);
+			if (!strcmp(status_msg, "Complete")) {
+				op_completed = 1;
+			}
+		}
+		if (!nerror) {
+			if (last_status && (strcmp(last_status, status_msg))) {
+				printf("\n");
+			}
+
+			if (!npercent) {
+				printf("%s - %s\n", operation, status_msg);
+			} else {
+				printf("%s - %s (%d%%)\r", operation, status_msg, percent);
+			}
+		} else {
+			char *err_msg = NULL;
+			plist_get_string_val(nerror, &err_msg);
+			printf("%s - Error occured: %s\n", operation, err_msg);
+			free(err_msg);
+			err_occured = 1;
+		}
+		if (last_status) {
+			free(last_status);
+			last_status = NULL;
+		}
+		if (status_msg) {
+			last_status = strdup(status_msg);
+			free(status_msg);
+		}
+	} else {
+		printf("%s: called with invalid data!\n", __func__);
+	}
+}
+
+static int zip_f_get_contents(struct zip *zf, const char *filename, int locate_flags, char **buffer, uint32_t *len)
+{
+	struct zip_stat zs;
+	struct zip_file *zfile;
+	int zindex = zip_name_locate(zf, filename, locate_flags);
+
+	*buffer = NULL;
+	*len = 0;
+
+	if (zindex < 0) {
+		fprintf(stderr, "ERROR: could not locate %s in archive!\n", filename);
+		return -1;
+	}
+
+	zip_stat_init(&zs);
+
+	if (zip_stat_index(zf, zindex, 0, &zs) != 0) {
+		fprintf(stderr, "ERROR: zip_stat_index '%s' failed!\n", filename);
+		return -2;
+	}
+
+	if (zs.size > 10485760) {
+		fprintf(stderr, "ERROR: file '%s' is too large!\n", filename);
+		return -3;
+	}
+
+	zfile = zip_fopen_index(zf, zindex, 0);
+	if (!zfile) {
+		fprintf(stderr, "ERROR: zip_fopen '%s' failed!\n", filename);
+		return -4;
+	}
+
+	*buffer = malloc(zs.size);
+	if (zip_fread(zfile, *buffer, zs.size) != zs.size) {
+		fprintf(stderr, "ERROR: zip_fread %ld bytes from '%s'\n", zs.size, filename);
+		free(*buffer);
+		*buffer = NULL;
+		zip_fclose(zfile);
+		return -5;
+	}
+	*len = zs.size;
+	zip_fclose(zfile);
+	return 0;
+}
+
+static void do_wait_when_needed()
+{
+	int i = 0;
+	struct timespec ts;
+	ts.tv_sec = 0;
+	ts.tv_nsec = 500000000;
+
+	/* wait for operation to complete */
+	while (wait_for_op_complete && !op_completed && !err_occured
+		   && !notified && (i < 60)) {
+		nanosleep(&ts, NULL);
+		i++;
+	}
+
+	/* wait some time if a notification is expected */
+	while (notification_expected && !notified && !err_occured && (i < 10)) {
+		nanosleep(&ts, NULL);
+		i++;
+	}
+}
+
+static void print_usage(int argc, char **argv)
+{
+	char *name = NULL;
+
+	name = strrchr(argv[0], '/');
+	printf("Usage: %s OPTIONS\n", (name ? name + 1 : argv[0]));
+	printf
+		("  -U|--uuid UUID\tTarget specific device by its 40-digit device UUID.\n"
+		 "  -l|--list-apps\tList apps, possible options:\n"
+		 "       -o list_user\t- list user apps only (this is the default)\n"
+		 "       -o list_system\t- list system apps only\n"
+		 "       -o list_all\t- list all types of apps\n"
+		 "       -o xml\t\t- print full output as xml plist\n"
+		 "  -i|--install ARCHIVE\tInstall app from package file specified by ARCHIVE.\n"
+		 "  -u|--uninstall APPID\tUninstall app specified by APPID.\n"
+		 "  -g|--upgrade APPID\tUpgrade app specified by APPID.\n"
+		 "  -L|--list-archives\tList archived applications, possible options:\n"
+		 "       -o xml\t\t- print full output as xml plist\n"
+		 "  -a|--archive APPID\tArchive app specified by APPID, possible options:\n"
+		 "       -o uninstall\t- uninstall the package after making an archive\n"
+		 "       -o app_only\t- archive application data only\n"
+		 "       -o copy=PATH\t- copy the app archive to directory PATH when done\n"
+		 "       -o remove\t- only valid when copy=PATH is used: remove after copy\n"
+		 "  -r|--restore APPID\tRestore archived app specified by APPID\n"
+		 "  -R|--remove-archive APPID  Remove app archive specified by APPID\n"
+		 "  -o|--options\t\tPass additional options to the specified command.\n"
+		 "  -h|--help\t\tprints usage information\n"
+		 "  -D|--debug\t\tenable communication debugging\n" "\n");
+}
+
+static void parse_opts(int argc, char **argv)
+{
+	static struct option longopts[] = {
+		{"help", 0, NULL, 'h'},
+		{"uuid", 0, NULL, 'U'},
+		{"list-apps", 0, NULL, 'l'},
+		{"install", 0, NULL, 'i'},
+		{"uninstall", 0, NULL, 'u'},
+		{"upgrade", 0, NULL, 'g'},
+		{"list-archives", 0, NULL, 'L'},
+		{"archive", 0, NULL, 'a'},
+		{"restore", 0, NULL, 'r'},
+		{"remove-archive", 0, NULL, 'R'},
+		{"options", 0, NULL, 'o'},
+		{"debug", 0, NULL, 'D'},
+		{NULL, 0, NULL, 0}
+	};
+	int c;
+
+	while (1) {
+		c = getopt_long(argc, argv, "hU:li:u:g:La:r:R:o:D", longopts,
+						(int *) 0);
+		if (c == -1) {
+			break;
+		}
+
+		switch (c) {
+		case 'h':
+			print_usage(argc, argv);
+			exit(0);
+		case 'U':
+			if (strlen(optarg) != 40) {
+				printf("%s: invalid UUID specified (length != 40)\n",
+					   argv[0]);
+				print_usage(argc, argv);
+				exit(2);
+			}
+			uuid = strdup(optarg);
+			break;
+		case 'l':
+			list_apps_mode = 1;
+			break;
+		case 'i':
+			install_mode = 1;
+			appid = strdup(optarg);
+			break;
+		case 'u':
+			uninstall_mode = 1;
+			appid = strdup(optarg);
+			break;
+		case 'g':
+			upgrade_mode = 1;
+			appid = strdup(optarg);
+			break;
+		case 'L':
+			list_archives_mode = 1;
+			break;
+		case 'a':
+			archive_mode = 1;
+			appid = strdup(optarg);
+			break;
+		case 'r':
+			restore_mode = 1;
+			appid = strdup(optarg);
+			break;
+		case 'R':
+			remove_archive_mode = 1;
+			appid = strdup(optarg);
+			break;
+		case 'o':
+			if (!options) {
+				options = strdup(optarg);
+			} else {
+				char *newopts =	malloc(strlen(options) + strlen(optarg) + 2);
+				strcpy(newopts, options);
+				free(options);
+				strcat(newopts, ",");
+				strcat(newopts, optarg);
+				options = newopts;
+			}
+			break;
+		case 'D':
+			iphone_set_debug_level(1);
+			iphone_set_debug_mask(DBGMASK_ALL);
+			break;
+		default:
+			print_usage(argc, argv);
+			exit(2);
+		}
+	}
+
+	if (optind <= 1 || (argc - optind > 0)) {
+		print_usage(argc, argv);
+		exit(2);
+	}
+}
+
+int main(int argc, char **argv)
+{
+	iphone_device_t phone = NULL;
+	lockdownd_client_t client = NULL;
+	instproxy_client_t ipc = NULL;
+	np_client_t np = NULL;
+	afc_client_t afc = NULL;
+	int port = 0;
+	int res = 0;
+
+	parse_opts(argc, argv);
+
+	argc -= optind;
+	argv += optind;
+
+	if (IPHONE_E_SUCCESS != iphone_device_new(&phone, uuid)) {
+		fprintf(stderr, "No iPhone found, is it plugged in?\n");
+		return -1;
+	}
+
+	if (LOCKDOWN_E_SUCCESS != lockdownd_client_new(phone, &client)) {
+		fprintf(stderr, "Could not connect to lockdownd. Exiting.\n");
+		goto leave_cleanup;
+	}
+
+	if ((lockdownd_start_service
+		 (client, "com.apple.mobile.notification_proxy",
+		  &port) != LOCKDOWN_E_SUCCESS) || !port) {
+		fprintf(stderr,
+				"Could not start com.apple.mobile.notification_proxy!\n");
+		goto leave_cleanup;
+	}
+
+	if (np_client_new(phone, port, &np) != NP_E_SUCCESS) {
+		fprintf(stderr, "Could not connect to notification_proxy!\n");
+		goto leave_cleanup;
+	}
+
+	np_set_notify_callback(np, notifier);
+
+	const char *noties[3] = { NP_APP_INSTALLED, NP_APP_UNINSTALLED, NULL };
+
+	np_observe_notifications(np, noties);
+
+run_again:
+	port = 0;
+	if ((lockdownd_start_service
+		 (client, "com.apple.mobile.installation_proxy",
+		  &port) != LOCKDOWN_E_SUCCESS) || !port) {
+		fprintf(stderr,
+				"Could not start com.apple.mobile.installation_proxy!\n");
+		goto leave_cleanup;
+	}
+
+	if (instproxy_client_new(phone, port, &ipc) != INSTPROXY_E_SUCCESS) {
+		fprintf(stderr, "Could not connect to installation_proxy!\n");
+		goto leave_cleanup;
+	}
+
+	setbuf(stdout, NULL);
+
+	if (last_status) {
+		free(last_status);
+		last_status = NULL;
+	}
+	notification_expected = 0;
+
+	if (list_apps_mode) {
+		int xml_mode = 0;
+		instproxy_apptype_t apptype = INSTPROXY_APPTYPE_USER;
+		instproxy_error_t err;
+		plist_t apps = NULL;
+
+		/* look for options */
+		if (options) {
+			char *opts = strdup(options);
+			char *elem = strtok(opts, ",");
+			while (elem) {
+				if (!strcmp(elem, "list_system")) {
+					apptype = INSTPROXY_APPTYPE_SYSTEM;
+				} else if (!strcmp(elem, "list_all")) {
+					apptype = INSTPROXY_APPTYPE_ALL;
+				} else if (!strcmp(elem, "list_user")) {
+					apptype = INSTPROXY_APPTYPE_USER;
+				} else if (!strcmp(elem, "xml")) {
+					xml_mode = 1;
+				}
+				elem = strtok(NULL, ",");
+			}
+		}
+
+		err = instproxy_browse(ipc, apptype, &apps);
+		if (err != INSTPROXY_E_SUCCESS) {
+			fprintf(stderr, "ERROR: instproxy_browse returned %d\n", err);
+			goto leave_cleanup;
+		}
+		if (!apps || (plist_get_node_type(apps) != PLIST_ARRAY)) {
+			fprintf(stderr,
+					"ERROR: instproxy_browse returnd an invalid plist!\n");
+			goto leave_cleanup;
+		}
+		if (xml_mode) {
+			char *xml = NULL;
+			uint32_t len = 0;
+
+			plist_to_xml(apps, &xml, &len);
+			if (xml) {
+				puts(xml);
+				free(xml);
+			}
+			plist_free(apps);
+			goto leave_cleanup;
+		}
+		printf("Total: %d apps\n", plist_array_get_size(apps));
+		uint32_t i = 0;
+		for (i = 0; i < plist_array_get_size(apps); i++) {
+			plist_t app = plist_array_get_item(apps, i);
+			plist_t p_appid =
+				plist_dict_get_item(app, "CFBundleIdentifier");
+			char *s_appid = NULL;
+			char *s_dispName = NULL;
+			char *s_version = NULL;
+			plist_t dispName =
+				plist_dict_get_item(app, "CFBundleDisplayName");
+			plist_t version = plist_dict_get_item(app, "CFBundleVersion");
+
+			if (p_appid) {
+				plist_get_string_val(p_appid, &s_appid);
+			}
+			if (!s_appid) {
+				fprintf(stderr, "ERROR: Failed to get APPID!\n");
+				break;
+			}
+
+			if (dispName) {
+				plist_get_string_val(dispName, &s_dispName);
+			}
+			if (version) {
+				plist_get_string_val(version, &s_version);
+			}
+
+			if (!s_dispName) {
+				s_dispName = strdup(s_appid);
+			}
+			if (s_version) {
+				printf("%s - %s %s\n", s_appid, s_dispName, s_version);
+				free(s_version);
+			} else {
+				printf("%s - %s\n", s_appid, s_dispName);
+			}
+			free(s_dispName);
+			free(s_appid);
+		}
+		plist_free(apps);
+	} else if (install_mode || upgrade_mode) {
+		plist_t sinf = NULL;
+		plist_t meta = NULL;
+		char *pkgname = NULL;
+		struct stat fst;
+		FILE *f = NULL;
+		uint64_t af = 0;
+		char buf[8192];
+
+		port = 0;
+		if ((lockdownd_start_service(client, "com.apple.afc", &port) !=
+			 LOCKDOWN_E_SUCCESS) || !port) {
+			fprintf(stderr, "Could not start com.apple.afc!\n");
+			goto leave_cleanup;
+		}
+
+		lockdownd_client_free(client);
+		client = NULL;
+
+		if (afc_client_new(phone, port, &afc) != INSTPROXY_E_SUCCESS) {
+			fprintf(stderr, "Could not connect to AFC!\n");
+			goto leave_cleanup;
+		}
+
+		if (stat(appid, &fst) != 0) {
+			fprintf(stderr, "ERROR: stat: %s: %s\n", appid, strerror(errno));
+			goto leave_cleanup;
+		}
+
+		/* open install package */
+		int errp = 0;
+		struct zip *zf = zip_open(appid, 0, &errp);
+		if (!zf) {
+			fprintf(stderr, "ERROR: zip_open: %s: %d\n", appid, errp);
+			goto leave_cleanup;
+		}
+
+		/* extract iTunesMetadata.plist from package */
+		char *zbuf = NULL;
+		uint32_t len = 0;
+		if (zip_f_get_contents(zf, "iTunesMetadata.plist", 0, &zbuf, &len) < 0) {
+			zip_unchange_all(zf);
+			zip_close(zf);
+			goto leave_cleanup;
+		}
+		meta = plist_new_data(zbuf, len);
+		free(zbuf);
+
+		/* we need to get the CFBundleName first */
+		plist_t info = NULL;
+		zbuf = NULL;
+		len = 0;
+		if (zip_f_get_contents(zf, "Info.plist", ZIP_FL_NODIR, &zbuf, &len) < 0) {
+			zip_unchange_all(zf);
+			zip_close(zf);
+			goto leave_cleanup;
+		}
+		if (memcmp(zbuf, "bplist00", 8) == 0) {
+			plist_from_bin(zbuf, len, &info);
+		} else {
+			plist_from_xml(zbuf, len, &info);
+		}
+		free(zbuf);
+
+		if (!info) {
+			fprintf(stderr, "Could not parse Info.plist!\n");
+			zip_unchange_all(zf);
+			zip_close(zf);
+			goto leave_cleanup;
+		}
+
+		char *bundlename = NULL;
+
+		plist_t bname = plist_dict_get_item(info, "CFBundleName");
+		if (bname) {
+			plist_get_string_val(bname, &bundlename);
+		}
+		plist_free(info);
+
+		if (!bundlename) {
+			fprintf(stderr, "Could not determine CFBundleName!\n");
+			zip_unchange_all(zf);
+			zip_close(zf);
+			goto leave_cleanup;
+		}
+
+		char *sinfname = NULL;
+	       	if (asprintf(&sinfname, "Payload/%s.app/SC_Info/%s.sinf", bundlename, bundlename) < 0) {
+			fprintf(stderr, "Out of memory!?\n");
+			goto leave_cleanup;
+		}
+		free(bundlename);
+
+		/* extract .sinf from package */
+		zbuf = NULL;
+		len = 0;
+		if (zip_f_get_contents(zf, sinfname, 0, &zbuf, &len) == 0) {
+			sinf = plist_new_data(zbuf, len);
+		}
+		free(sinfname);
+		if (zbuf) {
+			free(zbuf);
+		}
+
+		zip_unchange_all(zf);
+		zip_close(zf);
+
+		/* copy archive to device */
+		f = fopen(appid, "r");
+		if (!f) {
+			fprintf(stderr, "fopen: %s: %s\n", appid, strerror(errno));
+			goto leave_cleanup;
+		}
+
+		pkgname = NULL;
+		if (asprintf(&pkgname, "%s/%s", PKG_PATH, basename(appid)) < 0) {
+			fprintf(stderr, "Out of memory!?\n");
+			goto leave_cleanup;
+		}
+
+		printf("Copying '%s' --> '%s'\n", appid, pkgname);
+
+		char **strs = NULL;
+		if (afc_get_file_info(afc, PKG_PATH, &strs) != AFC_E_SUCCESS) {
+			if (afc_make_directory(afc, PKG_PATH) != AFC_E_SUCCESS) {
+				fprintf(stderr, "WARNING: Could not create directory '%s' on device!\n", PKG_PATH);
+			}
+		}
+		if (strs) {
+			int i = 0;
+			while (strs[i]) {
+				free(strs[i]);
+				i++;
+			}
+			free(strs);
+		}
+
+		if ((afc_file_open(afc, pkgname, AFC_FOPEN_WRONLY, &af) !=
+			 AFC_E_SUCCESS) || !af) {
+			fclose(f);
+			fprintf(stderr, "afc_file_open on '%s' failed!\n", pkgname);
+			free(pkgname);
+			goto leave_cleanup;
+		}
+
+		size_t amount = 0;
+		do {
+			amount = fread(buf, 1, sizeof(buf), f);
+			if (amount > 0) {
+				uint32_t written, total = 0;
+				while (total < amount) {
+					written = 0;
+					if (afc_file_write(afc, af, buf, amount, &written) !=
+						AFC_E_SUCCESS) {
+						fprintf(stderr, "AFC Write error!\n");
+						break;
+					}
+					total += written;
+				}
+				if (total != amount) {
+					fprintf(stderr, "Error: wrote only %d of %d\n", total,
+							amount);
+					afc_file_close(afc, af);
+					fclose(f);
+					free(pkgname);
+					goto leave_cleanup;
+				}
+			}
+		}
+		while (amount > 0);
+
+		afc_file_close(afc, af);
+		fclose(f);
+
+		printf("done.\n");
+
+		/* perform installation or upgrade */
+		if (install_mode) {
+			printf("Installing '%s'\n", pkgname);
+			instproxy_install(ipc, pkgname, sinf, meta, status_cb);
+		} else {
+			printf("Upgrading '%s'\n", pkgname);
+			instproxy_upgrade(ipc, pkgname, sinf, meta, status_cb);
+		}
+		free(pkgname);
+		wait_for_op_complete = 1;
+		notification_expected = 1;
+	} else if (uninstall_mode) {
+		instproxy_uninstall(ipc, appid, status_cb);
+		wait_for_op_complete = 1;
+		notification_expected = 1;
+	} else if (list_archives_mode) {
+		int xml_mode = 0;
+		plist_t dict = NULL;
+		plist_t lres = NULL;
+		instproxy_error_t err;
+
+		/* look for options */
+		if (options) {
+			char *opts = strdup(options);
+			char *elem = strtok(opts, ",");
+			while (elem) {
+				if (!strcmp(elem, "xml")) {
+					xml_mode = 1;
+				}
+				elem = strtok(NULL, ",");
+			}
+		}
+
+		err = instproxy_lookup_archives(ipc, &dict);
+		if (err != INSTPROXY_E_SUCCESS) {
+			fprintf(stderr, "ERROR: lookup_archives returned %d\n", err);
+			goto leave_cleanup;
+		}
+		if (!dict) {
+			fprintf(stderr,
+					"ERROR: lookup_archives did not return a plist!?\n");
+			goto leave_cleanup;
+		}
+
+		lres = plist_dict_get_item(dict, "LookupResult");
+		if (!lres || (plist_get_node_type(lres) != PLIST_DICT)) {
+			plist_free(dict);
+			fprintf(stderr, "ERROR: Could not get dict 'LookupResult'\n");
+			goto leave_cleanup;
+		}
+
+		if (xml_mode) {
+			char *xml = NULL;
+			uint32_t len = 0;
+
+			plist_to_xml(lres, &xml, &len);
+			if (xml) {
+				puts(xml);
+				free(xml);
+			}
+			plist_free(dict);
+			goto leave_cleanup;
+		}
+		plist_dict_iter iter = NULL;
+		plist_t node = NULL;
+		char *key = NULL;
+
+		printf("Total: %d archived apps\n", plist_dict_get_size(lres));
+		plist_dict_new_iter(lres, &iter);
+		if (!iter) {
+			plist_free(dict);
+			fprintf(stderr, "ERROR: Could not create plist_dict_iter!\n");
+			goto leave_cleanup;
+		}
+		do {
+			key = NULL;
+			node = NULL;
+			plist_dict_next_item(lres, iter, &key, &node);
+			if (key && (plist_get_node_type(node) == PLIST_DICT)) {
+				char *s_dispName = NULL;
+				char *s_version = NULL;
+				plist_t dispName =
+					plist_dict_get_item(node, "CFBundleDisplayName");
+				plist_t version =
+					plist_dict_get_item(node, "CFBundleVersion");
+				if (dispName) {
+					plist_get_string_val(dispName, &s_dispName);
+				}
+				if (version) {
+					plist_get_string_val(version, &s_version);
+				}
+				if (!s_dispName) {
+					s_dispName = strdup(key);
+				}
+				if (s_version) {
+					printf("%s - %s %s\n", key, s_dispName, s_version);
+					free(s_version);
+				} else {
+					printf("%s - %s\n", key, s_dispName);
+				}
+				free(s_dispName);
+				free(key);
+			}
+		}
+		while (node);
+		plist_free(dict);
+	} else if (archive_mode) {
+		uint32_t opt = INSTPROXY_ARCHIVE_SKIP_UNINSTALL;
+		char *copy_path = NULL;
+		int remove_after_copy = 0;
+		/* look for options */
+		if (options) {
+			char *opts = strdup(options);
+			char *elem = strtok(opts, ",");
+			while (elem) {
+				if (!strcmp(elem, "uninstall")) {
+					opt &= ~INSTPROXY_ARCHIVE_SKIP_UNINSTALL;
+				} else if (!strcmp(elem, "app_only")) {
+					opt |= INSTPROXY_ARCHIVE_APP_ONLY;
+				} else if ((strlen(elem) > 5) && !strncmp(elem, "copy=", 5)) {
+					copy_path = strdup(elem+5);
+				} else if (!strcmp(elem, "remove")) {
+					remove_after_copy = 1;
+				}
+				elem = strtok(NULL, ",");
+			}
+		}
+
+		if (copy_path) {
+			struct stat fst;
+			if (stat(copy_path, &fst) != 0) {
+				fprintf(stderr, "ERROR: stat: %s: %s\n", copy_path, strerror(errno));
+				free(copy_path);
+				goto leave_cleanup;
+			}
+
+			if (!S_ISDIR(fst.st_mode)) {
+				fprintf(stderr, "ERROR: '%s' is not a directory as expected.\n", copy_path);
+				free(copy_path);
+				goto leave_cleanup;
+			}
+
+			port = 0;
+			if ((lockdownd_start_service(client, "com.apple.afc", &port) != LOCKDOWN_E_SUCCESS) || !port) {
+				fprintf(stderr, "Could not start com.apple.afc!\n");
+				free(copy_path);
+				goto leave_cleanup;
+			}
+
+			lockdownd_client_free(client);
+			client = NULL;
+
+			if (afc_client_new(phone, port, &afc) != INSTPROXY_E_SUCCESS) {
+				fprintf(stderr, "Could not connect to AFC!\n");
+				goto leave_cleanup;
+			}
+		}
+
+		instproxy_archive(ipc, appid, opt, status_cb);
+		wait_for_op_complete = 1;
+		if (opt & INSTPROXY_ARCHIVE_SKIP_UNINSTALL) {
+			notification_expected = 0;
+		} else {
+			notification_expected = 1;
+		}
+
+		do_wait_when_needed();
+
+		if (copy_path) {
+			if (err_occured) {
+				afc_client_free(afc);
+				afc = NULL;
+				goto leave_cleanup;
+			}
+			FILE *f = NULL;
+			uint64_t af = 0;
+			/* local filename */
+			char *localfile = NULL;
+			if (asprintf(&localfile, "%s/%s.ipa", copy_path, appid) < 0) {
+				fprintf(stderr, "Out of memory!?\n");
+				goto leave_cleanup;
+			}
+			free(copy_path);
+
+			f = fopen(localfile, "w");
+			if (!f) {
+				fprintf(stderr, "ERROR: fopen: %s: %s\n", localfile, strerror(errno));
+				free(localfile);
+				goto leave_cleanup;
+			}
+
+			/* remote filename */
+			char *remotefile = NULL;
+			if (asprintf(&remotefile, "%s/%s.zip", APPARCH_PATH, appid) < 0) {
+				fprintf(stderr, "Out of memory!?\n");
+				goto leave_cleanup;
+			}
+
+			uint32_t fsize = 0;
+			char **fileinfo = NULL;
+			if ((afc_get_file_info(afc, remotefile, &fileinfo) != AFC_E_SUCCESS) || !fileinfo) {
+				fprintf(stderr, "ERROR getting AFC file info for '%s' on device!\n", remotefile);
+				fclose(f);
+				free(remotefile);
+				free(localfile);
+				goto leave_cleanup;
+			}
+
+			int i;
+			for (i = 0; fileinfo[i]; i+=2) {
+				if (!strcmp(fileinfo[i], "st_size")) {
+					fsize = atoi(fileinfo[i+1]);
+					break;
+				}
+			}
+			i = 0;
+			while (fileinfo[i]) {
+				free(fileinfo[i]);
+				i++;
+			}
+			free(fileinfo);
+
+			if (fsize == 0) {
+				fprintf(stderr, "Hm... remote file length could not be determined. Cannot copy.\n");
+				fclose(f);
+				free(remotefile);
+				free(localfile);
+				goto leave_cleanup;
+			}
+
+			if ((afc_file_open(afc, remotefile, AFC_FOPEN_RDONLY, &af) != AFC_E_SUCCESS) || !af) {
+				fclose(f);
+				fprintf(stderr, "ERROR: could not open '%s' on device for reading!\n", remotefile);
+				free(remotefile);
+				free(localfile);
+				goto leave_cleanup;
+			}
+
+			/* copy file over */
+			printf("Copying '%s' --> '%s'\n", remotefile, localfile);
+			free(remotefile);
+			free(localfile);
+
+			uint32_t amount = 0;
+			uint32_t total = 0;
+			char buf[8192];
+
+			do {
+				if (afc_file_read(afc, af, buf, sizeof(buf), &amount) != AFC_E_SUCCESS) {
+					fprintf(stderr, "AFC Read error!\n");
+					break;
+				}
+
+				if (amount > 0) {
+					size_t written = fwrite(buf, 1, amount, f);
+					if (written != amount) {
+						fprintf(stderr, "Error when writing %d bytes to local file!\n", amount);
+						break;
+					}
+					total += written;
+				}
+			} while (amount > 0);
+
+			afc_file_close(afc, af);
+			fclose(f);
+
+			printf("done.\n");
+			if (total != fsize) {
+				fprintf(stderr, "WARNING: remote and local file sizes don't match (%d != %d)\n", fsize, total);
+				if (remove_after_copy) {
+					fprintf(stderr, "NOTE: archive file will NOT be removed from device\n");
+					remove_after_copy = 0;
+				}
+			}
+
+			if (remove_after_copy) {
+				/* remove archive if requested */
+				printf("Removing '%s'\n", appid);
+				archive_mode = 0;
+				remove_archive_mode = 1;
+				free(options);
+				options = NULL;
+				if (LOCKDOWN_E_SUCCESS != lockdownd_client_new(phone, &client)) {
+					fprintf(stderr, "Could not connect to lockdownd. Exiting.\n");
+					goto leave_cleanup;
+				}
+				goto run_again;
+			}
+		}
+		goto leave_cleanup;
+	} else if (restore_mode) {
+		instproxy_restore(ipc, appid, status_cb);
+		wait_for_op_complete = 1;
+		notification_expected = 1;
+	} else if (remove_archive_mode) {
+		instproxy_remove_archive(ipc, appid, status_cb);
+		wait_for_op_complete = 1;
+	} else {
+		printf
+			("ERROR: no operation selected?! This should not be reached!\n");
+		res = -2;
+		goto leave_cleanup;
+	}
+
+	if (client) {
+		/* not needed anymore */
+		lockdownd_client_free(client);
+		client = NULL;
+	}
+
+	do_wait_when_needed();
+
+  leave_cleanup:
+	if (np) {
+		np_client_free(np);
+	}
+	if (ipc) {
+		instproxy_client_free(ipc);
+	}
+	if (afc) {
+		afc_client_free(afc);
+	}
+	if (client) {
+		lockdownd_client_free(client);
+	}
+	iphone_device_free(phone);
+
+	if (uuid) {
+		free(uuid);
+	}
+	if (appid) {
+		free(appid);
+	}
+	if (options) {
+		free(options);
+	}
+
+	return res;
+}
