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

1.18    ! claudio     1: /*     $Id: fargs.c,v 1.17 2019/05/08 20:00:25 benno 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:
                     29: char **
1.14      naddy      30: fargs_cmdline(struct sess *sess, const struct fargs *f, size_t *skip)
1.1       benno      31: {
1.15      deraadt    32:        arglist          args;
                     33:        size_t           j;
                     34:        char            *rsync_path, *ap, *arg;
                     35:
                     36:        memset(&args, 0, sizeof args);
1.1       benno      37:
1.3       deraadt    38:        assert(f != NULL);
1.1       benno      39:        assert(f->sourcesz > 0);
                     40:
1.3       deraadt    41:        if ((rsync_path = sess->opts->rsync_path) == NULL)
1.1       benno      42:                rsync_path = RSYNC_PATH;
                     43:
1.3       deraadt    44:        if (f->host != NULL) {
1.11      florian    45:                /*
                     46:                 * Splice arguments from -e "foo bar baz" into array
                     47:                 * elements required for execve(2).
                     48:                 * This doesn't do anything fancy: it splits along
                     49:                 * whitespace into the array.
                     50:                 */
                     51:
1.9       deraadt    52:                if (sess->opts->ssh_prog) {
1.11      florian    53:                        ap = strdup(sess->opts->ssh_prog);
1.9       deraadt    54:                        if (ap == NULL)
1.18    ! claudio    55:                                err(ERR_NOMEM, NULL);
1.11      florian    56:
1.15      deraadt    57:                        while ((arg = strsep(&ap, " \t")) != NULL) {
                     58:                                if (arg[0] == '\0') {
1.9       deraadt    59:                                        ap++;   /* skip seperators */
                     60:                                        continue;
                     61:                                }
                     62:
1.15      deraadt    63:                                addargs(&args, "%s", arg);
1.9       deraadt    64:                        }
                     65:                } else
1.15      deraadt    66:                        addargs(&args, "ssh");
1.11      florian    67:
1.15      deraadt    68:                addargs(&args, "%s", f->host);
                     69:                addargs(&args, "%s", rsync_path);
1.14      naddy      70:                if (skip)
1.15      deraadt    71:                        *skip = args.num;
                     72:                addargs(&args, "--server");
1.3       deraadt    73:                if (f->mode == FARGS_RECEIVER)
1.15      deraadt    74:                        addargs(&args, "--sender");
1.1       benno      75:        } else {
1.15      deraadt    76:                addargs(&args, "%s", rsync_path);
                     77:                addargs(&args, "--server");
1.1       benno      78:        }
                     79:
                     80:        /* Shared arguments. */
                     81:
1.7       benno      82:        if (sess->opts->del)
1.15      deraadt    83:                addargs(&args, "--delete");
1.13      benno      84:        if (sess->opts->numeric_ids)
1.15      deraadt    85:                addargs(&args, "--numeric-ids");
1.7       benno      86:        if (sess->opts->preserve_gids)
1.15      deraadt    87:                addargs(&args, "-g");
1.7       benno      88:        if (sess->opts->preserve_links)
1.15      deraadt    89:                addargs(&args, "-l");
1.7       benno      90:        if (sess->opts->dry_run)
1.15      deraadt    91:                addargs(&args, "-n");
1.10      florian    92:        if (sess->opts->preserve_uids)
1.15      deraadt    93:                addargs(&args, "-o");
1.7       benno      94:        if (sess->opts->preserve_perms)
1.15      deraadt    95:                addargs(&args, "-p");
1.12      florian    96:        if (sess->opts->devices)
1.15      deraadt    97:                addargs(&args, "-D");
1.7       benno      98:        if (sess->opts->recursive)
1.15      deraadt    99:                addargs(&args, "-r");
1.7       benno     100:        if (sess->opts->preserve_times)
1.15      deraadt   101:                addargs(&args, "-t");
1.17      benno     102:        if (verbose > 3)
1.15      deraadt   103:                addargs(&args, "-v");
1.17      benno     104:        if (verbose > 2)
1.15      deraadt   105:                addargs(&args, "-v");
1.17      benno     106:        if (verbose > 1)
1.15      deraadt   107:                addargs(&args, "-v");
1.17      benno     108:        if (verbose > 0)
1.15      deraadt   109:                addargs(&args, "-v");
1.16      bket      110:        if (sess->opts->one_file_system > 1)
                    111:                addargs(&args, "-x");
                    112:        if (sess->opts->one_file_system > 0)
                    113:                addargs(&args, "-x");
1.12      florian   114:        if (sess->opts->specials && !sess->opts->devices)
1.15      deraadt   115:                addargs(&args, "--specials");
1.12      florian   116:        if (!sess->opts->specials && sess->opts->devices)
                    117:                /* --devices is sent as -D --no-specials */
1.15      deraadt   118:                addargs(&args, "--no-specials");
1.1       benno     119:
                    120:        /* Terminate with a full-stop for reasons unknown. */
                    121:
1.15      deraadt   122:        addargs(&args, ".");
1.1       benno     123:
1.3       deraadt   124:        if (f->mode == FARGS_RECEIVER) {
1.1       benno     125:                for (j = 0; j < f->sourcesz; j++)
1.15      deraadt   126:                        addargs(&args, "%s", f->sources[j]);
1.1       benno     127:        } else
1.15      deraadt   128:                addargs(&args, "%s", f->sink);
1.1       benno     129:
1.15      deraadt   130:        return args.list;
1.1       benno     131: }