// Snapshots returns the list of container snapshots. func (c *Container) Snapshots() ([]Snapshot, error) { if err := c.makeSure(isDefined); err != nil { return nil, err } c.mu.Lock() defer c.mu.Unlock() var csnapshots *C.struct_lxc_snapshot var snapshots []Snapshot size := int(C.go_lxc_snapshot_list(c.container, &csnapshots)) defer freeSnapshots(csnapshots, size) if size < 1 { return nil, ErrNoSnapshot } p := uintptr(unsafe.Pointer(csnapshots)) for i := 0; i < size; i++ { z := (*C.struct_lxc_snapshot)(unsafe.Pointer(p)) s := &Snapshot{Name: C.GoString(z.name), Timestamp: C.GoString(z.timestamp), CommentPath: C.GoString(z.comment_pathname), Path: C.GoString(z.lxcpath)} snapshots = append(snapshots, *s) p += unsafe.Sizeof(*csnapshots) } return snapshots, nil }
// Snapshots returns the list of container snapshots. func (c *Container) Snapshots() ([]Snapshot, error) { if err := c.makeSure(isDefined); err != nil { return nil, err } c.mu.Lock() defer c.mu.Unlock() var csnapshots *C.struct_lxc_snapshot size := int(C.go_lxc_snapshot_list(c.container, &csnapshots)) defer freeSnapshots(csnapshots, size) if size < 1 { return nil, ErrNoSnapshot } hdr := reflect.SliceHeader{ Data: uintptr(unsafe.Pointer(csnapshots)), Len: size, Cap: size, } gosnapshots := *(*[]C.struct_lxc_snapshot)(unsafe.Pointer(&hdr)) snapshots := make([]Snapshot, size, size) for i := 0; i < size; i++ { snapshots[i] = Snapshot{ Name: C.GoString(gosnapshots[i].name), Timestamp: C.GoString(gosnapshots[i].timestamp), CommentPath: C.GoString(gosnapshots[i].comment_pathname), Path: C.GoString(gosnapshots[i].lxcpath), } } return snapshots, nil }