17c478bdstevel@tonic-gate/* 27c478bdstevel@tonic-gate * CDDL HEADER START 37c478bdstevel@tonic-gate * 47c478bdstevel@tonic-gate * The contents of this file are subject to the terms of the 57c478bdstevel@tonic-gate * Common Development and Distribution License, Version 1.0 only 67c478bdstevel@tonic-gate * (the "License"). You may not use this file except in compliance 77c478bdstevel@tonic-gate * with the License. 87c478bdstevel@tonic-gate * 97c478bdstevel@tonic-gate * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 107c478bdstevel@tonic-gate * or http://www.opensolaris.org/os/licensing. 117c478bdstevel@tonic-gate * See the License for the specific language governing permissions 127c478bdstevel@tonic-gate * and limitations under the License. 137c478bdstevel@tonic-gate * 147c478bdstevel@tonic-gate * When distributing Covered Code, include this CDDL HEADER in each 157c478bdstevel@tonic-gate * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 167c478bdstevel@tonic-gate * If applicable, add the following below this CDDL HEADER, with the 177c478bdstevel@tonic-gate * fields enclosed by brackets "[]" replaced with your own identifying 187c478bdstevel@tonic-gate * information: Portions Copyright [yyyy] [name of copyright owner] 197c478bdstevel@tonic-gate * 207c478bdstevel@tonic-gate * CDDL HEADER END 217c478bdstevel@tonic-gate */ 227c478bdstevel@tonic-gate/* 237c478bdstevel@tonic-gate * Copyright (c) 1996 Sun Microsystems, Inc. All Rights Reserved 247c478bdstevel@tonic-gate * 257c478bdstevel@tonic-gate * module: 267c478bdstevel@tonic-gate * database.h 277c478bdstevel@tonic-gate * 287c478bdstevel@tonic-gate * purpose: 297c478bdstevel@tonic-gate * definition of the baseline and rules data structures 307c478bdstevel@tonic-gate */ 317c478bdstevel@tonic-gate 327c478bdstevel@tonic-gate#ifndef _DATABASE_H 337c478bdstevel@tonic-gate#define _DATABASE_H 347c478bdstevel@tonic-gate 357c478bdstevel@tonic-gate#pragma ident "%W% %E% SMI" 367c478bdstevel@tonic-gate 377c478bdstevel@tonic-gate#ifdef __cplusplus 387c478bdstevel@tonic-gateextern "C" { 397c478bdstevel@tonic-gate#endif 407c478bdstevel@tonic-gate 417c478bdstevel@tonic-gate#include <sys/stat.h> 427c478bdstevel@tonic-gate#include <sys/acl.h> 437c478bdstevel@tonic-gate 447c478bdstevel@tonic-gate#define ACL_UID_BUG 1 /* acl:SETACL sets owner to be caller */ 457c478bdstevel@tonic-gate 467c478bdstevel@tonic-gate/* 477c478bdstevel@tonic-gate * flag bits describing what we know about an individual file, or in 487c478bdstevel@tonic-gate * some cases an entire base pair. These flags are found in the 497c478bdstevel@tonic-gate * base and file stuctures. 507c478bdstevel@tonic-gate */ 517c478bdstevel@tonic-gatetypedef int fflags_t; /* type for file flags */ 527c478bdstevel@tonic-gate 537c478bdstevel@tonic-gate#define F_NEW 0x01 /* newly allocated */ 547c478bdstevel@tonic-gate#define F_IN_BASELINE 0x02 /* file found in baseline */ 557c478bdstevel@tonic-gate#define F_IN_SOURCE 0x04 /* file found in source tree */ 567c478bdstevel@tonic-gate#define F_IN_DEST 0x08 /* file found in dest tree */ 577c478bdstevel@tonic-gate#define F_EVALUATE 0x10 /* include in analysis */ 587c478bdstevel@tonic-gate#define F_SPARSE 0x20 /* don't walk this directory */ 597c478bdstevel@tonic-gate#define F_REMOVE 0x40 /* remove from baseline */ 607c478bdstevel@tonic-gate#define F_CONFLICT 0x80 /* unresolvable conflict */ 617c478bdstevel@tonic-gate#define F_LISTED 0x100 /* file came from LIST */ 627c478bdstevel@tonic-gate#define F_STAT_ERROR 0x200 /* unable to stat file */ 637c478bdstevel@tonic-gate 647c478bdstevel@tonic-gate#define F_WHEREFOUND (F_IN_BASELINE|F_IN_SOURCE|F_IN_DEST) 657c478bdstevel@tonic-gate 667c478bdstevel@tonic-gate/* 677c478bdstevel@tonic-gate * a base is a pair of directories to be kept in sync 687c478bdstevel@tonic-gate * all rules and baseline data is stored beneath some base 697c478bdstevel@tonic-gate */ 707c478bdstevel@tonic-gatestruct base { 717c478bdstevel@tonic-gate struct base *b_next; /* pointer to next base */ 727c478bdstevel@tonic-gate fflags_t b_flags; /* what I know about this base */ 737c478bdstevel@tonic-gate int b_ident; /* base sequence # (DBG) */ 747c478bdstevel@tonic-gate char *b_src_spec; /* spec name of source dir */ 757c478bdstevel@tonic-gate char *b_dst_spec; /* spec name of dest dir */ 767c478bdstevel@tonic-gate char *b_src_name; /* expanded name of source dir */ 777c478bdstevel@tonic-gate char *b_dst_name; /* expanded name of dest dir */ 787c478bdstevel@tonic-gate 797c478bdstevel@tonic-gate struct rule *b_includes; /* chain of include rules */ 807c478bdstevel@tonic-gate struct rule *b_excludes; /* chain of exclude rules */ 817c478bdstevel@tonic-gate struct rule *b_restrictions; /* chain of restrictions */ 827c478bdstevel@tonic-gate 837c478bdstevel@tonic-gate struct file *b_files; /* chain of files */ 847c478bdstevel@tonic-gate 857c478bdstevel@tonic-gate /* statistics for wrap-up summary */ 867c478bdstevel@tonic-gate int b_totfiles; /* total files found in tree */ 877c478bdstevel@tonic-gate int b_src_copies; /* files copied to source */ 887c478bdstevel@tonic-gate int b_src_deletes; /* files deleted from source */ 897c478bdstevel@tonic-gate int b_src_misc; /* ownership changes on source */ 907c478bdstevel@tonic-gate int b_dst_copies; /* files copied to dest */ 917c478bdstevel@tonic-gate int b_dst_deletes; /* files deleted from dest */ 927c478bdstevel@tonic-gate int b_dst_misc; /* ownership changes on source */ 937c478bdstevel@tonic-gate int b_unresolved; /* unresolved conflicts */ 947c478bdstevel@tonic-gate}; 957c478bdstevel@tonic-gate 967c478bdstevel@tonic-gate/* 977c478bdstevel@tonic-gate * flag bits describing what we know about a particular rule. 987c478bdstevel@tonic-gate * These flags are found in the rule structure 997c478bdstevel@tonic-gate */ 1007c478bdstevel@tonic-gatetypedef int rflags_t; /* type for rule flags */ 1017c478bdstevel@tonic-gate 1027c478bdstevel@tonic-gate#define R_NEW 0x01 /* newly added rule (=OPT_NEW) */ 1037c478bdstevel@tonic-gate#define R_PROGRAM 0x02 /* program (vs literal names) */ 1047c478bdstevel@tonic-gate#define R_IGNORE 0x04 /* IGNORE (vs INCLUDE) */ 1057c478bdstevel@tonic-gate#define R_RESTRICT 0x08 /* restriction (-r argument) */ 1067c478bdstevel@tonic-gate#define R_WILD 0x10 /* name involves wild cards */ 1077c478bdstevel@tonic-gate#define R_BOGUS 0x20 /* fabricated rule */ 1087c478bdstevel@tonic-gate 1097c478bdstevel@tonic-gate/* 1107c478bdstevel@tonic-gate * a rule describes files to be included or excluded 1117c478bdstevel@tonic-gate * they are stored under bases 1127c478bdstevel@tonic-gate */ 1137c478bdstevel@tonic-gatestruct rule { 1147c478bdstevel@tonic-gate struct rule *r_next; /* pointer to next rule in base */ 1157c478bdstevel@tonic-gate rflags_t r_flags; /* flags associated with rule */ 1167c478bdstevel@tonic-gate char *r_file; /* file for this rule */ 1177c478bdstevel@tonic-gate}; 1187c478bdstevel@tonic-gate 1197c478bdstevel@tonic-gate 1207c478bdstevel@tonic-gate/* 1217c478bdstevel@tonic-gate * this is the information we keep track of for a file 1227c478bdstevel@tonic-gate */ 1237c478bdstevel@tonic-gatestruct fileinfo { 1247c478bdstevel@tonic-gate ino_t f_ino; /* inode number of this file */ 1257c478bdstevel@tonic-gate long f_d_maj; /* maj dev on which it lives */ 1267c478bdstevel@tonic-gate long f_d_min; /* minj dev on which it lives */ 1277c478bdstevel@tonic-gate 1287c478bdstevel@tonic-gate int f_type; /* file/dir/special ... */ 1297c478bdstevel@tonic-gate int f_mode; /* protection */ 1307c478bdstevel@tonic-gate int f_nlink; /* number of links to file */ 1317c478bdstevel@tonic-gate 1327c478bdstevel@tonic-gate uid_t f_uid; /* owning UID */ 1337c478bdstevel@tonic-gate gid_t f_gid; /* owning GID */ 1347c478bdstevel@tonic-gate 1357c478bdstevel@tonic-gate off_t f_size; /* length in bytes */ 1367c478bdstevel@tonic-gate long f_modtime; /* last modification time */ 1377c478bdstevel@tonic-gate long f_modns; /* low order bits of modtime */ 1387c478bdstevel@tonic-gate 1397c478bdstevel@tonic-gate long f_rd_maj; /* major dev for specials */ 1407c478bdstevel@tonic-gate long f_rd_min; /* minor dev for specials */ 1417c478bdstevel@tonic-gate 1427c478bdstevel@tonic-gate int f_numacls; /* number of entries in acls */ 1437c478bdstevel@tonic-gate aclent_t *f_acls; /* acl list (if any) */ 1447c478bdstevel@tonic-gate}; 1457c478bdstevel@tonic-gate 1467c478bdstevel@tonic-gate/* 1477c478bdstevel@tonic-gate * flag bits describing the differences we have detected between a file 1487c478bdstevel@tonic-gate * and the last time it was in sync (based on the baseline). 1497c478bdstevel@tonic-gate * These flags are used in the srcdiffs and dstdiffs fields of the 1507c478bdstevel@tonic-gate * file structure 1517c478bdstevel@tonic-gate */ 1527c478bdstevel@tonic-gatetypedef int diffmask_t; /* type for difference masks */ 1537c478bdstevel@tonic-gate 1547c478bdstevel@tonic-gate#define D_CREATE 0x01 /* file has been created */ 1557c478bdstevel@tonic-gate#define D_DELETE 0x02 /* file has been deleted */ 1567c478bdstevel@tonic-gate#define D_MTIME 0x04 /* file has been modified */ 1577c478bdstevel@tonic-gate#define D_SIZE 0x08 /* file has changed size */ 1587c478bdstevel@tonic-gate#define D_UID 0x10 /* file has changed user id */ 1597c478bdstevel@tonic-gate#define D_GID 0x20 /* file has changed group id */ 1607c478bdstevel@tonic-gate#define D_PROT 0x40 /* file has changed protection */ 1617c478bdstevel@tonic-gate#define D_LINKS 0x80 /* file has changed link count */ 1627c478bdstevel@tonic-gate#define D_TYPE 0x100 /* file has changed type */ 1637c478bdstevel@tonic-gate#define D_FACLS 0x200 /* file has changed facls */ 1647c478bdstevel@tonic-gate#define D_RENAME_TO 0x400 /* file came from a rename */ 1657c478bdstevel@tonic-gate#define D_RENAME_FROM 0x800 /* file has been renamed */ 1667c478bdstevel@tonic-gate 1677c478bdstevel@tonic-gate/* 1687c478bdstevel@tonic-gate * these masks are used to determine how important potential changes are. 1697c478bdstevel@tonic-gate * 1707c478bdstevel@tonic-gate * D_CONTENTS there may be changes to the file's contents 1717c478bdstevel@tonic-gate * D_ADMIN there may be changes to the ownership and protection 1727c478bdstevel@tonic-gate * D_IMPORTANT there may be changes that should block a deletion 1737c478bdstevel@tonic-gate * 1747c478bdstevel@tonic-gate * Note: 1757c478bdstevel@tonic-gate * I am torn on whether or not to include modtime in D_IMPORTANT. 1767c478bdstevel@tonic-gate * Experience suggests that deleting one of many links affects the 1777c478bdstevel@tonic-gate * file modification time. 1787c478bdstevel@tonic-gate */ 1797c478bdstevel@tonic-gate#define D_ADMIN (D_UID|D_GID|D_PROT|D_FACLS) 1807c478bdstevel@tonic-gate#define D_CONTENTS (D_SIZE|D_TYPE|D_CREATE|D_MTIME) 1817c478bdstevel@tonic-gate#define D_IMPORTANT (D_SIZE|D_TYPE|D_CREATE|D_MTIME|D_ADMIN) 1827c478bdstevel@tonic-gate 1837c478bdstevel@tonic-gate/* 1847c478bdstevel@tonic-gate * a file is an instance that follows (under a base) from a rule 1857c478bdstevel@tonic-gate * (for that base). A file structure may exist because of any 1867c478bdstevel@tonic-gate * combination of a file under the source, destination, in a 1877c478bdstevel@tonic-gate * baseline for historical reasons, or merely because a rule 1887c478bdstevel@tonic-gate * calls it out (whether it exists or not). 1897c478bdstevel@tonic-gate */ 1907c478bdstevel@tonic-gatestruct file { 1917c478bdstevel@tonic-gate struct file *f_next; /* pointer to next file in base */ 1927c478bdstevel@tonic-gate struct file *f_files; /* pointer to files in subdir */ 1937c478bdstevel@tonic-gate struct base *f_base; /* pointer to owning base */ 1947c478bdstevel@tonic-gate fflags_t f_flags; /* flags associated with file */ 1957c478bdstevel@tonic-gate int f_depth; /* directory depth for file */ 1967c478bdstevel@tonic-gate char *f_name; /* name of this file */ 1977c478bdstevel@tonic-gate 1987c478bdstevel@tonic-gate /* 1997c478bdstevel@tonic-gate * these fields capture information, gleaned from the baseline 2007c478bdstevel@tonic-gate * that is side-specific, and should not be expected to be in 2017c478bdstevel@tonic-gate * agreement between the two sides. As a result, this info can 2027c478bdstevel@tonic-gate * not be properly captured in f_info[OPT_BASE] and needs to 2037c478bdstevel@tonic-gate * be kept somewhere else. 2047c478bdstevel@tonic-gate */ 2057c478bdstevel@tonic-gate long f_s_modtime; /* baseline source mod time */ 2067c478bdstevel@tonic-gate ino_t f_s_inum; /* baseline source inode # */ 2077c478bdstevel@tonic-gate long f_s_nlink; /* baseline source link count */ 2087c478bdstevel@tonic-gate long f_s_maj; /* baseline source dev maj */ 2097c478bdstevel@tonic-gate long f_s_min; /* baseline source dev min */ 2107c478bdstevel@tonic-gate long f_d_modtime; /* baseline target mod time */ 2117c478bdstevel@tonic-gate ino_t f_d_inum; /* baseline target inode # */ 2127c478bdstevel@tonic-gate long f_d_nlink; /* baseline target link count */ 2137c478bdstevel@tonic-gate long f_d_maj; /* baseline target dev maj */ 2147c478bdstevel@tonic-gate long f_d_min; /* baseline target dev min */ 2157c478bdstevel@tonic-gate 2167c478bdstevel@tonic-gate /* stat information from baseline file and evaluation */ 2177c478bdstevel@tonic-gate struct fileinfo f_info[3]; /* baseline, source, dest */ 2187c478bdstevel@tonic-gate 2197c478bdstevel@tonic-gate /* summary of changes discovered in analysis */ 2207c478bdstevel@tonic-gate diffmask_t f_srcdiffs; /* changes on source side */ 2217c478bdstevel@tonic-gate diffmask_t f_dstdiffs; /* changes on dest side */ 2227c478bdstevel@tonic-gate 2237c478bdstevel@tonic-gate /* this field is only valid for a renamed file */ 2247c478bdstevel@tonic-gate struct file * f_previous; /* node for previous filename */ 2257c478bdstevel@tonic-gate 2267c478bdstevel@tonic-gate /* 2277c478bdstevel@tonic-gate * these fields are only valid for a file that has been added 2287c478bdstevel@tonic-gate * to the reconciliation list 2297c478bdstevel@tonic-gate */ 2307c478bdstevel@tonic-gate struct file *f_rnext; /* reconciliation chain ptr */ 2317c478bdstevel@tonic-gate char *f_fullname; /* full name for reconciling */ 2327c478bdstevel@tonic-gate long f_modtime; /* modtime for ordering purpose */ 2337c478bdstevel@tonic-gate long f_modns; /* low order modtime */ 2347c478bdstevel@tonic-gate 2357c478bdstevel@tonic-gate /* this field is only valid for a file with a hard conflict */ 2367c478bdstevel@tonic-gate char *f_problem; /* description of conflict */ 2377c478bdstevel@tonic-gate}; 2387c478bdstevel@tonic-gate 2397c478bdstevel@tonic-gate/* 2407c478bdstevel@tonic-gate * globals 2417c478bdstevel@tonic-gate */ 2427c478bdstevel@tonic-gateextern struct base omnibase; /* base for global rules */ 2437c478bdstevel@tonic-gateextern struct base *bases; /* base for the main list */ 2447c478bdstevel@tonic-gateextern int inum_changes; /* LISTed dirs with i# changes */ 2457c478bdstevel@tonic-gate 2467c478bdstevel@tonic-gate/* routines to manage base nodes, file nodes, and file infor */ 2477c478bdstevel@tonic-gateerrmask_t read_baseline(char *); 2487c478bdstevel@tonic-gateerrmask_t write_baseline(char *); 2497c478bdstevel@tonic-gatestruct file *add_file_to_base(struct base *, const char *); 2507c478bdstevel@tonic-gatestruct file *add_file_to_dir(struct file *, const char *); 2517c478bdstevel@tonic-gatestruct base *add_base(const char *src, const char *dst); 2527c478bdstevel@tonic-gatevoid note_info(struct file *, const struct stat *, side_t); 2537c478bdstevel@tonic-gatevoid update_info(struct file *, side_t); 2547c478bdstevel@tonic-gate 2557c478bdstevel@tonic-gate/* routines to manage rules */ 2567c478bdstevel@tonic-gateerrmask_t read_rules(char *); 2577c478bdstevel@tonic-gateerrmask_t write_rules(char *); 2587c478bdstevel@tonic-gateerrmask_t add_include(struct base *, char *); 2597c478bdstevel@tonic-gateerrmask_t add_ignore(struct base *, char *); 2607c478bdstevel@tonic-gate 2617c478bdstevel@tonic-gate/* routines to manage and querry restriction lists */ 2627c478bdstevel@tonic-gateerrmask_t add_restr(char *); 2637c478bdstevel@tonic-gatebool_t check_restr(struct base *, const char *); 2647c478bdstevel@tonic-gate 2657c478bdstevel@tonic-gate/* routines for dealing with ignore lists */ 2667c478bdstevel@tonic-gatevoid ignore_reset(); 2677c478bdstevel@tonic-gatevoid ignore_pgm(const char *); 2687c478bdstevel@tonic-gatevoid ignore_expr(const char *); 2697c478bdstevel@tonic-gatevoid ignore_file(const char *); 2707c478bdstevel@tonic-gatebool_t ignore_check(const char *); 2717c478bdstevel@tonic-gate 2727c478bdstevel@tonic-gate/* database processing routines for the primary passes */ 2737c478bdstevel@tonic-gateerrmask_t evaluate(struct base *, side_t, bool_t); 2747c478bdstevel@tonic-gateerrmask_t analyze(void); 2757c478bdstevel@tonic-gateerrmask_t find_renames(struct file *); 2767c478bdstevel@tonic-gateerrmask_t reconcile(struct file *); 2777c478bdstevel@tonic-gateint prune(void); 2787c478bdstevel@tonic-gatevoid summary(void); 2797c478bdstevel@tonic-gatechar *full_name(struct file *, side_t, side_t); 2807c478bdstevel@tonic-gate 2817c478bdstevel@tonic-gate/* routines in action.c to carry out reconciliation */ 2827c478bdstevel@tonic-gateerrmask_t do_copy(struct file *, side_t); 2837c478bdstevel@tonic-gateerrmask_t do_remove(struct file *, side_t); 2847c478bdstevel@tonic-gateerrmask_t do_rename(struct file *, side_t); 2857c478bdstevel@tonic-gateerrmask_t do_like(struct file *, side_t, bool_t); 2867c478bdstevel@tonic-gate 2877c478bdstevel@tonic-gate/* routines to deal with links in the reconciliation list */ 2887c478bdstevel@tonic-gatestruct file *find_link(struct file *, side_t); 2897c478bdstevel@tonic-gatevoid link_update(struct file *, side_t); 2907c478bdstevel@tonic-gatebool_t has_other_links(struct file *, side_t); 2917c478bdstevel@tonic-gate 2927c478bdstevel@tonic-gate/* maintain a name stack during directory tree traversal */ 2937c478bdstevel@tonic-gatevoid push_name(const char *); 2947c478bdstevel@tonic-gatevoid pop_name(); 2957c478bdstevel@tonic-gatechar *get_name(struct file *); 2967c478bdstevel@tonic-gate 2977c478bdstevel@tonic-gate/* acl manipulation functions */ 2987c478bdstevel@tonic-gateint get_acls(const char *, struct fileinfo *); 2997c478bdstevel@tonic-gateint set_acls(const char *, struct fileinfo *); 3007c478bdstevel@tonic-gateint cmp_acls(struct fileinfo *, struct fileinfo *); 3017c478bdstevel@tonic-gatechar *show_acls(int, aclent_t *); 3027c478bdstevel@tonic-gate 3037c478bdstevel@tonic-gate#ifdef __cplusplus 3047c478bdstevel@tonic-gate} 3057c478bdstevel@tonic-gate#endif 3067c478bdstevel@tonic-gate 3077c478bdstevel@tonic-gate#endif /* _DATABASE_H */ 308