int module_id = -1;
int am_server = 0;
int am_sender = 0;
+int am_generator = 0;
char *files_from = NULL;
int filesfrom_fd = -1;
char *remote_filesfrom_file = NULL;
int keep_partial=0;
int safe_symlinks=0;
int copy_unsafe_links=0;
-int block_size=0;
int size_only=0;
int bwlimit=0;
int delete_after=0;
int ignore_errors=0;
int modify_window=0;
int blocking_io=-1;
+unsigned int block_size = 0;
/** Network address family. **/
int always_checksum = 0;
int list_only = 0;
+#define MAX_BATCH_PREFIX_LEN 256 /* Must be less than MAXPATHLEN-13 */
char *batch_prefix = NULL;
+static int daemon_opt; /* sets am_daemon after option error-reporting */
static int modify_window_set;
/** Local address to bind. As a character string because it's
rprintf(F," -R, --relative use relative path names\n");
rprintf(F," --no-relative turn off --relative\n");
rprintf(F," --no-implied-dirs don't send implied dirs with -R\n");
- rprintf(F," -b, --backup make backups (default %s suffix)\n",BACKUP_SUFFIX);
+ rprintf(F," -b, --backup make backups (see --suffix & --backup-dir)\n");
rprintf(F," --backup-dir make backups into this directory\n");
- rprintf(F," --suffix=SUFFIX override backup suffix\n");
+ rprintf(F," --suffix=SUFFIX backup suffix (default %s w/o --backup-dir)\n",BACKUP_SUFFIX);
rprintf(F," -u, --update update only (don't overwrite newer files)\n");
rprintf(F," -l, --links copy symlinks as symlinks\n");
- rprintf(F," -L, --copy-links copy the referent of symlinks\n");
- rprintf(F," --copy-unsafe-links copy links outside the source tree\n");
- rprintf(F," --safe-links ignore links outside the destination tree\n");
+ rprintf(F," -L, --copy-links copy the referent of all symlinks\n");
+ rprintf(F," --copy-unsafe-links copy the referent of \"unsafe\" symlinks\n");
+ rprintf(F," --safe-links ignore \"unsafe\" symlinks\n");
rprintf(F," -H, --hard-links preserve hard links\n");
rprintf(F," -p, --perms preserve permissions\n");
rprintf(F," -o, --owner preserve owner (root only)\n");
rprintf(F," -e, --rsh=COMMAND specify the remote shell\n");
rprintf(F," --rsync-path=PATH specify path to rsync on the remote machine\n");
rprintf(F," --existing only update files that already exist\n");
- rprintf(F," --ignore-existing ignore files that already exist on the receiving side\n");
+ rprintf(F," --ignore-existing ignore files that already exist on receiving side\n");
rprintf(F," --delete delete files that don't exist on the sending side\n");
rprintf(F," --delete-excluded also delete excluded files on the receiving side\n");
- rprintf(F," --delete-after delete after transferring, not before\n");
- rprintf(F," --ignore-errors delete even if there are IO errors\n");
+ rprintf(F," --delete-after receiver deletes after transferring, not before\n");
+ rprintf(F," --ignore-errors delete even if there are I/O errors\n");
rprintf(F," --max-delete=NUM don't delete more than NUM files\n");
rprintf(F," --partial keep partially transferred files\n");
rprintf(F," --force force deletion of directories even if not empty\n");
rprintf(F," --numeric-ids don't map uid/gid values by user/group name\n");
- rprintf(F," --timeout=TIME set IO timeout in seconds\n");
- rprintf(F," -I, --ignore-times don't exclude files that match length and time\n");
- rprintf(F," --size-only only use file size when determining if a file should be transferred\n");
- rprintf(F," --modify-window=NUM Timestamp window (seconds) for file match (default=%d)\n",modify_window);
+ rprintf(F," --timeout=TIME set I/O timeout in seconds\n");
+ rprintf(F," -I, --ignore-times turn off mod time & file size quick check\n");
+ rprintf(F," --size-only ignore mod time for quick check (use size)\n");
+ rprintf(F," --modify-window=NUM compare mod times with reduced accuracy\n");
rprintf(F," -T --temp-dir=DIR create temporary files in directory DIR\n");
rprintf(F," --compare-dest=DIR also compare destination files relative to DIR\n");
rprintf(F," --link-dest=DIR create hardlinks to DIR for unchanged files\n");
rprintf(F," --include=PATTERN don't exclude files matching PATTERN\n");
rprintf(F," --include-from=FILE don't exclude patterns listed in FILE\n");
rprintf(F," --files-from=FILE read FILE for list of source-file names\n");
- rprintf(F," -0 --from0 file names we read are separated by nulls, not newlines\n");
+ rprintf(F," -0 --from0 all *-from file lists are delimited by nulls\n");
rprintf(F," --version print version number\n");
- rprintf(F," --daemon run as a rsync daemon\n");
+ rprintf(F," --daemon run as an rsync daemon\n");
rprintf(F," --no-detach do not detach from the parent\n");
rprintf(F," --address=ADDRESS bind to the specified address\n");
rprintf(F," --config=FILE specify alternate rsyncd.conf file\n");
rprintf(F," --port=PORT specify alternate rsyncd port number\n");
- rprintf(F," --blocking-io use blocking IO for the remote shell\n");
+ rprintf(F," --blocking-io use blocking I/O for the remote shell\n");
rprintf(F," --no-blocking-io turn off --blocking-io\n");
rprintf(F," --stats give some file transfer stats\n");
rprintf(F," --progress show progress during transfer\n");
{"link-dest", 0, POPT_ARG_STRING, 0, OPT_LINK_DEST, 0, 0 },
/* TODO: Should this take an optional int giving the compression level? */
{"compress", 'z', POPT_ARG_NONE, &do_compression, 0, 0, 0 },
- {"daemon", 0, POPT_ARG_NONE, &am_daemon, 0, 0, 0 },
+ {"daemon", 0, POPT_ARG_NONE, &daemon_opt, 0, 0, 0 },
{"no-detach", 0, POPT_ARG_NONE, &no_detach, 0, 0, 0 },
{"stats", 0, POPT_ARG_NONE, &do_stats, 0, 0, 0 },
{"progress", 0, POPT_ARG_NONE, &do_progress, 0, 0, 0 },
usage(FINFO);
exit_cleanup(0);
- case 'H':
-#if SUPPORT_HARD_LINKS
- preserve_hard_links=1;
-#else
- /* FIXME: Don't say "server" if this is
- * happening on the client. */
- /* FIXME: Why do we have the duplicated
- * rprintf? Everybody who gets this message
- * ought to send it to the client and also to
- * the logs. */
- snprintf(err_buf, sizeof err_buf,
- "hard links are not supported on this %s\n",
- am_server ? "server" : "client");
- rprintf(FERROR, "ERROR: %s", err_buf);
- return 0;
-#endif /* SUPPORT_HARD_LINKS */
- break;
-
case 'v':
verbose++;
break;
default:
- /* FIXME: If --daemon is specified, then errors for later
- * parameters seem to disappear. */
snprintf(err_buf, sizeof(err_buf),
"%s%s: %s\n",
am_server ? "on remote machine: " : "",
}
}
+#if !SUPPORT_LINKS
+ if (preserve_links && !am_sender) {
+ snprintf(err_buf, sizeof err_buf,
+ "symlinks are not supported on this %s\n",
+ am_server ? "server" : "client");
+ rprintf(FERROR, "ERROR: %s", err_buf);
+ return 0;
+ }
+#endif
+
+#if !SUPPORT_HARD_LINKS
+ if (preserve_hard_links) {
+ snprintf(err_buf, sizeof err_buf,
+ "hard links are not supported on this %s\n",
+ am_server ? "server" : "client");
+ rprintf(FERROR, "ERROR: %s", err_buf);
+ return 0;
+ }
+#endif
+
if (write_batch && read_batch) {
rprintf(FERROR,
"write-batch and read-batch can not be used together\n");
exit_cleanup(RERR_SYNTAX);
}
+ if (batch_prefix && strlen(batch_prefix) > MAX_BATCH_PREFIX_LEN) {
+ rprintf(FERROR,
+ "the batch-file prefix must be %d characters or less.\n",
+ MAX_BATCH_PREFIX_LEN);
+ exit_cleanup(RERR_SYNTAX);
+ }
+
+ if (tmpdir && strlen(tmpdir) >= MAXPATHLEN - 10) {
+ rprintf(FERROR, "the --temp-dir path is WAY too long.\n");
+ exit_cleanup(RERR_SYNTAX);
+ }
if (do_compression && (write_batch || read_batch)) {
rprintf(FERROR,
}
} else {
extern int sanitize_paths;
- if (sanitize_paths)
- sanitize_path(strdup(files_from), NULL);
+ if (sanitize_paths) {
+ files_from = strdup(files_from);
+ sanitize_path(files_from, NULL);
+ }
filesfrom_fd = open(files_from, O_RDONLY|O_BINARY);
if (filesfrom_fd < 0) {
rsyserr(FERROR, errno,
}
}
+ if (daemon_opt)
+ am_daemon = 1;
+
return 1;
}
static char mwindow[30];
static char bw[50];
/* Leave room for ``--(write|read)-batch='' */
- static char fext[MAXPATHLEN + 15];
+ static char fext[MAX_BATCH_PREFIX_LEN + 15];
int i, x;
if (x != 1) args[ac++] = argstr;
if (block_size) {
- snprintf(bsize,sizeof(bsize),"-B%d",block_size);
+ snprintf(bsize, sizeof bsize, "-B%u", block_size);
args[ac++] = bsize;
}