import sys
from _typeshed import FileDescriptorLike
from typing import Any

if sys.platform != "win32":
    FASYNC: int
    FD_CLOEXEC: int

    DN_ACCESS: int
    DN_ATTRIB: int
    DN_CREATE: int
    DN_DELETE: int
    DN_MODIFY: int
    DN_MULTISHOT: int
    DN_RENAME: int
    F_DUPFD: int
    F_EXLCK: int
    F_GETFD: int
    F_GETFL: int
    F_GETLEASE: int
    F_GETLK: int
    F_GETLK64: int
    F_GETOWN: int
    F_GETSIG: int
    F_NOTIFY: int
    F_RDLCK: int
    F_SETFD: int
    F_SETFL: int
    F_SETLEASE: int
    F_SETLK: int
    F_SETLK64: int
    F_SETLKW: int
    F_SETLKW64: int
    F_SETOWN: int
    F_SETSIG: int
    F_SHLCK: int
    F_UNLCK: int
    F_WRLCK: int
    I_ATMARK: int
    I_CANPUT: int
    I_CKBAND: int
    I_FDINSERT: int
    I_FIND: int
    I_FLUSH: int
    I_FLUSHBAND: int
    I_GETBAND: int
    I_GETCLTIME: int
    I_GETSIG: int
    I_GRDOPT: int
    I_GWROPT: int
    I_LINK: int
    I_LIST: int
    I_LOOK: int
    I_NREAD: int
    I_PEEK: int
    I_PLINK: int
    I_POP: int
    I_PUNLINK: int
    I_PUSH: int
    I_RECVFD: int
    I_SENDFD: int
    I_SETCLTIME: int
    I_SETSIG: int
    I_SRDOPT: int
    I_STR: int
    I_SWROPT: int
    I_UNLINK: int
    LOCK_EX: int
    LOCK_MAND: int
    LOCK_NB: int
    LOCK_READ: int
    LOCK_RW: int
    LOCK_SH: int
    LOCK_UN: int
    LOCK_WRITE: int

    # TODO All these return either int or bytes depending on the value of
    # cmd (not on the type of arg).
    def fcntl(fd: FileDescriptorLike, op: int, arg: int | bytes = ...) -> Any: ...
    # TODO: arg: int or read-only buffer interface or read-write buffer interface
    def ioctl(fd: FileDescriptorLike, op: int, arg: int | bytes = ..., mutate_flag: bool = ...) -> Any: ...
    def flock(fd: FileDescriptorLike, op: int) -> None: ...
    def lockf(fd: FileDescriptorLike, op: int, length: int = ..., start: int = ..., whence: int = ...) -> Any: ...
