* commit '7e463719c9fb559a164ace78743da6d439a6ed9f': adb: Don't unlink special files on sync failure.
This commit is contained in:
commit
0631bf3ddb
1 changed files with 8 additions and 5 deletions
|
@ -172,7 +172,7 @@ static int fail_errno(int s)
|
|||
}
|
||||
|
||||
static int handle_send_file(int s, char *path, uid_t uid,
|
||||
gid_t gid, mode_t mode, char *buffer)
|
||||
gid_t gid, mode_t mode, char *buffer, bool do_unlink)
|
||||
{
|
||||
syncmsg msg;
|
||||
unsigned int timestamp = 0;
|
||||
|
@ -236,7 +236,7 @@ static int handle_send_file(int s, char *path, uid_t uid,
|
|||
if(writex(fd, buffer, len)) {
|
||||
int saved_errno = errno;
|
||||
adb_close(fd);
|
||||
adb_unlink(path);
|
||||
if (do_unlink) adb_unlink(path);
|
||||
fd = -1;
|
||||
errno = saved_errno;
|
||||
if(fail_errno(s)) return -1;
|
||||
|
@ -261,7 +261,7 @@ static int handle_send_file(int s, char *path, uid_t uid,
|
|||
fail:
|
||||
if(fd >= 0)
|
||||
adb_close(fd);
|
||||
adb_unlink(path);
|
||||
if (do_unlink) adb_unlink(path);
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
@ -323,6 +323,7 @@ static int do_send(int s, char *path, char *buffer)
|
|||
char *tmp;
|
||||
unsigned int mode;
|
||||
int is_link, ret;
|
||||
bool do_unlink;
|
||||
|
||||
tmp = strrchr(path,',');
|
||||
if(tmp) {
|
||||
|
@ -339,10 +340,12 @@ static int do_send(int s, char *path, char *buffer)
|
|||
if(!tmp || errno) {
|
||||
mode = 0644;
|
||||
is_link = 0;
|
||||
do_unlink = true;
|
||||
} else {
|
||||
struct stat st;
|
||||
/* Don't delete files before copying if they are not "regular" */
|
||||
if(lstat(path, &st) || S_ISREG(st.st_mode) || S_ISLNK(st.st_mode)) {
|
||||
do_unlink = lstat(path, &st) || S_ISREG(st.st_mode) || S_ISLNK(st.st_mode);
|
||||
if (do_unlink) {
|
||||
adb_unlink(path);
|
||||
}
|
||||
}
|
||||
|
@ -369,7 +372,7 @@ static int do_send(int s, char *path, char *buffer)
|
|||
if (is_on_system(path)) {
|
||||
fs_config(tmp, 0, &uid, &gid, &mode, &cap);
|
||||
}
|
||||
ret = handle_send_file(s, path, uid, gid, mode, buffer);
|
||||
ret = handle_send_file(s, path, uid, gid, mode, buffer, do_unlink);
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
|
Loading…
Reference in a new issue