%global _empty_manifest_terminate_build 0 Name: python-ioctl-opt Version: 1.3 Release: 1 Summary: Functions to compute fnctl.ioctl's opt argument License: GPL 2+ URL: http://github.com/vpelletier/python-ioctl-opt Source0: https://mirrors.nju.edu.cn/pypi/web/packages/33/58/4e7c0921c0e92dd18928043ce167952d6201206703ff31c44e3477523362/ioctl-opt-1.3.tar.gz BuildArch: noarch %description Pythonified linux ``asm-generic/ioctl.h`` . So you can replicate driver's code computing ``fcntl.ioctl``'s ``opt`` argument. For example, starting from the following IOCTL declaration (taken from ``input.h``): .. code:: C #include #define EVIOCGNAME(len) _IOC(_IOC_READ, 'E', 0x06, len) /* get device name */ you could write the following: .. code:: python from ioctl_opt import IOC, IOC_READ EVIOCGNAME = lambda length: IOC(IOC_READ, ord('E'), 0x06, length) The differences are minimal, and all come from python language or coding style: - macros/constants to use from ``ioctl_opt`` for not start with an underscore - defined macro becomes a callable (here a lambda, could be function) - ``IOC``'s ``nr`` argument has to be an integer, so C's single-quote char becomes an ``ord`` call - avoid shadowing built-in ``len`` function The ``length`` argument is an object (typically serving as an I/O buffer with the ``fcntl.ioctl()`` call), the size of which is incorporated in the generated ioctl ``opt`` value. ``IOC()`` will calculate the size of the object. Supported object types are: - any ``ctypes`` type or instance - ``memoryview`` - ``bytearray`` - ``struct.Struct`` - ``array.array`` You may want to then write a pythonic function to conveniently access that ioctl: .. code:: python import ctypes import fcntl def getDeviceName(fd, length=1024): name = (ctypes.c_char * length)() actual_length = fcntl.ioctl(fd, EVIOCGNAME(length), name, True) if actual_length < 0: raise OSError(-actual_length) if name[actual_length - 1] == b'\x00': actual_length -= 1 return name[:actual_length] More advanced example defining hidraw ioctls, requiring structures (for more on how structures are defined, check python's ctype documentation for your python version): .. code:: python import ctypes from ioctl_opt import IOR, IOC, IOC_READ, IOC_WRITE # hid.h HID_MAX_DESCRIPTOR_SIZE = 4096 # hidraw.h class hidraw_report_descriptor(ctypes.Structure): _fields_ = [ ('size', ctypes.c_uint), ('value', ctypes.c_ubyte * HID_MAX_DESCRIPTOR_SIZE), ] class hidraw_devinfo(ctypes.Structure): _fields_ = [ ('bustype', ctypes.c_uint), ('vendor', ctypes.c_short), ('product', ctypes.c_short), ] HIDIOCGRDESCSIZE = IOR(ord('H'), 0x01, ctypes.c_int) HIDIOCGRDESC = IOR(ord('H'), 0x02, hidraw_report_descriptor) HIDIOCGRAWINFO = IOR(ord('H'), 0x03, hidraw_devinfo) HIDIOCGRAWNAME = lambda length: IOC(IOC_READ, ord('H'), 0x04, length) HIDIOCGRAWPHYS = lambda length: IOC(IOC_READ, ord('H'), 0x05, length) HIDIOCSFEATURE = lambda length: IOC(IOC_WRITE|IOC_READ, ord('H'), 0x06, length) HIDIOCGFEATURE = lambda length: IOC(IOC_WRITE|IOC_READ, ord('H'), 0x07, length) %package -n python3-ioctl-opt Summary: Functions to compute fnctl.ioctl's opt argument Provides: python-ioctl-opt BuildRequires: python3-devel BuildRequires: python3-setuptools BuildRequires: python3-pip %description -n python3-ioctl-opt Pythonified linux ``asm-generic/ioctl.h`` . So you can replicate driver's code computing ``fcntl.ioctl``'s ``opt`` argument. For example, starting from the following IOCTL declaration (taken from ``input.h``): .. code:: C #include #define EVIOCGNAME(len) _IOC(_IOC_READ, 'E', 0x06, len) /* get device name */ you could write the following: .. code:: python from ioctl_opt import IOC, IOC_READ EVIOCGNAME = lambda length: IOC(IOC_READ, ord('E'), 0x06, length) The differences are minimal, and all come from python language or coding style: - macros/constants to use from ``ioctl_opt`` for not start with an underscore - defined macro becomes a callable (here a lambda, could be function) - ``IOC``'s ``nr`` argument has to be an integer, so C's single-quote char becomes an ``ord`` call - avoid shadowing built-in ``len`` function The ``length`` argument is an object (typically serving as an I/O buffer with the ``fcntl.ioctl()`` call), the size of which is incorporated in the generated ioctl ``opt`` value. ``IOC()`` will calculate the size of the object. Supported object types are: - any ``ctypes`` type or instance - ``memoryview`` - ``bytearray`` - ``struct.Struct`` - ``array.array`` You may want to then write a pythonic function to conveniently access that ioctl: .. code:: python import ctypes import fcntl def getDeviceName(fd, length=1024): name = (ctypes.c_char * length)() actual_length = fcntl.ioctl(fd, EVIOCGNAME(length), name, True) if actual_length < 0: raise OSError(-actual_length) if name[actual_length - 1] == b'\x00': actual_length -= 1 return name[:actual_length] More advanced example defining hidraw ioctls, requiring structures (for more on how structures are defined, check python's ctype documentation for your python version): .. code:: python import ctypes from ioctl_opt import IOR, IOC, IOC_READ, IOC_WRITE # hid.h HID_MAX_DESCRIPTOR_SIZE = 4096 # hidraw.h class hidraw_report_descriptor(ctypes.Structure): _fields_ = [ ('size', ctypes.c_uint), ('value', ctypes.c_ubyte * HID_MAX_DESCRIPTOR_SIZE), ] class hidraw_devinfo(ctypes.Structure): _fields_ = [ ('bustype', ctypes.c_uint), ('vendor', ctypes.c_short), ('product', ctypes.c_short), ] HIDIOCGRDESCSIZE = IOR(ord('H'), 0x01, ctypes.c_int) HIDIOCGRDESC = IOR(ord('H'), 0x02, hidraw_report_descriptor) HIDIOCGRAWINFO = IOR(ord('H'), 0x03, hidraw_devinfo) HIDIOCGRAWNAME = lambda length: IOC(IOC_READ, ord('H'), 0x04, length) HIDIOCGRAWPHYS = lambda length: IOC(IOC_READ, ord('H'), 0x05, length) HIDIOCSFEATURE = lambda length: IOC(IOC_WRITE|IOC_READ, ord('H'), 0x06, length) HIDIOCGFEATURE = lambda length: IOC(IOC_WRITE|IOC_READ, ord('H'), 0x07, length) %package help Summary: Development documents and examples for ioctl-opt Provides: python3-ioctl-opt-doc %description help Pythonified linux ``asm-generic/ioctl.h`` . So you can replicate driver's code computing ``fcntl.ioctl``'s ``opt`` argument. For example, starting from the following IOCTL declaration (taken from ``input.h``): .. code:: C #include #define EVIOCGNAME(len) _IOC(_IOC_READ, 'E', 0x06, len) /* get device name */ you could write the following: .. code:: python from ioctl_opt import IOC, IOC_READ EVIOCGNAME = lambda length: IOC(IOC_READ, ord('E'), 0x06, length) The differences are minimal, and all come from python language or coding style: - macros/constants to use from ``ioctl_opt`` for not start with an underscore - defined macro becomes a callable (here a lambda, could be function) - ``IOC``'s ``nr`` argument has to be an integer, so C's single-quote char becomes an ``ord`` call - avoid shadowing built-in ``len`` function The ``length`` argument is an object (typically serving as an I/O buffer with the ``fcntl.ioctl()`` call), the size of which is incorporated in the generated ioctl ``opt`` value. ``IOC()`` will calculate the size of the object. Supported object types are: - any ``ctypes`` type or instance - ``memoryview`` - ``bytearray`` - ``struct.Struct`` - ``array.array`` You may want to then write a pythonic function to conveniently access that ioctl: .. code:: python import ctypes import fcntl def getDeviceName(fd, length=1024): name = (ctypes.c_char * length)() actual_length = fcntl.ioctl(fd, EVIOCGNAME(length), name, True) if actual_length < 0: raise OSError(-actual_length) if name[actual_length - 1] == b'\x00': actual_length -= 1 return name[:actual_length] More advanced example defining hidraw ioctls, requiring structures (for more on how structures are defined, check python's ctype documentation for your python version): .. code:: python import ctypes from ioctl_opt import IOR, IOC, IOC_READ, IOC_WRITE # hid.h HID_MAX_DESCRIPTOR_SIZE = 4096 # hidraw.h class hidraw_report_descriptor(ctypes.Structure): _fields_ = [ ('size', ctypes.c_uint), ('value', ctypes.c_ubyte * HID_MAX_DESCRIPTOR_SIZE), ] class hidraw_devinfo(ctypes.Structure): _fields_ = [ ('bustype', ctypes.c_uint), ('vendor', ctypes.c_short), ('product', ctypes.c_short), ] HIDIOCGRDESCSIZE = IOR(ord('H'), 0x01, ctypes.c_int) HIDIOCGRDESC = IOR(ord('H'), 0x02, hidraw_report_descriptor) HIDIOCGRAWINFO = IOR(ord('H'), 0x03, hidraw_devinfo) HIDIOCGRAWNAME = lambda length: IOC(IOC_READ, ord('H'), 0x04, length) HIDIOCGRAWPHYS = lambda length: IOC(IOC_READ, ord('H'), 0x05, length) HIDIOCSFEATURE = lambda length: IOC(IOC_WRITE|IOC_READ, ord('H'), 0x06, length) HIDIOCGFEATURE = lambda length: IOC(IOC_WRITE|IOC_READ, ord('H'), 0x07, length) %prep %autosetup -n ioctl-opt-1.3 %build %py3_build %install %py3_install install -d -m755 %{buildroot}/%{_pkgdocdir} if [ -d doc ]; then cp -arf doc %{buildroot}/%{_pkgdocdir}; fi if [ -d docs ]; then cp -arf docs %{buildroot}/%{_pkgdocdir}; fi if [ -d example ]; then cp -arf example %{buildroot}/%{_pkgdocdir}; fi if [ -d examples ]; then cp -arf examples %{buildroot}/%{_pkgdocdir}; fi pushd %{buildroot} if [ -d usr/lib ]; then find usr/lib -type f -printf "/%h/%f\n" >> filelist.lst fi if [ -d usr/lib64 ]; then find usr/lib64 -type f -printf "/%h/%f\n" >> filelist.lst fi if [ -d usr/bin ]; then find usr/bin -type f -printf "/%h/%f\n" >> filelist.lst fi if [ -d usr/sbin ]; then find usr/sbin -type f -printf "/%h/%f\n" >> filelist.lst fi touch doclist.lst if [ -d usr/share/man ]; then find usr/share/man -type f -printf "/%h/%f.gz\n" >> doclist.lst fi popd mv %{buildroot}/filelist.lst . mv %{buildroot}/doclist.lst . %files -n python3-ioctl-opt -f filelist.lst %dir %{python3_sitelib}/* %files help -f doclist.lst %{_docdir}/* %changelog * Fri May 05 2023 Python_Bot - 1.3-1 - Package Spec generated