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)
Raw data
{
"_id": null,
"home_page": "http://github.com/vpelletier/python-ioctl-opt",
"name": "ioctl-opt",
"maintainer": "",
"docs_url": null,
"requires_python": "",
"maintainer_email": "",
"keywords": "ioctl",
"author": "Vincent Pelletier",
"author_email": "plr.vincent@gmail.com",
"download_url": "https://files.pythonhosted.org/packages/33/58/4e7c0921c0e92dd18928043ce167952d6201206703ff31c44e3477523362/ioctl-opt-1.3.tar.gz",
"platform": null,
"description": "Pythonified linux ``asm-generic/ioctl.h`` .\n\nSo you can replicate driver's code computing ``fcntl.ioctl``'s ``opt`` argument.\n\nFor example, starting from the following IOCTL declaration (taken from ``input.h``):\n\n.. code:: C\n\n #include <sys/ioctl.h>\n #define EVIOCGNAME(len) _IOC(_IOC_READ, 'E', 0x06, len) /* get device name */\n\nyou could write the following:\n\n.. code:: python\n\n from ioctl_opt import IOC, IOC_READ\n EVIOCGNAME = lambda length: IOC(IOC_READ, ord('E'), 0x06, length)\n\nThe differences are minimal, and all come from python language or coding style:\n\n- macros/constants to use from ``ioctl_opt`` for not start with an underscore\n- defined macro becomes a callable (here a lambda, could be function)\n- ``IOC``'s ``nr`` argument has to be an integer, so C's single-quote char becomes an ``ord`` call\n- avoid shadowing built-in ``len`` function\n\nThe ``length`` argument is an object (typically serving as an I/O buffer with the ``fcntl.ioctl()``\ncall), the size of which is incorporated in the generated ioctl ``opt`` value. ``IOC()`` will\ncalculate the size of the object. Supported object types are:\n\n- any ``ctypes`` type or instance\n- ``memoryview``\n- ``bytearray``\n- ``struct.Struct``\n- ``array.array``\n\nYou may want to then write a pythonic function to conveniently access that ioctl:\n\n.. code:: python\n\n import ctypes\n import fcntl\n\n def getDeviceName(fd, length=1024):\n name = (ctypes.c_char * length)()\n actual_length = fcntl.ioctl(fd, EVIOCGNAME(length), name, True)\n if actual_length < 0:\n raise OSError(-actual_length)\n if name[actual_length - 1] == b'\\x00':\n actual_length -= 1\n return name[:actual_length]\n\nMore advanced example defining hidraw ioctls, requiring structures (for more on how structures are defined, check python's ctype documentation for your python version):\n\n.. code:: python\n\n import ctypes\n from ioctl_opt import IOR, IOC, IOC_READ, IOC_WRITE\n\n # hid.h\n HID_MAX_DESCRIPTOR_SIZE = 4096\n\n # hidraw.h\n class hidraw_report_descriptor(ctypes.Structure):\n _fields_ = [\n ('size', ctypes.c_uint),\n ('value', ctypes.c_ubyte * HID_MAX_DESCRIPTOR_SIZE),\n ]\n\n class hidraw_devinfo(ctypes.Structure):\n _fields_ = [\n ('bustype', ctypes.c_uint),\n ('vendor', ctypes.c_short),\n ('product', ctypes.c_short),\n ]\n\n HIDIOCGRDESCSIZE = IOR(ord('H'), 0x01, ctypes.c_int)\n HIDIOCGRDESC = IOR(ord('H'), 0x02, hidraw_report_descriptor)\n HIDIOCGRAWINFO = IOR(ord('H'), 0x03, hidraw_devinfo)\n HIDIOCGRAWNAME = lambda length: IOC(IOC_READ, ord('H'), 0x04, length)\n HIDIOCGRAWPHYS = lambda length: IOC(IOC_READ, ord('H'), 0x05, length)\n HIDIOCSFEATURE = lambda length: IOC(IOC_WRITE|IOC_READ, ord('H'), 0x06, length)\n HIDIOCGFEATURE = lambda length: IOC(IOC_WRITE|IOC_READ, ord('H'), 0x07, length)\n",
"bugtrack_url": null,
"license": "GPL 2+",
"summary": "Functions to compute fnctl.ioctl's opt argument",
"version": "1.3",
"split_keywords": [
"ioctl"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "33584e7c0921c0e92dd18928043ce167952d6201206703ff31c44e3477523362",
"md5": "0a8991b5f58ff91bd55916eb143a65af",
"sha256": "5ed4f9a80d2e02e152a43d3648d7ed8821a0aac5ea88ecc5fcc14460ff7cf2f9"
},
"downloads": -1,
"filename": "ioctl-opt-1.3.tar.gz",
"has_sig": false,
"md5_digest": "0a8991b5f58ff91bd55916eb143a65af",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 10519,
"upload_time": "2023-03-28T12:39:16",
"upload_time_iso_8601": "2023-03-28T12:39:16.556690Z",
"url": "https://files.pythonhosted.org/packages/33/58/4e7c0921c0e92dd18928043ce167952d6201206703ff31c44e3477523362/ioctl-opt-1.3.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2023-03-28 12:39:16",
"github": true,
"gitlab": false,
"bitbucket": false,
"github_user": "vpelletier",
"github_project": "python-ioctl-opt",
"travis_ci": false,
"coveralls": false,
"github_actions": false,
"lcname": "ioctl-opt"
}