root/usr/src/cmd/filesync/filesync.h
/*
 * 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
 * Copyright (c) 2016 by Delphix. All rights reserved.
 *
 * module:
 *      filesync.h
 *
 * purpose:
 *      general defines for use throughout the program
 */

#ifndef _FILESYNC_H
#define _FILESYNC_H

#ifdef  __cplusplus
extern "C" {
#endif

#include <sys/types.h>

/*
 * arbitrary limits
 */
#define MAX_NAME        256             /* longest path component       */
#define MAX_PATH        1024            /* longest total path length    */
#define MAX_RLIST       32              /* max number of -r arguments   */
#define MAX_LINE        1024            /* longest input line           */
#define MAX_DEPTH       20              /* how deep to recurse          */
#define COPY_BSIZE      8192            /* block size for file copies   */
#define MIN_HOLE        1024            /* minimum hole in sparse file  */
#define HASH_SIZE       99              /* ignore list hash table       */

/*
 * sanity check limits
 */
#define CONFIRM_MIN     4               /* min # deletetes to confirm   */
#define CONFIRM_PCT     25              /* min pctg of files to confirm */

/*
 * special types used in the program
 */
typedef enum {
        FALSE = 0,
        TRUE  = 1,
        MAYBE = 2                       /* only partially true          */
} bool_t;

typedef enum {
        OPT_BASE = 0,                   /* use the baseline data        */
        OPT_SRC = 1,                    /* use the source side          */
        OPT_DST = 2,                    /* use the destination side     */
        OPT_OLD = 3,                    /* use the old one              */
        OPT_NEW = 4                     /* use the new one              */
} side_t;

/*
 * values for debug mask
 */
typedef long dbgmask_t;                 /* type for debug masks         */
#define DBG_BASE        0x0001          /* baseline changes             */
#define DBG_RULE        0x0002          /* rule base changes            */
#define DBG_STAT        0x0004          /* file stats                   */
#define DBG_ANAL        0x0008          /* analysis tracing             */
#define DBG_RECON       0x0010          /* reconciliation tracing       */
#define DBG_VARS        0x0020          /* variable tracing             */
#define DBG_FILES       0x0040          /* file reading/writing         */
#define DBG_LIST        0x0080          /* include list building        */
#define DBG_EVAL        0x0100          /* evaluation tracing           */
#define DBG_IGNORE      0x0200          /* ignore tracing               */
#define DBG_MISC        0x0400          /* catch-all everything else    */

/*
 * values for error codes
 */
typedef int errmask_t;                  /* type for error masks         */
#define ERR_OK          0               /* everything is fine           */
#define ERR_RESOLVABLE  1               /* resolvable conflicts         */
#define ERR_UNRESOLVED  2               /* unresolvable conflicts       */
#define ERR_MISSING     4               /* some files missing           */
#define ERR_PERM        8               /* insufficient access          */
#define ERR_FILES       16              /* file format or I/O errors    */
#define ERR_INVAL       32              /* invalid arguments            */
#define ERR_NOBASE      64              /* inaccessable base directory  */
#define ERR_OTHER       128             /* anything else                */

/* errors that will prevent reconciliation from taking place            */
#define ERR_FATAL       (ERR_FILES|ERR_INVAL|ERR_NOBASE|ERR_OTHER)

/* errors that will cause reconciliation to stop with -h specified      */
#define ERR_ABORT       (ERR_FILES|ERR_PERM)

/*
 * program defaults
 */
#define DFLT_PRFX       "$HOME/"                /* default location/pfx */
#define SUFX_RULES      ".packingrules"         /* rules v1.1 location  */
#define SUFX_BASE       ".filesync-base"        /* baseline location    */
#define SUFX_OLD        ".filesync-rules"       /* rules v1.0 location  */

/*
 * global variables for command line options
 */
extern bool_t  opt_acls;        /* enable acl checking/preservation     */
extern bool_t  opt_mtime;       /* preserve modification times          */
extern bool_t  opt_notouch;     /* don't actually make any changes      */
extern side_t  opt_force;       /* designated winner for conflicts      */
extern side_t  opt_oneway;      /* one way only propagation             */
extern side_t  opt_onesided;    /* permit one sided analysis            */
extern bool_t  opt_everything;  /* everything must agree (modes/uid/gid) */
extern bool_t  opt_quiet;       /* stiffle reconciliaton descriptions   */
extern bool_t  opt_verbose;     /* generate analysis commentary         */
extern bool_t  opt_errors;      /* simulate errors on specified files   */
extern bool_t  opt_halt;        /* halt on any propagation error        */
extern dbgmask_t opt_debug;     /* debugging options                    */

/*
 * information gained during startup that other people may need
 */
extern uid_t my_uid;    /* User ID for files I create                   */
extern gid_t my_gid;    /* Group ID for files I create                  */

/* error and warning routines                                           */
void confirm(char *);           /* ask user if they're sure             */
void nomem(char *);             /* die from malloc failure              */

/* routines for dealing with strings and file names                     */
const char *prefix(const char *, const char *); /* does s1 begin with s2 */
char *qualify(char *);          /* validate and fully qualify           */
char *expand(char *);           /* expand variables in name             */
char *lex(FILE *);              /* lex off one token                    */
extern int lex_linenum;         /* current input file line number       */
const char *noblanks(const char *);     /* escape strings for embedded blanks */
bool_t wildcards(const char *); /* does name contain wildcards          */
bool_t suffix(const char *, const char *);      /* does s1 end with s2  */
bool_t contains(const char *, const char *);    /* does s1 contain s2   */

#ifdef  __cplusplus
}
#endif

#endif  /* _FILESYNC_H */