[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.29

1.29    ! benno       1: /*     $Id: extern.h,v 1.28 2019/04/04 04:19:54 bket 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:
                     20: /*
                     21:  * This is the rsync protocol version that we support.
                     22:  */
                     23: #define        RSYNC_PROTOCOL  (27)
                     24:
                     25: /*
                     26:  * Maximum amount of file data sent over the wire at once.
                     27:  */
                     28: #define MAX_CHUNK      (32 * 1024)
                     29:
                     30: /*
                     31:  * This is the minimum size for a block of data not including those in
                     32:  * the remainder block.
                     33:  */
                     34: #define        BLOCK_SIZE_MIN  (700)
                     35:
                     36: /*
                     37:  * The sender and receiver use a two-phase synchronisation process.
                     38:  * The first uses two-byte hashes; the second, 16-byte.
                     39:  * (The second must hold a full MD4 digest.)
                     40:  */
                     41: #define        CSUM_LENGTH_PHASE1 (2)
                     42: #define        CSUM_LENGTH_PHASE2 (16)
                     43:
1.14      florian    44: /*
                     45:  * Use this for debugging deadlocks.
                     46:  * All poll events will use it and catch time-outs.
                     47:  */
                     48: #define POLL_TIMEOUT   (INFTIM)
1.13      florian    49:
1.1       benno      50: /*
                     51:  * Operating mode for a client or a server.
                     52:  * Sender means we synchronise local files with those from remote.
                     53:  * Receiver is the opposite.
                     54:  * This is relative to which host we're running on.
                     55:  */
                     56: enum   fmode {
                     57:        FARGS_SENDER,
                     58:        FARGS_RECEIVER
                     59: };
                     60:
                     61: /*
                     62:  * File arguments given on the command line.
                     63:  * See struct opts.
                     64:  */
                     65: struct fargs {
                     66:        char      *host; /* hostname or NULL if local */
                     67:        char     **sources; /* transfer source */
                     68:        size_t     sourcesz; /* number of sources */
                     69:        char      *sink; /* transfer endpoint */
                     70:        enum fmode mode; /* mode of operation */
                     71:        int        remote; /* uses rsync:// or :: for remote */
                     72:        char      *module; /* if rsync://, the module */
                     73: };
                     74:
                     75: /*
                     76:  * The subset of stat(2) information that we need.
                     77:  * (There are some parts we don't use yet.)
                     78:  */
                     79: struct flstat {
1.12      florian    80:        mode_t           mode;  /* mode */
                     81:        uid_t            uid;   /* user */
                     82:        gid_t            gid;   /* group */
                     83:        dev_t            rdev;  /* device type */
                     84:        off_t            size;  /* size */
                     85:        time_t           mtime; /* modification */
1.1       benno      86:        unsigned int     flags;
1.12      florian    87: #define        FLSTAT_TOP_DIR   0x01   /* a top-level directory */
1.1       benno      88:
                     89: };
                     90:
                     91: /*
                     92:  * A list of files with their statistics.
                     93:  */
                     94: struct flist {
                     95:        char            *path; /* path relative to root */
                     96:        const char      *wpath; /* "working" path for receiver */
                     97:        struct flstat    st; /* file information */
                     98:        char            *link; /* symlink target or NULL */
                     99: };
                    100:
                    101: /*
                    102:  * Options passed into the command line.
                    103:  * See struct fargs.
                    104:  */
                    105: struct opts {
1.3       deraadt   106:        int              sender;                /* --sender */
                    107:        int              server;                /* --server */
                    108:        int              recursive;             /* -r */
                    109:        int              dry_run;               /* -n */
                    110:        int              preserve_times;        /* -t */
                    111:        int              preserve_perms;        /* -p */
                    112:        int              preserve_links;        /* -l */
1.5       benno     113:        int              preserve_gids;         /* -g */
1.9       florian   114:        int              preserve_uids;         /* -u */
1.3       deraadt   115:        int              del;                   /* --delete */
1.12      florian   116:        int              devices;               /* --devices */
                    117:        int              specials;              /* --specials */
1.22      benno     118:        int              numeric_ids;           /* --numeric-ids */
1.28      bket      119:        int              one_file_system;       /* -x */
1.3       deraadt   120:        char            *rsync_path;            /* --rsync-path */
1.4       deraadt   121:        char            *ssh_prog;              /* --rsh or -e */
1.18      deraadt   122:        char            *port;                  /* --port */
1.1       benno     123: };
                    124:
                    125: /*
                    126:  * An individual block description for a file.
                    127:  * See struct blkset.
                    128:  */
                    129: struct blk {
                    130:        off_t            offs; /* offset in file */
                    131:        size_t           idx; /* block index */
                    132:        size_t           len; /* bytes in block */
                    133:        uint32_t         chksum_short; /* fast checksum */
                    134:        unsigned char    chksum_long[CSUM_LENGTH_PHASE2]; /* slow checksum */
                    135: };
                    136:
1.14      florian   137: enum   blkstatst {
                    138:        BLKSTAT_NONE = 0,
1.21      benno     139:        BLKSTAT_NEXT,
1.14      florian   140:        BLKSTAT_DATA,
                    141:        BLKSTAT_TOK,
                    142:        BLKSTAT_HASH,
1.21      benno     143:        BLKSTAT_DONE,
                    144:        BLKSTAT_PHASE,
1.14      florian   145: };
                    146:
1.1       benno     147: /*
1.13      florian   148:  * Information for the sender updating receiver blocks reentrantly.
                    149:  */
                    150: struct blkstat {
1.14      florian   151:        off_t            offs; /* position in sender file */
                    152:        off_t            total; /* total amount processed */
                    153:        off_t            dirty; /* total amount sent */
                    154:        size_t           hint; /* optimisation: next probable match */
                    155:        void            *map; /* mapped file or MAP_FAILED otherwise */
                    156:        size_t           mapsz; /* size of file or zero */
                    157:        int              fd; /* descriptor girding the map */
                    158:        enum blkstatst   curst; /* FSM for sending file blocks */
                    159:        off_t            curpos; /* sending: position in file to send */
                    160:        off_t            curlen; /* sending: length of send */
                    161:        int32_t          curtok; /* sending: next matching token or zero */
1.13      florian   162: };
                    163:
                    164: /*
1.1       benno     165:  * When transferring file contents, we break the file down into blocks
                    166:  * and work with those.
                    167:  */
                    168: struct blkset {
                    169:        off_t            size; /* file size */
                    170:        size_t           rem; /* terminal block length if non-zero */
                    171:        size_t           len; /* block length */
                    172:        size_t           csum; /* checksum length */
                    173:        struct blk      *blks; /* all blocks */
                    174:        size_t           blksz; /* number of blks */
                    175: };
                    176:
                    177: /*
                    178:  * Values required during a communication session.
                    179:  */
                    180: struct sess {
                    181:        const struct opts *opts; /* system options */
                    182:        int32_t            seed; /* checksum seed */
                    183:        int32_t            lver; /* local version */
                    184:        int32_t            rver; /* remote version */
                    185:        uint64_t           total_read; /* non-logging wire/reads */
                    186:        uint64_t           total_size; /* total file size */
                    187:        uint64_t           total_write; /* non-logging wire/writes */
                    188:        int                mplex_reads; /* multiplexing reads? */
                    189:        size_t             mplex_read_remain; /* remaining bytes */
                    190:        int                mplex_writes; /* multiplexing writes? */
                    191: };
                    192:
1.6       benno     193: /*
                    194:  * Combination of name and numeric id for groups and users.
                    195:  */
                    196: struct ident {
                    197:        int32_t  id; /* the gid_t or uid_t */
                    198:        int32_t  mapped; /* if receiving, the mapped gid */
                    199:        char    *name; /* resolved name */
                    200: };
1.27      deraadt   201:
                    202: typedef struct arglist arglist;
                    203: struct arglist {
                    204:        char    **list;
                    205:        u_int   num;
                    206:        u_int   nalloc;
                    207: };
                    208: void   addargs(arglist *, char *, ...)
                    209:            __attribute__((format(printf, 2, 3)));
                    210: void   freeargs(arglist *);
1.6       benno     211:
1.1       benno     212: struct download;
                    213: struct upload;
                    214:
1.29    ! benno     215: extern int verbose;
        !           216:
1.17      deraadt   217: #define MINIMUM(a, b) (((a) < (b)) ? (a) : (b))
1.14      florian   218:
1.29    ! benno     219: #define LOG0(_fmt, ...) \
        !           220:        rsync_log(__FILE__, __LINE__, -1, (_fmt), ##__VA_ARGS__)
        !           221: #define LOG1(_fmt, ...) \
        !           222:        rsync_log(__FILE__, __LINE__, 0, (_fmt), ##__VA_ARGS__)
        !           223: #define LOG2(_fmt, ...) \
        !           224:        rsync_log(__FILE__, __LINE__, 1, (_fmt), ##__VA_ARGS__)
        !           225: #define LOG3(_fmt, ...) \
        !           226:        rsync_log(__FILE__, __LINE__, 2, (_fmt), ##__VA_ARGS__)
        !           227: #define LOG4(_fmt, ...) \
        !           228:        rsync_log(__FILE__, __LINE__, 3, (_fmt), ##__VA_ARGS__)
        !           229: #define ERRX1(_fmt, ...) \
        !           230:        rsync_errx1(__FILE__, __LINE__, (_fmt), ##__VA_ARGS__)
        !           231: #define WARNX(_fmt, ...) \
        !           232:        rsync_warnx(__FILE__, __LINE__, (_fmt), ##__VA_ARGS__)
        !           233: #define WARN(_fmt, ...) \
        !           234:        rsync_warn(0, __FILE__, __LINE__, (_fmt), ##__VA_ARGS__)
        !           235: #define WARN1(_fmt, ...) \
        !           236:        rsync_warn(1, __FILE__, __LINE__, (_fmt), ##__VA_ARGS__)
        !           237: #define WARN2(_fmt, ...) \
        !           238:        rsync_warn(2, __FILE__, __LINE__, (_fmt), ##__VA_ARGS__)
        !           239: #define ERR(_fmt, ...) \
        !           240:        rsync_err(__FILE__, __LINE__, (_fmt), ##__VA_ARGS__)
        !           241: #define ERRX(_fmt, ...) \
        !           242:        rsync_errx(__FILE__, __LINE__, (_fmt), ##__VA_ARGS__)
        !           243:
        !           244: void             rsync_log(const char *, size_t, int, const char *, ...)
1.1       benno     245:                        __attribute__((format(printf, 4, 5)));
1.29    ! benno     246: void             rsync_warnx1(const char *, size_t, const char *, ...)
        !           247:                        __attribute__((format(printf, 3, 4)));
        !           248: void             rsync_warn(int, const char *, size_t, const char *, ...)
1.1       benno     249:                        __attribute__((format(printf, 4, 5)));
1.29    ! benno     250: void             rsync_warnx(const char *, size_t, const char *, ...)
        !           251:                        __attribute__((format(printf, 3, 4)));
        !           252: void             rsync_err(const char *, size_t, const char *, ...)
        !           253:                        __attribute__((format(printf, 3, 4)));
        !           254: void             rsync_errx(const char *, size_t, const char *, ...)
        !           255:                        __attribute__((format(printf, 3, 4)));
        !           256: void             rsync_errx1(const char *, size_t, const char *, ...)
        !           257:                        __attribute__((format(printf, 3, 4)));
1.1       benno     258:
1.2       benno     259: int              flist_del(struct sess *, int,
1.1       benno     260:                        const struct flist *, size_t);
                    261: int              flist_gen(struct sess *, size_t, char **,
                    262:                        struct flist **, size_t *);
                    263: int              flist_gen_local(struct sess *, const char *,
                    264:                        struct flist **, size_t *);
                    265: void             flist_free(struct flist *, size_t);
                    266: int              flist_recv(struct sess *, int,
                    267:                        struct flist **, size_t *);
                    268: int              flist_send(struct sess *, int, int,
                    269:                        const struct flist *, size_t);
1.2       benno     270: int              flist_gen_dels(struct sess *, const char *,
1.1       benno     271:                        struct flist **, size_t *,
                    272:                        const struct flist *, size_t);
                    273:
1.25      naddy     274: char           **fargs_cmdline(struct sess *, const struct fargs *, size_t *);
1.1       benno     275:
                    276: int              io_read_buf(struct sess *, int, void *, size_t);
                    277: int              io_read_byte(struct sess *, int, uint8_t *);
                    278: int              io_read_check(struct sess *, int);
                    279: int              io_read_flush(struct sess *, int);
                    280: int              io_read_int(struct sess *, int, int32_t *);
1.26      deraadt   281: int              io_read_uint(struct sess *, int, uint32_t *);
1.1       benno     282: int              io_read_long(struct sess *, int, int64_t *);
                    283: int              io_read_size(struct sess *, int, size_t *);
                    284: int              io_read_ulong(struct sess *, int, uint64_t *);
                    285: int              io_write_buf(struct sess *, int, const void *, size_t);
                    286: int              io_write_byte(struct sess *, int, uint8_t);
                    287: int              io_write_int(struct sess *, int, int32_t);
1.26      deraadt   288: int              io_write_uint(struct sess *, int, uint32_t);
1.1       benno     289: int              io_write_line(struct sess *, int, const char *);
                    290: int              io_write_long(struct sess *, int, int64_t);
1.26      deraadt   291: int              io_write_ulong(struct sess *, int, uint64_t);
1.1       benno     292:
1.14      florian   293: int              io_lowbuffer_alloc(struct sess *, void **,
                    294:                        size_t *, size_t *, size_t);
                    295: void             io_lowbuffer_int(struct sess *, void *,
                    296:                        size_t *, size_t, int32_t);
                    297: void             io_lowbuffer_buf(struct sess *, void *,
                    298:                        size_t *, size_t, const void *, size_t);
                    299:
1.2       benno     300: void             io_buffer_int(struct sess *, void *,
1.1       benno     301:                        size_t *, size_t, int32_t);
1.2       benno     302: void             io_buffer_buf(struct sess *, void *,
1.1       benno     303:                        size_t *, size_t, const void *, size_t);
                    304:
1.2       benno     305: void             io_unbuffer_int(struct sess *, const void *,
1.1       benno     306:                        size_t *, size_t, int32_t *);
1.2       benno     307: int              io_unbuffer_size(struct sess *, const void *,
1.1       benno     308:                        size_t *, size_t, size_t *);
1.2       benno     309: void             io_unbuffer_buf(struct sess *, const void *,
1.1       benno     310:                        size_t *, size_t, void *, size_t);
                    311:
                    312: int              rsync_receiver(struct sess *, int, int, const char *);
                    313: int              rsync_sender(struct sess *, int, int, size_t, char **);
                    314: int              rsync_client(const struct opts *, int, const struct fargs *);
1.25      naddy     315: int              rsync_connect(const struct opts *, int *,
                    316:                        const struct fargs *);
                    317: int              rsync_socket(const struct opts *, int, const struct fargs *);
1.1       benno     318: int              rsync_server(const struct opts *, size_t, char *[]);
                    319: int              rsync_downloader(struct download *, struct sess *, int *);
1.15      florian   320: int              rsync_set_metadata(struct sess *, int, int,
1.10      florian   321:                        const struct flist *, const char *);
1.16      deraadt   322: int              rsync_set_metadata_at(struct sess *, int, int,
1.12      florian   323:                        const struct flist *, const char *);
1.2       benno     324: int              rsync_uploader(struct upload *,
1.1       benno     325:                        int *, struct sess *, int *);
                    326: int              rsync_uploader_tail(struct upload *, struct sess *);
                    327:
                    328: struct download         *download_alloc(struct sess *, int,
                    329:                        const struct flist *, size_t, int);
                    330: void             download_free(struct download *);
1.12      florian   331: struct upload   *upload_alloc(struct sess *, const char *, int, int, size_t,
1.1       benno     332:                        const struct flist *, size_t, mode_t);
                    333: void             upload_free(struct upload *);
                    334:
                    335: struct blkset   *blk_recv(struct sess *, int, const char *);
1.21      benno     336: void             blk_recv_ack(struct sess *,
                    337:                        char [20], const struct blkset *, int32_t);
1.14      florian   338: void             blk_match(struct sess *, const struct blkset *,
1.13      florian   339:                        const char *, struct blkstat *);
1.1       benno     340: int              blk_send(struct sess *, int, size_t,
                    341:                        const struct blkset *, const char *);
                    342: int              blk_send_ack(struct sess *, int, struct blkset *);
                    343:
                    344: uint32_t         hash_fast(const void *, size_t);
                    345: void             hash_slow(const void *, size_t,
                    346:                        unsigned char *, const struct sess *);
                    347: void             hash_file(const void *, size_t,
                    348:                        unsigned char *, const struct sess *);
                    349:
                    350: int              mkpath(struct sess *, char *);
1.11      florian   351:
                    352: int              mkstempat(int, char *);
                    353: char            *mkstemplinkat(char*, int, char *);
1.12      florian   354: char            *mkstempfifoat(int, char *);
                    355: char            *mkstempnodat(int, char *, mode_t, dev_t);
                    356: char            *mkstempsock(const char *, char *);
1.21      benno     357: int              mktemplate(struct sess *, char **, const char *, int);
1.1       benno     358:
                    359: char            *symlink_read(struct sess *, const char *);
                    360: char            *symlinkat_read(struct sess *, int, const char *);
                    361:
                    362: int              sess_stats_send(struct sess *, int);
                    363: int              sess_stats_recv(struct sess *, int);
1.6       benno     364:
1.9       florian   365: int              idents_add(struct sess *, int, struct ident **, size_t *,
                    366:                        int32_t);
                    367: void             idents_assign_gid(struct sess *,
                    368:                        struct flist *, size_t, const struct ident *, size_t);
                    369: void             idents_assign_uid(struct sess *,
                    370:                        struct flist *, size_t, const struct ident *, size_t);
1.6       benno     371: void             idents_free(struct ident *, size_t);
1.7       benno     372: int              idents_recv(struct sess *, int, struct ident **, size_t *);
1.9       florian   373: void             idents_remap(struct sess *, int, struct ident *, size_t);
1.6       benno     374: int              idents_send(struct sess *, int, const struct ident *, size_t);
1.1       benno     375:
                    376: #endif /*!EXTERN_H*/