Got rid of unused string_area struct.
[rsync/rsync.git] / options.c
index 082d4f7..ce51386 100644 (file)
--- a/options.c
+++ b/options.c
@@ -128,6 +128,7 @@ 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
@@ -225,9 +226,9 @@ void usage(enum logcode F)
   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");
@@ -356,7 +357,7 @@ static struct poptOption long_options[] = {
   {"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 },
@@ -524,24 +525,6 @@ int parse_arguments(int *argc, const char ***argv, int frommain)
                        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;
@@ -588,8 +571,6 @@ int parse_arguments(int *argc, const char ***argv, int frommain)
 
 
                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: " : "",
@@ -599,6 +580,26 @@ int parse_arguments(int *argc, const char ***argv, int frommain)
                }
        }
 
+#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");
@@ -686,8 +687,10 @@ int parse_arguments(int *argc, const char ***argv, int frommain)
                        }
                } 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,
@@ -698,6 +701,9 @@ int parse_arguments(int *argc, const char ***argv, int frommain)
                }
        }
 
+       if (daemon_opt)
+               am_daemon = 1;
+
        return 1;
 }