func (d *Dataset) openChildren() (err error) { var dataset Dataset d.Children = make([]Dataset, 0, 5) errcode := C.dataset_list_children(d.list.zh, &(dataset.list)) for dataset.list != nil { dataset.Type = DatasetType(C.zfs_get_type(dataset.list.zh)) dataset.Properties = make(map[ZFSProp]Property) err = dataset.ReloadProperties() if err != nil { return } d.Children = append(d.Children, dataset) dataset.list = C.dataset_next(dataset.list) } if errcode != 0 { err = LastError() return } for ci, _ := range d.Children { if err = d.Children[ci].openChildren(); err != nil { return } } return }
// Open dataset and all of its recursive children datasets func DatasetOpen(path string) (d Dataset, err error) { d.list = C.create_dataset_list_item() d.list.zh = C.zfs_open(libzfs_handle, C.CString(path), 0xF) if d.list.zh == nil { err = LastError() return } d.Type = DatasetType(C.zfs_get_type(d.list.zh)) d.Properties = make(map[ZFSProp]Property) err = d.ReloadProperties() if err != nil { return } err = d.openChildren() return }
// Recursive get handles to all available datasets on system // (file-systems, volumes or snapshots). func DatasetOpenAll() (datasets []Dataset, err error) { var dataset Dataset errcode := C.dataset_list_root(libzfs_handle, &dataset.list) for dataset.list != nil { dataset.Type = DatasetType(C.zfs_get_type(dataset.list.zh)) err = dataset.ReloadProperties() if err != nil { return } datasets = append(datasets, dataset) dataset.list = C.dataset_next(dataset.list) } if errcode != 0 { err = LastError() return } for ci, _ := range datasets { if err = datasets[ci].openChildren(); err != nil { return } } return }