func main() { flag.Usage = help cmd := "help" switch av0 := path.Base(os.Args[0]); av0 { case "tao_run", "tao_list", "tao_stop", "tao_kill": cmd = av0[4:] flag.Parse() default: // Get options before the command verb flag.Parse() // Get command verb if flag.NArg() > 0 { cmd = flag.Arg(0) } // Get options after the command verb if flag.NArg() > 1 { flag.CommandLine.Parse(flag.Args()[1:]) } } sockPath := path.Join(hostPath(), "admin_socket") conn, err := net.DialUnix("unix", nil, &net.UnixAddr{Name: sockPath, Net: "unix"}) options.FailIf(err, "Can't connect to host admin socket") defer conn.Close() client := tao.NewLinuxHostAdminClient(conn) switch cmd { case "help": help() case "run": runHosted(&client, flag.Args()) case "stop": for _, s := range flag.Args() { var subprin auth.SubPrin _, err := fmt.Sscanf(s, "%v", &subprin) options.FailIf(err, "Not a subprin: %s", s) err = client.StopHostedProgram(subprin) options.FailIf(err, "Could not stop %s", s) } case "kill": for _, s := range flag.Args() { var subprin auth.SubPrin options.FailIf(err, "Not a subprin: %s", s) err = client.KillHostedProgram(subprin) options.FailIf(err, "Could not kill %s", s) } case "list": names, pids, err := client.ListHostedPrograms() options.FailIf(err, "Can't list hosted programs") for i, p := range pids { fmt.Printf("pid=%d subprin=%v\n", p, names[i]) } fmt.Printf("%d hosted programs\n", len(pids)) default: options.Usage("Unrecognized command: %s", cmd) } return }
func shutdown() error { sockPath := path.Join(hostPath(), "admin_socket") conn, err := net.DialUnix("unix", nil, &net.UnixAddr{Name: sockPath, Net: "unix"}) if err != nil { return err } defer conn.Close() return tao.NewLinuxHostAdminClient(conn).Shutdown() }