diff options
author | CoprDistGit <infra@openeuler.org> | 2023-05-05 07:26:11 +0000 |
---|---|---|
committer | CoprDistGit <infra@openeuler.org> | 2023-05-05 07:26:11 +0000 |
commit | a33c2706aa7973393d6d9b57f93c73114531ba94 (patch) | |
tree | 2e6edb112467144fdc7c1f2b8057929df0345110 | |
parent | 38512e2e5eb50e43844dfea937f52f10e490c72e (diff) |
automatic import of python-ioctl-optopeneuler20.03
-rw-r--r-- | .gitignore | 1 | ||||
-rw-r--r-- | python-ioctl-opt.spec | 318 | ||||
-rw-r--r-- | sources | 1 |
3 files changed, 320 insertions, 0 deletions
@@ -0,0 +1 @@ +/ioctl-opt-1.3.tar.gz diff --git a/python-ioctl-opt.spec b/python-ioctl-opt.spec new file mode 100644 index 0000000..96410a0 --- /dev/null +++ b/python-ioctl-opt.spec @@ -0,0 +1,318 @@ +%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 <sys/ioctl.h> + #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 <sys/ioctl.h> + #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 <sys/ioctl.h> + #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 <Python_Bot@openeuler.org> - 1.3-1 +- Package Spec generated @@ -0,0 +1 @@ +0a8991b5f58ff91bd55916eb143a65af ioctl-opt-1.3.tar.gz |