| package main |
| |
| import ( |
| "fmt" |
| "os" |
| ) |
| |
| var logC = make(chan string) |
| |
| // logPiper pipes log entries submitted via logf and panicf into whatever |
| // consoles are available to the system. |
| func logPiper() { |
| var consoles []*os.File |
| for _, p := range []string{"/dev/tty0", "/dev/ttyS0"} { |
| f, err := os.OpenFile(p, os.O_WRONLY, 0) |
| if err != nil { |
| continue |
| } |
| consoles = append(consoles, f) |
| } |
| |
| for { |
| s := <-logC |
| for _, c := range consoles { |
| fmt.Fprintf(c, "%s\n", s) |
| } |
| } |
| } |
| |
| // logf logs some format/args into the active consoles. |
| func logf(format string, args ...any) { |
| s := fmt.Sprintf(format, args...) |
| logC <- s |
| } |
| |
| // panicf aborts the installation process with a given format/args. |
| func panicf(format string, args ...any) { |
| s := fmt.Sprintf(format, args...) |
| // We don't need to print `s` here, as it's gonna get printed by the recovery |
| // code in main. |
| panic(s) |
| } |