All checks were successful
Test / Create distribution (push) Successful in 1m3s
Test / Sandbox (push) Successful in 2m41s
Test / Hakurei (push) Successful in 3m40s
Test / ShareFS (push) Successful in 3m41s
Test / Sandbox (race detector) (push) Successful in 5m0s
Test / Hakurei (race detector) (push) Successful in 6m11s
Test / Flake checks (push) Successful in 1m22s
These are set by the bootloader. Signed-off-by: Ophestra <cat@gensokyo.uk>
76 lines
1.5 KiB
Go
76 lines
1.5 KiB
Go
package main
|
|
|
|
import (
|
|
"log"
|
|
"os"
|
|
"runtime"
|
|
"strings"
|
|
. "syscall"
|
|
)
|
|
|
|
func main() {
|
|
runtime.LockOSThread()
|
|
log.SetFlags(0)
|
|
log.SetPrefix("earlyinit: ")
|
|
|
|
var (
|
|
option map[string]string
|
|
flags []string
|
|
)
|
|
if len(os.Args) > 1 {
|
|
option = make(map[string]string)
|
|
for _, s := range os.Args[1:] {
|
|
key, value, ok := strings.Cut(s, "=")
|
|
if !ok {
|
|
flags = append(flags, s)
|
|
continue
|
|
}
|
|
option[key] = value
|
|
}
|
|
}
|
|
|
|
if err := Mount(
|
|
"devtmpfs",
|
|
"/dev/",
|
|
"devtmpfs",
|
|
MS_NOSUID|MS_NOEXEC,
|
|
"",
|
|
); err != nil {
|
|
log.Fatalf("cannot mount devtmpfs: %v", err)
|
|
}
|
|
|
|
// The kernel might be unable to set up the console. When that happens,
|
|
// printk is called with "Warning: unable to open an initial console."
|
|
// and the init runs with no files. The checkfds runtime function
|
|
// populates 0-2 by opening /dev/null for them.
|
|
//
|
|
// This check replaces 1 and 2 with /dev/kmsg to improve the chance
|
|
// of output being visible to the user.
|
|
if fi, err := os.Stdout.Stat(); err == nil {
|
|
if stat, ok := fi.Sys().(*Stat_t); ok {
|
|
if stat.Rdev == 0x103 {
|
|
var fd int
|
|
if fd, err = Open(
|
|
"/dev/kmsg",
|
|
O_WRONLY|O_CLOEXEC,
|
|
0,
|
|
); err != nil {
|
|
log.Fatalf("cannot open kmsg: %v", err)
|
|
}
|
|
|
|
if err = Dup3(fd, Stdout, 0); err != nil {
|
|
log.Fatalf("cannot open stdout: %v", err)
|
|
}
|
|
if err = Dup3(fd, Stderr, 0); err != nil {
|
|
log.Fatalf("cannot open stderr: %v", err)
|
|
}
|
|
|
|
if err = Close(fd); err != nil {
|
|
log.Printf("cannot close kmsg: %v", err)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|