Got rid of unused string_area struct.
[rsync/rsync.git] / options.c
index d719a4d..ce51386 100644 (file)
--- a/options.c
+++ b/options.c
@@ -66,6 +66,7 @@ int read_only = 0;
 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;
@@ -127,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
@@ -224,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");
@@ -246,12 +248,12 @@ void usage(enum logcode F)
   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          receiver deletes after transferring, not before\n");
-  rprintf(F,"     --ignore-errors         delete even if there are IO errors\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,"     --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");
@@ -268,12 +270,12 @@ void usage(enum logcode F)
   rprintf(F,"     --files-from=FILE       read FILE for list of source-file names\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");
@@ -355,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 },
@@ -523,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;
@@ -587,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: " : "",
@@ -598,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");
@@ -685,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,
@@ -697,6 +701,9 @@ int parse_arguments(int *argc, const char ***argv, int frommain)
                }
        }
 
+       if (daemon_opt)
+               am_daemon = 1;
+
        return 1;
 }