rprintf(F,"Usage: rsync [OPTION]... SRC [USER@]HOST:DEST\n");
rprintf(F," or rsync [OPTION]... [USER@]HOST:SRC DEST\n");
rprintf(F," or rsync [OPTION]... SRC DEST\n");
- rprintf(F," or rsync [OPTION]... [USER@]HOST::SRC DEST\n");
+ rprintf(F," or rsync [OPTION]... [USER@]HOST::SRC [DEST]\n");
rprintf(F," or rsync [OPTION]... SRC [USER@]HOST::DEST\n");
+ rprintf(F," or rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]\n");
rprintf(F,"\nOptions\n");
rprintf(F," -v, --verbose increase verbosity\n");
rprintf(F," -c, --checksum always checksum\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," -z, --compress compress file data\n");
- rprintf(F," --exclude=PATTERN exclude file FILE\n");
+ rprintf(F," --exclude=PATTERN exclude files matching PATTERN\n");
rprintf(F," --exclude-from=FILE exclude patterns listed in FILE\n");
- rprintf(F," --include=PATTERN don't exclude file FILE\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," --suffix=SUFFIX override backup suffix\n");
rprintf(F," --version print version number\n");
rprintf(F,"the block size defaults to %d\n",BLOCK_SIZE);
rprintf(F,"\nPlease see the rsync(1) and rsyncd.conf(5) man pages for full documentation\n");
- rprintf(F,"See http://samba.anu.edu.au/rsync/ for updates and bug reports\n");
+ rprintf(F,"See http://rsync.samba.org/ for updates and bug reports\n");
}
enum {OPT_VERSION,OPT_SUFFIX,OPT_SENDER,OPT_SERVER,OPT_EXCLUDE,
{0,0,0,0}};
+static char err_buf[100];
+
+void option_error(void)
+{
+ if (err_buf[0]) {
+ rprintf(FLOG,"%s", err_buf);
+ rprintf(FERROR,"%s", err_buf);
+ } else {
+ rprintf(FLOG,"Error parsing options - unsupported option?\n");
+ rprintf(FERROR,"Error parsing options - unsupported option?\n");
+ }
+ exit_cleanup(RERR_UNSUPPORTED);
+}
+
+/* check to see if we should refuse this option */
+static int check_refuse_options(char *ref, int opt)
+{
+ int i, len;
+ char *p;
+ const char *name;
+
+ for (i=0; long_options[i].name; i++) {
+ if (long_options[i].val == opt) break;
+ }
+
+ if (!long_options[i].name) return 0;
+
+ name = long_options[i].name;
+ len = strlen(name);
+
+ while ((p = strstr(ref,name))) {
+ if ((p==ref || p[-1]==' ') &&
+ (p[len] == ' ' || p[len] == 0)) {
+ slprintf(err_buf,sizeof(err_buf),
+ "The '%s' option is not supported by this server\n", name);
+ return 1;
+ }
+ ref += len;
+ }
+ return 0;
+}
+
+
int parse_arguments(int argc, char *argv[])
{
int opt;
int option_index;
+ char *ref = lp_refuse_options(module_id);
while ((opt = getopt_long(argc, argv,
short_options, long_options, &option_index))
!= -1) {
+
+ if (ref) {
+ if (check_refuse_options(ref, opt)) return 0;
+ }
+
switch (opt) {
case OPT_VERSION:
rprintf(FINFO,"rsync version %s protocol version %d\n\n",
#if SUPPORT_HARD_LINKS
preserve_hard_links=1;
#else
+ slprintf(err_buf,sizeof(err_buf),"hard links are not supported on this server\n");
rprintf(FERROR,"ERROR: hard links not supported on this platform\n");
return 0;
#endif
case OPT_SENDER:
if (!am_server) {
usage(FERROR);
- exit_cleanup(1);
+ exit_cleanup(RERR_SYNTAX);
}
am_sender = 1;
break;
break;
default:
+ slprintf(err_buf,sizeof(err_buf),"unrecognised option\n");
return 0;
}
}