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

Annotation of src/usr.bin/rsync/fargs.c, Revision 1.25

1.25    ! job         1: /*     $OpenBSD: fargs.c,v 1.24 2023/04/28 10:24:38 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: #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.24      claudio   117:        if (sess->opts->ignore_times)
                    118:                addargs(&args, "-I");
1.17      benno     119:        if (verbose > 3)
1.15      deraadt   120:                addargs(&args, "-v");
1.17      benno     121:        if (verbose > 2)
1.15      deraadt   122:                addargs(&args, "-v");
1.17      benno     123:        if (verbose > 1)
1.15      deraadt   124:                addargs(&args, "-v");
1.17      benno     125:        if (verbose > 0)
1.15      deraadt   126:                addargs(&args, "-v");
1.16      bket      127:        if (sess->opts->one_file_system > 1)
                    128:                addargs(&args, "-x");
                    129:        if (sess->opts->one_file_system > 0)
                    130:                addargs(&args, "-x");
1.12      florian   131:        if (sess->opts->specials && !sess->opts->devices)
1.15      deraadt   132:                addargs(&args, "--specials");
1.12      florian   133:        if (!sess->opts->specials && sess->opts->devices)
                    134:                /* --devices is sent as -D --no-specials */
1.15      deraadt   135:                addargs(&args, "--no-specials");
1.21      claudio   136:        if (sess->opts->max_size >= 0)
                    137:                addargs(&args, "--max-size=%lld", sess->opts->max_size);
                    138:        if (sess->opts->min_size >= 0)
                    139:                addargs(&args, "--min-size=%lld", sess->opts->min_size);
1.20      claudio   140:
1.24      claudio   141:        /* extra options for the receiver (local is sender) */
                    142:        if (f->mode == FARGS_SENDER) {
1.25    ! job       143:                if (sess->opts->ignore_dir_times)
        !           144:                        addargs(&args, "-O");
1.24      claudio   145:                if (sess->opts->size_only)
                    146:                        addargs(&args, "--size-only");
                    147:
                    148:                /* only add --compare-dest, etc if this is the sender */
                    149:                if (sess->opts->alt_base_mode != 0) {
                    150:                        for (j = 0; j < MAX_BASEDIR; j++) {
                    151:                                if (sess->opts->basedir[j] == NULL)
                    152:                                        break;
                    153:                                addargs(&args, "%s=%s",
                    154:                                    alt_base_mode(sess->opts->alt_base_mode),
                    155:                                    sess->opts->basedir[j]);
                    156:                        }
1.20      claudio   157:                }
                    158:        }
1.1       benno     159:
                    160:        /* Terminate with a full-stop for reasons unknown. */
                    161:
1.15      deraadt   162:        addargs(&args, ".");
1.1       benno     163:
1.3       deraadt   164:        if (f->mode == FARGS_RECEIVER) {
1.1       benno     165:                for (j = 0; j < f->sourcesz; j++)
1.15      deraadt   166:                        addargs(&args, "%s", f->sources[j]);
1.1       benno     167:        } else
1.15      deraadt   168:                addargs(&args, "%s", f->sink);
1.1       benno     169:
1.15      deraadt   170:        return args.list;
1.1       benno     171: }