idevice 1.1.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (62) hide show
  1. data/.gitignore +18 -0
  2. data/.rspec +2 -0
  3. data/Gemfile +4 -0
  4. data/NOTICE +202 -0
  5. data/README.md +74 -0
  6. data/Rakefile +37 -0
  7. data/examples/idevimgmount +58 -0
  8. data/examples/idumplockdownvalues +64 -0
  9. data/examples/ifetchcrashreports +54 -0
  10. data/examples/ilistapps +38 -0
  11. data/examples/ilistudids +26 -0
  12. data/examples/ilog +35 -0
  13. data/examples/installipa +51 -0
  14. data/examples/iremoveapp +42 -0
  15. data/examples/irestart +26 -0
  16. data/examples/iscreenshotr +39 -0
  17. data/idevice.gemspec +33 -0
  18. data/lib/idevice.rb +69 -0
  19. data/lib/idevice/afc.rb +518 -0
  20. data/lib/idevice/c.rb +129 -0
  21. data/lib/idevice/diagnostics_relay.rb +185 -0
  22. data/lib/idevice/file_relay.rb +83 -0
  23. data/lib/idevice/heartbeat.rb +99 -0
  24. data/lib/idevice/house_arrest.rb +138 -0
  25. data/lib/idevice/idevice.rb +208 -0
  26. data/lib/idevice/image_mounter.rb +117 -0
  27. data/lib/idevice/installation_proxy.rb +193 -0
  28. data/lib/idevice/lockdown.rb +350 -0
  29. data/lib/idevice/misagent.rb +112 -0
  30. data/lib/idevice/mobilebackup.rb +183 -0
  31. data/lib/idevice/mobilebackup2.rb +174 -0
  32. data/lib/idevice/mobilesync.rb +306 -0
  33. data/lib/idevice/notification_proxy.rb +168 -0
  34. data/lib/idevice/plist.rb +366 -0
  35. data/lib/idevice/restore.rb +176 -0
  36. data/lib/idevice/sbservices.rb +152 -0
  37. data/lib/idevice/screenshotr.rb +88 -0
  38. data/lib/idevice/version.rb +3 -0
  39. data/lib/idevice/webinspector.rb +96 -0
  40. data/spec/afc_devicespec.rb +409 -0
  41. data/spec/diagnostics_relay_devicespec.rb +125 -0
  42. data/spec/file_relay_devicespec.rb +45 -0
  43. data/spec/heartbeat_devicespec.rb +39 -0
  44. data/spec/idevice_devicespec.rb +93 -0
  45. data/spec/idevice_spec.rb +29 -0
  46. data/spec/image_mounter_devicespec.rb +65 -0
  47. data/spec/installation_proxy_devicespec.rb +54 -0
  48. data/spec/lockdown_devicespec.rb +106 -0
  49. data/spec/misagent_devicespec.rb +43 -0
  50. data/spec/mobilebackup2_devicespec.rb +58 -0
  51. data/spec/mobilebackup_devicespec.rb +41 -0
  52. data/spec/mobilesync_devicespec.rb +62 -0
  53. data/spec/notification_proxy_devicespec.rb +45 -0
  54. data/spec/plist_spec.rb +176 -0
  55. data/spec/restore_devicespec.rb +72 -0
  56. data/spec/samples/plist.bin +0 -0
  57. data/spec/samples/plist.xml +10 -0
  58. data/spec/sbservices_devicespec.rb +64 -0
  59. data/spec/screenshotr_devicespec.rb +39 -0
  60. data/spec/spec_helper.rb +73 -0
  61. data/spec/webinspector_devicespec.rb +36 -0
  62. metadata +233 -0
@@ -0,0 +1,193 @@
1
+ #
2
+ # Copyright (c) 2013 Eric Monti - Bluebox Security
3
+ #
4
+ # Licensed to the Apache Software Foundation (ASF) under one
5
+ # or more contributor license agreements. See the NOTICE file
6
+ # distributed with this work for additional information
7
+ # regarding copyright ownership. The ASF licenses this file
8
+ # to you under the Apache License, Version 2.0 (the
9
+ # "License"); you may not use this file except in compliance
10
+ # with the License. You may obtain a copy of the License at
11
+ #
12
+ # http://www.apache.org/licenses/LICENSE-2.0
13
+ #
14
+ # Unless required by applicable law or agreed to in writing,
15
+ # software distributed under the License is distributed on an
16
+ # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17
+ # KIND, either express or implied. See the License for the
18
+ # specific language governing permissions and limitations
19
+ # under the License.
20
+
21
+ require 'idevice/c'
22
+ require 'idevice/idevice'
23
+ require 'idevice/lockdown'
24
+ require 'idevice/plist'
25
+
26
+ module Idevice
27
+ class InstProxyError < IdeviceLibError
28
+ end
29
+
30
+ class InstProxyClient < C::ManagedOpaquePointer
31
+ include LibHelpers
32
+
33
+ def self.release(ptr)
34
+ C.instproxy_client_free(ptr) unless ptr.null?
35
+ end
36
+
37
+ def self.attach(opts={})
38
+ _attach_helper("com.apple.mobile.installation_proxy", opts) do |idevice, ldsvc, p_ip|
39
+ err = C.instproxy_client_new(idevice, ldsvc, p_ip)
40
+ raise InstProxyError, "instproxy_client error: #{err}" if err != :SUCCESS
41
+
42
+ ip = p_ip.read_pointer
43
+ raise InstProxyError, "instproxy_client_new returned a NULL house_arrest_client_t pointer" if ip.null?
44
+
45
+ return new(ip)
46
+ end
47
+ end
48
+
49
+ def browse(opts={})
50
+ opts ||= {}
51
+ FFI::MemoryPointer.new(:pointer) do |p_result|
52
+ err = C.instproxy_browse(self, opts.to_plist_t, p_result)
53
+ raise InstProxyError, "instproxy_client error: #{err}" if err != :SUCCESS
54
+
55
+ result = p_result.read_pointer.read_plist_t
56
+ raise InstProxyError, "instproxy_browse returned a null plist_t" if result.nil?
57
+
58
+ return result
59
+ end
60
+ end
61
+
62
+ def install(pkg_path, opts={}, &block)
63
+ opts ||= {}
64
+ err = C.instproxy_install(self, pkg_path, opts.to_plist_t, _cb(&block), nil)
65
+ raise InstProxyError, "instproxy_client error: #{err}" if err != :SUCCESS
66
+
67
+ return true
68
+ end
69
+
70
+ def upgrade(pkg_path, opts={}, &block)
71
+ opts ||= {}
72
+ err = C.instproxy_upgrade(self, pkg_path, opts.to_plist_t, _cb(&block), nil)
73
+ raise InstProxyError, "instproxy_client error: #{err}" if err != :SUCCESS
74
+
75
+ return true
76
+ end
77
+
78
+ def uninstall(appid, opts={}, &block)
79
+ opts ||= {}
80
+ err = C.instproxy_uninstall(self, appid, opts.to_plist_t, _cb(&block), nil)
81
+ raise InstProxyError, "instproxy_client error: #{err}" if err != :SUCCESS
82
+
83
+ return true
84
+ end
85
+
86
+ def lookup_archives(opts={})
87
+ opts ||= {}
88
+ FFI::MemoryPointer.new(:pointer) do |p_result|
89
+ err = C.instproxy_lookup_archives(self, opts.to_plist_t, p_result)
90
+ raise InstProxyError, "instproxy_client error: #{err}" if err != :SUCCESS
91
+
92
+ result = p_result.read_pointer.read_plist_t
93
+ raise InstProxyError, "instproxy_lookup_archives returned a null plist_t" if result.nil?
94
+
95
+ return result
96
+ end
97
+ end
98
+
99
+ def archive(appid, opts={}, &block)
100
+ opts ||= {}
101
+ err = C.instproxy_archive(self, appid, opts.to_plist_t, _cb(&block), nil)
102
+ raise InstProxyError, "instproxy_client error: #{err}" if err != :SUCCESS
103
+
104
+ return true
105
+ end
106
+
107
+ def restore(appid, opts={}, &block)
108
+ opts ||= {}
109
+ err = C.instproxy_restore(self, appid, opts.to_plist_t, _cb(&block), nil)
110
+ raise InstProxyError, "instproxy_client error: #{err}" if err != :SUCCESS
111
+
112
+ return true
113
+ end
114
+
115
+ def remove_archive(appid, opts={}, &block)
116
+ opts ||= {}
117
+ err = C.instproxy_remove_archive(self, appid, opts.to_plist_t, _cb(&block), nil)
118
+ raise InstProxyError, "instproxy_client error: #{err}" if err != :SUCCESS
119
+
120
+ return true
121
+ end
122
+
123
+ private
124
+ def _cb(&blk)
125
+ if blk
126
+ lambda {|op, status, junk| blk.call(op, status.to_ruby) }
127
+ end
128
+ end
129
+ end
130
+
131
+
132
+ module C
133
+ ffi_lib 'imobiledevice'
134
+
135
+ typedef enum(
136
+ :SUCCESS , 0,
137
+ :INVALID_ARG , -1,
138
+ :PLIST_ERROR , -2,
139
+ :CONN_FAILED , -3,
140
+ :OP_IN_PROGRESS , -4,
141
+ :OP_FAILED , -5,
142
+ :UNKNOWN_ERROR , -256,
143
+ ), :instproxy_error_t
144
+
145
+ #/** Reports the status of the given operation */
146
+ #typedef void (*instproxy_status_cb_t) (const char *operation, plist_t status, void *user_data);
147
+ callback :instproxy_status_cb_t, [:string, Plist_t_Unmanaged, :pointer], :void
148
+
149
+ #/* Interface */
150
+ #instproxy_error_t instproxy_client_new(idevice_t device, lockdownd_service_descriptor_t service, instproxy_client_t *client);
151
+ attach_function :instproxy_client_new, [Idevice, LockdownServiceDescriptor, :pointer], :instproxy_error_t
152
+
153
+ #instproxy_error_t instproxy_client_free(instproxy_client_t client);
154
+ attach_function :instproxy_client_free, [InstProxyClient], :instproxy_error_t
155
+
156
+ #instproxy_error_t instproxy_browse(instproxy_client_t client, plist_t client_options, plist_t *result);
157
+ attach_function :instproxy_browse, [InstProxyClient, Plist_t, :pointer], :instproxy_error_t
158
+
159
+ #instproxy_error_t instproxy_install(instproxy_client_t client, const char *pkg_path, plist_t client_options, instproxy_status_cb_t status_cb, void *user_data);
160
+ attach_function :instproxy_install, [InstProxyClient, :string, Plist_t, :instproxy_status_cb_t, :pointer], :instproxy_error_t
161
+
162
+ #instproxy_error_t instproxy_upgrade(instproxy_client_t client, const char *pkg_path, plist_t client_options, instproxy_status_cb_t status_cb, void *user_data);
163
+ attach_function :instproxy_upgrade, [InstProxyClient, :string, Plist_t, :instproxy_status_cb_t, :pointer], :instproxy_error_t
164
+
165
+ #instproxy_error_t instproxy_uninstall(instproxy_client_t client, const char *appid, plist_t client_options, instproxy_status_cb_t status_cb, void *user_data);
166
+ attach_function :instproxy_uninstall, [InstProxyClient, :string, Plist_t, :instproxy_status_cb_t, :pointer], :instproxy_error_t
167
+
168
+ #instproxy_error_t instproxy_lookup_archives(instproxy_client_t client, plist_t client_options, plist_t *result);
169
+ attach_function :instproxy_lookup_archives, [InstProxyClient, Plist_t, :pointer], :instproxy_error_t
170
+
171
+ #instproxy_error_t instproxy_archive(instproxy_client_t client, const char *appid, plist_t client_options, instproxy_status_cb_t status_cb, void *user_data);
172
+ attach_function :instproxy_archive, [InstProxyClient, :string, Plist_t, :instproxy_status_cb_t, :pointer], :instproxy_error_t
173
+
174
+ #instproxy_error_t instproxy_restore(instproxy_client_t client, const char *appid, plist_t client_options, instproxy_status_cb_t status_cb, void *user_data);
175
+ attach_function :instproxy_restore, [InstProxyClient, :string, Plist_t, :instproxy_status_cb_t, :pointer], :instproxy_error_t
176
+
177
+ #instproxy_error_t instproxy_remove_archive(instproxy_client_t client, const char *appid, plist_t client_options, instproxy_status_cb_t status_cb, void *user_data);
178
+ attach_function :instproxy_remove_archive, [InstProxyClient, :string, Plist_t, :instproxy_status_cb_t, :pointer], :instproxy_error_t
179
+
180
+
181
+ ### favor use of regular plist_t over the less rubyful instproxy_client_options interface
182
+
183
+ #plist_t instproxy_client_options_new();
184
+ #attach_function :instproxy_client_options_new, [], Plist_t
185
+
186
+ #void instproxy_client_options_add(plist_t client_options, ...);
187
+ #attach_function :instproxy_client_options_add, [Plist_t, :varargs], :void
188
+
189
+ #void instproxy_client_options_free(plist_t client_options);
190
+ #attach_function :instproxy_client_options_free, [Plist_t], :void
191
+
192
+ end
193
+ end
@@ -0,0 +1,350 @@
1
+ #
2
+ # Copyright (c) 2013 Eric Monti - Bluebox Security
3
+ #
4
+ # Licensed to the Apache Software Foundation (ASF) under one
5
+ # or more contributor license agreements. See the NOTICE file
6
+ # distributed with this work for additional information
7
+ # regarding copyright ownership. The ASF licenses this file
8
+ # to you under the Apache License, Version 2.0 (the
9
+ # "License"); you may not use this file except in compliance
10
+ # with the License. You may obtain a copy of the License at
11
+ #
12
+ # http://www.apache.org/licenses/LICENSE-2.0
13
+ #
14
+ # Unless required by applicable law or agreed to in writing,
15
+ # software distributed under the License is distributed on an
16
+ # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17
+ # KIND, either express or implied. See the License for the
18
+ # specific language governing permissions and limitations
19
+ # under the License.
20
+
21
+ require 'idevice/c'
22
+ require 'idevice/plist'
23
+ require 'idevice/idevice'
24
+
25
+ module Idevice
26
+ class LockdownError < IdeviceLibError
27
+ end
28
+
29
+ # Used to manage device preferences, start services, pairing and activation on the device.
30
+ class LockdownClient < C::ManagedOpaquePointer
31
+ def self.release(ptr)
32
+ C.lockdownd_client_free(ptr) unless ptr.null?
33
+ end
34
+
35
+ def self.attach(opts={})
36
+ idevice = opts[:idevice] || Idevice.attach(opts)
37
+
38
+ label = opts[:label] || "ruby-idevice"
39
+
40
+ FFI::MemoryPointer.new(:pointer) do |p_lockdown_client|
41
+ err =
42
+ if opts[:nohandshake]
43
+ C.lockdownd_client_new(idevice, p_lockdown_client, label)
44
+ else
45
+ C.lockdownd_client_new_with_handshake(idevice, p_lockdown_client, label)
46
+ end
47
+
48
+ raise LockdownError, "Lockdownd error: #{err}" if err != :SUCCESS
49
+
50
+ lockdown_client = p_lockdown_client.read_pointer
51
+ if lockdown_client.null?
52
+ raise LockdownError, "lockdownd_client creation returned a NULL object"
53
+ else
54
+ return new(lockdown_client)
55
+ end
56
+ end
57
+ end
58
+
59
+ def device_udid
60
+ res = nil
61
+ FFI::MemoryPointer.new(:pointer) do |p_udid|
62
+ err = C.lockdownd_get_device_udid(self, p_udid)
63
+ raise LockdownError, "Lockdownd error: #{err}" if err != :SUCCESS
64
+
65
+ udid = p_udid.read_pointer
66
+ unless udid.null?
67
+ res = udid.read_string
68
+ C.free(udid)
69
+ end
70
+ end
71
+ return res
72
+ end
73
+
74
+ def device_name
75
+ res = nil
76
+ FFI::MemoryPointer.new(:pointer) do |p_name|
77
+ err = C.lockdownd_get_device_name(self, p_name)
78
+ raise LockdownError, "Lockdownd error: #{err}" if err != :SUCCESS
79
+
80
+ name = p_name.read_pointer
81
+ unless name.null?
82
+ res = name.read_string
83
+ C.free(name)
84
+ end
85
+ end
86
+ return res
87
+ end
88
+
89
+ def sync_data_classes
90
+ res = nil
91
+ FFI::MemoryPointer.new(:pointer) do |p_sync_classes|
92
+ FFI::MemoryPointer.new(:int) do |p_count|
93
+ err = C.lockdownd_get_sync_data_classes(self, p_sync_classes, p_count)
94
+ raise LockdownError, "Lockdownd error: #{err}" if err != :SUCCESS
95
+
96
+ sync_classes = p_sync_classes.read_pointer
97
+ count = p_count.read_int
98
+ unless sync_classes.null?
99
+ res = sync_classes.read_array_of_pointer(count).map{|p| p.read_string }
100
+ err = C.lockdownd_data_classes_free(sync_classes)
101
+ raise LockdownError, "Lockdownd error: #{err}" if err != :SUCCESS
102
+ end
103
+ end
104
+ end
105
+ return res
106
+ end
107
+
108
+ def query_type
109
+ res = nil
110
+ FFI::MemoryPointer.new(:pointer) do |p_type|
111
+ err = C.lockdownd_query_type(self, p_type)
112
+ raise LockdownError, "Lockdownd error: #{err}" if err != :SUCCESS
113
+
114
+ type = p_type.read_pointer
115
+ res = type.read_string
116
+ C.free(type)
117
+ end
118
+ return res
119
+ end
120
+
121
+ def get_value(domain, key)
122
+ res = nil
123
+ FFI::MemoryPointer.new(:pointer) do |p_val|
124
+ err = C.lockdownd_get_value(self, domain, key, p_val)
125
+ raise LockdownError, "Lockdownd error: #{err}" if err != :SUCCESS
126
+
127
+ res = p_val.read_pointer.read_plist_t
128
+ end
129
+ return res
130
+ end
131
+
132
+ def set_value(domain, key, value)
133
+ err = C.lockdownd_set_value(self, domain, key, Plist_t.from_ruby(value))
134
+ raise LockdownError, "Lockdownd error: #{err}" if err != :SUCCESS
135
+ return true
136
+ end
137
+
138
+ def remove_value(domain, key)
139
+ err = C.lockdownd_remove_value(self, domain, key)
140
+ raise LockdownError, "Lockdownd error: #{err}" if err != :SUCCESS
141
+ return true
142
+ end
143
+
144
+ def start_service(identifier)
145
+ ret = nil
146
+ FFI::MemoryPointer.new(:pointer) do |p_ldsvc|
147
+ err = C.lockdownd_start_service(self, identifier, p_ldsvc)
148
+ raise LockdownError, "Lockdownd error: #{err}" if err != :SUCCESS
149
+
150
+ ldsvc = p_ldsvc.read_pointer
151
+ unless ldsvc.null?
152
+ ret = LockdownServiceDescriptor.new(ldsvc)
153
+ end
154
+ end
155
+ return ret
156
+ end
157
+
158
+ def send_plist(obj)
159
+ err = C.lockdownd_send(self, Plist_t.from_ruby(obj))
160
+ raise LockdownError, "Lockdownd error: #{err}" if err != :SUCCESS
161
+
162
+ return true
163
+ end
164
+
165
+ def receive_plist
166
+ ret = nil
167
+ FFI::MemoryPointer.new(:pointer) do |p_plist|
168
+ err = C.lockdownd_receive(self, p_plist)
169
+ raise LockdownError, "Lockdownd error: #{err}" if err != :SUCCESS
170
+
171
+ ret = p_plist.read_pointer.read_plist_t
172
+ end
173
+ return ret
174
+ end
175
+
176
+ def pair(pair_record)
177
+ raise TypeError, "pair_record must be a LockdownPairRecord" unless pair_record.is_a?(LockdownPairRecord)
178
+ err = C.lockdownd_pair(self, pair_record)
179
+ raise LockdownError, "Lockdownd error: #{err}" if err != :SUCCESS
180
+ return true
181
+ end
182
+
183
+ def validate_pair(pair_record)
184
+ raise TypeError, "pair_record must be a LockdownPairRecord" unless pair_record.is_a?(LockdownPairRecord)
185
+ err = C.lockdownd_validate_pair(self, pair_record)
186
+ raise LockdownError, "Lockdownd error: #{err}" if err != :SUCCESS
187
+ return true
188
+ end
189
+
190
+ def unpair(pair_record)
191
+ raise TypeError, "pair_record must be a LockdownPairRecord" unless pair_record.is_a?(LockdownPairRecord)
192
+ err = C.lockdownd_unpair(self, pair_record)
193
+ raise LockdownError, "Lockdownd error: #{err}" if err != :SUCCESS
194
+ return true
195
+ end
196
+
197
+ def activate(activation_record)
198
+ err = C.lockdownd_activate(self, Plist_t.from_ruby(activation_record))
199
+ raise LockdownError, "Lockdownd error: #{err}" if err != :SUCCESS
200
+ return true
201
+ end
202
+
203
+ def deactivate
204
+ err = C.lockdownd_deactivate(self)
205
+ raise LockdownError, "Lockdownd error: #{err}" if err != :SUCCESS
206
+ return true
207
+ end
208
+
209
+ def enter_recovery
210
+ err = C.lockdownd_enter_recovery(self)
211
+ raise LockdownError, "Lockdownd error: #{err}" if err != :SUCCESS
212
+ return true
213
+ end
214
+
215
+ def goodbye
216
+ err = C.lockdownd_goodbye(self)
217
+ raise LockdownError, "Lockdownd error: #{err}" if err != :SUCCESS
218
+ return true
219
+ end
220
+
221
+ def set_label(label)
222
+ C.lockdownd_client_set_label(self, label)
223
+ return true
224
+ end
225
+ end
226
+
227
+ class LockdownPairRecord < FFI::Struct
228
+ layout(
229
+ :device_certificate, :string,
230
+ :host_certificate, :string,
231
+ :host_id, :string,
232
+ :root_certificate, :string,
233
+ )
234
+ end
235
+
236
+ class LockdownServiceDescriptor < FFI::ManagedStruct
237
+ layout(
238
+ :port, :uint16,
239
+ :ssl_enabled, :uint8,
240
+ )
241
+
242
+ def self.release(ptr)
243
+ C::lockdownd_service_descriptor_free(ptr)
244
+ end
245
+ end
246
+
247
+ module C
248
+ ffi_lib 'imobiledevice'
249
+
250
+ typedef enum(
251
+ :SUCCESS , 0,
252
+ :INVALID_ARG , -1,
253
+ :INVALID_CONF , -2,
254
+ :PLIST_ERROR , -3,
255
+ :PAIRING_FAILED , -4,
256
+ :SSL_ERROR , -5,
257
+ :DICT_ERROR , -6,
258
+ :START_SERVICE_FAILED , -7,
259
+ :NOT_ENOUGH_DATA , -8,
260
+ :SET_VALUE_PROHIBITED , -9,
261
+ :GET_VALUE_PROHIBITED ,-10,
262
+ :REMOVE_VALUE_PROHIBITED ,-11,
263
+ :MUX_ERROR ,-12,
264
+ :ACTIVATION_FAILED ,-13,
265
+ :PASSWORD_PROTECTED ,-14,
266
+ :NO_RUNNING_SESSION ,-15,
267
+ :INVALID_HOST_ID ,-16,
268
+ :INVALID_SERVICE ,-17,
269
+ :INVALID_ACTIVATION_RECORD,-18,
270
+ :UNKNOWN_ERROR ,-256,
271
+ ), :lockdownd_error_t
272
+
273
+ typedef :pointer, :lockdownd_client_t
274
+
275
+ #lockdownd_error_t lockdownd_client_new(idevice_t device, lockdownd_client_t *client, const char *label);
276
+ attach_function :lockdownd_client_new, [Idevice, :pointer, :string], :lockdownd_error_t
277
+
278
+ #lockdownd_error_t lockdownd_client_new_with_handshake(idevice_t device, lockdownd_client_t *client, const char *label);
279
+ attach_function :lockdownd_client_new_with_handshake, [Idevice, :pointer, :string], :lockdownd_error_t
280
+
281
+ #lockdownd_error_t lockdownd_client_free(lockdownd_client_t client);
282
+ attach_function :lockdownd_client_free, [LockdownClient], :lockdownd_error_t
283
+
284
+ #lockdownd_error_t lockdownd_query_type(lockdownd_client_t client, char **type);
285
+ attach_function :lockdownd_query_type, [LockdownClient, :pointer], :lockdownd_error_t
286
+
287
+ #lockdownd_error_t lockdownd_get_value(lockdownd_client_t client, const char *domain, const char *key, plist_t *value);
288
+ attach_function :lockdownd_get_value, [LockdownClient, :string, :string, :pointer], :lockdownd_error_t
289
+
290
+ #lockdownd_error_t lockdownd_set_value(lockdownd_client_t client, const char *domain, const char *key, plist_t value);
291
+ attach_function :lockdownd_set_value, [LockdownClient, :string, :string, Plist_t], :lockdownd_error_t
292
+
293
+ #lockdownd_error_t lockdownd_remove_value(lockdownd_client_t client, const char *domain, const char *key);
294
+ attach_function :lockdownd_remove_value, [LockdownClient, :string, :string], :lockdownd_error_t
295
+
296
+ #lockdownd_error_t lockdownd_start_service(lockdownd_client_t client, const char *identifier, lockdownd_service_descriptor_t *service);
297
+ attach_function :lockdownd_start_service, [LockdownClient, :string, :pointer], :lockdownd_error_t
298
+
299
+ #lockdownd_error_t lockdownd_start_session(lockdownd_client_t client, const char *host_id, char **session_id, int *ssl_enabled);
300
+ attach_function :lockdownd_start_session, [LockdownClient, :string, :pointer, :pointer], :lockdownd_error_t
301
+
302
+ #lockdownd_error_t lockdownd_stop_session(lockdownd_client_t client, const char *session_id);
303
+ attach_function :lockdownd_stop_session, [LockdownClient, :string], :lockdownd_error_t
304
+
305
+ #lockdownd_error_t lockdownd_send(lockdownd_client_t client, plist_t plist);
306
+ attach_function :lockdownd_send, [LockdownClient, Plist_t], :lockdownd_error_t
307
+
308
+ #lockdownd_error_t lockdownd_receive(lockdownd_client_t client, plist_t *plist);
309
+ attach_function :lockdownd_receive, [LockdownClient, :pointer], :lockdownd_error_t
310
+
311
+ #lockdownd_error_t lockdownd_pair(lockdownd_client_t client, lockdownd_pair_record_t pair_record);
312
+ attach_function :lockdownd_pair, [LockdownClient, LockdownPairRecord], :lockdownd_error_t
313
+
314
+ #lockdownd_error_t lockdownd_validate_pair(lockdownd_client_t client, lockdownd_pair_record_t pair_record);
315
+ attach_function :lockdownd_validate_pair, [LockdownClient, LockdownPairRecord], :lockdownd_error_t
316
+
317
+ #lockdownd_error_t lockdownd_unpair(lockdownd_client_t client, lockdownd_pair_record_t pair_record);
318
+ attach_function :lockdownd_unpair, [LockdownClient, LockdownPairRecord], :lockdownd_error_t
319
+
320
+ #lockdownd_error_t lockdownd_activate(lockdownd_client_t client, plist_t activation_record);
321
+ attach_function :lockdownd_activate, [LockdownClient, Plist_t], :lockdownd_error_t
322
+
323
+ #lockdownd_error_t lockdownd_deactivate(lockdownd_client_t client);
324
+ attach_function :lockdownd_deactivate, [LockdownClient], :lockdownd_error_t
325
+
326
+ #lockdownd_error_t lockdownd_enter_recovery(lockdownd_client_t client);
327
+ attach_function :lockdownd_enter_recovery, [LockdownClient], :lockdownd_error_t
328
+
329
+ #lockdownd_error_t lockdownd_goodbye(lockdownd_client_t client);
330
+ attach_function :lockdownd_goodbye, [LockdownClient], :lockdownd_error_t
331
+
332
+ #void lockdownd_client_set_label(lockdownd_client_t client, const char *label);
333
+ attach_function :lockdownd_client_set_label, [LockdownClient, :string], :void
334
+
335
+ #lockdownd_error_t lockdownd_get_device_udid(lockdownd_client_t control, char **udid);
336
+ attach_function :lockdownd_get_device_udid, [LockdownClient, :pointer], :lockdownd_error_t
337
+
338
+ #lockdownd_error_t lockdownd_get_device_name(lockdownd_client_t client, char **device_name);
339
+ attach_function :lockdownd_get_device_name, [LockdownClient, :pointer], :lockdownd_error_t
340
+
341
+ #lockdownd_error_t lockdownd_get_sync_data_classes(lockdownd_client_t client, char ***classes, int *count);
342
+ attach_function :lockdownd_get_sync_data_classes, [LockdownClient, :pointer, :pointer], :lockdownd_error_t
343
+
344
+ #lockdownd_error_t lockdownd_data_classes_free(char **classes);
345
+ attach_function :lockdownd_data_classes_free, [:pointer], :lockdownd_error_t
346
+
347
+ #lockdownd_error_t lockdownd_service_descriptor_free(lockdownd_service_descriptor_t service);
348
+ attach_function :lockdownd_service_descriptor_free, [LockdownServiceDescriptor], :lockdownd_error_t
349
+ end
350
+ end