func showVhdBAT()

in vhdInspectCmdHandler.go [216:289]


func showVhdBAT(c *cli.Context) error {
	vhdPath := c.String("path")
	if vhdPath == "" {
		return errors.New("Missing required argument --path")
	}

	startRange := uint32(0)
	var err error
	if c.IsSet("start-range") {
		r, err := strconv.ParseUint(c.String("start-range"), 10, 32)
		if err != nil {
			return fmt.Errorf("invalid index value --start-range: %s", err)
		}
		startRange = uint32(r)
	}

	endRange := uint32(0)
	if c.IsSet("end-range") {
		r, err := strconv.ParseUint(c.String("end-range"), 10, 32)
		if err != nil {
			return fmt.Errorf("invalid index value --end-range: %s", err)
		}
		endRange = uint32(r)
	}

	vFileFactory := &vhdfile.FileFactory{}
	vFile, err := vFileFactory.Create(vhdPath)
	if err != nil {
		return err
	}

	defer vFileFactory.Dispose(nil)
	if vFile.GetDiskType() == footer.DiskTypeFixed {
		return errors.New("Warn: Only expandable VHDs has Block Allocation Table, this is a fixed VHD")
	}

	maxEntries := vFile.BlockAllocationTable.BATEntriesCount
	if !c.IsSet("end-range") {
		endRange = maxEntries - 1
	}

	if startRange > maxEntries || endRange > maxEntries {
		return fmt.Errorf("index out of boundary, this vhd BAT index range is [0, %d]", maxEntries)
	}

	if startRange > endRange {
		return errors.New("invalid range --start-range > --end-range")
	}

	fMap := template.FuncMap{
		"adj": func(i int) int {
			return i + int(startRange)
		},
	}

	t, _ := template.New("root").
		Funcs(fMap).
		Parse(batTempl)

	if !c.IsSet("skip-empty") {
		t.Execute(os.Stdout, vFile.BlockAllocationTable.BAT[startRange:endRange+1])
	} else {
		nonEmptyBATEntries := make(map[int]uint32)
		for blockIndex := startRange; blockIndex <= endRange; blockIndex++ {
			if vFile.BlockAllocationTable.HasData(blockIndex) {
				nonEmptyBATEntries[int(blockIndex-startRange)] = vFile.BlockAllocationTable.BAT[blockIndex]
			}
		}

		t.Execute(os.Stdout, nonEmptyBATEntries)
	}

	return nil
}