1 /* 2 * CDDL HEADER START 3 * 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 7 * with the License. 8 * 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. 13 * 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] 19 * 20 * CDDL HEADER END 21 */ 22 /* 23 * Copyright (c) 1996 Sun Microsystems, Inc. All Rights Reserved 24 * 25 * module: 26 * database.h 27 * 28 * purpose: 29 * definition of the baseline and rules data structures 30 */ 31 32 #ifndef _DATABASE_H 33 #define _DATABASE_H 34 35 #pragma ident "%W% %E% SMI" 36 37 #ifdef __cplusplus 38 extern "C" { 39 #endif 40 41 #include <sys/stat.h> 42 #include <sys/acl.h> 43 44 #define ACL_UID_BUG 1 /* acl:SETACL sets owner to be caller */ 45 46 /* 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. 50 */ 51 typedef int fflags_t; /* type for file flags */ 52 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 */ 63 64 #define F_WHEREFOUND (F_IN_BASELINE|F_IN_SOURCE|F_IN_DEST) 65 66 /* 67 * a base is a pair of directories to be kept in sync 68 * all rules and baseline data is stored beneath some base 69 */ 70 struct 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 */ 78 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 */ 82 83 struct file *b_files; /* chain of files */ 84 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 */ 94 }; 95 96 /* 97 * flag bits describing what we know about a particular rule. 98 * These flags are found in the rule structure 99 */ 100 typedef int rflags_t; /* type for rule flags */ 101 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 */ 108 109 /* 110 * a rule describes files to be included or excluded 111 * they are stored under bases 112 */ 113 struct rule { 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 */ 117 }; 118 119 120 /* 121 * this is the information we keep track of for a file 122 */ 123 struct fileinfo { 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 */ 127 128 int f_type; /* file/dir/special ... */ 129 int f_mode; /* protection */ 130 int f_nlink; /* number of links to file */ 131 132 uid_t f_uid; /* owning UID */ 133 gid_t f_gid; /* owning GID */ 134 135 off_t f_size; /* length in bytes */ 136 long f_modtime; /* last modification time */ 137 long f_modns; /* low order bits of modtime */ 138 139 long f_rd_maj; /* major dev for specials */ 140 long f_rd_min; /* minor dev for specials */ 141 142 int f_numacls; /* number of entries in acls */ 143 aclent_t *f_acls; /* acl list (if any) */ 144 }; 145 146 /* 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 150 * file structure 151 */ 152 typedef int diffmask_t; /* type for difference masks */ 153 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 */ 166 167 /* 168 * these masks are used to determine how important potential changes are. 169 * 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 173 * 174 * Note: 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. 178 */ 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) 182 183 /* 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). 189 */ 190 struct file { 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 */ 197 198 /* 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. 204 */ 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 */ 215 216 /* stat information from baseline file and evaluation */ 217 struct fileinfo f_info[3]; /* baseline, source, dest */ 218 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 */ 222 223 /* this field is only valid for a renamed file */ 224 struct file * f_previous; /* node for previous filename */ 225 226 /* 227 * these fields are only valid for a file that has been added 228 * to the reconciliation list 229 */ 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 */ 234 235 /* this field is only valid for a file with a hard conflict */ 236 char *f_problem; /* description of conflict */ 237 }; 238 239 /* 240 * globals 241 */ 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 */ 245 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); 254 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 *); 260 261 /* routines to manage and querry restriction lists */ 262 errmask_t add_restr(char *); 263 bool_t check_restr(struct base *, const char *); 264 265 /* routines for dealing with ignore lists */ 266 void ignore_reset(); 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 *); 271 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 *); 277 int prune(void); 278 void summary(void); 279 char *full_name(struct file *, side_t, side_t); 280 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); 286 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); 291 292 /* maintain a name stack during directory tree traversal */ 293 void push_name(const char *); 294 void pop_name(); 295 char *get_name(struct file *); 296 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 *); 302 303 #ifdef __cplusplus 304 } 305 #endif 306 307 #endif /* _DATABASE_H */