summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/ideviceinstaller.c124
1 files changed, 79 insertions, 45 deletions
diff --git a/src/ideviceinstaller.c b/src/ideviceinstaller.c
index f45326f..5709b58 100644
--- a/src/ideviceinstaller.c
+++ b/src/ideviceinstaller.c
@@ -657,6 +657,7 @@ int main(int argc, char **argv)
if (LOCKDOWN_E_SUCCESS != lockdownd_client_new_with_handshake(device, &client, "ideviceinstaller")) {
fprintf(stderr, "Could not connect to lockdownd. Exiting.\n");
+ res = -1;
goto leave_cleanup;
}
@@ -665,6 +666,7 @@ int main(int argc, char **argv)
&service) != LOCKDOWN_E_SUCCESS) || !service) {
fprintf(stderr,
"Could not start com.apple.mobile.notification_proxy!\n");
+ res = -1;
goto leave_cleanup;
}
@@ -677,6 +679,7 @@ int main(int argc, char **argv)
if (nperr != NP_E_SUCCESS) {
fprintf(stderr, "Could not connect to notification_proxy!\n");
+ res = -1;
goto leave_cleanup;
}
@@ -696,6 +699,7 @@ run_again:
&service) != LOCKDOWN_E_SUCCESS) || !service) {
fprintf(stderr,
"Could not start com.apple.mobile.installation_proxy!\n");
+ res = -1;
goto leave_cleanup;
}
@@ -708,6 +712,7 @@ run_again:
if (err != INSTPROXY_E_SUCCESS) {
fprintf(stderr, "Could not connect to installation_proxy!\n");
+ res = -1;
goto leave_cleanup;
}
@@ -760,6 +765,7 @@ run_again:
if (!apps || (plist_get_node_type(apps) != PLIST_ARRAY)) {
fprintf(stderr,
"ERROR: instproxy_browse returnd an invalid plist!\n");
+ res = -1;
goto leave_cleanup;
}
@@ -785,6 +791,7 @@ run_again:
instproxy_client_options_free(client_opts);
if (err != INSTPROXY_E_SUCCESS) {
fprintf(stderr, "ERROR: instproxy_browse returned %d\n", err);
+ res = -1;
goto leave_cleanup;
}
@@ -804,6 +811,7 @@ run_again:
if ((lockdownd_start_service(client, "com.apple.afc", &service) !=
LOCKDOWN_E_SUCCESS) || !service) {
fprintf(stderr, "Could not start com.apple.afc!\n");
+ res = -1;
goto leave_cleanup;
}
@@ -812,11 +820,13 @@ run_again:
if (afc_client_new(device, service, &afc) != AFC_E_SUCCESS) {
fprintf(stderr, "Could not connect to AFC!\n");
+ res = -1;
goto leave_cleanup;
}
if (stat(appid, &fst) != 0) {
fprintf(stderr, "ERROR: stat: %s: %s\n", appid, strerror(errno));
+ res = -1;
goto leave_cleanup;
}
@@ -845,6 +855,7 @@ run_again:
zf = zip_open(appid, 0, &errp);
if (!zf) {
fprintf(stderr, "ERROR: zip_open: %s: %d\n", appid, errp);
+ res = -1;
goto leave_cleanup;
}
@@ -917,6 +928,7 @@ run_again:
afc_file_close(afc, af);
zip_fclose(zfile);
free(dstpath);
+ res = -1;
goto leave_cleanup;
}
}
@@ -940,6 +952,7 @@ run_again:
if (asprintf(&pkgname, "%s/%s", PKG_PATH, basename(appid)) < 0) {
fprintf(stderr, "ERROR: Out of memory allocating pkgname!?\n");
+ res = -1;
goto leave_cleanup;
}
@@ -947,55 +960,59 @@ run_again:
afc_upload_dir(afc, appid, pkgname);
printf("DONE.\n");
- /* extract the CFBundleIdentifier from the package */
-
- /* construct full filename to Info.plist */
- char *filename = (char*)malloc(strlen(appid)+10+1);
- strcpy(filename, appid);
- strcat(filename, "/Info.plist");
-
- struct stat st;
- FILE *fp = NULL;
-
- if (stat(filename, &st) == -1 || (fp = fopen(filename, "r")) == NULL) {
- fprintf(stderr, "ERROR: could not locate %s in app!\n", filename);
- free(filename);
- goto leave_cleanup;
- }
- size_t filesize = st.st_size;
- char *ibuf = malloc(filesize * sizeof(char));
- size_t amount = fread(ibuf, 1, filesize, fp);
- if (amount != filesize) {
- fprintf(stderr, "ERROR: could not read %ld bytes from %s\n", filesize, filename);
- free(filename);
- goto leave_cleanup;
- }
- fclose(fp);
- free(filename);
-
- plist_t info = NULL;
- if (memcmp(ibuf, "bplist00", 8) == 0) {
- plist_from_bin(ibuf, filesize, &info);
- } else {
- plist_from_xml(ibuf, filesize, &info);
- }
- free(ibuf);
-
- if (!info) {
- fprintf(stderr, "ERROR: could not parse Info.plist!\n");
- goto leave_cleanup;
- }
-
- plist_t bname = plist_dict_get_item(info, "CFBundleIdentifier");
- if (bname) {
- plist_get_string_val(bname, &bundleidentifier);
- }
- plist_free(info);
- info = NULL;
+ /* extract the CFBundleIdentifier from the package */
+
+ /* construct full filename to Info.plist */
+ char *filename = (char*)malloc(strlen(appid)+10+1);
+ strcpy(filename, appid);
+ strcat(filename, "/Info.plist");
+
+ struct stat st;
+ FILE *fp = NULL;
+
+ if (stat(filename, &st) == -1 || (fp = fopen(filename, "r")) == NULL) {
+ fprintf(stderr, "ERROR: could not locate %s in app!\n", filename);
+ free(filename);
+ res = -1;
+ goto leave_cleanup;
+ }
+ size_t filesize = st.st_size;
+ char *ibuf = malloc(filesize * sizeof(char));
+ size_t amount = fread(ibuf, 1, filesize, fp);
+ if (amount != filesize) {
+ fprintf(stderr, "ERROR: could not read %ld bytes from %s\n", filesize, filename);
+ free(filename);
+ res = -1;
+ goto leave_cleanup;
+ }
+ fclose(fp);
+ free(filename);
+
+ plist_t info = NULL;
+ if (memcmp(ibuf, "bplist00", 8) == 0) {
+ plist_from_bin(ibuf, filesize, &info);
+ } else {
+ plist_from_xml(ibuf, filesize, &info);
+ }
+ free(ibuf);
+
+ if (!info) {
+ fprintf(stderr, "ERROR: could not parse Info.plist!\n");
+ res = -1;
+ goto leave_cleanup;
+ }
+
+ plist_t bname = plist_dict_get_item(info, "CFBundleIdentifier");
+ if (bname) {
+ plist_get_string_val(bname, &bundleidentifier);
+ }
+ plist_free(info);
+ info = NULL;
} else {
zf = zip_open(appid, 0, &errp);
if (!zf) {
fprintf(stderr, "ERROR: zip_open: %s: %d\n", appid, errp);
+ res = -1;
goto leave_cleanup;
}
@@ -1024,6 +1041,7 @@ run_again:
if (zip_get_app_directory(zf, &app_directory_name)) {
fprintf(stderr, "Unable to locate app directory in archive!\n");
+ res = -1;
goto leave_cleanup;
}
@@ -1039,6 +1057,7 @@ run_again:
free(filename);
zip_unchange_all(zf);
zip_close(zf);
+ res = -1;
goto leave_cleanup;
}
free(filename);
@@ -1053,6 +1072,7 @@ run_again:
fprintf(stderr, "Could not parse Info.plist!\n");
zip_unchange_all(zf);
zip_close(zf);
+ res = -1;
goto leave_cleanup;
}
@@ -1074,12 +1094,14 @@ run_again:
fprintf(stderr, "Could not determine value for CFBundleExecutable!\n");
zip_unchange_all(zf);
zip_close(zf);
+ res = -1;
goto leave_cleanup;
}
char *sinfname = NULL;
if (asprintf(&sinfname, "Payload/%s.app/SC_Info/%s.sinf", bundleexecutable, bundleexecutable) < 0) {
fprintf(stderr, "Out of memory!?\n");
+ res = -1;
goto leave_cleanup;
}
free(bundleexecutable);
@@ -1099,6 +1121,7 @@ run_again:
pkgname = NULL;
if (asprintf(&pkgname, "%s/%s", PKG_PATH, bundleidentifier) < 0) {
fprintf(stderr, "Out of memory!?\n");
+ res = -1;
goto leave_cleanup;
}
@@ -1162,12 +1185,14 @@ run_again:
err = instproxy_lookup_archives(ipc, NULL, &dict);
if (err != INSTPROXY_E_SUCCESS) {
fprintf(stderr, "ERROR: lookup_archives returned %d\n", err);
+ res = -1;
goto leave_cleanup;
}
if (!dict) {
fprintf(stderr,
"ERROR: lookup_archives did not return a plist!?\n");
+ res = -1;
goto leave_cleanup;
}
@@ -1273,12 +1298,14 @@ run_again:
if (stat(copy_path, &fst) != 0) {
fprintf(stderr, "ERROR: stat: %s: %s\n", copy_path, strerror(errno));
free(copy_path);
+ res = -1;
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);
+ res = -1;
goto leave_cleanup;
}
@@ -1290,6 +1317,7 @@ run_again:
if ((lockdownd_start_service(client, "com.apple.afc", &service) != LOCKDOWN_E_SUCCESS) || !service) {
fprintf(stderr, "Could not start com.apple.afc!\n");
free(copy_path);
+ res = -1;
goto leave_cleanup;
}
@@ -1298,6 +1326,7 @@ run_again:
if (afc_client_new(device, service, &afc) != AFC_E_SUCCESS) {
fprintf(stderr, "Could not connect to AFC!\n");
+ res = -1;
goto leave_cleanup;
}
}
@@ -1318,6 +1347,7 @@ run_again:
if (err_occurred) {
afc_client_free(afc);
afc = NULL;
+ res = -1;
goto leave_cleanup;
}
FILE *f = NULL;
@@ -1326,6 +1356,7 @@ run_again:
char *localfile = NULL;
if (asprintf(&localfile, "%s/%s.ipa", copy_path, appid) < 0) {
fprintf(stderr, "Out of memory!?\n");
+ res = -1;
goto leave_cleanup;
}
free(copy_path);
@@ -1351,6 +1382,7 @@ run_again:
fclose(f);
free(remotefile);
free(localfile);
+ res = -1;
goto leave_cleanup;
}
@@ -1381,6 +1413,7 @@ run_again:
fprintf(stderr, "ERROR: could not open '%s' on device for reading!\n", remotefile);
free(remotefile);
free(localfile);
+ res = -1;
goto leave_cleanup;
}
@@ -1430,6 +1463,7 @@ run_again:
options = NULL;
if (LOCKDOWN_E_SUCCESS != lockdownd_client_new_with_handshake(device, &client, "ideviceinstaller")) {
fprintf(stderr, "Could not connect to lockdownd. Exiting.\n");
+ res = -1;
goto leave_cleanup;
}
goto run_again;