summaryrefslogtreecommitdiff
path: root/usr/src/cmd/filesync/database.h
diff options
context:
space:
mode:
authorstevel@tonic-gate <none@none>2005-06-14 00:00:00 -0700
committerstevel@tonic-gate <none@none>2005-06-14 00:00:00 -0700
commit7c478bd95313f5f23a4c958a745db2134aa03244 (patch)
treec871e58545497667cbb4b0a4f2daf204743e1fe7 /usr/src/cmd/filesync/database.h
downloadillumos-joyent-7c478bd95313f5f23a4c958a745db2134aa03244.tar.gz
OpenSolaris Launch
Diffstat (limited to 'usr/src/cmd/filesync/database.h')
-rw-r--r--usr/src/cmd/filesync/database.h307
1 files changed, 307 insertions, 0 deletions
diff --git a/usr/src/cmd/filesync/database.h b/usr/src/cmd/filesync/database.h
new file mode 100644
index 0000000000..f9e0c44180
--- /dev/null
+++ b/usr/src/cmd/filesync/database.h
@@ -0,0 +1,307 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright (c) 1996 Sun Microsystems, Inc. All Rights Reserved
+ *
+ * module:
+ * database.h
+ *
+ * purpose:
+ * definition of the baseline and rules data structures
+ */
+
+#ifndef _DATABASE_H
+#define _DATABASE_H
+
+#pragma ident "%W% %E% SMI"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <sys/stat.h>
+#include <sys/acl.h>
+
+#define ACL_UID_BUG 1 /* acl:SETACL sets owner to be caller */
+
+/*
+ * flag bits describing what we know about an individual file, or in
+ * some cases an entire base pair. These flags are found in the
+ * base and file stuctures.
+ */
+typedef int fflags_t; /* type for file flags */
+
+#define F_NEW 0x01 /* newly allocated */
+#define F_IN_BASELINE 0x02 /* file found in baseline */
+#define F_IN_SOURCE 0x04 /* file found in source tree */
+#define F_IN_DEST 0x08 /* file found in dest tree */
+#define F_EVALUATE 0x10 /* include in analysis */
+#define F_SPARSE 0x20 /* don't walk this directory */
+#define F_REMOVE 0x40 /* remove from baseline */
+#define F_CONFLICT 0x80 /* unresolvable conflict */
+#define F_LISTED 0x100 /* file came from LIST */
+#define F_STAT_ERROR 0x200 /* unable to stat file */
+
+#define F_WHEREFOUND (F_IN_BASELINE|F_IN_SOURCE|F_IN_DEST)
+
+/*
+ * a base is a pair of directories to be kept in sync
+ * all rules and baseline data is stored beneath some base
+ */
+struct base {
+ struct base *b_next; /* pointer to next base */
+ fflags_t b_flags; /* what I know about this base */
+ int b_ident; /* base sequence # (DBG) */
+ char *b_src_spec; /* spec name of source dir */
+ char *b_dst_spec; /* spec name of dest dir */
+ char *b_src_name; /* expanded name of source dir */
+ char *b_dst_name; /* expanded name of dest dir */
+
+ struct rule *b_includes; /* chain of include rules */
+ struct rule *b_excludes; /* chain of exclude rules */
+ struct rule *b_restrictions; /* chain of restrictions */
+
+ struct file *b_files; /* chain of files */
+
+ /* statistics for wrap-up summary */
+ int b_totfiles; /* total files found in tree */
+ int b_src_copies; /* files copied to source */
+ int b_src_deletes; /* files deleted from source */
+ int b_src_misc; /* ownership changes on source */
+ int b_dst_copies; /* files copied to dest */
+ int b_dst_deletes; /* files deleted from dest */
+ int b_dst_misc; /* ownership changes on source */
+ int b_unresolved; /* unresolved conflicts */
+};
+
+/*
+ * flag bits describing what we know about a particular rule.
+ * These flags are found in the rule structure
+ */
+typedef int rflags_t; /* type for rule flags */
+
+#define R_NEW 0x01 /* newly added rule (=OPT_NEW) */
+#define R_PROGRAM 0x02 /* program (vs literal names) */
+#define R_IGNORE 0x04 /* IGNORE (vs INCLUDE) */
+#define R_RESTRICT 0x08 /* restriction (-r argument) */
+#define R_WILD 0x10 /* name involves wild cards */
+#define R_BOGUS 0x20 /* fabricated rule */
+
+/*
+ * a rule describes files to be included or excluded
+ * they are stored under bases
+ */
+struct rule {
+ struct rule *r_next; /* pointer to next rule in base */
+ rflags_t r_flags; /* flags associated with rule */
+ char *r_file; /* file for this rule */
+};
+
+
+/*
+ * this is the information we keep track of for a file
+ */
+struct fileinfo {
+ ino_t f_ino; /* inode number of this file */
+ long f_d_maj; /* maj dev on which it lives */
+ long f_d_min; /* minj dev on which it lives */
+
+ int f_type; /* file/dir/special ... */
+ int f_mode; /* protection */
+ int f_nlink; /* number of links to file */
+
+ uid_t f_uid; /* owning UID */
+ gid_t f_gid; /* owning GID */
+
+ off_t f_size; /* length in bytes */
+ long f_modtime; /* last modification time */
+ long f_modns; /* low order bits of modtime */
+
+ long f_rd_maj; /* major dev for specials */
+ long f_rd_min; /* minor dev for specials */
+
+ int f_numacls; /* number of entries in acls */
+ aclent_t *f_acls; /* acl list (if any) */
+};
+
+/*
+ * flag bits describing the differences we have detected between a file
+ * and the last time it was in sync (based on the baseline).
+ * These flags are used in the srcdiffs and dstdiffs fields of the
+ * file structure
+ */
+typedef int diffmask_t; /* type for difference masks */
+
+#define D_CREATE 0x01 /* file has been created */
+#define D_DELETE 0x02 /* file has been deleted */
+#define D_MTIME 0x04 /* file has been modified */
+#define D_SIZE 0x08 /* file has changed size */
+#define D_UID 0x10 /* file has changed user id */
+#define D_GID 0x20 /* file has changed group id */
+#define D_PROT 0x40 /* file has changed protection */
+#define D_LINKS 0x80 /* file has changed link count */
+#define D_TYPE 0x100 /* file has changed type */
+#define D_FACLS 0x200 /* file has changed facls */
+#define D_RENAME_TO 0x400 /* file came from a rename */
+#define D_RENAME_FROM 0x800 /* file has been renamed */
+
+/*
+ * these masks are used to determine how important potential changes are.
+ *
+ * D_CONTENTS there may be changes to the file's contents
+ * D_ADMIN there may be changes to the ownership and protection
+ * D_IMPORTANT there may be changes that should block a deletion
+ *
+ * Note:
+ * I am torn on whether or not to include modtime in D_IMPORTANT.
+ * Experience suggests that deleting one of many links affects the
+ * file modification time.
+ */
+#define D_ADMIN (D_UID|D_GID|D_PROT|D_FACLS)
+#define D_CONTENTS (D_SIZE|D_TYPE|D_CREATE|D_MTIME)
+#define D_IMPORTANT (D_SIZE|D_TYPE|D_CREATE|D_MTIME|D_ADMIN)
+
+/*
+ * a file is an instance that follows (under a base) from a rule
+ * (for that base). A file structure may exist because of any
+ * combination of a file under the source, destination, in a
+ * baseline for historical reasons, or merely because a rule
+ * calls it out (whether it exists or not).
+ */
+struct file {
+ struct file *f_next; /* pointer to next file in base */
+ struct file *f_files; /* pointer to files in subdir */
+ struct base *f_base; /* pointer to owning base */
+ fflags_t f_flags; /* flags associated with file */
+ int f_depth; /* directory depth for file */
+ char *f_name; /* name of this file */
+
+ /*
+ * these fields capture information, gleaned from the baseline
+ * that is side-specific, and should not be expected to be in
+ * agreement between the two sides. As a result, this info can
+ * not be properly captured in f_info[OPT_BASE] and needs to
+ * be kept somewhere else.
+ */
+ long f_s_modtime; /* baseline source mod time */
+ ino_t f_s_inum; /* baseline source inode # */
+ long f_s_nlink; /* baseline source link count */
+ long f_s_maj; /* baseline source dev maj */
+ long f_s_min; /* baseline source dev min */
+ long f_d_modtime; /* baseline target mod time */
+ ino_t f_d_inum; /* baseline target inode # */
+ long f_d_nlink; /* baseline target link count */
+ long f_d_maj; /* baseline target dev maj */
+ long f_d_min; /* baseline target dev min */
+
+ /* stat information from baseline file and evaluation */
+ struct fileinfo f_info[3]; /* baseline, source, dest */
+
+ /* summary of changes discovered in analysis */
+ diffmask_t f_srcdiffs; /* changes on source side */
+ diffmask_t f_dstdiffs; /* changes on dest side */
+
+ /* this field is only valid for a renamed file */
+ struct file * f_previous; /* node for previous filename */
+
+ /*
+ * these fields are only valid for a file that has been added
+ * to the reconciliation list
+ */
+ struct file *f_rnext; /* reconciliation chain ptr */
+ char *f_fullname; /* full name for reconciling */
+ long f_modtime; /* modtime for ordering purpose */
+ long f_modns; /* low order modtime */
+
+ /* this field is only valid for a file with a hard conflict */
+ char *f_problem; /* description of conflict */
+};
+
+/*
+ * globals
+ */
+extern struct base omnibase; /* base for global rules */
+extern struct base *bases; /* base for the main list */
+extern int inum_changes; /* LISTed dirs with i# changes */
+
+/* routines to manage base nodes, file nodes, and file infor */
+errmask_t read_baseline(char *);
+errmask_t write_baseline(char *);
+struct file *add_file_to_base(struct base *, const char *);
+struct file *add_file_to_dir(struct file *, const char *);
+struct base *add_base(const char *src, const char *dst);
+void note_info(struct file *, const struct stat *, side_t);
+void update_info(struct file *, side_t);
+
+/* routines to manage rules */
+errmask_t read_rules(char *);
+errmask_t write_rules(char *);
+errmask_t add_include(struct base *, char *);
+errmask_t add_ignore(struct base *, char *);
+
+/* routines to manage and querry restriction lists */
+errmask_t add_restr(char *);
+bool_t check_restr(struct base *, const char *);
+
+/* routines for dealing with ignore lists */
+void ignore_reset();
+void ignore_pgm(const char *);
+void ignore_expr(const char *);
+void ignore_file(const char *);
+bool_t ignore_check(const char *);
+
+/* database processing routines for the primary passes */
+errmask_t evaluate(struct base *, side_t, bool_t);
+errmask_t analyze(void);
+errmask_t find_renames(struct file *);
+errmask_t reconcile(struct file *);
+int prune(void);
+void summary(void);
+char *full_name(struct file *, side_t, side_t);
+
+/* routines in action.c to carry out reconciliation */
+errmask_t do_copy(struct file *, side_t);
+errmask_t do_remove(struct file *, side_t);
+errmask_t do_rename(struct file *, side_t);
+errmask_t do_like(struct file *, side_t, bool_t);
+
+/* routines to deal with links in the reconciliation list */
+struct file *find_link(struct file *, side_t);
+void link_update(struct file *, side_t);
+bool_t has_other_links(struct file *, side_t);
+
+/* maintain a name stack during directory tree traversal */
+void push_name(const char *);
+void pop_name();
+char *get_name(struct file *);
+
+/* acl manipulation functions */
+int get_acls(const char *, struct fileinfo *);
+int set_acls(const char *, struct fileinfo *);
+int cmp_acls(struct fileinfo *, struct fileinfo *);
+char *show_acls(int, aclent_t *);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _DATABASE_H */