github.com/jlowellwofford/u-root@v1.0.0/cmds/xinit/xinit.go (about)

     1  // Copyright 2018 the u-root Authors. All rights reserved
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package main
     6  
     7  import (
     8  	"fmt"
     9  	"log"
    10  	"os"
    11  	"os/exec"
    12  	"path/filepath"
    13  	"time"
    14  )
    15  
    16  func x11(n string, args ...string) error {
    17  	cmd := exec.Command(n, args...)
    18  	cmd.Env = append(os.Environ(), "DISPLAY=:0")
    19  	cmd.Stdout, cmd.Stderr = os.Stdout, os.Stderr
    20  	if err := cmd.Run(); err != nil {
    21  		return fmt.Errorf("X11 start %v %v: %v", n, args, err)
    22  	}
    23  	return nil
    24  }
    25  
    26  func setup() error {
    27  	if err := os.Symlink("/usr/local/bin/bash", "/bin/bash"); err != nil {
    28  		return err
    29  	}
    30  	if err := os.Symlink("/lib/ld-linux-x86-64.so.2", "/lib64/ld-linux-x86-64.so.2"); err != nil {
    31  		return err
    32  	}
    33  	go func() {
    34  		cmd := exec.Command("Xfbdev")
    35  		cmd.Stdout, cmd.Stderr = os.Stdout, os.Stderr
    36  		if err := cmd.Run(); err != nil {
    37  			log.Fatalf("X11 startup: %v", err)
    38  		}
    39  	}()
    40  	for {
    41  		s, err := filepath.Glob("/tmp/.X*/X?")
    42  		if err != nil {
    43  			return err
    44  		}
    45  		if len(s) > 0 {
    46  			break
    47  		}
    48  		time.Sleep(time.Second)
    49  	}
    50  	for _, f := range []string{"wingo", "flwm", "chrome"} {
    51  		log.Printf("Run %v", f)
    52  		go x11(f)
    53  	}
    54  
    55  	// we block on the aterm. When the aterm exits, we do too.
    56  	return x11("aterm")
    57  }
    58  
    59  func main() {
    60  	if err := setup(); err != nil {
    61  		log.Fatal(err)
    62  	}
    63  }