37static int copy(
char *src,
char *dst,
int opt);
38static int mdir(
char *buf,
size_t buf_len,
char *
dir,
char *name,
struct stat *st);
39static int prune(
char *dst,
char **new_files,
int new_num);
40static int set_mtime(
char *fn,
struct stat *st);
70int rsync(
char *src,
char *dst,
int opt,
int (*filter)(
const char *file))
76 int i = 0, num = 0, result = 0, do_mtim = 0;
82 if (stat(dst, &st) && fisslashdir(dst))
89 if (copy(src, dst, keep_mtim))
96 if (!fisslashdir(src)) {
97 char *ptr = rindex(src,
'/');
107 if (mdir(dest,
sizeof(dest), dst, ptr, &st))
113 num =
dir(src,
"", filter, &files, 0);
114 for (i = 0; i < num; i++) {
116 snprintf(source,
sizeof(source),
"%s%s%s", src, fisslashdir(src) ?
"" :
"/", files[i]);
122 if (stat(source, &sb)) {
127 if (mdir(dst2,
sizeof(dst2), dst, files[i], &sb)) {
132 rsync(source, dst2, opt, filter);
134 set_mtime(dst2, &sb);
139 if (copy(source, dst, keep_mtim))
144 set_mtime(dest, &st);
149 prune(dst, files, num);
152 for (i = 0; i < num; i++)
160static int copy(
char *src,
char *dst,
int opt)
174static int mdir(
char *buf,
size_t buf_len,
char *
dir,
char *name,
struct stat *st)
176 snprintf(buf, buf_len,
"%s%s%s",
dir, fisslashdir(
dir) ?
"" :
"/", name);
177 if (mkdir(buf, st->st_mode)) {
188static int find(
char *file,
char **files,
int num)
192 for (n = 0; n < num; n++)
193 if (!strncmp (files[n], file, MAX(strlen(files[n]), strlen(file))))
201static int prune(
char *dst,
char **new_files,
int new_num)
206 num =
dir(dst,
"", NULL, &files, 0);
210 for (i = 0; i < num; i++) {
211 if (!find(files[i], new_files, new_num)) {
213 size_t len = strlen(files[i]) + 2 + strlen(dst);
217 snprintf(name, len,
"%s%s%s", dst, fisslashdir(dst) ?
"" :
"/", files[i]);
231static int set_mtime(
char *fn,
struct stat *st)
233 struct timespec tv[2];
238 return utimensat(AT_FDCWD, fn, tv, AT_SYMLINK_NOFOLLOW);
ssize_t copyfile(const char *src, const char *dst, int len, int opt)
int dir(const char *dir, const char *type, int(*filter)(const char *file), char ***list, int strip)
int fexist(const char *file)
int fisdir(const char *path)
#define LITE_FOPT_RSYNC_DELETE
#define LITE_FOPT_KEEP_MTIME
#define LITE_FOPT_COPYFILE_SYM
int rsync(char *src, char *dst, int opt, int(*filter)(const char *file))