summaryrefslogtreecommitdiffstats
path: root/dev
diff options
context:
space:
mode:
Diffstat (limited to 'dev')
-rw-r--r--dev/Makefile.am36
-rw-r--r--dev/afccheck.c146
-rw-r--r--dev/filerelaytest.c108
-rw-r--r--dev/housearresttest.c214
-rw-r--r--dev/ideviceclient.c252
-rw-r--r--dev/lckdclient.c115
6 files changed, 0 insertions, 871 deletions
diff --git a/dev/Makefile.am b/dev/Makefile.am
deleted file mode 100644
index 72c00a3..0000000
--- a/dev/Makefile.am
+++ /dev/null
@@ -1,36 +0,0 @@
1AM_CPPFLAGS = -I$(top_srcdir)/include
2
3AM_CFLAGS = $(GLOBAL_CFLAGS) $(libglib2_CFLAGS) $(libgnutls_CFLAGS) $(libtasn1_CFLAGS) $(libgthread2_CFLAGS) $(LFS_CFLAGS)
4AM_LDFLAGS = $(libglib2_LIBS) $(libgnutls_LIBS) $(libtasn1_LIBS) $(libgthread2_LIBS)
5
6if ENABLE_DEVTOOLS
7noinst_PROGRAMS = ideviceclient lckd-client afccheck filerelaytest housearresttest
8
9ideviceclient_SOURCES = ideviceclient.c
10ideviceclient_CFLAGS = $(AM_CFLAGS)
11ideviceclient_LDFLAGS = $(AM_LDFLAGS)
12ideviceclient_LDADD = ../src/libimobiledevice.la
13
14lckd_client_SOURCES = lckdclient.c
15lckd_client_CFLAGS = $(AM_CFLAGS)
16lckd_client_LDFLAGS = -lreadline $(AM_LDFLAGS)
17lckd_client_LDADD = ../src/libimobiledevice.la
18
19afccheck_SOURCES = afccheck.c
20afccheck_CFLAGS = $(AM_CFLAGS)
21afccheck_LDFLAGS = $(AM_LDFLAGS)
22afccheck_LDADD = ../src/libimobiledevice.la
23
24filerelaytest_SOURCES = filerelaytest.c
25filerelaytest_CFLAGS = $(AM_CFLAGS)
26filerelaytest_LDFLAGS = $(AM_LDFLAGS)
27filerelaytest_LDADD = ../src/libimobiledevice.la
28
29housearresttest_SOURCES = housearresttest.c
30housearresttest_CFLAGS = $(AM_CFLAGS)
31housearresttest_LDFLAGS = $(AM_LDFLAGS)
32housearresttest_LDADD = ../src/libimobiledevice.la
33
34endif # ENABLE_DEVTOOLS
35
36EXTRA_DIST = ideviceclient.c lckdclient.c afccheck.c filerelaytest.c housearresttest.c
diff --git a/dev/afccheck.c b/dev/afccheck.c
deleted file mode 100644
index b4d8910..0000000
--- a/dev/afccheck.c
+++ /dev/null
@@ -1,146 +0,0 @@
1/*
2 * afccheck.c
3 * creates threads and check communication through AFC is done rigth
4 *
5 * Copyright (c) 2008 Jonathan Beck All Rights Reserved.
6 *
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 */
21
22#include <stdlib.h>
23#include <stdio.h>
24#include <string.h>
25#include <glib.h>
26
27#include <libimobiledevice/libimobiledevice.h>
28#include <libimobiledevice/lockdown.h>
29#include <libimobiledevice/afc.h>
30
31#define BUFFER_SIZE 20000
32#define NB_THREADS 10
33
34
35typedef struct {
36 afc_client_t afc;
37 int id;
38} param;
39
40
41static void check_afc(gpointer data)
42{
43 //prepare a buffer
44 unsigned int buffersize = BUFFER_SIZE * sizeof(unsigned int);
45 int *buf = (int *) malloc(buffersize);
46 int *buf2 = (int *) malloc(buffersize);
47 unsigned int bytes = 0;
48 uint64_t position = 0;
49
50 //fill buffer
51 int i = 0;
52 for (i = 0; i < BUFFER_SIZE; i++) {
53 buf[i] = ((param *) data)->id * i;
54 }
55
56 //now writes buffer on device
57 uint64_t file = 0;
58 char path[50];
59 sprintf(path, "/Buf%i", ((param *) data)->id);
60 afc_file_open(((param *) data)->afc, path, AFC_FOPEN_RW, &file);
61 afc_file_write(((param *) data)->afc, file, (char *) buf, buffersize, &bytes);
62 afc_file_close(((param *) data)->afc, file);
63 file = 0;
64 if (bytes != buffersize)
65 printf("Write operation failed\n");
66
67 //now read it
68 bytes = 0;
69 afc_file_open(((param *) data)->afc, path, AFC_FOPEN_RDONLY, &file);
70 afc_file_read(((param *) data)->afc, file, (char *) buf2, buffersize/2, &bytes);
71 afc_file_read(((param *) data)->afc, file, (char *) buf2 + (buffersize/2), buffersize/2, &bytes);
72 if(AFC_E_SUCCESS != afc_file_tell(((param *) data)->afc, file, &position))
73 printf("Tell operation failed\n");
74 afc_file_close(((param *) data)->afc, file);
75 if (position != buffersize)
76 printf("Read operation failed\n");
77
78 //compare buffers
79 for (i = 0; i < BUFFER_SIZE; i++) {
80 if (buf[i] != buf2[i]) {
81 printf("Buffers are differents, stream corrupted\n");
82 break;
83 }
84 }
85
86 //cleanup
87 afc_remove_path(((param *) data)->afc, path);
88 g_thread_exit(0);
89}
90
91int main(int argc, char *argv[])
92{
93 lockdownd_client_t client = NULL;
94 idevice_t phone = NULL;
95 GError *err;
96 uint16_t port = 0;
97 afc_client_t afc = NULL;
98
99 if (argc > 1 && !strcasecmp(argv[1], "--debug")) {
100 idevice_set_debug_level(1);
101 } else {
102 idevice_set_debug_level(0);
103 }
104
105 if (IDEVICE_E_SUCCESS != idevice_new(&phone, NULL)) {
106 printf("No device found, is it plugged in?\n");
107 return 1;
108 }
109
110 if (LOCKDOWN_E_SUCCESS != lockdownd_client_new_with_handshake(phone, &client, "afccheck")) {
111 idevice_free(phone);
112 return 1;
113 }
114
115 if (LOCKDOWN_E_SUCCESS == lockdownd_start_service(client, "com.apple.afc", &port) && !port) {
116 lockdownd_client_free(client);
117 idevice_free(phone);
118 fprintf(stderr, "Something went wrong when starting AFC.");
119 return 1;
120 }
121
122 afc_client_new(phone, port, &afc);
123
124 //makes sure thread environment is available
125 if (!g_thread_supported())
126 g_thread_init(NULL);
127
128 GThread *threads[NB_THREADS];
129 param data[NB_THREADS];
130
131 int i = 0;
132 for (i = 0; i < NB_THREADS; i++) {
133 data[i].afc = afc;
134 data[i].id = i + 1;
135 threads[i] = g_thread_create((GThreadFunc) check_afc, data + i, TRUE, &err);
136 }
137
138 for (i = 0; i < NB_THREADS; i++) {
139 g_thread_join(threads[i]);
140 }
141
142 lockdownd_client_free(client);
143 idevice_free(phone);
144
145 return 0;
146}
diff --git a/dev/filerelaytest.c b/dev/filerelaytest.c
deleted file mode 100644
index 6e611c0..0000000
--- a/dev/filerelaytest.c
+++ /dev/null
@@ -1,108 +0,0 @@
1/*
2 * filerelaytest.c
3 * Simple Test program showing the usage of the file_relay interface.
4 *
5 * Copyright (c) 2010 Nikias Bassen All Rights Reserved.
6 *
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 */
21#include <stdio.h>
22#include <libimobiledevice/libimobiledevice.h>
23#include <libimobiledevice/lockdown.h>
24#include <libimobiledevice/file_relay.h>
25
26int main(int argc, char **argv)
27{
28 idevice_t dev = NULL;
29 lockdownd_client_t client = NULL;
30 file_relay_client_t frc = NULL;
31
32 if (idevice_new(&dev, NULL) != IDEVICE_E_SUCCESS) {
33 printf("no device connected?!\n");
34 goto leave_cleanup;
35 }
36
37 printf("connecting...\n");
38 if (lockdownd_client_new_with_handshake(dev, &client, NULL) != LOCKDOWN_E_SUCCESS) {
39 printf("could not connect to lockdownd!\n");
40 goto leave_cleanup;
41 }
42
43 uint16_t port = 0;
44 if (lockdownd_start_service(client, "com.apple.mobile.file_relay", &port) != LOCKDOWN_E_SUCCESS) {
45 printf("could not start file_relay service!\n");
46 goto leave_cleanup;
47 }
48
49 if (client) {
50 lockdownd_client_free(client);
51 client = NULL;
52 }
53
54 if (file_relay_client_new(dev, port, &frc) != FILE_RELAY_E_SUCCESS) {
55 printf("could not connect to file_relay service!\n");
56 goto leave_cleanup;
57 }
58
59 idevice_connection_t dump = NULL;
60 const char *sources[] = {"AppleSupport", "Network", "VPN", "WiFi", "UserDatabases", "CrashReporter", "tmp", "SystemConfiguration", NULL};
61
62 printf("Requesting");
63 int i = 0;
64 while (sources[i]) {
65 printf(" %s", sources[i]);
66 i++;
67 }
68 printf("\n");
69
70 if (file_relay_request_sources(frc, sources, &dump) != FILE_RELAY_E_SUCCESS) {
71 printf("could not get sources\n");
72 goto leave_cleanup;
73 }
74
75 if (!dump) {
76 printf("did not get connection!\n");
77 goto leave_cleanup;
78 }
79
80 uint32_t cnt = 0;
81 uint32_t len = 0;
82 char buf[4096];
83 FILE *f = fopen("dump.cpio.gz", "w");
84 setbuf(stdout, NULL);
85 printf("receiving ");
86 while (idevice_connection_receive(dump, buf, 4096, &len) == IDEVICE_E_SUCCESS) {
87 fwrite(buf, 1, len, f);
88 cnt += len;
89 printf(".");
90 len = 0;
91 }
92 printf("\n");
93 fclose(f);
94 printf("total size received: %d\n", cnt);
95
96leave_cleanup:
97 if (frc) {
98 file_relay_client_free(frc);
99 }
100 if (client) {
101 lockdownd_client_free(client);
102 }
103 if (dev) {
104 idevice_free(dev);
105 }
106
107 return 0;
108}
diff --git a/dev/housearresttest.c b/dev/housearresttest.c
deleted file mode 100644
index 7282a8c..0000000
--- a/dev/housearresttest.c
+++ /dev/null
@@ -1,214 +0,0 @@
1/*
2 * housearresttest.c
3 * Simple Test program showing the usage of the house_arrest interface.
4 *
5 * Copyright (c) 2010 Nikias Bassen All Rights Reserved.
6 *
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 */
21#include <stdio.h>
22#include <stdlib.h>
23#include <string.h>
24
25#include <libimobiledevice/libimobiledevice.h>
26#include <libimobiledevice/lockdown.h>
27#include <libimobiledevice/house_arrest.h>
28#include <libimobiledevice/afc.h>
29
30static void print_usage(int argc, char **argv)
31{
32 char *name = NULL;
33
34 name = strrchr(argv[0], '/');
35 printf("Usage: %s [OPTIONS] APPID\n", (name ? name + 1: argv[0]));
36 printf("Test the house_arrest service.\n\n");
37 printf(" -d, --debug\t\tenable communication debugging\n");
38 printf(" -u, --uuid UUID\ttarget specific device by its 40-digit device UUID\n");
39 printf(" -t, --test\t\ttest creating, writing, and deleting a file\n");
40 printf(" -h, --help\t\tprints usage information\n");
41 printf("\n");
42}
43
44int main(int argc, char **argv)
45{
46 idevice_t dev = NULL;
47 lockdownd_client_t client = NULL;
48 house_arrest_client_t hac = NULL;
49 house_arrest_error_t res;
50 int i;
51 char *uuid = NULL;
52 const char *appid = NULL;
53 int test_file_io = 0;
54
55 /* parse cmdline args */
56 for (i = 1; i < argc; i++) {
57 if (!strcmp(argv[i], "-d") || !strcmp(argv[i], "--debug")) {
58 idevice_set_debug_level(1);
59 continue;
60 }
61 else if (!strcmp(argv[i], "-u") || !strcmp(argv[i], "--uuid")) {
62 i++;
63 if (!argv[i] || (strlen(argv[i]) != 40)) {
64 print_usage(argc, argv);
65 return 0;
66 }
67 uuid = strdup(argv[i]);
68 continue;
69 }
70 else if (!strcmp(argv[i], "-t") || !strcmp(argv[i], "--test")) {
71 test_file_io = 1;
72 continue;
73 }
74 else if (!strcmp(argv[i], "-h") || !strcmp(argv[i], "--help")) {
75 print_usage(argc, argv);
76 return 0;
77 }
78 else {
79 appid = argv[i];
80 break;
81 }
82 }
83
84 if (!appid) {
85 print_usage(argc, argv);
86 return 0;
87 }
88
89 if (idevice_new(&dev, uuid) != IDEVICE_E_SUCCESS) {
90 printf("no device connected?!\n");
91 goto leave_cleanup;
92 }
93
94 if (lockdownd_client_new_with_handshake(dev, &client, NULL) != LOCKDOWN_E_SUCCESS) {
95 printf("could not connect to lockdownd!\n");
96 goto leave_cleanup;
97 }
98
99 uint16_t port = 0;
100 if (lockdownd_start_service(client, "com.apple.mobile.house_arrest", &port) != LOCKDOWN_E_SUCCESS) {
101 printf("could not start house_arrest service!\n");
102 goto leave_cleanup;
103 }
104
105 if (client) {
106 lockdownd_client_free(client);
107 client = NULL;
108 }
109
110 if (house_arrest_client_new(dev, port, &hac) != HOUSE_ARREST_E_SUCCESS) {
111 printf("could not connect to house_arrest service!\n");
112 goto leave_cleanup;
113 }
114
115 res = house_arrest_send_command(hac, "VendDocuments", appid);
116 if (res != HOUSE_ARREST_E_SUCCESS) {
117 printf("error %d when trying to get VendDocuments\n", res);
118 goto leave_cleanup;
119 }
120
121 plist_t dict = NULL;
122 if (house_arrest_get_result(hac, &dict) != HOUSE_ARREST_E_SUCCESS) {
123 if (house_arrest_get_result(hac, &dict) != HOUSE_ARREST_E_SUCCESS) {
124 printf("hmmm....\n");
125 goto leave_cleanup;
126 }
127 }
128
129 plist_t node = plist_dict_get_item(dict, "Error");
130 if (node) {
131 char *str = NULL;
132 plist_get_string_val(node, &str);
133 printf("Error: %s\n", str);
134 if (str) free(str);
135 plist_free(dict);
136 dict = NULL;
137 goto leave_cleanup;
138 }
139 node = plist_dict_get_item(dict, "Status");
140 if (node) {
141 char *str = NULL;
142 plist_get_string_val(node, &str);
143 if (str && (strcmp(str, "Complete") != 0)) {
144 printf("Warning: Status is not 'Complete' but '%s'\n", str);
145 }
146 if (str) free(str);
147 plist_free(dict);
148 dict = NULL;
149 }
150 if (dict) {
151 plist_free(dict);
152 }
153
154 afc_client_t afc = NULL;
155 afc_error_t ae = afc_client_new_from_house_arrest_client(hac, &afc);
156 if (ae != AFC_E_SUCCESS) {
157 printf("afc error %d\n", ae);
158 }
159 if (ae == AFC_E_SUCCESS) {
160 char **list = NULL;
161 afc_read_directory(afc, "/", &list);
162 printf("Directory contents:\n");
163 if (list) {
164 while (list[0]) {
165 if (strcmp(list[0], ".") && strcmp(list[0], "..")) {
166 puts(list[0]);
167 }
168 list++;
169 }
170 }
171
172 if (test_file_io) {
173 uint64_t tf = 0;
174 printf("\n==== Performing file tests ====\n");
175 printf("Opening file 'foobar' for writing: ");
176 if (afc_file_open(afc, "/foobar", AFC_FOPEN_RW, &tf) == AFC_E_SUCCESS) {
177 uint32_t wb = 0;
178 printf("OK\n");
179
180 printf("Writing to file: ");
181 if (afc_file_write(afc, tf, "test\r\n", 6, &wb) != AFC_E_SUCCESS) {
182 printf("ERROR\n");
183 } else {
184 printf("OK\n");
185 }
186 afc_file_close(afc, tf);
187 printf("Deleting file 'foobar': ");
188 if (afc_remove_path(afc, "/foobar") == AFC_E_SUCCESS) {
189 printf("OK\n");
190 } else {
191 printf("ERROR\n");
192 }
193 } else {
194 printf("ERROR\n");
195 }
196 }
197 afc_client_free(afc);
198 } else {
199 printf("failed to connect to afc service, error %d\n", ae);
200 }
201
202leave_cleanup:
203 if (hac) {
204 house_arrest_client_free(hac);
205 }
206 if (client) {
207 lockdownd_client_free(client);
208 }
209 if (dev) {
210 idevice_free(dev);
211 }
212
213 return 0;
214}
diff --git a/dev/ideviceclient.c b/dev/ideviceclient.c
deleted file mode 100644
index d952594..0000000
--- a/dev/ideviceclient.c
+++ /dev/null
@@ -1,252 +0,0 @@
1/*
2 * main.c
3 * Test program for testing several services.
4 *
5 * Copyright (c) 2008 Zach C. All Rights Reserved.
6 *
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 */
21
22#include <stdio.h>
23#include <stdlib.h>
24#include <string.h>
25#include <errno.h>
26#include <glib.h>
27
28#include <libimobiledevice/libimobiledevice.h>
29#include <libimobiledevice/lockdown.h>
30#include <libimobiledevice/afc.h>
31#include <libimobiledevice/notification_proxy.h>
32
33static void notifier(const char *notification, void *userdata)
34{
35 printf("---------------------------------------------------------\n");
36 printf("------> Notification received: %s\n", notification);
37 printf("---------------------------------------------------------\n");
38}
39
40static void perform_notification(idevice_t phone, lockdownd_client_t client, const char *notification)
41{
42 uint16_t nport = 0;
43 np_client_t np;
44
45 lockdownd_start_service(client, "com.apple.mobile.notification_proxy", &nport);
46 if (nport) {
47 printf("::::::::::::::: np was started ::::::::::::\n");
48 np_client_new(phone, nport, &np);
49 if (np) {
50 printf("::::::::: PostNotification %s\n", notification);
51 np_post_notification(np, notification);
52 np_client_free(np);
53 }
54 } else {
55 printf("::::::::::::::: np was NOT started ::::::::::::\n");
56 }
57}
58
59int main(int argc, char *argv[])
60{
61 unsigned int bytes = 0;
62 uint16_t port = 0, i = 0;
63 uint16_t npp;
64 lockdownd_client_t client = NULL;
65 idevice_t phone = NULL;
66 uint64_t lockfile = 0;
67 np_client_t gnp = NULL;
68
69 if (argc > 1 && !strcasecmp(argv[1], "--debug")) {
70 idevice_set_debug_level(1);
71 } else {
72 idevice_set_debug_level(0);
73 }
74
75 if (IDEVICE_E_SUCCESS != idevice_new(&phone, NULL)) {
76 printf("No device found, is it plugged in?\n");
77 return -1;
78 }
79
80 char *uuid = NULL;
81 if (IDEVICE_E_SUCCESS == idevice_get_uuid(phone, &uuid)) {
82 printf("DeviceUniqueID : %s\n", uuid);
83 }
84 if (uuid)
85 free(uuid);
86
87 if (LOCKDOWN_E_SUCCESS != lockdownd_client_new_with_handshake(phone, &client, "ideviceclient")) {
88 idevice_free(phone);
89 printf("Exiting.\n");
90 return -1;
91 }
92
93 char *nnn = NULL;
94 if (LOCKDOWN_E_SUCCESS == lockdownd_get_device_name(client, &nnn)) {
95 printf("DeviceName : %s\n", nnn);
96 free(nnn);
97 }
98
99 lockdownd_start_service(client, "com.apple.afc", &port);
100
101 if (port) {
102 afc_client_t afc = NULL;
103 afc_client_new(phone, port, &afc);
104 if (afc) {
105 lockdownd_start_service(client, "com.apple.mobile.notification_proxy", &npp);
106 if (npp) {
107 printf("Notification Proxy started.\n");
108 np_client_new(phone, npp, &gnp);
109 } else {
110 printf("ERROR: Notification proxy could not be started.\n");
111 }
112 if (gnp) {
113 const char *nspec[5] = {
114 NP_SYNC_CANCEL_REQUEST,
115 NP_SYNC_SUSPEND_REQUEST,
116 NP_SYNC_RESUME_REQUEST,
117 NP_ITDBPREP_DID_END,
118 NULL
119 };
120 np_observe_notifications(gnp, nspec);
121 np_set_notify_callback(gnp, notifier, NULL);
122 }
123
124 perform_notification(phone, client, NP_SYNC_WILL_START);
125
126 afc_file_open(afc, "/com.apple.itunes.lock_sync", AFC_FOPEN_RW, &lockfile);
127 if (lockfile) {
128 printf("locking file\n");
129 afc_file_lock(afc, lockfile, AFC_LOCK_EX);
130
131 perform_notification(phone, client, NP_SYNC_DID_START);
132 }
133
134 char **dirs = NULL;
135 afc_read_directory(afc, "/eafaedf", &dirs);
136 if (!dirs)
137 afc_read_directory(afc, "/", &dirs);
138 printf("Directory time.\n");
139 for (i = 0; dirs[i]; i++) {
140 printf("/%s\n", dirs[i]);
141 }
142
143 g_strfreev(dirs);
144
145 dirs = NULL;
146 afc_get_device_info(afc, &dirs);
147 if (dirs) {
148 for (i = 0; dirs[i]; i += 2) {
149 printf("%s: %s\n", dirs[i], dirs[i + 1]);
150 }
151 }
152 g_strfreev(dirs);
153
154 uint64_t my_file = 0;
155 char **info = NULL;
156 uint64_t fsize = 0;
157 if (AFC_E_SUCCESS == afc_get_file_info(afc, "/readme.libimobiledevice.fx", &info) && info) {
158 for (i = 0; info[i]; i += 2) {
159 printf("%s: %s\n", info[i], info[i+1]);
160 if (!strcmp(info[i], "st_size")) {
161 fsize = atoll(info[i+1]);
162 }
163 }
164 }
165
166 if (AFC_E_SUCCESS ==
167 afc_file_open(afc, "/readme.libimobiledevice.fx", AFC_FOPEN_RDONLY, &my_file) && my_file) {
168 printf("A file size: %llu\n", (long long)fsize);
169 char *file_data = (char *) malloc(sizeof(char) * fsize);
170 afc_file_read(afc, my_file, file_data, fsize, &bytes);
171 if (bytes > 0) {
172 printf("The file's data:\n");
173 fwrite(file_data, 1, bytes, stdout);
174 }
175 printf("\nClosing my file.\n");
176 afc_file_close(afc, my_file);
177 free(file_data);
178 } else
179 printf("couldn't open a file\n");
180
181 afc_file_open(afc, "/readme.libimobiledevice.fx", AFC_FOPEN_WR, &my_file);
182 if (my_file) {
183 char *outdatafile = strdup("this is a bitchin text file\n");
184 afc_file_write(afc, my_file, outdatafile, strlen(outdatafile), &bytes);
185 free(outdatafile);
186 if (bytes > 0)
187 printf("Wrote a surprise. ;)\n");
188 else
189 printf("I wanted to write a surprise, but... :(\n");
190 afc_file_close(afc, my_file);
191 }
192 printf("Deleting a file...\n");
193 bytes = afc_remove_path(afc, "/delme");
194 if (bytes)
195 printf("Success.\n");
196 else
197 printf("Failure. (expected unless you have a /delme file on your phone)\n");
198
199 printf("Renaming a file...\n");
200 bytes = afc_rename_path(afc, "/renme", "/renme2");
201 if (bytes > 0)
202 printf("Success.\n");
203 else
204 printf("Failure. (expected unless you have a /renme file on your phone)\n");
205
206 printf("Seek & read\n");
207 afc_file_open(afc, "/readme.libimobiledevice.fx", AFC_FOPEN_RDONLY, &my_file);
208 if (AFC_E_SUCCESS != afc_file_seek(afc, my_file, 5, SEEK_CUR))
209 printf("WARN: SEEK DID NOT WORK\n");
210 char *threeletterword = (char *) malloc(sizeof(char) * 5);
211 afc_file_read(afc, my_file, threeletterword, 3, &bytes);
212 threeletterword[3] = '\0';
213 if (bytes > 0)
214 printf("Result: %s\n", threeletterword);
215 else
216 printf("Couldn't read!\n");
217 free(threeletterword);
218 afc_file_close(afc, my_file);
219 }
220
221 if (gnp && lockfile) {
222 printf("XXX sleeping\n");
223 sleep(5);
224
225 printf("XXX unlocking file\n");
226 afc_file_lock(afc, lockfile, AFC_LOCK_UN);
227
228 printf("XXX closing file\n");
229 afc_file_close(afc, lockfile);
230
231 printf("XXX sleeping\n");
232 sleep(5);
233 //perform_notification(phone, client, NP_SYNC_DID_FINISH);
234 }
235
236 if (gnp) {
237 np_client_free(gnp);
238 gnp = NULL;
239 }
240
241 afc_client_free(afc);
242 } else {
243 printf("Start service failure.\n");
244 }
245
246 printf("All done.\n");
247
248 lockdownd_client_free(client);
249 idevice_free(phone);
250
251 return 0;
252}
diff --git a/dev/lckdclient.c b/dev/lckdclient.c
deleted file mode 100644
index 773de9f..0000000
--- a/dev/lckdclient.c
+++ /dev/null
@@ -1,115 +0,0 @@
1/*
2 * lckdclient.c
3 * Rudimentary command line interface to the Lockdown protocol
4 *
5 * Copyright (c) 2008 Jonathan Beck All Rights Reserved.
6 *
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 */
21
22#include <stdio.h>
23#include <stdlib.h>
24#include <string.h>
25#include <glib.h>
26#include <readline/readline.h>
27#include <readline/history.h>
28
29#include <libimobiledevice/libimobiledevice.h>
30#include <libimobiledevice/lockdown.h>
31
32int main(int argc, char *argv[])
33{
34 lockdownd_client_t client = NULL;
35 idevice_t phone = NULL;
36
37 idevice_set_debug_level(1);
38
39 if (IDEVICE_E_SUCCESS != idevice_new(&phone, NULL)) {
40 printf("No device found, is it plugged in?\n");
41 return -1;
42 }
43
44 char *uuid = NULL;
45 if (IDEVICE_E_SUCCESS == idevice_get_uuid(phone, &uuid)) {
46 printf("DeviceUniqueID : %s\n", uuid);
47 }
48 if (uuid)
49 free(uuid);
50
51 if (LOCKDOWN_E_SUCCESS != lockdownd_client_new_with_handshake(phone, &client, "lckdclient")) {
52 idevice_free(phone);
53 return -1;
54 }
55
56 using_history();
57 int loop = TRUE;
58 while (loop) {
59 char *cmd = readline("> ");
60 if (cmd) {
61
62 gchar **args = g_strsplit(cmd, " ", 0);
63
64 int len = 0;
65 if (args) {
66 while (*(args + len)) {
67 g_strstrip(*(args + len));
68 len++;
69 }
70 }
71
72 if (len > 0) {
73 add_history(cmd);
74 if (!strcmp(*args, "quit"))
75 loop = FALSE;
76
77 if (!strcmp(*args, "get") && len >= 2) {
78 plist_t value = NULL;
79 if (LOCKDOWN_E_SUCCESS == lockdownd_get_value(client, len == 3 ? *(args + 1):NULL, len == 3 ? *(args + 2):*(args + 1), &value))
80 {
81 char *xml = NULL;
82 uint32_t length;
83 plist_to_xml(value, &xml, &length);
84 printf("Success : value = %s\n", xml);
85 free(xml);
86 }
87 else
88 printf("Error\n");
89
90 if (value)
91 plist_free(value);
92 }
93
94 if (!strcmp(*args, "start") && len == 2) {
95 uint16_t port = 0;
96 if(LOCKDOWN_E_SUCCESS == lockdownd_start_service(client, *(args + 1), &port)) {
97 printf("started service %s on port %i\n", *(args + 1), port);
98 }
99 else
100 {
101 printf("failed to start service %s on device.\n", *(args + 1));
102 }
103 }
104 }
105 g_strfreev(args);
106 }
107 free(cmd);
108 cmd = NULL;
109 }
110 clear_history();
111 lockdownd_client_free(client);
112 idevice_free(phone);
113
114 return 0;
115}