50 lines
753 B
Go
50 lines
753 B
Go
package main
|
|
|
|
import (
|
|
"bufio"
|
|
"io"
|
|
"os"
|
|
"syscall"
|
|
)
|
|
|
|
func listenInitctl() {
|
|
const f = "/run/initctl"
|
|
|
|
if err := syscall.Mkfifo(f, 0700); err != nil {
|
|
fatal("can't create "+f+": ", err)
|
|
}
|
|
|
|
for {
|
|
func() {
|
|
fifo, err := os.Open(f)
|
|
if err != nil {
|
|
fatal("can't open "+f+": ", err)
|
|
}
|
|
defer fifo.Close()
|
|
|
|
r := bufio.NewReader(fifo)
|
|
|
|
for {
|
|
s, err := r.ReadString('\n')
|
|
if err == io.EOF {
|
|
break
|
|
}
|
|
if err != nil {
|
|
initLog.Print(f+": read error: ", err)
|
|
}
|
|
|
|
switch s {
|
|
case "prepare-shutdown\n":
|
|
prepareShutdown()
|
|
case "poweroff\n", "shutdown\n":
|
|
poweroff()
|
|
case "reboot\n":
|
|
reboot()
|
|
default:
|
|
initLog.Printf(f+": unknown command: %q", s)
|
|
}
|
|
}
|
|
}()
|
|
}
|
|
}
|