|  | // Copyright 2019 The Fuchsia Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | // +build !build_with_native_toolchain | 
|  |  | 
|  | // The Fuchsia Go Grand Unified Binary is a binary that contains several other | 
|  | // binaries, so done in order to reduce the amount of disk space and shared | 
|  | // memory required to run Fuchsia subsystems written in Go. This combination | 
|  | // saves >=50% of storage and ram cost on a running system at boot/update time. | 
|  | package main | 
|  |  | 
|  | import ( | 
|  | "log" | 
|  | "os" | 
|  | "path/filepath" | 
|  | "strings" | 
|  |  | 
|  | "go.fuchsia.dev/fuchsia/src/connectivity/network/netstack" | 
|  | "go.fuchsia.dev/fuchsia/src/connectivity/network/netstack/ifconfig" | 
|  | "go.fuchsia.dev/fuchsia/src/sys/pkg/bin/amber/amberctl" | 
|  | "go.fuchsia.dev/fuchsia/src/sys/pkg/bin/pkgfs/pkgsvr" | 
|  | ) | 
|  |  | 
|  | func main() { | 
|  | // The new fuchsia build templates do not support renaming a binary and properly | 
|  | // including its dependent libraries in a package. As a workaround, we leave the | 
|  | // binary name untouched and check the second argument if the first argument is | 
|  | // the default binary name. | 
|  | // TODO(fxbug.dev/55842): Remove this workaround. | 
|  | if len(os.Args) != 0 && filepath.Base(os.Args[0]) == "grand_unified_binary" { | 
|  | os.Args[0] = "" | 
|  | os.Args = os.Args[1:] | 
|  | } | 
|  |  | 
|  | if len(os.Args) < 1 { | 
|  | log.Println("software delivery grand unified binary: cannot determine binary, no argv 0") | 
|  | os.Exit(1) | 
|  | } | 
|  | name := filepath.Base(os.Args[0]) | 
|  | name = strings.SplitN(name, ".", 2)[0] | 
|  | switch name { | 
|  | case "pkgsvr": | 
|  | pkgsvr.Main() | 
|  | case "amberctl", "amber_ctl": | 
|  | amberctl.Main() | 
|  | case "netstack": | 
|  | netstack.Main() | 
|  | case "ifconfig": | 
|  | ifconfig.Main() | 
|  | default: | 
|  | log.Printf("software delivery grand unified binary: unknown inner binary name: %s (%s)", name, os.Args[0]) | 
|  | os.Exit(1) | 
|  | } | 
|  | } |