Compare commits

...

3 commits

Author SHA1 Message Date
ptrcnull 2454b772dc feat: Add spawning processes 2021-11-29 23:08:39 +01:00
ptrcnull e8591c5770 fix: Make inittab parse if error was nil 2021-11-29 23:08:10 +01:00
ptrcnull 068cb742f5 chore: Add .gitignore 2021-11-29 23:06:55 +01:00
3 changed files with 82 additions and 2 deletions

1
.gitignore vendored Normal file
View file

@ -0,0 +1 @@
init

44
main.go
View file

@ -7,12 +7,52 @@ import (
func main() {
inittab := DefaultInitTab
if file, err := os.OpenFile("/etc/inittab", os.O_RDONLY, 0644); err != nil {
if file, err := os.OpenFile("/etc/inittab", os.O_RDONLY, 0644); err == nil {
inittab = ParseInitTab(file)
err := file.Close()
if err != nil {
fmt.Println("close inittab:", err)
fmt.Printf("error closing inittab: %s\n", err)
}
} else {
fmt.Printf("error reading inittab: %s\n", err)
}
for _, entry := range inittab.Entries(SysInit) {
err := Exec(entry)
if err != nil {
fmt.Printf("error running sysinit \"%s\": %s\n", entry.Process, err)
}
}
for _, entry := range inittab.Entries(Wait) {
err := Exec(entry)
if err != nil {
fmt.Printf("error running wait \"%s\": %s\n", entry.Process, err)
}
}
for _, entry := range inittab.Entries(Once) {
_, err := Spawn(entry)
if err != nil {
fmt.Printf("error running once \"%s\": %s\n", entry.Process, err)
}
}
// TODO implement AskFirst handling
for _, entry := range inittab.Entries(Respawn) {
go func(entry InitTabEntry) {
for {
err := Exec(entry)
if err != nil {
fmt.Printf("error running respawn \"%s\": %s\n", entry.Process, err)
break
}
}
}(entry)
}
// TODO implement Shutdown, Restart and CtrlAltDel handling
select {}
}

39
process.go Normal file
View file

@ -0,0 +1,39 @@
package main
import (
"fmt"
"os"
"os/exec"
"strings"
)
func Spawn(entry InitTabEntry) (*exec.Cmd, error) {
cmdline := strings.Split(entry.Process, " ")
cmd := exec.Command(cmdline[0], cmdline[1:]...)
// TODO: add stdio handling
cmd.Stdin = os.Stdin
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
err := cmd.Start()
if err != nil {
return nil, err
}
return cmd, nil
}
func Exec(entry InitTabEntry) error {
cmd, err := Spawn(entry)
if err != nil {
return fmt.Errorf("spawn: %w", err)
}
err = cmd.Wait()
if err != nil {
return fmt.Errorf("wait: %w", err)
}
return nil
}