github.com/fnproject/cli@v0.0.0-20240508150455-e5d88bd86117/commands/invoke_windows.go (about)

     1  //go:build windows
     2  
     3  /*
     4   * Copyright (c) 2019, 2020 Oracle and/or its affiliates. All rights reserved.
     5   *
     6   * Licensed under the Apache License, Version 2.0 (the "License");
     7   * you may not use this file except in compliance with the License.
     8   * You may obtain a copy of the License at
     9   *
    10   *     http://www.apache.org/licenses/LICENSE-2.0
    11   *
    12   * Unless required by applicable law or agreed to in writing, software
    13   * distributed under the License is distributed on an "AS IS" BASIS,
    14   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    15   * See the License for the specific language governing permissions and
    16   * limitations under the License.
    17   */
    18  
    19  package commands
    20  
    21  import (
    22  	"io"
    23  	"os"
    24  	"syscall"
    25  	"unsafe"
    26  )
    27  
    28  func stdin() io.Reader {
    29  	if isTerminal(int(os.Stdin.Fd())) {
    30  		return nil
    31  	}
    32  	return os.Stdin
    33  }
    34  
    35  func isTerminal(fd int) bool {
    36  	kernel32 := syscall.NewLazyDLL("kernel32.dll")
    37  	procGetConsoleMode := kernel32.NewProc("GetConsoleMode")
    38  	var st uint32
    39  	r, _, e := syscall.Syscall(procGetConsoleMode.Addr(), 2, uintptr(fd), uintptr(unsafe.Pointer(&st)), 0)
    40  	return r != 0 && e == 0
    41  }