Skip to main content

Functions to compute fnctl.ioctl's opt argument

Project 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):

#include <sys/ioctl.h>
#define EVIOCGNAME(len) _IOC(_IOC_READ, 'E', 0x06, len) /* get device name */

you could write the following:

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:

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):

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)

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

ioctl_opt-1.3.1-py3-none-any.whl (21.0 kB view details)

Uploaded Python 3

File details

Details for the file ioctl_opt-1.3.1-py3-none-any.whl.

File metadata

  • Download URL: ioctl_opt-1.3.1-py3-none-any.whl
  • Upload date:
  • Size: 21.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.11

File hashes

Hashes for ioctl_opt-1.3.1-py3-none-any.whl
Algorithm Hash digest
SHA256 7617a734e7083fd0ff5607c821ca67f75f4dd009c55b3f96db5c55621e64ee9a
MD5 955d10a7b3dd5fb1cfcde73d145dd70e
BLAKE2b-256 7fba2a8796dfa24e8ac9fbbffe4e70c9cdab6fa088122b258ab53354ba8af490

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page