ioctl_zos.go raw

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