[BACK]Return to extern.h CVS log [TXT][DIR] Up to [local] / src / usr.bin / rsync

Annotation of src/usr.bin/rsync/extern.h, Revision 1.48

1.48    ! claudio     1: /*     $OpenBSD: extern.h,v 1.47 2023/11/27 11:30:49 claudio Exp $ */
1.1       benno       2: /*
                      3:  * Copyright (c) 2019 Kristaps Dzonsons <kristaps@bsd.lv>
                      4:  *
                      5:  * Permission to use, copy, modify, and distribute this software for any
                      6:  * purpose with or without fee is hereby granted, provided that the above
                      7:  * copyright notice and this permission notice appear in all copies.
                      8:  *
                      9:  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
                     10:  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
                     11:  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
                     12:  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
                     13:  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
                     14:  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
                     15:  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
                     16:  */
                     17: #ifndef EXTERN_H
                     18: #define EXTERN_H
                     19:
1.48    ! claudio    20: #include <openssl/md4.h>
        !            21:
1.1       benno      22: /*
                     23:  * This is the rsync protocol version that we support.
                     24:  */
                     25: #define        RSYNC_PROTOCOL  (27)
                     26:
                     27: /*
                     28:  * Maximum amount of file data sent over the wire at once.
                     29:  */
                     30: #define MAX_CHUNK      (32 * 1024)
                     31:
                     32: /*
                     33:  * This is the minimum size for a block of data not including those in
                     34:  * the remainder block.
                     35:  */
                     36: #define        BLOCK_SIZE_MIN  (700)
                     37:
                     38: /*
1.42      claudio    39:  * Maximum number of base directories that can be used.
                     40:  */
                     41: #define MAX_BASEDIR    20
                     42:
                     43: #define BASE_MODE_COMPARE      1
                     44: #define BASE_MODE_COPY         2
                     45: #define BASE_MODE_LINK         3
                     46:
                     47: /*
1.1       benno      48:  * The sender and receiver use a two-phase synchronisation process.
                     49:  * The first uses two-byte hashes; the second, 16-byte.
                     50:  * (The second must hold a full MD4 digest.)
                     51:  */
                     52: #define        CSUM_LENGTH_PHASE1 (2)
                     53: #define        CSUM_LENGTH_PHASE2 (16)
1.37      claudio    54:
                     55: /*
                     56:  * Rsync error codes.
                     57:  */
                     58: #define ERR_SYNTAX     1
                     59: #define ERR_PROTOCOL   2
                     60: #define ERR_SOCK_IO    10
                     61: #define ERR_FILE_IO    11
                     62: #define ERR_WIREPROTO  12
                     63: #define ERR_IPC                14      /* catchall for any kind of syscall error */
                     64: #define ERR_TERMIMATED 16
                     65: #define ERR_WAITPID    21
                     66: #define ERR_NOMEM      22
1.1       benno      67:
1.14      florian    68: /*
1.34      claudio    69:  * Use this for --timeout.
1.14      florian    70:  * All poll events will use it and catch time-outs.
                     71:  */
1.34      claudio    72: extern int poll_timeout;
1.44      job        73:
                     74: /*
                     75:  * Use this for --contimeout.
                     76:  */
                     77: extern int poll_contimeout;
1.13      florian    78:
1.1       benno      79: /*
                     80:  * Operating mode for a client or a server.
                     81:  * Sender means we synchronise local files with those from remote.
                     82:  * Receiver is the opposite.
                     83:  * This is relative to which host we're running on.
                     84:  */
                     85: enum   fmode {
                     86:        FARGS_SENDER,
                     87:        FARGS_RECEIVER
                     88: };
                     89:
                     90: /*
                     91:  * File arguments given on the command line.
                     92:  * See struct opts.
                     93:  */
                     94: struct fargs {
                     95:        char      *host; /* hostname or NULL if local */
                     96:        char     **sources; /* transfer source */
                     97:        size_t     sourcesz; /* number of sources */
                     98:        char      *sink; /* transfer endpoint */
                     99:        enum fmode mode; /* mode of operation */
                    100:        int        remote; /* uses rsync:// or :: for remote */
                    101:        char      *module; /* if rsync://, the module */
                    102: };
                    103:
                    104: /*
                    105:  * The subset of stat(2) information that we need.
                    106:  * (There are some parts we don't use yet.)
                    107:  */
                    108: struct flstat {
1.12      florian   109:        mode_t           mode;  /* mode */
                    110:        uid_t            uid;   /* user */
                    111:        gid_t            gid;   /* group */
                    112:        dev_t            rdev;  /* device type */
                    113:        off_t            size;  /* size */
                    114:        time_t           mtime; /* modification */
1.1       benno     115:        unsigned int     flags;
1.12      florian   116: #define        FLSTAT_TOP_DIR   0x01   /* a top-level directory */
1.1       benno     117:
                    118: };
                    119:
                    120: /*
                    121:  * A list of files with their statistics.
                    122:  */
                    123: struct flist {
                    124:        char            *path; /* path relative to root */
                    125:        const char      *wpath; /* "working" path for receiver */
                    126:        struct flstat    st; /* file information */
                    127:        char            *link; /* symlink target or NULL */
                    128: };
                    129:
                    130: /*
                    131:  * Options passed into the command line.
                    132:  * See struct fargs.
                    133:  */
                    134: struct opts {
1.3       deraadt   135:        int              sender;                /* --sender */
                    136:        int              server;                /* --server */
                    137:        int              recursive;             /* -r */
                    138:        int              dry_run;               /* -n */
                    139:        int              preserve_times;        /* -t */
                    140:        int              preserve_perms;        /* -p */
                    141:        int              preserve_links;        /* -l */
1.5       benno     142:        int              preserve_gids;         /* -g */
1.9       florian   143:        int              preserve_uids;         /* -u */
1.3       deraadt   144:        int              del;                   /* --delete */
1.12      florian   145:        int              devices;               /* --devices */
                    146:        int              specials;              /* --specials */
1.36      job       147:        int              no_motd;               /* --no-motd */
1.22      benno     148:        int              numeric_ids;           /* --numeric-ids */
1.28      bket      149:        int              one_file_system;       /* -x */
1.45      claudio   150:        int              ignore_times;          /* -I */
1.46      job       151:        int              ignore_dir_times;      /* -O */
1.47      claudio   152:        int              ignore_link_times;     /* -J */
1.45      claudio   153:        int              size_only;             /* --size-only */
1.42      claudio   154:        int              alt_base_mode;
1.43      claudio   155:        off_t            max_size;              /* --max-size */
                    156:        off_t            min_size;              /* --min-size */
1.3       deraadt   157:        char            *rsync_path;            /* --rsync-path */
1.4       deraadt   158:        char            *ssh_prog;              /* --rsh or -e */
1.18      deraadt   159:        char            *port;                  /* --port */
1.32      claudio   160:        char            *address;               /* --address */
1.42      claudio   161:        char            *basedir[MAX_BASEDIR];
1.1       benno     162: };
                    163:
1.40      claudio   164: enum rule_type {
                    165:        RULE_NONE,
                    166:        RULE_EXCLUDE,
                    167:        RULE_INCLUDE,
                    168:        RULE_CLEAR,
                    169: #ifdef NOTYET
                    170:        RULE_MERGE,
                    171:        RULE_DIR_MERGE,
                    172:        RULE_SHOW,
                    173:        RULE_HIDE,
                    174:        RULE_PROTECT,
                    175:        RULE_RISK,
                    176: #endif
                    177: };
                    178:
1.1       benno     179: /*
                    180:  * An individual block description for a file.
                    181:  * See struct blkset.
                    182:  */
                    183: struct blk {
                    184:        off_t            offs; /* offset in file */
                    185:        size_t           idx; /* block index */
                    186:        size_t           len; /* bytes in block */
                    187:        uint32_t         chksum_short; /* fast checksum */
                    188:        unsigned char    chksum_long[CSUM_LENGTH_PHASE2]; /* slow checksum */
                    189: };
                    190:
1.14      florian   191: enum   blkstatst {
                    192:        BLKSTAT_NONE = 0,
1.21      benno     193:        BLKSTAT_NEXT,
1.14      florian   194:        BLKSTAT_DATA,
                    195:        BLKSTAT_TOK,
                    196:        BLKSTAT_HASH,
1.21      benno     197:        BLKSTAT_DONE,
                    198:        BLKSTAT_PHASE,
1.14      florian   199: };
                    200:
1.1       benno     201: /*
1.13      florian   202:  * Information for the sender updating receiver blocks reentrantly.
                    203:  */
                    204: struct blkstat {
1.14      florian   205:        off_t            offs; /* position in sender file */
                    206:        off_t            total; /* total amount processed */
                    207:        off_t            dirty; /* total amount sent */
                    208:        size_t           hint; /* optimisation: next probable match */
                    209:        void            *map; /* mapped file or MAP_FAILED otherwise */
                    210:        size_t           mapsz; /* size of file or zero */
                    211:        int              fd; /* descriptor girding the map */
                    212:        enum blkstatst   curst; /* FSM for sending file blocks */
                    213:        off_t            curpos; /* sending: position in file to send */
                    214:        off_t            curlen; /* sending: length of send */
                    215:        int32_t          curtok; /* sending: next matching token or zero */
1.31      florian   216:        struct blktab   *blktab; /* hashtable of blocks */
                    217:        uint32_t         s1; /* partial sum for computing fast hash */
                    218:        uint32_t         s2; /* partial sum for computing fast hash */
1.48    ! claudio   219:        MD4_CTX          ctx; /* context for hash_file */
1.13      florian   220: };
                    221:
                    222: /*
1.1       benno     223:  * When transferring file contents, we break the file down into blocks
                    224:  * and work with those.
                    225:  */
                    226: struct blkset {
                    227:        off_t            size; /* file size */
                    228:        size_t           rem; /* terminal block length if non-zero */
                    229:        size_t           len; /* block length */
                    230:        size_t           csum; /* checksum length */
                    231:        struct blk      *blks; /* all blocks */
                    232:        size_t           blksz; /* number of blks */
                    233: };
                    234:
                    235: /*
                    236:  * Values required during a communication session.
                    237:  */
                    238: struct sess {
                    239:        const struct opts *opts; /* system options */
                    240:        int32_t            seed; /* checksum seed */
                    241:        int32_t            lver; /* local version */
                    242:        int32_t            rver; /* remote version */
                    243:        uint64_t           total_read; /* non-logging wire/reads */
                    244:        uint64_t           total_size; /* total file size */
                    245:        uint64_t           total_write; /* non-logging wire/writes */
                    246:        int                mplex_reads; /* multiplexing reads? */
                    247:        size_t             mplex_read_remain; /* remaining bytes */
                    248:        int                mplex_writes; /* multiplexing writes? */
                    249: };
                    250:
1.6       benno     251: /*
                    252:  * Combination of name and numeric id for groups and users.
                    253:  */
                    254: struct ident {
                    255:        int32_t  id; /* the gid_t or uid_t */
                    256:        int32_t  mapped; /* if receiving, the mapped gid */
                    257:        char    *name; /* resolved name */
                    258: };
1.27      deraadt   259:
                    260: typedef struct arglist arglist;
                    261: struct arglist {
                    262:        char    **list;
                    263:        u_int   num;
                    264:        u_int   nalloc;
                    265: };
1.35      claudio   266: void   addargs(arglist *, const char *, ...)
1.27      deraadt   267:            __attribute__((format(printf, 2, 3)));
                    268: void   freeargs(arglist *);
1.6       benno     269:
1.1       benno     270: struct download;
                    271: struct upload;
                    272:
1.29      benno     273: extern int verbose;
                    274:
1.17      deraadt   275: #define MINIMUM(a, b) (((a) < (b)) ? (a) : (b))
1.14      florian   276:
1.29      benno     277: #define LOG0(_fmt, ...) \
1.33      deraadt   278:        rsync_log( -1, (_fmt), ##__VA_ARGS__)
1.29      benno     279: #define LOG1(_fmt, ...) \
1.33      deraadt   280:        rsync_log( 0, (_fmt), ##__VA_ARGS__)
1.29      benno     281: #define LOG2(_fmt, ...) \
1.33      deraadt   282:        rsync_log( 1, (_fmt), ##__VA_ARGS__)
1.29      benno     283: #define LOG3(_fmt, ...) \
1.33      deraadt   284:        rsync_log( 2, (_fmt), ##__VA_ARGS__)
1.29      benno     285: #define LOG4(_fmt, ...) \
1.33      deraadt   286:        rsync_log( 3, (_fmt), ##__VA_ARGS__)
1.29      benno     287: #define ERRX1(_fmt, ...) \
1.33      deraadt   288:        rsync_errx1( (_fmt), ##__VA_ARGS__)
1.29      benno     289: #define WARNX(_fmt, ...) \
1.33      deraadt   290:        rsync_warnx( (_fmt), ##__VA_ARGS__)
1.29      benno     291: #define WARN(_fmt, ...) \
1.33      deraadt   292:        rsync_warn(0,  (_fmt), ##__VA_ARGS__)
1.29      benno     293: #define WARN1(_fmt, ...) \
1.33      deraadt   294:        rsync_warn(1,  (_fmt), ##__VA_ARGS__)
1.29      benno     295: #define WARN2(_fmt, ...) \
1.33      deraadt   296:        rsync_warn(2,  (_fmt), ##__VA_ARGS__)
1.29      benno     297: #define ERR(_fmt, ...) \
1.33      deraadt   298:        rsync_err( (_fmt), ##__VA_ARGS__)
1.29      benno     299: #define ERRX(_fmt, ...) \
1.33      deraadt   300:        rsync_errx( (_fmt), ##__VA_ARGS__)
1.29      benno     301:
1.39      claudio   302: void   rsync_log(int, const char *, ...)
1.33      deraadt   303:                        __attribute__((format(printf, 2, 3)));
1.39      claudio   304: void   rsync_warnx1(const char *, ...)
1.33      deraadt   305:                        __attribute__((format(printf, 1, 2)));
1.39      claudio   306: void   rsync_warn(int, const char *, ...)
1.33      deraadt   307:                        __attribute__((format(printf, 2, 3)));
1.39      claudio   308: void   rsync_warnx(const char *, ...)
1.33      deraadt   309:                        __attribute__((format(printf, 1, 2)));
1.39      claudio   310: void   rsync_err(const char *, ...)
1.33      deraadt   311:                        __attribute__((format(printf, 1, 2)));
1.39      claudio   312: void   rsync_errx(const char *, ...)
1.33      deraadt   313:                        __attribute__((format(printf, 1, 2)));
1.39      claudio   314: void   rsync_errx1(const char *, ...)
1.33      deraadt   315:                        __attribute__((format(printf, 1, 2)));
1.1       benno     316:
1.39      claudio   317: int    flist_del(struct sess *, int, const struct flist *, size_t);
                    318: int    flist_gen(struct sess *, size_t, char **, struct flist **, size_t *);
                    319: int    flist_gen_local(struct sess *, const char *, struct flist **, size_t *);
                    320: void   flist_free(struct flist *, size_t);
                    321: int    flist_recv(struct sess *, int, struct flist **, size_t *);
                    322: int    flist_send(struct sess *, int, int, const struct flist *, size_t);
                    323: int    flist_gen_dels(struct sess *, const char *, struct flist **, size_t *,
                    324:            const struct flist *, size_t);
                    325:
1.42      claudio   326: const char      *alt_base_mode(int);
                    327: char           **fargs_cmdline(struct sess *, const struct fargs *, size_t *);
1.39      claudio   328:
                    329: int    io_read_buf(struct sess *, int, void *, size_t);
                    330: int    io_read_byte(struct sess *, int, uint8_t *);
                    331: int    io_read_check(int);
                    332: int    io_read_flush(struct sess *, int);
                    333: int    io_read_int(struct sess *, int, int32_t *);
                    334: int    io_read_uint(struct sess *, int, uint32_t *);
                    335: int    io_read_long(struct sess *, int, int64_t *);
                    336: int    io_read_size(struct sess *, int, size_t *);
                    337: int    io_read_ulong(struct sess *, int, uint64_t *);
                    338: int    io_write_buf(struct sess *, int, const void *, size_t);
                    339: int    io_write_byte(struct sess *, int, uint8_t);
                    340: int    io_write_int(struct sess *, int, int32_t);
                    341: int    io_write_uint(struct sess *, int, uint32_t);
                    342: int    io_write_line(struct sess *, int, const char *);
                    343: int    io_write_long(struct sess *, int, int64_t);
                    344: int    io_write_ulong(struct sess *, int, uint64_t);
                    345:
                    346: int    io_lowbuffer_alloc(struct sess *, void **, size_t *, size_t *, size_t);
                    347: void   io_lowbuffer_int(struct sess *, void *, size_t *, size_t, int32_t);
                    348: void   io_lowbuffer_buf(struct sess *, void *, size_t *, size_t, const void *,
                    349:            size_t);
                    350:
                    351: void   io_buffer_int(void *, size_t *, size_t, int32_t);
                    352: void   io_buffer_buf(void *, size_t *, size_t, const void *, size_t);
                    353:
                    354: void   io_unbuffer_int(const void *, size_t *, size_t, int32_t *);
                    355: int    io_unbuffer_size(const void *, size_t *, size_t, size_t *);
                    356: void   io_unbuffer_buf(const void *, size_t *, size_t, void *, size_t);
                    357:
                    358: int    rsync_receiver(struct sess *, int, int, const char *);
                    359: int    rsync_sender(struct sess *, int, int, size_t, char **);
                    360: int    rsync_client(const struct opts *, int, const struct fargs *);
                    361: int    rsync_connect(const struct opts *, int *, const struct fargs *);
                    362: int    rsync_socket(const struct opts *, int, const struct fargs *);
                    363: int    rsync_server(const struct opts *, size_t, char *[]);
                    364: int    rsync_downloader(struct download *, struct sess *, int *);
                    365: int    rsync_set_metadata(struct sess *, int, int, const struct flist *,
                    366:            const char *);
                    367: int    rsync_set_metadata_at(struct sess *, int, int, const struct flist *,
                    368:            const char *);
                    369: int    rsync_uploader(struct upload *, int *, struct sess *, int *);
                    370: int    rsync_uploader_tail(struct upload *, struct sess *);
                    371:
                    372: struct download        *download_alloc(struct sess *, int, const struct flist *,
                    373:                    size_t, int);
                    374: void            download_free(struct download *);
                    375: struct upload  *upload_alloc(const char *, int, int, size_t,
                    376:                    const struct flist *, size_t, mode_t);
                    377: void           upload_free(struct upload *);
1.31      florian   378:
                    379: struct blktab  *blkhash_alloc(void);
                    380: int             blkhash_set(struct blktab *, const struct blkset *);
                    381: void            blkhash_free(struct blktab *);
1.1       benno     382:
1.39      claudio   383: struct blkset  *blk_recv(struct sess *, int, const char *);
                    384: void            blk_recv_ack(char [20], const struct blkset *, int32_t);
                    385: void            blk_match(struct sess *, const struct blkset *,
                    386:                    const char *, struct blkstat *);
                    387: int             blk_send(struct sess *, int, size_t, const struct blkset *,
                    388:                    const char *);
                    389: int             blk_send_ack(struct sess *, int, struct blkset *);
                    390:
                    391: uint32_t        hash_fast(const void *, size_t);
                    392: void            hash_slow(const void *, size_t, unsigned char *,
                    393:                    const struct sess *);
1.48    ! claudio   394:
        !           395: void            hash_file_start(MD4_CTX *, const struct sess *);
        !           396: void            hash_file_buf(MD4_CTX *, const void *, size_t);
        !           397: void            hash_file_final(MD4_CTX *, unsigned char *);
1.42      claudio   398:
                    399: void            copy_file(int, const char *, const struct flist *);
1.39      claudio   400:
                    401: int             mkpath(char *);
                    402:
                    403: int             mkstempat(int, char *);
                    404: char           *mkstemplinkat(char*, int, char *);
                    405: char           *mkstempfifoat(int, char *);
                    406: char           *mkstempnodat(int, char *, mode_t, dev_t);
                    407: char           *mkstempsock(const char *, char *);
                    408: int             mktemplate(char **, const char *, int);
1.40      claudio   409:
                    410: int             parse_rule(char *line, enum rule_type);
1.41      claudio   411: void            parse_file(const char *, enum rule_type);
1.40      claudio   412: void            send_rules(struct sess *, int);
                    413: void            recv_rules(struct sess *, int);
                    414: int             rules_match(const char *, int);
                    415:
                    416: int             rmatch(const char *, const char *, int);
1.39      claudio   417:
                    418: char           *symlink_read(const char *);
                    419: char           *symlinkat_read(int, const char *);
                    420:
                    421: int             sess_stats_send(struct sess *, int);
                    422: int             sess_stats_recv(struct sess *, int);
                    423:
                    424: int             idents_add(int, struct ident **, size_t *, int32_t);
                    425: void            idents_assign_gid(struct sess *, struct flist *, size_t,
                    426:                    const struct ident *, size_t);
                    427: void            idents_assign_uid(struct sess *, struct flist *, size_t,
                    428:                    const struct ident *, size_t);
                    429: void            idents_free(struct ident *, size_t);
                    430: int             idents_recv(struct sess *, int, struct ident **, size_t *);
                    431: void            idents_remap(struct sess *, int, struct ident *, size_t);
                    432: int             idents_send(struct sess *, int, const struct ident *, size_t);
1.1       benno     433:
                    434: #endif /*!EXTERN_H*/