4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License, Version 1.0 only
6 * (the "License"). You may not use this file except in compliance
9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10 * or http://www.opensolaris.org/os/licensing.
11 * See the License for the specific language governing permissions
12 * and limitations under the License.
14 * When distributing Covered Code, include this CDDL HEADER in each
15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16 * If applicable, add the following below this CDDL HEADER, with the
17 * fields enclosed by brackets "[]" replaced with your own identifying
18 * information: Portions Copyright [yyyy] [name of copyright owner]
23 * Copyright (c) 1996 Sun Microsystems, Inc. All Rights Reserved
29 * definition of the baseline and rules data structures
35 #pragma ident "%W% %E% SMI"
44 #define ACL_UID_BUG 1 /* acl:SETACL sets owner to be caller */
47 * flag bits describing what we know about an individual file, or in
48 * some cases an entire base pair. These flags are found in the
49 * base and file stuctures.
51 typedef int fflags_t
; /* type for file flags */
53 #define F_NEW 0x01 /* newly allocated */
54 #define F_IN_BASELINE 0x02 /* file found in baseline */
55 #define F_IN_SOURCE 0x04 /* file found in source tree */
56 #define F_IN_DEST 0x08 /* file found in dest tree */
57 #define F_EVALUATE 0x10 /* include in analysis */
58 #define F_SPARSE 0x20 /* don't walk this directory */
59 #define F_REMOVE 0x40 /* remove from baseline */
60 #define F_CONFLICT 0x80 /* unresolvable conflict */
61 #define F_LISTED 0x100 /* file came from LIST */
62 #define F_STAT_ERROR 0x200 /* unable to stat file */
64 #define F_WHEREFOUND (F_IN_BASELINE|F_IN_SOURCE|F_IN_DEST)
67 * a base is a pair of directories to be kept in sync
68 * all rules and baseline data is stored beneath some base
71 struct base
*b_next
; /* pointer to next base */
72 fflags_t b_flags
; /* what I know about this base */
73 int b_ident
; /* base sequence # (DBG) */
74 char *b_src_spec
; /* spec name of source dir */
75 char *b_dst_spec
; /* spec name of dest dir */
76 char *b_src_name
; /* expanded name of source dir */
77 char *b_dst_name
; /* expanded name of dest dir */
79 struct rule
*b_includes
; /* chain of include rules */
80 struct rule
*b_excludes
; /* chain of exclude rules */
81 struct rule
*b_restrictions
; /* chain of restrictions */
83 struct file
*b_files
; /* chain of files */
85 /* statistics for wrap-up summary */
86 int b_totfiles
; /* total files found in tree */
87 int b_src_copies
; /* files copied to source */
88 int b_src_deletes
; /* files deleted from source */
89 int b_src_misc
; /* ownership changes on source */
90 int b_dst_copies
; /* files copied to dest */
91 int b_dst_deletes
; /* files deleted from dest */
92 int b_dst_misc
; /* ownership changes on source */
93 int b_unresolved
; /* unresolved conflicts */
97 * flag bits describing what we know about a particular rule.
98 * These flags are found in the rule structure
100 typedef int rflags_t
; /* type for rule flags */
102 #define R_NEW 0x01 /* newly added rule (=OPT_NEW) */
103 #define R_PROGRAM 0x02 /* program (vs literal names) */
104 #define R_IGNORE 0x04 /* IGNORE (vs INCLUDE) */
105 #define R_RESTRICT 0x08 /* restriction (-r argument) */
106 #define R_WILD 0x10 /* name involves wild cards */
107 #define R_BOGUS 0x20 /* fabricated rule */
110 * a rule describes files to be included or excluded
111 * they are stored under bases
114 struct rule
*r_next
; /* pointer to next rule in base */
115 rflags_t r_flags
; /* flags associated with rule */
116 char *r_file
; /* file for this rule */
121 * this is the information we keep track of for a file
124 ino_t f_ino
; /* inode number of this file */
125 long f_d_maj
; /* maj dev on which it lives */
126 long f_d_min
; /* minj dev on which it lives */
128 int f_type
; /* file/dir/special ... */
129 int f_mode
; /* protection */
130 int f_nlink
; /* number of links to file */
132 uid_t f_uid
; /* owning UID */
133 gid_t f_gid
; /* owning GID */
135 off_t f_size
; /* length in bytes */
136 long f_modtime
; /* last modification time */
137 long f_modns
; /* low order bits of modtime */
139 long f_rd_maj
; /* major dev for specials */
140 long f_rd_min
; /* minor dev for specials */
142 int f_numacls
; /* number of entries in acls */
143 aclent_t
*f_acls
; /* acl list (if any) */
147 * flag bits describing the differences we have detected between a file
148 * and the last time it was in sync (based on the baseline).
149 * These flags are used in the srcdiffs and dstdiffs fields of the
152 typedef int diffmask_t
; /* type for difference masks */
154 #define D_CREATE 0x01 /* file has been created */
155 #define D_DELETE 0x02 /* file has been deleted */
156 #define D_MTIME 0x04 /* file has been modified */
157 #define D_SIZE 0x08 /* file has changed size */
158 #define D_UID 0x10 /* file has changed user id */
159 #define D_GID 0x20 /* file has changed group id */
160 #define D_PROT 0x40 /* file has changed protection */
161 #define D_LINKS 0x80 /* file has changed link count */
162 #define D_TYPE 0x100 /* file has changed type */
163 #define D_FACLS 0x200 /* file has changed facls */
164 #define D_RENAME_TO 0x400 /* file came from a rename */
165 #define D_RENAME_FROM 0x800 /* file has been renamed */
168 * these masks are used to determine how important potential changes are.
170 * D_CONTENTS there may be changes to the file's contents
171 * D_ADMIN there may be changes to the ownership and protection
172 * D_IMPORTANT there may be changes that should block a deletion
175 * I am torn on whether or not to include modtime in D_IMPORTANT.
176 * Experience suggests that deleting one of many links affects the
177 * file modification time.
179 #define D_ADMIN (D_UID|D_GID|D_PROT|D_FACLS)
180 #define D_CONTENTS (D_SIZE|D_TYPE|D_CREATE|D_MTIME)
181 #define D_IMPORTANT (D_SIZE|D_TYPE|D_CREATE|D_MTIME|D_ADMIN)
184 * a file is an instance that follows (under a base) from a rule
185 * (for that base). A file structure may exist because of any
186 * combination of a file under the source, destination, in a
187 * baseline for historical reasons, or merely because a rule
188 * calls it out (whether it exists or not).
191 struct file
*f_next
; /* pointer to next file in base */
192 struct file
*f_files
; /* pointer to files in subdir */
193 struct base
*f_base
; /* pointer to owning base */
194 fflags_t f_flags
; /* flags associated with file */
195 int f_depth
; /* directory depth for file */
196 char *f_name
; /* name of this file */
199 * these fields capture information, gleaned from the baseline
200 * that is side-specific, and should not be expected to be in
201 * agreement between the two sides. As a result, this info can
202 * not be properly captured in f_info[OPT_BASE] and needs to
203 * be kept somewhere else.
205 long f_s_modtime
; /* baseline source mod time */
206 ino_t f_s_inum
; /* baseline source inode # */
207 long f_s_nlink
; /* baseline source link count */
208 long f_s_maj
; /* baseline source dev maj */
209 long f_s_min
; /* baseline source dev min */
210 long f_d_modtime
; /* baseline target mod time */
211 ino_t f_d_inum
; /* baseline target inode # */
212 long f_d_nlink
; /* baseline target link count */
213 long f_d_maj
; /* baseline target dev maj */
214 long f_d_min
; /* baseline target dev min */
216 /* stat information from baseline file and evaluation */
217 struct fileinfo f_info
[3]; /* baseline, source, dest */
219 /* summary of changes discovered in analysis */
220 diffmask_t f_srcdiffs
; /* changes on source side */
221 diffmask_t f_dstdiffs
; /* changes on dest side */
223 /* this field is only valid for a renamed file */
224 struct file
* f_previous
; /* node for previous filename */
227 * these fields are only valid for a file that has been added
228 * to the reconciliation list
230 struct file
*f_rnext
; /* reconciliation chain ptr */
231 char *f_fullname
; /* full name for reconciling */
232 long f_modtime
; /* modtime for ordering purpose */
233 long f_modns
; /* low order modtime */
235 /* this field is only valid for a file with a hard conflict */
236 char *f_problem
; /* description of conflict */
242 extern struct base omnibase
; /* base for global rules */
243 extern struct base
*bases
; /* base for the main list */
244 extern int inum_changes
; /* LISTed dirs with i# changes */
246 /* routines to manage base nodes, file nodes, and file infor */
247 errmask_t
read_baseline(char *);
248 errmask_t
write_baseline(char *);
249 struct file
*add_file_to_base(struct base
*, const char *);
250 struct file
*add_file_to_dir(struct file
*, const char *);
251 struct base
*add_base(const char *src
, const char *dst
);
252 void note_info(struct file
*, const struct stat
*, side_t
);
253 void update_info(struct file
*, side_t
);
255 /* routines to manage rules */
256 errmask_t
read_rules(char *);
257 errmask_t
write_rules(char *);
258 errmask_t
add_include(struct base
*, char *);
259 errmask_t
add_ignore(struct base
*, char *);
261 /* routines to manage and querry restriction lists */
262 errmask_t
add_restr(char *);
263 bool_t
check_restr(struct base
*, const char *);
265 /* routines for dealing with ignore lists */
267 void ignore_pgm(const char *);
268 void ignore_expr(const char *);
269 void ignore_file(const char *);
270 bool_t
ignore_check(const char *);
272 /* database processing routines for the primary passes */
273 errmask_t
evaluate(struct base
*, side_t
, bool_t
);
274 errmask_t
analyze(void);
275 errmask_t
find_renames(struct file
*);
276 errmask_t
reconcile(struct file
*);
279 char *full_name(struct file
*, side_t
, side_t
);
281 /* routines in action.c to carry out reconciliation */
282 errmask_t
do_copy(struct file
*, side_t
);
283 errmask_t
do_remove(struct file
*, side_t
);
284 errmask_t
do_rename(struct file
*, side_t
);
285 errmask_t
do_like(struct file
*, side_t
, bool_t
);
287 /* routines to deal with links in the reconciliation list */
288 struct file
*find_link(struct file
*, side_t
);
289 void link_update(struct file
*, side_t
);
290 bool_t
has_other_links(struct file
*, side_t
);
292 /* maintain a name stack during directory tree traversal */
293 void push_name(const char *);
295 char *get_name(struct file
*);
297 /* acl manipulation functions */
298 int get_acls(const char *, struct fileinfo
*);
299 int set_acls(const char *, struct fileinfo
*);
300 int cmp_acls(struct fileinfo
*, struct fileinfo
*);
301 char *show_acls(int, aclent_t
*);
307 #endif /* _DATABASE_H */