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