71 lines
1.5 KiB
Go
71 lines
1.5 KiB
Go
|
package ioctl
|
||
|
|
||
|
import "syscall"
|
||
|
|
||
|
// Generic ioctl constants
|
||
|
const (
|
||
|
IOC_NONE = 0x0
|
||
|
IOC_WRITE = 0x1
|
||
|
IOC_READ = 0x2
|
||
|
|
||
|
IOC_NRBITS = 8
|
||
|
IOC_TYPEBITS = 8
|
||
|
|
||
|
IOC_SIZEBITS = 14
|
||
|
IOC_DIRBITS = 2
|
||
|
|
||
|
IOC_NRSHIFT = 0
|
||
|
IOC_TYPESHIFT = IOC_NRSHIFT + IOC_NRBITS
|
||
|
IOC_SIZESHIFT = IOC_TYPESHIFT + IOC_TYPEBITS
|
||
|
IOC_DIRSHIFT = IOC_SIZESHIFT + IOC_SIZEBITS
|
||
|
|
||
|
IOC_NRMASK = ((1 << IOC_NRBITS) - 1)
|
||
|
IOC_TYPEMASK = ((1 << IOC_TYPEBITS) - 1)
|
||
|
IOC_SIZEMASK = ((1 << IOC_SIZEBITS) - 1)
|
||
|
IOC_DIRMASK = ((1 << IOC_DIRBITS) - 1)
|
||
|
)
|
||
|
|
||
|
// Some useful additional ioctl constanst
|
||
|
const (
|
||
|
IOC_IN = IOC_WRITE << IOC_DIRSHIFT
|
||
|
IOC_OUT = IOC_READ << IOC_DIRSHIFT
|
||
|
IOC_INOUT = (IOC_WRITE | IOC_READ) << IOC_DIRSHIFT
|
||
|
IOCSIZE_MASK = IOC_SIZEMASK << IOC_SIZESHIFT
|
||
|
IOCSIZE_SHIFT = IOC_SIZESHIFT
|
||
|
)
|
||
|
|
||
|
// IOC generate IOC
|
||
|
func IOC(dir, t, nr, size uintptr) uintptr {
|
||
|
return (dir << IOC_DIRSHIFT) | (t << IOC_TYPESHIFT) |
|
||
|
(nr << IOC_NRSHIFT) | (size << IOC_SIZESHIFT)
|
||
|
}
|
||
|
|
||
|
// IOR generate IOR
|
||
|
func IOR(t, nr, size uintptr) uintptr {
|
||
|
return IOC(IOC_READ, t, nr, size)
|
||
|
}
|
||
|
|
||
|
// IOW generate IOW
|
||
|
func IOW(t, nr, size uintptr) uintptr {
|
||
|
return IOC(IOC_WRITE, t, nr, size)
|
||
|
}
|
||
|
|
||
|
// IOWR generate IOWR
|
||
|
func IOWR(t, nr, size uintptr) uintptr {
|
||
|
return IOC(IOC_READ|IOC_WRITE, t, nr, size)
|
||
|
}
|
||
|
|
||
|
// IO generate IO
|
||
|
func IO(t, nr uintptr) uintptr {
|
||
|
return IOC(IOC_NONE, t, nr, 0)
|
||
|
}
|
||
|
|
||
|
// IOCTL send ioctl
|
||
|
func IOCTL(fd, name, data uintptr) error {
|
||
|
_, _, err := syscall.Syscall(syscall.SYS_IOCTL, fd, name, data)
|
||
|
if err != 0 {
|
||
|
return syscall.Errno(err)
|
||
|
}
|
||
|
return nil
|
||
|
}
|