added --existing option, similar to one suggested by Gildas Quiniou <gildas@stip.fr>
[rsync/rsync.git] / options.c
index abdfff3..e4924bf 100644 (file)
--- a/options.c
+++ b/options.c
@@ -62,6 +62,8 @@ int safe_symlinks=0;
 int copy_unsafe_links=0;
 int block_size=BLOCK_SIZE;
 int size_only=0;
+int delete_after=0;
+int only_existing=0;
 
 char *backup_suffix = BACKUP_SUFFIX;
 char *tmpdir = NULL;
@@ -78,6 +80,8 @@ int quiet = 0;
 int always_checksum = 0;
 int list_only = 0;
 
+struct in_addr socket_address = {INADDR_ANY};
+
 void usage(int F)
 {
   rprintf(F,"rsync version %s Copyright Andrew Tridgell and Paul Mackerras\n\n",
@@ -122,8 +126,10 @@ void usage(int F)
   rprintf(F," -e, --rsh=COMMAND           specify rsh replacement\n");
   rprintf(F,"     --rsync-path=PATH       specify path to rsync on the remote machine\n");
   rprintf(F," -C, --cvs-exclude           auto ignore files in the same way CVS does\n");
+  rprintf(F,"     --existing              only update files that already exist\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,"     --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");
@@ -132,6 +138,7 @@ void usage(int F)
   rprintf(F,"     --size-only             only use file size when determining if a file should be transferred\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," -P                          equivalent to --partial --progress\n");
   rprintf(F," -z, --compress              compress file data\n");
   rprintf(F,"     --exclude=PATTERN       exclude files matching PATTERN\n");
   rprintf(F,"     --exclude-from=FILE     exclude patterns listed in FILE\n");
@@ -139,6 +146,7 @@ void usage(int F)
   rprintf(F,"     --include-from=FILE     don't exclude patterns listed in FILE\n");
   rprintf(F,"     --version               print version number\n");  
   rprintf(F,"     --daemon                run as a rsync daemon\n");  
+  rprintf(F,"     --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,"     --stats                 give some file transfer stats\n");  
@@ -158,14 +166,16 @@ enum {OPT_VERSION, OPT_SUFFIX, OPT_SENDER, OPT_SERVER, OPT_EXCLUDE,
       OPT_RSYNC_PATH, OPT_FORCE, OPT_TIMEOUT, OPT_DAEMON, OPT_CONFIG, OPT_PORT,
       OPT_INCLUDE, OPT_INCLUDE_FROM, OPT_STATS, OPT_PARTIAL, OPT_PROGRESS,
       OPT_COPY_UNSAFE_LINKS, OPT_SAFE_LINKS, OPT_COMPARE_DEST,
-      OPT_LOG_FORMAT, OPT_PASSWORD_FILE, OPT_SIZE_ONLY};
+      OPT_LOG_FORMAT, OPT_PASSWORD_FILE, OPT_SIZE_ONLY, OPT_ADDRESS,
+      OPT_DELETE_AFTER, OPT_EXISTING};
 
-static char *short_options = "oblLWHpguDCtcahvqrRIxnSe:B:T:z";
+static char *short_options = "oblLWHpguDCtcahvqrRIxnSe:B:T:zP";
 
 static struct option long_options[] = {
   {"version",     0,     0,    OPT_VERSION},
   {"server",      0,     0,    OPT_SERVER},
   {"sender",      0,     0,    OPT_SENDER},
+  {"existing",    0,     0,    OPT_EXISTING},
   {"delete",      0,     0,    OPT_DELETE},
   {"delete-excluded", 0, 0,    OPT_DELETE_EXCLUDED},
   {"force",       0,     0,    OPT_FORCE},
@@ -213,9 +223,11 @@ static struct option long_options[] = {
   {"stats",       0,     0,    OPT_STATS},
   {"progress",    0,     0,    OPT_PROGRESS},
   {"partial",     0,     0,    OPT_PARTIAL},
+  {"delete-after",0,     0,    OPT_DELETE_AFTER},
   {"config",      1,     0,    OPT_CONFIG},
   {"port",        1,     0,    OPT_PORT},
   {"log-format",  1,     0,    OPT_LOG_FORMAT},
+  {"address",     1,     0,    OPT_ADDRESS},
   {0,0,0,0}};
 
 
@@ -311,6 +323,14 @@ int parse_arguments(int argc, char *argv[], int frommain)
                        delete_mode = 1;
                        break;
 
+               case OPT_EXISTING:
+                       only_existing = 1;
+                       break;
+
+               case OPT_DELETE_AFTER:
+                       delete_after = 1;
+                       break;
+
                case OPT_DELETE_EXCLUDED:
                        delete_excluded = 1;
                        delete_mode = 1;
@@ -500,6 +520,11 @@ int parse_arguments(int argc, char *argv[], int frommain)
                        keep_partial = 1;
                        break;
 
+               case 'P':
+                       do_progress = 1;
+                       keep_partial = 1;
+                       break;
+
                case OPT_CONFIG:
                        config_file = optarg;
                        break;
@@ -512,6 +537,15 @@ int parse_arguments(int argc, char *argv[], int frommain)
                        log_format = optarg;
                        break;
 
+               case OPT_ADDRESS:
+                       {
+                               struct in_addr *ia;
+                               if ((ia = ip_address(optarg))) {
+                                       socket_address = *ia;
+                               }
+                       }
+                       break;
+
                default:
                        slprintf(err_buf,sizeof(err_buf),"unrecognised option\n");
                        return 0;
@@ -613,6 +647,9 @@ void server_options(char **args,int *argc)
        if (force_delete)
                args[ac++] = "--force";
 
+       if (delete_after)
+               args[ac++] = "--delete-after";
+
        if (copy_unsafe_links)
                args[ac++] = "--copy-unsafe-links";
 
@@ -622,6 +659,9 @@ void server_options(char **args,int *argc)
        if (numeric_ids)
                args[ac++] = "--numeric-ids";
 
+       if (only_existing)
+               args[ac++] = "--existing";
+
        if (tmpdir) {
                args[ac++] = "--temp-dir";
                args[ac++] = tmpdir;