func aoeAction(cmd *cobra.Command, args []string) { if len(args) != 4 { cmd.Usage() os.Exit(1) } srv := createServer() vol := args[0] ifname := args[1] maj := args[2] min := args[3] major, err := strconv.ParseUint(maj, 10, 16) if err != nil { die("Failed to parse major address %q: %v\n", maj, err) } minor, err := strconv.ParseUint(min, 10, 8) if err != nil { die("Failed to parse minor address %q: %v\n", min, err) } blockvol, err := block.OpenBlockVolume(srv, vol) if err != nil { fmt.Println("server doesn't support block volumes:", err) os.Exit(1) } ai, err := aoe.NewInterface(ifname) if err != nil { fmt.Fprintf(os.Stderr, "Failed to set up interface %q: %v\n", ifname, err) os.Exit(1) } as, err := aoe.NewServer(blockvol, &aoe.ServerOptions{ Major: uint16(major), Minor: uint8(minor), }) if err != nil { fmt.Fprintf(os.Stderr, "Failed to crate AoE server: %v\n", err) os.Exit(1) } signalChan := make(chan os.Signal, 1) signal.Notify(signalChan, os.Interrupt) go func(sv *torus.Server, iface *aoe.Interface) { for _ = range signalChan { fmt.Println("\nReceived an interrupt, stopping services...") iface.Close() sv.Close() as.Close() os.Exit(0) } }(srv, ai) if err = as.Serve(ai); err != nil { fmt.Fprintf(os.Stderr, "Failed to serve AoE: %v\n", err) os.Exit(1) } }
func aoeAction(cmd *cobra.Command, args []string) error { if len(aoeFlush) > 0 && len(args) == 0 { if err := flush(aoeFlush); err != nil { return fmt.Errorf("failed to flush: %v", err) } return nil } if len(args) != 4 { return torus.ErrUsage } srv := createServer() defer srv.Close() vol := args[0] ifname := args[1] maj := args[2] min := args[3] major, err := strconv.ParseUint(maj, 10, 16) if err != nil { return fmt.Errorf("Failed to parse major address %q: %v", maj, err) } minor, err := strconv.ParseUint(min, 10, 8) if err != nil { return fmt.Errorf("Failed to parse minor address %q: %v", min, err) } blockvol, err := block.OpenBlockVolume(srv, vol) if err != nil { return fmt.Errorf("server doesn't support block volumes: %v", err) } ai, err := aoe.NewInterface(ifname) if err != nil { return fmt.Errorf("Failed to set up interface %q: %v", ifname, err) } as, err := aoe.NewServer(blockvol, &aoe.ServerOptions{ Major: uint16(major), Minor: uint8(minor), }) if err != nil { return fmt.Errorf("Failed to crate AoE server: %v", err) } defer as.Close() signalChan := make(chan os.Signal, 1) signal.Notify(signalChan, os.Interrupt) go func(iface *aoe.Interface) { for _ = range signalChan { fmt.Println("\nReceived an interrupt, stopping services...") iface.Close() } }(ai) if err = as.Serve(ai); err != nil { return fmt.Errorf("Failed to serve AoE: %v", err) } return nil }