71 lines
1.2 KiB
Go
71 lines
1.2 KiB
Go
package pb
|
|
|
|
import (
|
|
"errors"
|
|
"os"
|
|
"os/signal"
|
|
"sync"
|
|
"syscall"
|
|
)
|
|
|
|
var ErrPoolWasStarted = errors.New("Bar pool was started")
|
|
|
|
var (
|
|
echoLockMutex sync.Mutex
|
|
consctl *os.File
|
|
)
|
|
|
|
// terminalWidth returns width of the terminal.
|
|
func terminalWidth() (int, error) {
|
|
return 0, errors.New("Not Supported")
|
|
}
|
|
|
|
func lockEcho() (shutdownCh chan struct{}, err error) {
|
|
echoLockMutex.Lock()
|
|
defer echoLockMutex.Unlock()
|
|
|
|
if consctl != nil {
|
|
return nil, ErrPoolWasStarted
|
|
}
|
|
consctl, err = os.OpenFile("/dev/consctl", os.O_WRONLY, 0)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
_, err = consctl.WriteString("rawon")
|
|
if err != nil {
|
|
consctl.Close()
|
|
consctl = nil
|
|
return nil, err
|
|
}
|
|
shutdownCh = make(chan struct{})
|
|
go catchTerminate(shutdownCh)
|
|
return
|
|
}
|
|
|
|
func unlockEcho() error {
|
|
echoLockMutex.Lock()
|
|
defer echoLockMutex.Unlock()
|
|
|
|
if consctl == nil {
|
|
return nil
|
|
}
|
|
if err := consctl.Close(); err != nil {
|
|
return err
|
|
}
|
|
consctl = nil
|
|
return nil
|
|
}
|
|
|
|
// listen exit signals and restore terminal state
|
|
func catchTerminate(shutdownCh chan struct{}) {
|
|
sig := make(chan os.Signal, 1)
|
|
signal.Notify(sig, os.Interrupt, syscall.SIGTERM, syscall.SIGKILL)
|
|
defer signal.Stop(sig)
|
|
select {
|
|
case <-shutdownCh:
|
|
unlockEcho()
|
|
case <-sig:
|
|
unlockEcho()
|
|
}
|
|
}
|