37static int adjust_target(
const char *src,
char **dst)
44 char *tmp, *ptr = strrchr(src,
'/');
51 tmp = malloc(strlen(*dst) + strlen(ptr) + 2);
58 slash = fisslashdir(*dst);
60 sprintf(tmp,
"%s%s%s", *dst, slash ?
"" :
"/", ptr);
65 if (stat(*dst, &st) && fisslashdir(*dst)) {
78static ssize_t do_copy(
int in,
int out,
size_t num,
char *buffer,
size_t len)
80 ssize_t ret = 0, size = -1;
83 size_t count = num > len ? len : num;
85 ret = read(in, buffer, count);
87 if (ret == -1 && EINTR == errno)
89 if (ret == 0 && size == -1)
97 size += write(out, buffer, ret);
105static void set_mtime(
int in,
int out)
108 struct timespec tv[2];
144ssize_t
copyfile(
const char *src,
const char *dst,
int len,
int opt)
146 char *buffer, *dest = (
char *)dst;
149 int in, out, isdir = 0, saved_errno = 0;
156 buffer = malloc(BUFSIZ);
161 saved_errno = EISDIR;
166 isdir = adjust_target(src, &dest);
169 if (stat(src, &st)) {
175 if (sym && (st.st_mode & S_IFMT) == S_IFLNK) {
176 size = readlink(src, buffer, BUFSIZ);
178 if (size >= (ssize_t)BUFSIZ) {
179 saved_errno = ENOBUFS;
183 size = !symlink(buffer, dest);
198 in = open(src, O_RDONLY);
204 out = open(dest, O_WRONLY | O_CREAT | O_TRUNC, st.st_mode);
211 size = do_copy(in, out, num, buffer, BUFSIZ);
246 char *dest = (
char *)dst;
247 int isdir, result = 0;
250 isdir = adjust_target(src, &dest);
252 if (rename(src, dest)) {
253 if (errno == EXDEV) {
259 result = remove(src);
287 buf = malloc(BUFSIZ);
291 while (fgets(buf, BUFSIZ, src))
int movefile(const char *src, const char *dst)
int fcopyfile(FILE *src, FILE *dst)
ssize_t copyfile(const char *src, const char *dst, int len, int opt)
int fisdir(const char *path)
#define LITE_FOPT_KEEP_MTIME
#define LITE_FOPT_COPYFILE_SYM