summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Bryan Forbes2010-03-16 03:40:55 -0500
committerGravatar Martin Szulecki2012-03-20 23:25:54 +0100
commitfd3f9219f4e7178435f312300f933abe25608cf3 (patch)
treed41f4e184fca3da70a4bb44a0eee39dab32b5350
parent69f518d3a4b249daab850b08a376adbbf6636a8e (diff)
downloadlibimobiledevice-fd3f9219f4e7178435f312300f933abe25608cf3.tar.gz
libimobiledevice-fd3f9219f4e7178435f312300f933abe25608cf3.tar.bz2
Added cython bindings.
-rw-r--r--.gitignore2
-rw-r--r--Makefile.am2
-rw-r--r--configure.ac43
-rw-r--r--cython/Makefile.am32
-rw-r--r--cython/imobiledevice.pyx336
-rw-r--r--cython/stdint.pxi10
6 files changed, 415 insertions, 10 deletions
diff --git a/.gitignore b/.gitignore
index a40d060..82daaf9 100644
--- a/.gitignore
+++ b/.gitignore
@@ -49,3 +49,5 @@ tools/idevicesyslog
49tools/idevicebackup 49tools/idevicebackup
50tools/ideviceimagemounter 50tools/ideviceimagemounter
51tools/idevicescreenshot 51tools/idevicescreenshot
52cython/.libs/*
53cython/*.c
diff --git a/Makefile.am b/Makefile.am
index 39840d6..9032f79 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -1,6 +1,6 @@
1AUTOMAKE_OPTIONS = foreign 1AUTOMAKE_OPTIONS = foreign
2ACLOCAL_AMFLAGS = -I m4 2ACLOCAL_AMFLAGS = -I m4
3SUBDIRS = src include swig dev tools docs 3SUBDIRS = src include $(SWIG_SUB) $(CYTHON_SUB) dev tools docs
4 4
5DISTCHECK_CONFIGURE_FLAGS = --enable-dev-tools 5DISTCHECK_CONFIGURE_FLAGS = --enable-dev-tools
6 6
diff --git a/configure.ac b/configure.ac
index 7dcf87b..b12ee61 100644
--- a/configure.ac
+++ b/configure.ac
@@ -69,12 +69,12 @@ if test "x$ac_cv_have_endian" = "xno"; then
69 fi 69 fi
70fi 70fi
71 71
72 72# SWIG Python Bindings
73AC_ARG_WITH([swig], 73AC_ARG_WITH([swig],
74 [AS_HELP_STRING([--without-swig], 74 [AS_HELP_STRING([--without-swig],
75 [build Python bindings using swig (default is yes)])], 75 [build Python bindings using SWIG (default is yes)])],
76 [build_swig=false], 76 [build_swig=false],
77 [build_swig=true]) 77 [build_swig=true])
78if test "$build_swig" = "true"; then 78if test "$build_swig" = "true"; then
79 AM_PATH_PYTHON(2.3) 79 AM_PATH_PYTHON(2.3)
80 AC_PROG_SWIG(1.3.21) 80 AC_PROG_SWIG(1.3.21)
@@ -83,13 +83,13 @@ if test "$build_swig" = "true"; then
83else 83else
84 SWIG=false 84 SWIG=false
85fi 85fi
86
87if [test "x$SWIG" != "xfalse"]; then 86if [test "x$SWIG" != "xfalse"]; then
88 python_bindings=yes 87 SWIG_SUB=swig
88 swig_python_bindings=yes
89else 89else
90 python_bindings=no 90 SWIG_SUB=
91 swig_python_bindings=no
91fi 92fi
92
93AM_CONDITIONAL([HAVE_SWIG],[test "x$SWIG" != "xfalse"]) 93AM_CONDITIONAL([HAVE_SWIG],[test "x$SWIG" != "xfalse"])
94 94
95AC_ARG_ENABLE([openssl], 95AC_ARG_ENABLE([openssl],
@@ -124,9 +124,32 @@ else
124 ssl_provider="GnuTLS" 124 ssl_provider="GnuTLS"
125fi 125fi
126 126
127# Cython Python Bindings
128AC_SUBST([CYTHON_PLIST_INCLUDE_DIR])
127 129
128AC_SUBST([DEV_SUB]) 130AC_ARG_WITH([cython],
131 [AS_HELP_STRING([--without-cython],
132 [build Python bindings using Cython (default is yes)])],
133 [build_cython=false],
134 [build_cython=true])
135if test "$build_cython" = "true"; then
136 AM_PATH_PYTHON(2.3)
137 AC_PROG_CYTHON(0.12.1)
138 CYTHON_PYTHON
139else
140 CYTHON=false
129 141
142fi
143if [test "x$CYTHON" != "xfalse"]; then
144 CYTHON_SUB=cython
145 CYTHON_PLIST_INCLUDE_DIR=$($PKG_CONFIG --variable=includedir libplist)/plist/cython
146else
147 CYTHON_SUB=
148 cython_python_bindings=no
149fi
150AM_CONDITIONAL([HAVE_CYTHON],[test "x$CYTHON" = "xcython"])
151
152AC_SUBST([DEV_SUB])
130 153
131AC_ARG_ENABLE([dev-tools], 154AC_ARG_ENABLE([dev-tools],
132 [AS_HELP_STRING([--enable-dev-tools], 155 [AS_HELP_STRING([--enable-dev-tools],
@@ -200,6 +223,7 @@ include/Makefile
200dev/Makefile 223dev/Makefile
201tools/Makefile 224tools/Makefile
202swig/Makefile 225swig/Makefile
226cython/Makefile
203docs/Makefile 227docs/Makefile
204libimobiledevice-1.0.pc 228libimobiledevice-1.0.pc
205doxygen.cfg 229doxygen.cfg
@@ -212,7 +236,8 @@ Configuration for $PACKAGE $VERSION:
212 Install prefix: .........: $prefix 236 Install prefix: .........: $prefix
213 Debug code ..............: $building_debug_code 237 Debug code ..............: $building_debug_code
214 Dev tools ...............: $building_dev_tools 238 Dev tools ...............: $building_dev_tools
215 Python bindings .........: $python_bindings 239 SWIG Python bindings ....: $swig_python_bindings
240 Cython Python bindgins ..: $cython_python_bindings
216 SSL support .............: $ssl_provider 241 SSL support .............: $ssl_provider
217 242
218 Now type 'make' to build $PACKAGE $VERSION, 243 Now type 'make' to build $PACKAGE $VERSION,
diff --git a/cython/Makefile.am b/cython/Makefile.am
new file mode 100644
index 0000000..3cada6c
--- /dev/null
+++ b/cython/Makefile.am
@@ -0,0 +1,32 @@
1AM_CPPFLAGS = -I$(top_srcdir)/include
2
3AM_CFLAGS = $(GLOBAL_CFLAGS) $(libusbmuxd_CFLAGS) $(libglib2_CFLAGS) $(libgnutls_CFLAGS) $(libtasn1_CFLAGS) $(libgthread2_CFLAGS) $(libplist_CFLAGS) $(LFS_CFLAGS)
4AM_LDFLAGS = $(libglib2_LIBS) $(libgnutls_LIBS) $(libtasn1_LIBS) $(libgthread2_LIBS) $(libplist_LIBS) $(libusbmuxd_LIBS) $(libgcrypt_LIBS)
5
6if HAVE_CYTHON
7
8BUILT_SOURCES = imobiledevice.c
9
10CLEANFILES = \
11 *.pyc \
12 *.pyo \
13 imobiledevice.so \
14 imobiledevice.c
15
16EXTRA_DIST = \
17 imobiledevice.pyx
18
19imobiledevicedir = $(pyexecdir)
20imobiledevice_LTLIBRARIES = imobiledevice.la
21nodist_imobiledevice_la_SOURCES = imobiledevice.c #imobiledevice_private.c
22imobiledevice_la_CFLAGS = -I$(top_builddir)/include -I$(top_srcdir)/src $(PYTHON_CPPFLAGS)
23imobiledevice_la_LDFLAGS = -module -avoid-version $(PYTHON_LDFLAGS)
24imobiledevice_la_LIBADD = $(top_builddir)/src/libimobiledevice.la
25
26imobiledevice.c: imobiledevice.pyx $(CYTHON_PLIST_INCLUDE_DIR)/plist.pxd
27 $(CYTHON) --line-directives -I$(CYTHON_PLIST_INCLUDE_DIR) -I$(top_srcdir)/src -o $@ $<
28
29# imobiledevice_private.c: $(IMOBILEDEVICE_PRIVATE_SOURCES) $(IMOBILEDEVICE_INCLUDES) $(PLIST_INCLUDES)
30# $(CYTHON) $(IMOBILEDEVICE_CPPFLAGS) -I$(top_srcdir)/src -o $@ $<
31
32endif
diff --git a/cython/imobiledevice.pyx b/cython/imobiledevice.pyx
new file mode 100644
index 0000000..7190def
--- /dev/null
+++ b/cython/imobiledevice.pyx
@@ -0,0 +1,336 @@
1cdef extern from *:
2 ctypedef unsigned char uint8_t
3 ctypedef short int int16_t
4 ctypedef unsigned short int uint16_t
5 ctypedef unsigned int uint32_t
6 ctypedef int int32_t
7IF UNAME_MACHINE == 'x86_64':
8 ctypedef unsigned long int uint64_t
9ELSE:
10 ctypedef unsigned long long int uint64_t
11
12cimport plist
13
14cdef extern from "pyerrors.h":
15 ctypedef class __builtin__.Exception [object PyBaseExceptionObject]:
16 pass
17
18cdef class BaseError(Exception):
19 cdef dict _lookup_table
20 cdef int16_t _c_errcode
21 cpdef get_message(self)
22
23 def __cinit__(self, int16_t errcode):
24 self._c_errcode = errcode
25 Exception.__init__(self, errcode)
26
27 def __nonzero__(self):
28 return self._c_errcode != 0
29
30 cpdef get_message(self):
31 return '%s (%s)' % (self._lookup_table[self._c_errcode], self._c_errcode)
32
33 def __str__(self):
34 return self.get_message()
35
36 def __repr__(self):
37 return self.__str__()
38
39cdef extern from "libimobiledevice/libimobiledevice.h":
40 cdef struct idevice_int:
41 pass
42 ctypedef idevice_int* idevice_t
43 ctypedef int16_t idevice_error_t
44 int16_t IDEVICE_E_SUCCESS
45 int16_t IDEVICE_E_INVALID_ARG
46 int16_t IDEVICE_E_UNKNOWN_ERROR
47 int16_t IDEVICE_E_NO_DEVICE
48 int16_t IDEVICE_E_NOT_ENOUGH_DATA
49 int16_t IDEVICE_E_BAD_HEADER
50 int16_t IDEVICE_E_SSL_ERROR
51 cdef enum idevice_event_type:
52 IDEVICE_DEVICE_ADD = 1,
53 IDEVICE_DEVICE_REMOVE
54 ctypedef struct idevice_event_t:
55 idevice_event_type event
56 char *uuid
57 int conn_type
58 ctypedef void (*idevice_event_cb_t) (idevice_event_t *event, void *user_data)
59 cdef extern idevice_error_t c_idevice_event_subscribe "idevice_event_subscribe" (idevice_event_cb_t callback, void *user_data)
60 cdef extern idevice_error_t c_idevice_event_unsubscribe "idevice_event_unsubscribe" ()
61 void idevice_set_debug_level(int level)
62 idevice_error_t idevice_new(idevice_t *device, char *uuid)
63 idevice_error_t idevice_free(idevice_t device)
64 idevice_error_t idevice_get_uuid(idevice_t device, char** uuid)
65 idevice_error_t idevice_get_handle(idevice_t device, uint32_t *handle)
66
67def set_debug_level(level):
68 idevice_set_debug_level(level)
69
70#cdef void idevice_event_cb(idevice_event_t *c_event, void *user_data):
71 #event = iDeviceEvent()
72 #event._c_event = c_event
73 #(<object>user_data)(event)
74
75#def idevice_event_subscribe(callback):
76 #c_idevice_event_subscribe(idevice_event_cb, <void*>callback)
77
78cdef class iDeviceError(BaseError):
79 def __cinit__(self, *args, **kwargs):
80 self._lookup_table = {
81 IDEVICE_E_SUCCESS: 'Success',
82 IDEVICE_E_INVALID_ARG: 'Invalid argument',
83 IDEVICE_E_UNKNOWN_ERROR: 'Unknown error',
84 IDEVICE_E_NO_DEVICE: 'No device',
85 IDEVICE_E_NOT_ENOUGH_DATA: 'Not enough data',
86 IDEVICE_E_BAD_HEADER: 'Bad header',
87 IDEVICE_E_SSL_ERROR: 'SSL Error'
88 }
89 BaseError.__init__(self, *args, **kwargs)
90
91cdef class iDeviceEvent:
92 cdef idevice_event_t* _c_event
93
94cdef class iDevice:
95 cdef idevice_t _c_dev
96
97 def __cinit__(self, uuid=None, *args, **kwargs):
98 cdef char* c_uuid = NULL
99 if uuid is not None:
100 c_uuid = uuid
101 err = iDeviceError(idevice_new(&(self._c_dev), c_uuid))
102 if err: raise err
103
104 def __dealloc__(self):
105 if self._c_dev is not NULL:
106 err = iDeviceError(idevice_free(self._c_dev))
107 if err: raise err
108
109 property uuid:
110 def __get__(self):
111 cdef char* uuid
112 err = iDeviceError(idevice_get_uuid(self._c_dev, &uuid))
113 if err: raise err
114 return uuid
115 property handle:
116 def __get__(self):
117 cdef uint32_t handle
118 err = iDeviceError(idevice_get_handle(self._c_dev, &handle))
119 if err: raise err
120 return handle
121
122cdef extern from "libimobiledevice/lockdown.h":
123 cdef struct lockdownd_client_int:
124 pass
125 ctypedef lockdownd_client_int *lockdownd_client_t
126 ctypedef int16_t lockdownd_error_t
127 int16_t LOCKDOWN_E_SUCCESS
128 int16_t LOCKDOWN_E_INVALID_ARG
129 int16_t LOCKDOWN_E_INVALID_CONF
130 int16_t LOCKDOWN_E_PLIST_ERROR
131 int16_t LOCKDOWN_E_PAIRING_FAILED
132 int16_t LOCKDOWN_E_SSL_ERROR
133 int16_t LOCKDOWN_E_DICT_ERROR
134 int16_t LOCKDOWN_E_START_SERVICE_FAILED
135 int16_t LOCKDOWN_E_NOT_ENOUGH_DATA
136 int16_t LOCKDOWN_E_SET_VALUE_PROHIBITED
137 int16_t LOCKDOWN_E_GET_VALUE_PROHIBITED
138 int16_t LOCKDOWN_E_REMOVE_VALUE_PROHIBITED
139 int16_t LOCKDOWN_E_MUX_ERROR
140 int16_t LOCKDOWN_E_ACTIVATION_FAILED
141 int16_t LOCKDOWN_E_PASSWORD_PROTECTED
142 int16_t LOCKDOWN_E_NO_RUNNING_SESSION
143 int16_t LOCKDOWN_E_INVALID_HOST_ID
144 int16_t LOCKDOWN_E_INVALID_SERVICE
145 int16_t LOCKDOWN_E_INVALID_ACTIVATION_RECORD
146 int16_t LOCKDOWN_E_UNKNOWN_ERROR
147
148 lockdownd_error_t lockdownd_client_new_with_handshake(idevice_t device, lockdownd_client_t *client, char *label)
149 lockdownd_error_t lockdownd_client_free(lockdownd_client_t client)
150 lockdownd_error_t lockdownd_start_service(lockdownd_client_t client, char *service, uint16_t *port)
151
152cdef class LockdownError(BaseError):
153 def __init__(self, *args, **kwargs):
154 self._lookup_table = {
155 LOCKDOWN_E_SUCCESS: "Success",
156 LOCKDOWN_E_INVALID_ARG: "Invalid argument",
157 LOCKDOWN_E_INVALID_CONF: "Invalid configuration",
158 LOCKDOWN_E_PLIST_ERROR: "PList error",
159 LOCKDOWN_E_PAIRING_FAILED: "Pairing failed",
160 LOCKDOWN_E_SSL_ERROR: "SSL error",
161 LOCKDOWN_E_DICT_ERROR: "Dict error",
162 LOCKDOWN_E_START_SERVICE_FAILED: "Start service failed",
163 LOCKDOWN_E_NOT_ENOUGH_DATA: "Not enough data",
164 LOCKDOWN_E_SET_VALUE_PROHIBITED: "Set value prohibited",
165 LOCKDOWN_E_GET_VALUE_PROHIBITED: "Get value prohibited",
166 LOCKDOWN_E_REMOVE_VALUE_PROHIBITED: "Remove value prohibited",
167 LOCKDOWN_E_MUX_ERROR: "MUX Error",
168 LOCKDOWN_E_ACTIVATION_FAILED: "Activation failed",
169 LOCKDOWN_E_PASSWORD_PROTECTED: "Password protected",
170 LOCKDOWN_E_NO_RUNNING_SESSION: "No running session",
171 LOCKDOWN_E_INVALID_HOST_ID: "Invalid host ID",
172 LOCKDOWN_E_INVALID_SERVICE: "Invalid service",
173 LOCKDOWN_E_INVALID_ACTIVATION_RECORD: "Invalid activation record",
174 LOCKDOWN_E_UNKNOWN_ERROR: "Unknown error"
175 }
176 BaseError.__init__(self, *args, **kwargs)
177
178cdef class LockdownClient:
179 cdef lockdownd_client_t _c_client
180
181 def __cinit__(self, iDevice device not None, char *label=NULL, *args, **kwargs):
182 cdef iDevice dev = device
183 err = LockdownError(lockdownd_client_new_with_handshake(dev._c_dev, &(self._c_client), label))
184 if err: raise err
185
186 def __dealloc__(self):
187 if self._c_client is not NULL:
188 err = LockdownError(lockdownd_client_free(self._c_client))
189 if err: raise err
190
191 cpdef start_service(self, service):
192 cdef uint16_t port
193 err = LockdownError(lockdownd_start_service(self._c_client, service, &port))
194 if err: raise err
195 return port
196
197 def goodbye(self):
198 pass
199
200
201cdef extern from "libimobiledevice/mobilesync.h":
202 cdef struct mobilesync_client_int:
203 pass
204 ctypedef mobilesync_client_int *mobilesync_client_t
205
206 ctypedef int16_t mobilesync_error_t
207 int16_t MOBILESYNC_E_SUCCESS
208 int16_t MOBILESYNC_E_INVALID_ARG
209 int16_t MOBILESYNC_E_PLIST_ERROR
210 int16_t MOBILESYNC_E_MUX_ERROR
211 int16_t MOBILESYNC_E_BAD_VERSION
212 int16_t MOBILESYNC_E_UNKNOWN_ERROR
213
214 mobilesync_error_t mobilesync_client_new(idevice_t device, uint16_t port, mobilesync_client_t * client)
215 mobilesync_error_t mobilesync_client_free(mobilesync_client_t client)
216 mobilesync_error_t mobilesync_receive(mobilesync_client_t client, plist.plist_t *plist)
217 mobilesync_error_t mobilesync_send(mobilesync_client_t client, plist.plist_t plist)
218
219cdef class MobileSyncError(BaseError):
220 def __init__(self, *args, **kwargs):
221 self._lookup_table = {
222 MOBILESYNC_E_SUCCESS: "Success",
223 MOBILESYNC_E_INVALID_ARG: "Invalid argument",
224 MOBILESYNC_E_PLIST_ERROR: "PList Error",
225 MOBILESYNC_E_MUX_ERROR: "MUX Error",
226 MOBILESYNC_E_BAD_VERSION: "Bad Version",
227 MOBILESYNC_E_UNKNOWN_ERROR: "Unknown error"
228 }
229 BaseError.__init__(self, *args, **kwargs)
230
231cdef class MobileSyncClient:
232 cdef mobilesync_client_t _c_client
233
234 def __cinit__(self, iDevice device not None, LockdownClient lockdown not None, *args, **kwargs):
235 cdef iDevice dev = device
236 cdef LockdownClient lckd = lockdown
237 port = lckd.start_service("com.apple.mobilesync")
238 err = MobileSyncError(mobilesync_client_new(dev._c_dev, port, &(self._c_client)))
239 if err: raise err
240
241 def __dealloc__(self):
242 if self._c_client is not NULL:
243 err = MobileSyncError(mobilesync_client_free(self._c_client))
244 if err: raise err
245
246 cpdef send(self, object obj):
247 cdef plist.Node node
248 cdef plist.plist_t c_node
249 if isinstance(obj, plist.Node):
250 node = obj
251 c_node = node._c_node
252 else:
253 c_node = plist.native_to_plist_t(obj)
254 err = MobileSyncError(mobilesync_send(self._c_client, c_node))
255 if err: raise err
256
257 cpdef receive(self):
258 cdef plist.plist_t c_node = NULL
259 err = MobileSyncError(mobilesync_receive(self._c_client, &(c_node)))
260 if err: raise err
261
262 return plist.plist_t_to_node(c_node)
263
264cdef extern from *:
265 ctypedef char* const_char_ptr "const char*"
266
267cdef extern from "libimobiledevice/notification_proxy.h":
268 cdef struct np_client_int:
269 pass
270 ctypedef np_client_int *np_client_t
271 ctypedef int16_t np_error_t
272 ctypedef void (*np_notify_cb_t) (const_char_ptr notification, void *userdata)
273 np_error_t np_client_new(idevice_t device, uint16_t port, np_client_t *client)
274 np_error_t np_client_free(np_client_t client)
275 np_error_t np_post_notification(np_client_t client, char *notification)
276 np_error_t np_observe_notification(np_client_t client, char *notification)
277 np_error_t np_observe_notifications(np_client_t client, char **notification_spec)
278 np_error_t np_set_notify_callback(np_client_t client, np_notify_cb_t notify_cb, void *userdata)
279
280cdef void np_notify_cb(const_char_ptr notification, void *py_callback):
281 (<object>py_callback)(notification)
282
283cdef class NotificationProxyError(BaseError):
284 pass
285
286cdef class NotificationProxy:
287 cdef np_client_t _c_client
288
289 def __cinit__(self, iDevice device not None, LockdownClient lockdown not None, *args, **kwargs):
290 cdef iDevice dev = device
291 cdef LockdownClient lckd = lockdown
292 port = lckd.start_service("com.apple.mobile.notification_proxy")
293 err = NotificationProxyError(np_client_new(dev._c_dev, port, &(self._c_client)))
294 if err: raise err
295
296 def __dealloc__(self):
297 if self._c_client is not NULL:
298 err = NotificationProxyError(np_client_free(self._c_client))
299 if err: raise err
300
301 def set_notify_callback(self, callback):
302 err = NotificationProxyError(np_set_notify_callback(self._c_client, np_notify_cb, <void*>callback))
303 if err: raise err
304
305 def observe_notification(self, notification):
306 err = NotificationProxyError(np_observe_notification(self._c_client, notification))
307 if err: raise err
308
309cdef extern from "libimobiledevice/sbservices.h":
310 cdef struct sbservices_client_int:
311 pass
312 ctypedef sbservices_client_int *sbservices_client_t
313 ctypedef int16_t sbservices_error_t
314 sbservices_error_t sbservices_client_new(idevice_t device, uint16_t port, sbservices_client_t *client)
315 sbservices_error_t sbservices_client_free(sbservices_client_t client)
316 sbservices_error_t sbservices_get_icon_state(sbservices_client_t client, plist.plist_t *state)
317 sbservices_error_t sbservices_set_icon_state(sbservices_client_t client, plist.plist_t newstate)
318 sbservices_error_t sbservices_get_icon_pngdata(sbservices_client_t client, char *bundleId, char **pngdata, uint64_t *pngsize)
319
320cdef class SpringboardServicesError(BaseError):
321 pass
322
323cdef class SpringboardServices:
324 cdef sbservices_client_t _c_client
325
326 def __cinit__(self, iDevice device not None, LockdownClient lockdown not None, *args, **kwargs):
327 cdef iDevice dev = device
328 cdef LockdownClient lckd = lockdown
329 port = lockdown.start_service("com.apple.springboardservices")
330 err = SpringboardServicesError(sbservices_client_new(dev._c_dev, port, &(self._c_client)))
331 if err: raise err
332
333 def __dealloc__(self):
334 if self._c_client is not NULL:
335 err = SpringboardServicesError(sbservices_client_free(self._c_client))
336 if err: raise err
diff --git a/cython/stdint.pxi b/cython/stdint.pxi
new file mode 100644
index 0000000..518c3d1
--- /dev/null
+++ b/cython/stdint.pxi
@@ -0,0 +1,10 @@
1cdef extern from "stdint.h":
2 ctypedef unsigned char uint8_t
3 ctypedef short int int16_t
4 ctypedef unsigned short int uint16_t
5 ctypedef unsigned int uint32_t
6 ctypedef int int32_t
7IF UNAME_MACHINE == 'x86_64':
8 ctypedef unsigned long int uint64_t
9ELSE:
10 ctypedef unsigned long long int uint64_t