liuxiaolong
2022-06-28 37714b1093c04061e636e5b1d27179652e671c0a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
// Copyright 2018 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
 
// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris
 
package unix
 
import (
    "runtime"
    "unsafe"
)
 
// ioctl itself should not be exposed directly, but additional get/set
// functions for specific types are permissible.
 
// IoctlSetInt performs an ioctl operation which sets an integer value
// on fd, using the specified request number.
func IoctlSetInt(fd int, req uint, value int) error {
    return ioctl(fd, req, uintptr(value))
}
 
// IoctlSetWinsize performs an ioctl on fd with a *Winsize argument.
//
// To change fd's window size, the req argument should be TIOCSWINSZ.
func IoctlSetWinsize(fd int, req uint, value *Winsize) error {
    // TODO: if we get the chance, remove the req parameter and
    // hardcode TIOCSWINSZ.
    err := ioctl(fd, req, uintptr(unsafe.Pointer(value)))
    runtime.KeepAlive(value)
    return err
}
 
// IoctlSetTermios performs an ioctl on fd with a *Termios.
//
// The req value will usually be TCSETA or TIOCSETA.
func IoctlSetTermios(fd int, req uint, value *Termios) error {
    // TODO: if we get the chance, remove the req parameter.
    err := ioctl(fd, req, uintptr(unsafe.Pointer(value)))
    runtime.KeepAlive(value)
    return err
}
 
// IoctlGetInt performs an ioctl operation which gets an integer value
// from fd, using the specified request number.
//
// A few ioctl requests use the return value as an output parameter;
// for those, IoctlRetInt should be used instead of this function.
func IoctlGetInt(fd int, req uint) (int, error) {
    var value int
    err := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))
    return value, err
}
 
func IoctlGetWinsize(fd int, req uint) (*Winsize, error) {
    var value Winsize
    err := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))
    return &value, err
}
 
func IoctlGetTermios(fd int, req uint) (*Termios, error) {
    var value Termios
    err := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))
    return &value, err
}