Annotation of src/usr.bin/rsync/fargs.c, Revision 1.23
1.23 ! tb 1: /* $OpenBSD: fargs.c,v 1.22 2021/11/03 14:42:12 deraadt 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: #include <sys/stat.h>
18:
19: #include <assert.h>
1.18 claudio 20: #include <err.h>
1.1 benno 21: #include <stdint.h>
22: #include <stdlib.h>
1.9 deraadt 23: #include <string.h>
1.1 benno 24:
25: #include "extern.h"
26:
1.2 benno 27: #define RSYNC_PATH "rsync"
1.1 benno 28:
1.20 claudio 29: const char *
30: alt_base_mode(int mode)
31: {
1.22 deraadt 32: switch (mode) {
1.20 claudio 33: case BASE_MODE_COMPARE:
34: return "--compare-dest";
35: case BASE_MODE_COPY:
36: return "--copy-dest";
37: case BASE_MODE_LINK:
38: return "--link-dest";
39: default:
40: errx(1, "unknown base mode %d", mode);
41: }
42: }
43:
1.1 benno 44: char **
1.14 naddy 45: fargs_cmdline(struct sess *sess, const struct fargs *f, size_t *skip)
1.1 benno 46: {
1.15 deraadt 47: arglist args;
48: size_t j;
49: char *rsync_path, *ap, *arg;
50:
51: memset(&args, 0, sizeof args);
1.1 benno 52:
1.3 deraadt 53: assert(f != NULL);
1.1 benno 54: assert(f->sourcesz > 0);
55:
1.3 deraadt 56: if ((rsync_path = sess->opts->rsync_path) == NULL)
1.1 benno 57: rsync_path = RSYNC_PATH;
58:
1.3 deraadt 59: if (f->host != NULL) {
1.11 florian 60: /*
61: * Splice arguments from -e "foo bar baz" into array
62: * elements required for execve(2).
63: * This doesn't do anything fancy: it splits along
64: * whitespace into the array.
65: */
66:
1.9 deraadt 67: if (sess->opts->ssh_prog) {
1.11 florian 68: ap = strdup(sess->opts->ssh_prog);
1.9 deraadt 69: if (ap == NULL)
1.18 claudio 70: err(ERR_NOMEM, NULL);
1.11 florian 71:
1.15 deraadt 72: while ((arg = strsep(&ap, " \t")) != NULL) {
73: if (arg[0] == '\0') {
1.23 ! tb 74: ap++; /* skip separators */
1.9 deraadt 75: continue;
76: }
77:
1.15 deraadt 78: addargs(&args, "%s", arg);
1.9 deraadt 79: }
80: } else
1.15 deraadt 81: addargs(&args, "ssh");
1.11 florian 82:
1.15 deraadt 83: addargs(&args, "%s", f->host);
84: addargs(&args, "%s", rsync_path);
1.14 naddy 85: if (skip)
1.15 deraadt 86: *skip = args.num;
87: addargs(&args, "--server");
1.3 deraadt 88: if (f->mode == FARGS_RECEIVER)
1.15 deraadt 89: addargs(&args, "--sender");
1.1 benno 90: } else {
1.15 deraadt 91: addargs(&args, "%s", rsync_path);
92: addargs(&args, "--server");
1.1 benno 93: }
94:
95: /* Shared arguments. */
96:
1.7 benno 97: if (sess->opts->del)
1.15 deraadt 98: addargs(&args, "--delete");
1.13 benno 99: if (sess->opts->numeric_ids)
1.15 deraadt 100: addargs(&args, "--numeric-ids");
1.7 benno 101: if (sess->opts->preserve_gids)
1.15 deraadt 102: addargs(&args, "-g");
1.7 benno 103: if (sess->opts->preserve_links)
1.15 deraadt 104: addargs(&args, "-l");
1.7 benno 105: if (sess->opts->dry_run)
1.15 deraadt 106: addargs(&args, "-n");
1.10 florian 107: if (sess->opts->preserve_uids)
1.15 deraadt 108: addargs(&args, "-o");
1.7 benno 109: if (sess->opts->preserve_perms)
1.15 deraadt 110: addargs(&args, "-p");
1.12 florian 111: if (sess->opts->devices)
1.15 deraadt 112: addargs(&args, "-D");
1.7 benno 113: if (sess->opts->recursive)
1.15 deraadt 114: addargs(&args, "-r");
1.7 benno 115: if (sess->opts->preserve_times)
1.15 deraadt 116: addargs(&args, "-t");
1.17 benno 117: if (verbose > 3)
1.15 deraadt 118: addargs(&args, "-v");
1.17 benno 119: if (verbose > 2)
1.15 deraadt 120: addargs(&args, "-v");
1.17 benno 121: if (verbose > 1)
1.15 deraadt 122: addargs(&args, "-v");
1.17 benno 123: if (verbose > 0)
1.15 deraadt 124: addargs(&args, "-v");
1.16 bket 125: if (sess->opts->one_file_system > 1)
126: addargs(&args, "-x");
127: if (sess->opts->one_file_system > 0)
128: addargs(&args, "-x");
1.12 florian 129: if (sess->opts->specials && !sess->opts->devices)
1.15 deraadt 130: addargs(&args, "--specials");
1.12 florian 131: if (!sess->opts->specials && sess->opts->devices)
132: /* --devices is sent as -D --no-specials */
1.15 deraadt 133: addargs(&args, "--no-specials");
1.21 claudio 134: if (sess->opts->max_size >= 0)
135: addargs(&args, "--max-size=%lld", sess->opts->max_size);
136: if (sess->opts->min_size >= 0)
137: addargs(&args, "--min-size=%lld", sess->opts->min_size);
1.20 claudio 138:
139: /* only add --compare-dest, etc if this is the sender */
1.22 deraadt 140: if (sess->opts->alt_base_mode != 0 &&
1.20 claudio 141: f->mode == FARGS_SENDER) {
142: for (j = 0; j < MAX_BASEDIR; j++) {
143: if (sess->opts->basedir[j] == NULL)
144: break;
145: addargs(&args, "%s=%s",
146: alt_base_mode(sess->opts->alt_base_mode),
147: sess->opts->basedir[j]);
148: }
149: }
1.1 benno 150:
151: /* Terminate with a full-stop for reasons unknown. */
152:
1.15 deraadt 153: addargs(&args, ".");
1.1 benno 154:
1.3 deraadt 155: if (f->mode == FARGS_RECEIVER) {
1.1 benno 156: for (j = 0; j < f->sourcesz; j++)
1.15 deraadt 157: addargs(&args, "%s", f->sources[j]);
1.1 benno 158: } else
1.15 deraadt 159: addargs(&args, "%s", f->sink);
1.1 benno 160:
1.15 deraadt 161: return args.list;
1.1 benno 162: }