diff --git a/app-pda/libimobiledevice/files/libimobiledevice-1.3.0-python.patch b/app-pda/libimobiledevice/files/libimobiledevice-1.3.0-python.patch new file mode 100644 index 0000000000000..28ca6da51ebd2 --- /dev/null +++ b/app-pda/libimobiledevice/files/libimobiledevice-1.3.0-python.patch @@ -0,0 +1,223 @@ +https://github.com/libimobiledevice/libimobiledevice/pull/685 + +From fb337f26c8e58ed0ce0750f7899ccbd5da203dee Mon Sep 17 00:00:00 2001 +From: wendyisgr33n +Date: Mon, 30 Jul 2018 10:43:57 -0700 +Subject: [PATCH 1/5] Fixed AFC afc.pxi definitions for Python2/3 + compatibility. Added missing public method 'remove_path_and_contents' + +--- a/cython/afc.pxi ++++ b/cython/afc.pxi +@@ -52,6 +52,7 @@ cdef extern from "libimobiledevice/afc.h": + afc_error_t afc_read_directory(afc_client_t client, char *dir, char ***list) + afc_error_t afc_get_file_info(afc_client_t client, char *filename, char ***infolist) + afc_error_t afc_remove_path(afc_client_t client, char *path) ++ afc_error_t afc_remove_path_and_contents(afc_client_t client, char *path) + afc_error_t afc_rename_path(afc_client_t client, char *f, char *to) + afc_error_t afc_make_directory(afc_client_t client, char *dir) + afc_error_t afc_truncate(afc_client_t client, char *path, uint64_t newsize) +@@ -235,17 +236,17 @@ cdef class AfcClient(BaseService): + afc_file_mode_t c_mode + uint64_t handle + AfcFile f +- if mode == 'r': ++ if mode == b'r': + c_mode = AFC_FOPEN_RDONLY +- elif mode == 'r+': ++ elif mode == b'r+': + c_mode = AFC_FOPEN_RW +- elif mode == 'w': ++ elif mode == b'w': + c_mode = AFC_FOPEN_WRONLY +- elif mode == 'w+': ++ elif mode == b'w+': + c_mode = AFC_FOPEN_WR +- elif mode == 'a': ++ elif mode == b'a': + c_mode = AFC_FOPEN_APPEND +- elif mode == 'a+': ++ elif mode == b'a+': + c_mode = AFC_FOPEN_RDAPPEND + else: + raise ValueError("mode string must be 'r', 'r+', 'w', 'w+', 'a', or 'a+'") +@@ -282,6 +283,9 @@ cdef class AfcClient(BaseService): + cpdef remove_path(self, bytes path): + self.handle_error(afc_remove_path(self._c_client, path)) + ++ cpdef remove_path_and_contents(self, bytes path): ++ self.handle_error(afc_remove_path_and_contents(self._c_client, path)) ++ + cpdef rename_path(self, bytes f, bytes t): + self.handle_error(afc_rename_path(self._c_client, f, t)) + +@@ -308,17 +312,17 @@ cdef class Afc2Client(AfcClient): + afc_file_mode_t c_mode + uint64_t handle + AfcFile f +- if mode == 'r': ++ if mode == b'r': + c_mode = AFC_FOPEN_RDONLY +- elif mode == 'r+': ++ elif mode == b'r+': + c_mode = AFC_FOPEN_RW +- elif mode == 'w': ++ elif mode == b'w': + c_mode = AFC_FOPEN_WRONLY +- elif mode == 'w+': ++ elif mode == b'w+': + c_mode = AFC_FOPEN_WR +- elif mode == 'a': ++ elif mode == b'a': + c_mode = AFC_FOPEN_APPEND +- elif mode == 'a+': ++ elif mode == b'a+': + c_mode = AFC_FOPEN_RDAPPEND + else: + raise ValueError("mode string must be 'r', 'r+', 'w', 'w+', 'a', or 'a+'") + +From b71e8935949a1d6f419a3f783d804809fb4c309b Mon Sep 17 00:00:00 2001 +From: wendyisgr33n +Date: Mon, 30 Jul 2018 10:44:40 -0700 +Subject: [PATCH 2/5] Fixed debugserver.pxi PyString_AsString compatibility + with Python3 + +--- a/cython/debugserver.pxi ++++ b/cython/debugserver.pxi +@@ -44,7 +44,12 @@ cdef class DebugServerError(BaseError): + + + # from http://stackoverflow.com/a/17511714 +-from cpython.string cimport PyString_AsString ++# https://github.com/libimobiledevice/libimobiledevice/pull/198 ++from cpython cimport PY_MAJOR_VERSION ++if PY_MAJOR_VERSION <= 2: ++ from cpython.string cimport PyString_AsString ++else: ++ from cpython.bytes cimport PyBytes_AsString as PyString_AsString + cdef char ** to_cstring_array(list_str): + if not list_str: + return NULL + +From 44f54cdc0ebb052e4a642023bbf96504e6139ec9 Mon Sep 17 00:00:00 2001 +From: wendyisgr33n +Date: Mon, 30 Jul 2018 10:45:22 -0700 +Subject: [PATCH 3/5] Fixed bytes/strings check in imobiledevice.pyx for + compatibility with Python2/3 + +--- a/cython/imobiledevice.pyx ++++ b/cython/imobiledevice.pyx +@@ -171,7 +171,7 @@ from libc.stdlib cimport * + cdef class iDevice(Base): + def __cinit__(self, object udid=None, *args, **kwargs): + cdef char* c_udid = NULL +- if isinstance(udid, basestring): ++ if isinstance(udid, (str, bytes)): + c_udid = udid + elif udid is not None: + raise TypeError("iDevice's constructor takes a string or None as the udid argument") + +From 8908619973e751b778d3fb73dc309cd5cb7f4122 Mon Sep 17 00:00:00 2001 +From: wendyisgr33n +Date: Mon, 30 Jul 2018 10:45:55 -0700 +Subject: [PATCH 4/5] Fixed bytes/strings checks in lockdown.pxi for + compatibility with Python2/3 + +--- a/cython/lockdown.pxi ++++ b/cython/lockdown.pxi +@@ -230,9 +230,9 @@ cdef class LockdownClient(PropertyListService): + + if issubclass(service, BaseService) and \ + service.__service_name__ is not None \ +- and isinstance(service.__service_name__, basestring): ++ and isinstance(service.__service_name__, (str, bytes)): + c_service_name = service.__service_name__ +- elif isinstance(service, basestring): ++ elif isinstance(service, (str, bytes)): + c_service_name = service + else: + raise TypeError("LockdownClient.start_service() takes a BaseService or string as its first argument") +@@ -253,7 +253,7 @@ cdef class LockdownClient(PropertyListService): + + if not hasattr(service_class, '__service_name__') and \ + not service_class.__service_name__ is not None \ +- and not isinstance(service_class.__service_name__, basestring): ++ and not isinstance(service_class.__service_name__, (str, bytes)): + raise TypeError("LockdownClient.get_service_client() takes a BaseService as its first argument") + + descriptor = self.start_service(service_class) + +From e59cbdbf4e7dba98ef57a54e314a89edfea0a3dc Mon Sep 17 00:00:00 2001 +From: wendyisgr33n +Date: Mon, 30 Jul 2018 10:47:48 -0700 +Subject: [PATCH 5/5] Fixed method visibility in mobilebackup2.pxi API + +--- a/cython/mobilebackup2.pxi ++++ b/cython/mobilebackup2.pxi +@@ -54,10 +54,10 @@ cdef class MobileBackup2Client(PropertyListService): + cdef inline BaseError _error(self, int16_t ret): + return MobileBackup2Error(ret) + +- cdef send_message(self, bytes message, plist.Node options): ++ cpdef send_message(self, bytes message, plist.Node options): + self.handle_error(mobilebackup2_send_message(self._c_client, message, options._c_node)) + +- cdef tuple receive_message(self): ++ cpdef tuple receive_message(self): + cdef: + char* dlmessage = NULL + plist.plist_t c_node = NULL +@@ -73,29 +73,34 @@ cdef class MobileBackup2Client(PropertyListService): + free(dlmessage) + raise + +- cdef int send_raw(self, bytes data, int length): ++ cpdef int send_raw(self, bytes data, int length): + cdef: +- uint32_t bytes = 0 ++ uint32_t bytes_recvd = 0 + mobilebackup2_error_t err +- err = mobilebackup2_send_raw(self._c_client, data, length, &bytes) ++ err = mobilebackup2_send_raw(self._c_client, data, length, &bytes_recvd) + try: + self.handle_error(err) +- return bytes ++ return bytes_recvd + except BaseError, e: + raise + +- cdef int receive_raw(self, bytes data, int length): ++ cpdef int receive_raw(self, bytearray data, int length): + cdef: +- uint32_t bytes = 0 ++ uint32_t bytes_recvd = 0 + mobilebackup2_error_t err +- err = mobilebackup2_receive_raw(self._c_client, data, length, &bytes) ++ err = mobilebackup2_receive_raw(self._c_client, data, length, &bytes_recvd) ++ ++ # Throwing an exception when we test if theres more data to read is excessive ++ if err == -1 and bytes_recvd == 0: ++ return 0 ++ + try: + self.handle_error(err) +- return bytes ++ return bytes_recvd + except BaseError, e: + raise + +- cdef float version_exchange(self, double[::1] local_versions): ++ cpdef float version_exchange(self, double[::1] local_versions): + cdef: + double[::1] temp = None + double remote_version = 0.0 +@@ -107,8 +112,8 @@ cdef class MobileBackup2Client(PropertyListService): + except BaseError, e: + raise + +- cdef send_request(self, bytes request, bytes target_identifier, bytes source_identifier, plist.Node options): ++ cpdef send_request(self, bytes request, bytes target_identifier, bytes source_identifier, plist.Node options): + self.handle_error(mobilebackup2_send_request(self._c_client, request, target_identifier, source_identifier, options._c_node)) + +- cdef send_status_response(self, int status_code, bytes status1, plist.Node status2): ++ cpdef send_status_response(self, int status_code, bytes status1, plist.Node status2): + self.handle_error(mobilebackup2_send_status_response(self._c_client, status_code, status1, status2._c_node)) diff --git a/app-pda/libimobiledevice/libimobiledevice-1.3.0-r2.ebuild b/app-pda/libimobiledevice/libimobiledevice-1.3.0-r2.ebuild new file mode 100644 index 0000000000000..9705c73f1fc2a --- /dev/null +++ b/app-pda/libimobiledevice/libimobiledevice-1.3.0-r2.ebuild @@ -0,0 +1,114 @@ +# Copyright 1999-2023 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +EAPI=7 + +PYTHON_COMPAT=( python3_{9..11} ) + +inherit autotools python-r1 + +DESCRIPTION="Support library to communicate with Apple iPhone/iPod Touch devices" +HOMEPAGE="https://www.libimobiledevice.org/" +SRC_URI="https://github.com/libimobiledevice/libimobiledevice/releases/download/${PV}/${P}.tar.bz2" + +# While COPYING* doesn't mention 'or any later version', all the headers do, hence use + +LICENSE="GPL-2+ LGPL-2.1+" +SLOT="0/1.0-6" # based on SONAME of libimobiledevice-1.0.so +KEYWORDS="~amd64 ~arm ~arm64 ~loong ~ppc ~ppc64 ~riscv ~x86" +IUSE="doc gnutls python static-libs" +REQUIRED_USE="python? ( ${PYTHON_REQUIRED_USE} )" + +RDEPEND=" + >=app-pda/libplist-2.2.0:= + >=app-pda/libusbmuxd-2.0.2:= + gnutls? ( + dev-libs/libgcrypt:0 + >=dev-libs/libtasn1-1.1 + >=net-libs/gnutls-2.2.0 + ) + !gnutls? ( + dev-libs/openssl:0= + ) + python? ( + ${PYTHON_DEPS} + app-pda/libplist[python(-),${PYTHON_USEDEP}] + ) +" +DEPEND=" + ${RDEPEND} +" +BDEPEND=" + virtual/pkgconfig + doc? ( app-doc/doxygen ) + python? ( >=dev-python/cython-0.17[${PYTHON_USEDEP}] ) +" + +BUILD_DIR="${S}_build" + +PATCHES=( + "${FILESDIR}/${P}-slibtool.patch" + "${FILESDIR}/${P}-missing_libflags.patch" #787962 + "${FILESDIR}/${P}-python.patch" +) + +src_prepare() { + default + eautoreconf +} + +src_configure() { + local ECONF_SOURCE=${S} + + local myeconfargs=( $(use_enable static-libs static) ) + use gnutls && myeconfargs+=( --disable-openssl ) + + do_configure() { + mkdir -p "${BUILD_DIR}" || die + pushd "${BUILD_DIR}" >/dev/null || die + econf "${myeconfargs[@]}" "${@}" + popd >/dev/null || die + } + + do_configure_python() { + # Bug 567916 + local -x PYTHON_LDFLAGS="$(python_get_LIBS)" + do_configure "$@" + } + + do_configure --without-cython + use python && python_foreach_impl do_configure_python +} + +src_compile() { + python_compile() { + emake -C "${BUILD_DIR}"/cython \ + VPATH="${S}/cython:$1/cython" \ + imobiledevice_la_LIBADD="$1/src/libimobiledevice-1.0.la" + } + + emake -C "${BUILD_DIR}" + use python && python_foreach_impl python_compile "${BUILD_DIR}" + + if use doc; then + doxygen "${BUILD_DIR}"/doxygen.cfg || die + fi +} + +src_install() { + python_install() { + emake -C "${BUILD_DIR}/cython" install \ + DESTDIR="${D}" \ + VPATH="${S}/cython:$1/cython" + } + + emake -C "${BUILD_DIR}" install DESTDIR="${D}" + use python && python_foreach_impl python_install "${BUILD_DIR}" + use doc && dodoc docs/html/* + + if use python; then + insinto /usr/include/${PN}/cython + doins cython/imobiledevice.pxd + fi + + find "${D}" -name '*.la' -delete || die +}