summaryrefslogtreecommitdiffstats
path: root/adb/file_sync_service.c
diff options
context:
space:
mode:
Diffstat (limited to 'adb/file_sync_service.c')
-rw-r--r--adb/file_sync_service.c24
1 files changed, 15 insertions, 9 deletions
diff --git a/adb/file_sync_service.c b/adb/file_sync_service.c
index 577fb8f..1d80d26 100644
--- a/adb/file_sync_service.c
+++ b/adb/file_sync_service.c
@@ -68,7 +68,7 @@ static int mkdirs(char *name)
*x = '/';
return ret;
}
- selinux_android_restorecon(name);
+ selinux_android_restorecon(name, 0);
}
*x++ = '/';
}
@@ -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;
@@ -246,7 +246,7 @@ static int handle_send_file(int s, char *path, uid_t uid,
if(fd >= 0) {
struct utimbuf u;
adb_close(fd);
- selinux_android_restorecon(path);
+ selinux_android_restorecon(path, 0);
u.actime = timestamp;
u.modtime = timestamp;
utime(path, &u);
@@ -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,11 +340,16 @@ 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" */
+ do_unlink = lstat(path, &st) || S_ISREG(st.st_mode) || S_ISLNK(st.st_mode);
+ if (do_unlink) {
+ adb_unlink(path);
+ }
}
- adb_unlink(path);
-
-
#ifdef HAVE_SYMLINKS
if(is_link)
ret = handle_send_link(s, path, buffer);
@@ -366,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;