idevice 1.1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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,366 @@
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 'plist'
23
+
24
+ # extensions on the Plist rubygem module for
25
+ # working with libplist plist_t objects
26
+ module Plist
27
+
28
+ def self.xml_to_pointer(xml)
29
+ Idevice::Plist_t.from_xml(xml)
30
+ end
31
+
32
+ def self.binary_to_pointer(data)
33
+ Idevice::Plist_t.from_binary(data)
34
+ end
35
+
36
+ def self.parse_binary(data)
37
+ plist_ptr = binary_to_pointer(data)
38
+ if plist_ptr
39
+ res = pointer_to_ruby(plist_ptr)
40
+ return res
41
+ end
42
+ end
43
+
44
+ def self.pointer_to_ruby(plist_ptr)
45
+ plist_ptr.to_ruby
46
+ end
47
+ end
48
+
49
+ # common extension for array and hash to convert
50
+ # to a libplist plist_t object
51
+ module PlistToPointer
52
+ def to_plist_t
53
+ ::Plist.xml_to_pointer(self.to_plist)
54
+ end
55
+ end
56
+
57
+ class Array
58
+ include PlistToPointer
59
+ end
60
+
61
+ class Hash
62
+ include PlistToPointer
63
+ end
64
+
65
+ module Idevice
66
+ class Plist_t < C::ManagedOpaquePointer
67
+ def self.release(ptr)
68
+ C::plist_free(ptr) unless ptr.null?
69
+ end
70
+
71
+ def self.new_array
72
+ C.plist_new_array()
73
+ end
74
+
75
+ def self.new_dict
76
+ C.plist_new_dict()
77
+ end
78
+
79
+ def self.from_xml(xml)
80
+ FFI::MemoryPointer.from_bytes(xml) do |plist_xml|
81
+ FFI::MemoryPointer.new(:pointer) do |p_out|
82
+ C.plist_from_xml(plist_xml, plist_xml.size, p_out)
83
+ out = p_out.read_pointer
84
+ if out.null?
85
+ return nil
86
+ else
87
+ return new(out)
88
+ end
89
+ end
90
+ end
91
+ end
92
+
93
+ def self.from_binary(data)
94
+ FFI::MemoryPointer.from_bytes(data) do |plist_bin|
95
+ FFI::MemoryPointer.new(:pointer) do |p_out|
96
+ C.plist_from_bin(plist_bin, plist_bin.size, p_out)
97
+ out = p_out.read_pointer
98
+ if out.null?
99
+ return nil
100
+ else
101
+ return new(out)
102
+ end
103
+ end
104
+ end
105
+ end
106
+
107
+ def self.new_bool(val)
108
+ C.plist_new_bool(val)
109
+ end
110
+
111
+ def self.new_string(str)
112
+ C.plist_new_string(str)
113
+ end
114
+
115
+ def self.new_real(val)
116
+ C.plist_new_real(val)
117
+ end
118
+
119
+ def self.new_uint(val)
120
+ C.plist_new_uint(val)
121
+ end
122
+
123
+ def self.new_uid(val)
124
+ C.plist_new_uint(val)
125
+ end
126
+
127
+ def self.new_data(data)
128
+ FFI::MemoryPointer.from_bytes(data) do |p_data|
129
+ FFI::MemoryPointer.new(:pointer) do |p_out|
130
+ return C.plist_new_data(p_data, p_data.size)
131
+ end
132
+ end
133
+ end
134
+
135
+ def self.from_ruby(obj)
136
+ case obj
137
+ when TrueClass,FalseClass
138
+ new_bool(obj)
139
+ when Hash, Array
140
+ from_xml(obj.to_plist)
141
+ when String
142
+ new_string(obj)
143
+ when StringIO
144
+ new_data(obj.string)
145
+ when Float
146
+ new_real(obj)
147
+ when Integer
148
+ new_uint(obj)
149
+ when Time,DateTime
150
+ raise NotImplementedError # XXX TODO
151
+ else
152
+ raise TypeError, "Unable to convert #{obj.class} to a plist"
153
+ end
154
+ end
155
+
156
+ def to_ruby
157
+ FFI::MemoryPointer.new(:pointer) do |plist_xml_p|
158
+ FFI::MemoryPointer.new(:pointer) do |length_p|
159
+ C.plist_to_xml(self, plist_xml_p, length_p)
160
+ length = length_p.read_uint32
161
+ if plist_xml_p.null?
162
+ return nil
163
+ else
164
+ ptr = plist_xml_p.read_pointer
165
+ begin
166
+ res = ::Plist.parse_xml(ptr.read_string_length(length).force_encoding('UTF-8'))
167
+ ensure
168
+ C.free(ptr)
169
+ end
170
+ return res
171
+ end
172
+ end
173
+ end
174
+ end
175
+
176
+ def to_plist_t
177
+ self
178
+ end
179
+ end
180
+
181
+ # for use with plists via callbacks and other cases
182
+ # where the ownership of the pointer is not granted
183
+ class Plist_t_Unmanaged < Plist_t
184
+ def self.release(ptr)
185
+ #nop
186
+ end
187
+ end
188
+
189
+
190
+ module C
191
+ ffi_lib 'plist'
192
+
193
+ #PLIST_API plist_t plist_new_dict(void);
194
+ attach_function :plist_new_dict, [], Plist_t
195
+
196
+ #PLIST_API plist_t plist_new_array(void);
197
+ attach_function :plist_new_array, [], Plist_t
198
+
199
+ #PLIST_API plist_t plist_new_string(const char *val);
200
+ attach_function :plist_new_string, [:string], Plist_t
201
+
202
+ #PLIST_API plist_t plist_new_bool(uint8_t val);
203
+ attach_function :plist_new_bool, [:bool], Plist_t
204
+
205
+ #PLIST_API plist_t plist_new_uint(uint64_t val);
206
+ attach_function :plist_new_uint, [:uint64], Plist_t
207
+
208
+ #PLIST_API plist_t plist_new_real(double val);
209
+ attach_function :plist_new_real, [:double], Plist_t
210
+
211
+ #PLIST_API plist_t plist_new_data(const char *val, uint64_t length);
212
+ attach_function :plist_new_data, [:pointer, :uint64], Plist_t
213
+
214
+ #PLIST_API plist_t plist_new_date(int32_t sec, int32_t usec);
215
+ attach_function :plist_new_date, [:int32, :int32], Plist_t
216
+
217
+ #PLIST_API plist_t plist_new_uid(uint64_t val);
218
+ attach_function :plist_new_uid, [:uint64], Plist_t
219
+
220
+ #PLIST_API plist_t plist_copy(plist_t node);
221
+ attach_function :plist_copy, [Plist_t], Plist_t
222
+
223
+ #PLIST_API uint32_t plist_array_get_size(plist_t node);
224
+ attach_function :plist_array_get_size, [Plist_t], :uint32
225
+
226
+ #PLIST_API plist_t plist_array_get_item(plist_t node, uint32_t n);
227
+ attach_function :plist_array_get_item, [Plist_t, :uint32], Plist_t
228
+
229
+ #PLIST_API uint32_t plist_array_get_item_index(plist_t node);
230
+ attach_function :plist_array_get_item_index, [Plist_t], :uint32
231
+
232
+ #PLIST_API void plist_array_set_item(plist_t node, plist_t item, uint32_t n);
233
+ attach_function :plist_array_set_item, [Plist_t, Plist_t, :uint32], :void
234
+
235
+ #PLIST_API void plist_array_append_item(plist_t node, plist_t item);
236
+ attach_function :plist_array_append_item, [Plist_t, Plist_t], :void
237
+
238
+ #PLIST_API void plist_array_insert_item(plist_t node, plist_t item, uint32_t n);
239
+ attach_function :plist_array_insert_item, [Plist_t, Plist_t, :uint32], :void
240
+
241
+ #PLIST_API void plist_array_remove_item(plist_t node, uint32_t n);
242
+ attach_function :plist_array_remove_item, [Plist_t, :uint32], :void
243
+
244
+ #PLIST_API uint32_t plist_dict_get_size(plist_t node);
245
+ attach_function :plist_dict_get_size, [Plist_t], :uint32
246
+
247
+ typedef :pointer, :plist_dict_iter
248
+
249
+ #PLIST_API void plist_dict_new_iter(plist_t node, plist_dict_iter *iter);
250
+ attach_function :plist_dict_new_iter, [Plist_t, :plist_dict_iter], :void
251
+
252
+ #PLIST_API void plist_dict_next_item(plist_t node, plist_dict_iter iter, char **key, plist_t *val);
253
+ attach_function :plist_dict_next_item, [Plist_t, :plist_dict_iter, :pointer, :pointer], :void
254
+
255
+ #PLIST_API void plist_dict_get_item_key(plist_t node, char **key);
256
+ attach_function :plist_dict_get_item_key, [Plist_t, :pointer], :void
257
+
258
+ #PLIST_API plist_t plist_dict_get_item(plist_t node, const char* key);
259
+ attach_function :plist_dict_get_item, [Plist_t, :string], Plist_t
260
+
261
+ #PLIST_API void plist_dict_set_item(plist_t node, const char* key, plist_t item);
262
+ attach_function :plist_dict_set_item, [Plist_t, :string, Plist_t], :void
263
+
264
+ #PLIST_API void plist_dict_insert_item(plist_t node, const char* key, plist_t item);
265
+ attach_function :plist_dict_insert_item, [Plist_t, :string, Plist_t], :void
266
+
267
+ #PLIST_API void plist_dict_remove_item(plist_t node, const char* key);
268
+ attach_function :plist_dict_remove_item, [Plist_t, :string], :void
269
+
270
+ #PLIST_API plist_t plist_get_parent(plist_t node);
271
+ attach_function :plist_get_parent, [Plist_t], Plist_t
272
+
273
+ typedef enum(
274
+ :BOOLEAN, # Boolean, scalar type
275
+ :UINT, # Unsigned integer, scalar type
276
+ :REAL, # Real, scalar type
277
+ :STRING, # ASCII string, scalar type
278
+ :ARRAY, # Ordered array, structured type
279
+ :DICT, # Unordered dictionary (key/value pair), structured type
280
+ :DATE, # Date, scalar type
281
+ :DATA, # Binary data, scalar type
282
+ :KEY, # Key in dictionaries (ASCII String), scalar type
283
+ :UID, # Special type used for 'keyed encoding'
284
+ :NONE, # No type
285
+ ), :plist_type
286
+
287
+ #PLIST_API plist_type plist_get_node_type(plist_t node);
288
+ attach_function :plist_get_node_type, [Plist_t], :plist_type
289
+
290
+ #PLIST_API void plist_get_key_val(plist_t node, char **val);
291
+ attach_function :plist_get_key_val, [Plist_t, :pointer], :void
292
+
293
+ #PLIST_API void plist_get_string_val(plist_t node, char **val);
294
+ attach_function :plist_get_string_val, [Plist_t, :pointer], :void
295
+
296
+ #PLIST_API void plist_get_bool_val(plist_t node, uint8_t * val);
297
+ attach_function :plist_get_bool_val, [Plist_t, :pointer], :void
298
+
299
+ #PLIST_API void plist_get_uint_val(plist_t node, uint64_t * val);
300
+ attach_function :plist_get_uint_val, [Plist_t, :pointer], :void
301
+
302
+ #PLIST_API void plist_get_real_val(plist_t node, double *val);
303
+ attach_function :plist_get_real_val, [Plist_t, :pointer], :void
304
+
305
+ #PLIST_API void plist_get_data_val(plist_t node, char **val, uint64_t * length);
306
+ attach_function :plist_get_data_val, [Plist_t, :pointer, :pointer], :void
307
+
308
+ #PLIST_API void plist_get_date_val(plist_t node, int32_t * sec, int32_t * usec);
309
+ attach_function :plist_get_date_val, [Plist_t, :pointer, :pointer], :void
310
+
311
+ #PLIST_API void plist_get_uid_val(plist_t node, uint64_t * val);
312
+ attach_function :plist_get_uid_val, [Plist_t, :pointer], :void
313
+
314
+ #PLIST_API void plist_set_type(plist_t node, plist_type type);
315
+ attach_function :plist_set_type, [Plist_t, :plist_type], :void
316
+
317
+ #PLIST_API void plist_set_key_val(plist_t node, const char *val);
318
+ attach_function :plist_set_key_val, [Plist_t, :string], :void
319
+
320
+ #PLIST_API void plist_set_string_val(plist_t node, const char *val);
321
+ attach_function :plist_set_string_val, [Plist_t, :string], :void
322
+
323
+ #PLIST_API void plist_set_bool_val(plist_t node, uint8_t val);
324
+ attach_function :plist_set_bool_val, [Plist_t, :uint8], :void
325
+
326
+ #PLIST_API void plist_set_uint_val(plist_t node, uint64_t val);
327
+ attach_function :plist_set_uint_val, [Plist_t, :uint64], :void
328
+
329
+ #PLIST_API void plist_set_real_val(plist_t node, double val);
330
+ attach_function :plist_set_real_val, [Plist_t, :double], :void
331
+
332
+ #PLIST_API void plist_set_data_val(plist_t node, const char *val, uint64_t length);
333
+ attach_function :plist_set_data_val, [Plist_t, :string, :uint64], :void
334
+
335
+ #PLIST_API void plist_set_date_val(plist_t node, int32_t sec, int32_t usec);
336
+ attach_function :plist_set_date_val, [Plist_t, :int32, :int32], :void
337
+
338
+ #PLIST_API void plist_set_uid_val(plist_t node, uint64_t val);
339
+ attach_function :plist_set_uid_val, [Plist_t, :int32, :int32], :void
340
+
341
+ # void plist_from_bin(const char *plist_bin, uint32_t length, plist_t * plist);
342
+ attach_function :plist_from_bin, [:pointer, :uint32, :pointer], :void
343
+
344
+ # void plist_from_xml(const char *plist_xml, uint32_t length, plist_t * plist);
345
+ attach_function :plist_from_xml, [:pointer, :uint32, :pointer], :void
346
+
347
+ # void plist_to_bin(plist_t plist, char **plist_bin, uint32_t * length);
348
+ attach_function :plist_to_bin, [Plist_t, :pointer, :pointer], :void
349
+
350
+ # void plist_to_xml(plist_t plist, char **plist_xml, uint32_t * length);
351
+ attach_function :plist_to_xml, [Plist_t, :pointer, :pointer], :void
352
+
353
+ attach_function :plist_free, [Plist_t], :void
354
+
355
+ end
356
+ end
357
+
358
+ module FFI
359
+ class Pointer
360
+ def read_plist_t
361
+ unless self.null?
362
+ return Idevice::Plist_t.new(self).to_ruby
363
+ end
364
+ end
365
+ end
366
+ end
@@ -0,0 +1,176 @@
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
+ require 'idevice/lockdown'
25
+
26
+ module Idevice
27
+ class RestoreErrror < IdeviceLibError
28
+ end
29
+
30
+ # Used to initiate the device restore process or reboot a device.
31
+ class RestoreClient < C::ManagedOpaquePointer
32
+ def self.release(ptr)
33
+ C.restored_client_free(ptr) unless ptr.null?
34
+ end
35
+
36
+ def self.attach(opts={})
37
+ idevice = opts[:idevice] || Idevice.attach(opts)
38
+ label = opts[:label] || "ruby-idevice"
39
+
40
+ FFI::MemoryPointer.new(:pointer) do |p_rc|
41
+ err = C.restored_client_new(idevice, p_rc, label)
42
+ raise RestoreErrror, "Restore Error: #{err}" if err != :SUCCESS
43
+
44
+ rc = p_rc.read_pointer
45
+ raise NPError, "restore_client_new returned a NULL client" if rc.null?
46
+ return new(rc)
47
+ end
48
+ end
49
+
50
+ def goodbye
51
+ err = C.restored_goodbye(self)
52
+ raise RestoreErrror, "Restore Error: #{err}" if err != :SUCCESS
53
+
54
+ return true
55
+ end
56
+
57
+ def query_type
58
+ FFI::MemoryPointer.new(:pointer) do |p_type|
59
+ FFI::MemoryPointer.new(:uint64) do |p_vers|
60
+ err = C.restored_query_type(self, p_type, p_vers)
61
+ raise RestoreErrror, "Restore Error: #{err}" if err != :SUCCESS
62
+
63
+ type = p_type.read_pointer
64
+ raise RestoreErrror, "restored_query_type returned a null type" if type.null?
65
+ result = {
66
+ type: type.read_string,
67
+ version: p_vers.read_uint64,
68
+ }
69
+ C.free(type)
70
+ return result
71
+ end
72
+ end
73
+ end
74
+
75
+ def query_value(key)
76
+ FFI::MemoryPointer.new(:pointer) do |p_value|
77
+ err = C.restored_query_value(self, key, p_value)
78
+ raise RestoreErrror, "Restore Error: #{err}" if err != :SUCCESS
79
+
80
+ return p_value.read_pointer.read_plist_t
81
+ end
82
+ end
83
+
84
+ def get_value(key)
85
+ FFI::MemoryPointer.new(:pointer) do |p_value|
86
+ err = C.restored_get_value(self, key, p_value)
87
+ raise RestoreErrror, "Restore Error: #{err}" if err != :SUCCESS
88
+ return p_value.read_pointer.read_plist_t
89
+ end
90
+ end
91
+
92
+ def send_plist(dict)
93
+ err = C.restored_send(self, Plist_t.from_ruby(hash))
94
+ raise RestoreErrror, "Restore Error: #{err}" if err != :SUCCESS
95
+
96
+ end
97
+
98
+ def receive_plist
99
+ FFI::MemoryPointer.new(:pointer) do |p_value|
100
+ err = C.restored_receive(self, p_value)
101
+ raise RestoreErrror, "Restore Error: #{err}" if err != :SUCCESS
102
+ return p_value.read_pointer.read_plist_t
103
+ end
104
+ end
105
+
106
+ def start_restore(version, options={})
107
+ err = C.restored_start_restore(self, Plist_t.from_ruby(options), version)
108
+ raise RestoreErrror, "Restore Error: #{err}" if err != :SUCCESS
109
+
110
+ return true
111
+ end
112
+
113
+ def reboot
114
+ err = C.restored_reboot(self)
115
+ raise RestoreErrror, "Restore Error: #{err}" if err != :SUCCESS
116
+
117
+ return true
118
+ end
119
+
120
+ def set_label(label)
121
+ C.restored_client_set_label(self, label)
122
+ return true
123
+ end
124
+
125
+ end
126
+
127
+ module C
128
+ ffi_lib 'imobiledevice'
129
+
130
+ typedef enum(
131
+ :SUCCESS , 0,
132
+ :INVALID_ARG , -1,
133
+ :INVALID_CONF , -2,
134
+ :PLIST_ERROR , -3,
135
+ :DICT_ERROR , -4,
136
+ :NOT_ENOUGH_DATA , -5,
137
+ :MUX_ERROR , -6,
138
+ :START_RESTORE_FAILED, -7,
139
+ :UNKNOWN_ERROR , -256,
140
+ ), :restored_error_t
141
+
142
+ #restored_error_t restored_client_new(idevice_t device, restored_client_t *client, const char *label);
143
+ attach_function :restored_client_new, [Idevice, :pointer, :string], :restored_error_t
144
+
145
+ #restored_error_t restored_client_free(restored_client_t client);
146
+ attach_function :restored_client_free, [RestoreClient], :restored_error_t
147
+
148
+ #restored_error_t restored_query_type(restored_client_t client, char **type, uint64_t *version);
149
+ attach_function :restored_query_type, [RestoreClient, :pointer, :pointer], :restored_error_t
150
+
151
+ #restored_error_t restored_query_value(restored_client_t client, const char *key, plist_t *value);
152
+ attach_function :restored_query_value, [RestoreClient, :string, :pointer], :restored_error_t
153
+
154
+ #restored_error_t restored_get_value(restored_client_t client, const char *key, plist_t *value) ;
155
+ attach_function :restored_get_value, [RestoreClient, :string, :pointer], :restored_error_t
156
+
157
+ #restored_error_t restored_send(restored_client_t client, plist_t plist);
158
+ attach_function :restored_send, [RestoreClient, Plist_t], :restored_error_t
159
+
160
+ #restored_error_t restored_receive(restored_client_t client, plist_t *plist);
161
+ attach_function :restored_receive, [RestoreClient, :pointer], :restored_error_t
162
+
163
+ #restored_error_t restored_goodbye(restored_client_t client);
164
+ attach_function :restored_goodbye, [RestoreClient], :restored_error_t
165
+
166
+ #restored_error_t restored_start_restore(restored_client_t client, plist_t options, uint64_t version);
167
+ attach_function :restored_start_restore, [RestoreClient, Plist_t, :uint64], :restored_error_t
168
+
169
+ #restored_error_t restored_reboot(restored_client_t client);
170
+ attach_function :restored_reboot, [RestoreClient], :restored_error_t
171
+
172
+ #void restored_client_set_label(restored_client_t client, const char *label);
173
+ attach_function :restored_client_set_label, [RestoreClient, :string], :void
174
+
175
+ end
176
+ end