1 /*
2  * virdomainmomentobjlist.h: handle a tree of moment objects
3  *                  (derived from snapshot_conf.h)
4  *
5  * Copyright (C) 2006-2019 Red Hat, Inc.
6  * Copyright (C) 2006-2008 Daniel P. Berrange
7  *
8  * This library is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public
10  * License as published by the Free Software Foundation; either
11  * version 2.1 of the License, or (at your option) any later version.
12  *
13  * This library is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16  * Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with this library.  If not, see
20  * <http://www.gnu.org/licenses/>.
21  */
22 
23 #pragma once
24 
25 #include "internal.h"
26 #include "virconftypes.h"
27 #include "virhash.h"
28 
29 /* Filter that returns true if a given moment matches the filter flags */
30 typedef bool (*virDomainMomentObjListFilter)(virDomainMomentObj *obj,
31                                              unsigned int flags);
32 
33 /* Struct that allows tracing hierarchical relationships between
34  * multiple virDomainMoment objects. The opaque type
35  * virDomainMomentObjList then maintains both a hash of these structs
36  * (for quick lookup by name) and a metaroot (which is the parent of
37  * all user-visible roots), so that all other objects always have a
38  * valid parent object; the tree structure is currently maintained via
39  * a linked list. */
40 struct _virDomainMomentObj {
41     /* Public field */
42     virDomainMomentDef *def; /* non-NULL except for metaroot */
43 
44     /* Private fields, use accessors instead */
45     virDomainMomentObj *parent; /* non-NULL except for metaroot, before
46                                      virDomainMomentUpdateRelations, or
47                                      after virDomainMomentDropParent */
48     virDomainMomentObj *sibling; /* NULL if last child of parent */
49     size_t nchildren;
50     virDomainMomentObj *first_child; /* NULL if no children */
51 };
52 
53 int virDomainMomentForEachChild(virDomainMomentObj *moment,
54                                 virHashIterator iter,
55                                 void *data);
56 int virDomainMomentForEachDescendant(virDomainMomentObj *moment,
57                                      virHashIterator iter,
58                                      void *data);
59 void virDomainMomentDropParent(virDomainMomentObj *moment);
60 void virDomainMomentDropChildren(virDomainMomentObj *moment);
61 void virDomainMomentMoveChildren(virDomainMomentObj *from,
62                                  virDomainMomentObj *to);
63 void virDomainMomentLinkParent(virDomainMomentObjList *moments,
64                                virDomainMomentObj *moment);
65 
66 virDomainMomentObjList *virDomainMomentObjListNew(void);
67 void virDomainMomentObjListFree(virDomainMomentObjList *moments);
68 
69 virDomainMomentObj *virDomainMomentAssignDef(virDomainMomentObjList *moments,
70                                                virDomainMomentDef *def);
71 
72 /* Various enum bits that map to public API filters. Note that the
73  * values of the internal bits are not the same as the public ones for
74  * snapshot, however, this list should be kept in sync with the public
75  * ones for checkpoint. */
76 typedef enum {
77     VIR_DOMAIN_MOMENT_LIST_ROOTS       = (1 << 0),
78     VIR_DOMAIN_MOMENT_LIST_DESCENDANTS = (1 << 0),
79     VIR_DOMAIN_MOMENT_LIST_TOPOLOGICAL = (1 << 1),
80     VIR_DOMAIN_MOMENT_LIST_LEAVES      = (1 << 2),
81     VIR_DOMAIN_MOMENT_LIST_NO_LEAVES   = (1 << 3),
82     VIR_DOMAIN_MOMENT_LIST_METADATA    = (1 << 4),
83     VIR_DOMAIN_MOMENT_LIST_NO_METADATA = (1 << 5),
84 } virDomainMomentFilters;
85 
86 #define VIR_DOMAIN_MOMENT_FILTERS_METADATA \
87                (VIR_DOMAIN_MOMENT_LIST_METADATA | \
88                 VIR_DOMAIN_MOMENT_LIST_NO_METADATA)
89 
90 #define VIR_DOMAIN_MOMENT_FILTERS_LEAVES \
91                (VIR_DOMAIN_MOMENT_LIST_LEAVES | \
92                 VIR_DOMAIN_MOMENT_LIST_NO_LEAVES)
93 
94 #define VIR_DOMAIN_MOMENT_FILTERS_ALL \
95                (VIR_DOMAIN_MOMENT_LIST_ROOTS | \
96                 VIR_DOMAIN_MOMENT_LIST_TOPOLOGICAL | \
97                 VIR_DOMAIN_MOMENT_FILTERS_METADATA | \
98                 VIR_DOMAIN_MOMENT_FILTERS_LEAVES)
99 
100 int virDomainMomentObjListGetNames(virDomainMomentObjList *moments,
101                                    virDomainMomentObj *from,
102                                    char **const names,
103                                    int maxnames,
104                                    unsigned int moment_flags,
105                                    virDomainMomentObjListFilter filter,
106                                    unsigned int filter_flags);
107 virDomainMomentObj *virDomainMomentFindByName(virDomainMomentObjList *moments,
108                                                 const char *name);
109 int virDomainMomentObjListSize(virDomainMomentObjList *moments);
110 virDomainMomentObj *virDomainMomentGetCurrent(virDomainMomentObjList *moments);
111 const char *virDomainMomentGetCurrentName(virDomainMomentObjList *moments);
112 void virDomainMomentSetCurrent(virDomainMomentObjList *moments,
113                                virDomainMomentObj *moment);
114 bool virDomainMomentObjListRemove(virDomainMomentObjList *moments,
115                                   virDomainMomentObj *moment);
116 void virDomainMomentObjListRemoveAll(virDomainMomentObjList *moments);
117 int virDomainMomentForEach(virDomainMomentObjList *moments,
118                            virHashIterator iter,
119                            void *data);
120 int virDomainMomentUpdateRelations(virDomainMomentObjList *moments);
121 int virDomainMomentCheckCycles(virDomainMomentObjList *list,
122                                virDomainMomentDef *def,
123                                const char *domname);
124 virDomainMomentObj *virDomainMomentFindLeaf(virDomainMomentObjList *list);
125