forked from jkcoxson/idevice
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathlocation_simulation.c
More file actions
161 lines (142 loc) · 4.6 KB
/
location_simulation.c
File metadata and controls
161 lines (142 loc) · 4.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
// Jackson Coxson
#include "idevice.h"
#include <arpa/inet.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
int main(int argc, char **argv) {
// Initialize logger
idevice_init_logger(Debug, Disabled, NULL);
if (argc < 4) {
fprintf(stderr,
"Usage: %s <device_ip> <latitude> <longitude> [pairing_file]\n",
argv[0]);
return 1;
}
const char *device_ip = argv[1];
double latitude = atof(argv[2]);
double longitude = atof(argv[3]);
const char *pairing_file = argc > 4 ? argv[4] : "pairing_file.plist";
// Create the socket address
struct sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(LOCKDOWN_PORT);
inet_pton(AF_INET, device_ip, &addr.sin_addr);
// Read pairing file
IdevicePairingFile *pairing = NULL;
IdeviceFfiError *err = idevice_pairing_file_read(pairing_file, &pairing);
if (err != NULL) {
fprintf(stderr, "Failed to read pairing file: [%d] %s", err->code,
err->message);
idevice_error_free(err);
return 1;
}
// Create TCP provider
IdeviceProviderHandle *tcp_provider = NULL;
err = idevice_tcp_provider_new((struct sockaddr *)&addr, pairing,
"LocationSimCLI", &tcp_provider);
if (err != NULL) {
fprintf(stderr, "Failed to create TCP provider: [%d] %s", err->code,
err->message);
idevice_error_free(err);
idevice_pairing_file_free(pairing);
return 1;
}
// Connect to CoreDeviceProxy
CoreDeviceProxyHandle *core_device = NULL;
err = core_device_proxy_connect(tcp_provider, &core_device);
idevice_provider_free(tcp_provider);
if (err != NULL) {
fprintf(stderr, "Failed to connect to CoreDeviceProxy: [%d] %s", err->code,
err->message);
idevice_error_free(err);
return 1;
}
// Get server RSD port
uint16_t rsd_port;
err = core_device_proxy_get_server_rsd_port(core_device, &rsd_port);
if (err != NULL) {
fprintf(stderr, "Failed to get server RSD port: [%d] %s", err->code,
err->message);
idevice_error_free(err);
core_device_proxy_free(core_device);
return 1;
}
// Create TCP adapter and connect to RSD port
AdapterHandle *adapter = NULL;
err = core_device_proxy_create_tcp_adapter(core_device, &adapter);
if (err != NULL) {
fprintf(stderr, "Failed to create TCP adapter: [%d] %s", err->code,
err->message);
idevice_error_free(err);
return 1;
}
// Connect to RSD port
AdapterStreamHandle *stream = NULL;
err = adapter_connect(adapter, rsd_port, &stream);
if (err != NULL) {
fprintf(stderr, "Failed to connect to RSD port: [%d] %s", err->code,
err->message);
idevice_error_free(err);
adapter_free(adapter);
return 1;
}
RsdHandshakeHandle *handshake = NULL;
err = rsd_handshake_new(stream, &handshake);
if (err != NULL) {
fprintf(stderr, "Failed to perform RSD handshake: [%d] %s", err->code,
err->message);
idevice_error_free(err);
adapter_close(stream);
adapter_free(adapter);
return 1;
}
// Create RemoteServerClient
RemoteServerHandle *remote_server = NULL;
err = remote_server_connect_rsd(adapter, handshake, &remote_server);
if (err != NULL) {
fprintf(stderr, "Failed to create remote server: [%d] %s", err->code,
err->message);
idevice_error_free(err);
adapter_free(adapter);
rsd_handshake_free(handshake);
return 1;
}
// Create LocationSimulationClient
LocationSimulationHandle *location_sim = NULL;
err = location_simulation_new(remote_server, &location_sim);
if (err != NULL) {
fprintf(stderr, "Failed to create location simulation client: [%d] %s",
err->code, err->message);
idevice_error_free(err);
remote_server_free(remote_server);
return 1;
}
// Set location
err = location_simulation_set(location_sim, latitude, longitude);
if (err != NULL) {
fprintf(stderr, "Failed to set location: [%d] %s", err->code, err->message);
idevice_error_free(err);
} else {
printf("Successfully set location to %.6f, %.6f\n", latitude, longitude);
}
printf("Press Enter to clear the simulated location...\n");
getchar();
// Clear location
err = location_simulation_clear(location_sim);
if (err != NULL) {
fprintf(stderr, "Failed to clear location: [%d] %s", err->code,
err->message);
idevice_error_free(err);
} else {
printf("Successfully cleared simulated location\n");
}
// Cleanup
location_simulation_free(location_sim);
remote_server_free(remote_server);
printf("Done.\n");
return 0;
}