Matt McCutchen's Web Site
/
rsync
/
rsync.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
added a --force option.
[rsync/rsync.git]
/
main.c
diff --git
a/main.c
b/main.c
index
1af6771
..
d476e21
100644
(file)
--- a/
main.c
+++ b/
main.c
@@
-54,6
+54,7
@@
int am_root=0;
int orig_umask=0;
int relative_paths=0;
int numeric_ids = 0;
int orig_umask=0;
int relative_paths=0;
int numeric_ids = 0;
+int force_delete = 0;
extern int csum_length;
extern int csum_length;
@@
-175,6
+176,9
@@
static void server_options(char **args,int *argc)
if (delete_mode)
args[ac++] = "--delete";
if (delete_mode)
args[ac++] = "--delete";
+ if (force_delete)
+ args[ac++] = "--force";
+
if (numeric_ids)
args[ac++] = "--numeric-ids";
if (numeric_ids)
args[ac++] = "--numeric-ids";
@@
-227,23
+231,10
@@
static int do_cmd(char *cmd,char *machine,char *user,char *path,int *f_in,int *f
server_options(args,&argc);
server_options(args,&argc);
- if (path && *path) {
- dir = strdup(path);
- p = strrchr(dir,'/');
- if (p && !relative_paths) {
- *p = 0;
- if (!dir[0])
- args[argc++] = "/";
- else
- args[argc++] = dir;
- p++;
- } else {
- args[argc++] = ".";
- p = dir;
- }
- if (p[0])
- args[argc++] = path;
- }
+ args[argc++] = ".";
+
+ if (path && *path)
+ args[argc++] = path;
args[argc] = NULL;
args[argc] = NULL;
@@
-313,31
+304,31
@@
static char *get_local_name(struct file_list *flist,char *name)
void do_server_sender(int argc,char *argv[])
{
int i;
void do_server_sender(int argc,char *argv[])
{
int i;
- char *dir = argv[0];
struct file_list *flist;
struct file_list *flist;
+ char *dir = argv[0];
if (verbose > 2)
fprintf(FERROR,"server_sender starting pid=%d\n",(int)getpid());
if (!relative_paths && chdir(dir) != 0) {
if (verbose > 2)
fprintf(FERROR,"server_sender starting pid=%d\n",(int)getpid());
if (!relative_paths && chdir(dir) != 0) {
- fprintf(FERROR,"chdir %s: %s (3)\n",dir,strerror(errno));
- exit_cleanup(1);
+
fprintf(FERROR,"chdir %s: %s (3)\n",dir,strerror(errno));
+
exit_cleanup(1);
}
argc--;
argv++;
if (strcmp(dir,".")) {
}
argc--;
argv++;
if (strcmp(dir,".")) {
- int l = strlen(dir);
- if (strcmp(dir,"/") == 0)
- l = 0;
- for (i=0;i<argc;i++)
- argv[i] += l+1;
+
int l = strlen(dir);
+
if (strcmp(dir,"/") == 0)
+
l = 0;
+
for (i=0;i<argc;i++)
+
argv[i] += l+1;
}
if (argc == 0 && recurse) {
}
if (argc == 0 && recurse) {
- argc=1;
- argv--;
- argv[0] = ".";
+
argc=1;
+
argv--;
+
argv[0] = ".";
}
}
@@
-381,21
+372,22
@@
static int do_recv(int f_in,int f_out,struct file_list *flist,char *local_name)
void do_server_recv(int argc,char *argv[])
{
int status;
void do_server_recv(int argc,char *argv[])
{
int status;
- char *dir = NULL;
struct file_list *flist;
char *local_name=NULL;
struct file_list *flist;
char *local_name=NULL;
+ char *dir = NULL;
if (verbose > 2)
fprintf(FERROR,"server_recv(%d) starting pid=%d\n",argc,(int)getpid());
if (argc > 0) {
if (verbose > 2)
fprintf(FERROR,"server_recv(%d) starting pid=%d\n",argc,(int)getpid());
if (argc > 0) {
- dir = argv[0];
- argc--;
- argv++;
- if (chdir(dir) != 0) {
- fprintf(FERROR,"chdir %s : %s (4)\n",dir,strerror(errno));
- exit_cleanup(1);
- }
+ dir = argv[0];
+ argc--;
+ argv++;
+ if (chdir(dir) != 0) {
+ fprintf(FERROR,"chdir %s : %s (4)\n",
+ dir,strerror(errno));
+ exit_cleanup(1);
+ }
}
if (delete_mode)
}
if (delete_mode)
@@
-408,11
+400,11
@@
void do_server_recv(int argc,char *argv[])
}
if (argc > 0) {
}
if (argc > 0) {
- if (strcmp(dir,".")) {
- argv[0] += strlen(dir);
- if (argv[0][0] == '/') argv[0]++;
- }
- local_name = get_local_name(flist,argv[0]);
+
if (strcmp(dir,".")) {
+
argv[0] += strlen(dir);
+
if (argv[0][0] == '/') argv[0]++;
+
}
+
local_name = get_local_name(flist,argv[0]);
}
status = do_recv(STDIN_FILENO,STDOUT_FILENO,flist,local_name);
}
status = do_recv(STDIN_FILENO,STDOUT_FILENO,flist,local_name);
@@
-451,6
+443,7
@@
static void usage(FILE *f)
fprintf(f," --rsync-path PATH specify path to rsync on the remote machine\n");
fprintf(f,"-C, --cvs-exclude auto ignore files in the same way CVS does\n");
fprintf(f," --delete delete files that don't exist on the sending side\n");
fprintf(f," --rsync-path PATH specify path to rsync on the remote machine\n");
fprintf(f,"-C, --cvs-exclude auto ignore files in the same way CVS does\n");
fprintf(f," --delete delete files that don't exist on the sending side\n");
+ fprintf(f," --force force deletion of directories even if not empty\n");
fprintf(f," --numeric-ids don't map uid/gid values by user/group name\n");
fprintf(f,"-I, --ignore-times don't exclude files that match length and time\n");
fprintf(f,"-T --temp-dir DIR create temporary files in directory DIR\n");
fprintf(f," --numeric-ids don't map uid/gid values by user/group name\n");
fprintf(f,"-I, --ignore-times don't exclude files that match length and time\n");
fprintf(f,"-T --temp-dir DIR create temporary files in directory DIR\n");
@@
-466,7
+459,7
@@
static void usage(FILE *f)
}
enum {OPT_VERSION,OPT_SUFFIX,OPT_SENDER,OPT_SERVER,OPT_EXCLUDE,
}
enum {OPT_VERSION,OPT_SUFFIX,OPT_SENDER,OPT_SERVER,OPT_EXCLUDE,
- OPT_EXCLUDE_FROM,OPT_DELETE,OPT_NUMERIC_IDS,OPT_RSYNC_PATH};
+ OPT_EXCLUDE_FROM,OPT_DELETE,OPT_NUMERIC_IDS,OPT_RSYNC_PATH
,OPT_FORCE
};
static char *short_options = "oblLWHpguDCtcahvrRIxnSe:B:T:z";
static char *short_options = "oblLWHpguDCtcahvrRIxnSe:B:T:z";
@@
-475,6
+468,7
@@
static struct option long_options[] = {
{"server", 0, 0, OPT_SERVER},
{"sender", 0, 0, OPT_SENDER},
{"delete", 0, 0, OPT_DELETE},
{"server", 0, 0, OPT_SERVER},
{"sender", 0, 0, OPT_SENDER},
{"delete", 0, 0, OPT_DELETE},
+ {"force", 0, 0, OPT_FORCE},
{"numeric-ids", 0, 0, OPT_NUMERIC_IDS},
{"exclude", 1, 0, OPT_EXCLUDE},
{"exclude-from",1, 0, OPT_EXCLUDE_FROM},
{"numeric-ids", 0, 0, OPT_NUMERIC_IDS},
{"exclude", 1, 0, OPT_EXCLUDE},
{"exclude-from",1, 0, OPT_EXCLUDE_FROM},
@@
-565,6
+559,10
@@
int main(int argc,char *argv[])
delete_mode = 1;
break;
delete_mode = 1;
break;
+ case OPT_FORCE:
+ force_delete = 1;
+ break;
+
case OPT_NUMERIC_IDS:
numeric_ids = 1;
break;
case OPT_NUMERIC_IDS:
numeric_ids = 1;
break;