func UiNetworks(ui *gui.DialogUi, data *xmlinput.XMLInputData, allowedNics host.NICList, gconf *guest.Config) error { guestPciSlotCounter := data.GuestNic.PCI.FirstSlot lastGuestPciSlotCounter := guestPciSlotCounter portCounter := 1 lastPortCounter := portCounter i := 0 MainLoop: for i < len(data.Networks.Configs) { net := data.Networks.Configs[i] PolicyLoop: for { var modes []xmlinput.ConnectionMode if net.UiModeBinding == nil || len(net.UiModeBinding) == 0 { for _, mode := range net.Modes { modes = append(modes, mode.Type) } } else { var err error modes, err = uiNetworkPolicySelector(ui, net) if err != nil { switch err.Error() { case gui.DialogMoveBack: gconf.Networks = gconf.Networks[:i] gconf.NICLists = gconf.NICLists[:i] portCounter = lastPortCounter - 1 guestPciSlotCounter = lastGuestPciSlotCounter - 1 if i == 0 { return err } i-- continue MainLoop case gui.DialogNext: i++ continue MainLoop case gui.DialogExit: os.Exit(1) default: return err } } } retainedNics, err := host_hwfilter.NicsByType(allowedNics, modes) if err != nil { return utils.FormatError(err) } if len(retainedNics) == 0 { ui.Output(gui.Warning, "No interfaces have been found.", "Press <OK> to return to menu.") continue MainLoop } if net.UiResetCounter { portCounter = 1 } list, err := uiNicSelectMenu(ui, data, &portCounter, &guestPciSlotCounter, retainedNics, net, i) if err != nil { switch err.Error() { case gui.DialogMoveBack: if i == 0 { return err } gconf.Networks = gconf.Networks[:i] gconf.NICLists = gconf.NICLists[:i] continue PolicyLoop case gui.DialogExit: os.Exit(1) } } gconf.Networks = append(gconf.Networks, net) gconf.NICLists = append(gconf.NICLists, list) lastPortCounter = portCounter lastGuestPciSlotCounter = guestPciSlotCounter i++ break } } return nil }