1dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* 2dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 3dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 4dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * you may not use this file except in compliance with the License. 6dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * You may obtain a copy of the License at 7dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 8dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 10dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * See the License for the specific language governing permissions and 14dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * limitations under the License. 15dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 16dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 17dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <stdlib.h> 18dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <stdio.h> 19dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <string.h> 20dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 21dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <sys/stat.h> 22dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <sys/types.h> 23dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <dirent.h> 24dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <utime.h> 25dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 26dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <errno.h> 27dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 28dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "sysdeps.h" 29dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 30dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define TRACE_TAG TRACE_SYNC 31dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "adb.h" 32dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "file_sync_service.h" 33dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 34dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic int mkdirs(char *name) 35dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 36dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int ret; 37dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *x = name + 1; 38dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 39dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(name[0] != '/') return -1; 40dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 41dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for(;;) { 42dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project x = adb_dirstart(x); 43dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(x == 0) return 0; 44dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *x = 0; 45dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ret = adb_mkdir(name, 0775); 46dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if((ret < 0) && (errno != EEXIST)) { 47dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project D("mkdir(\"%s\") -> %s\n", name, strerror(errno)); 48dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *x = '/'; 49dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return ret; 50dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 51dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *x++ = '/'; 52dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 53dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 54dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 55dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 56dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic int do_stat(int s, const char *path) 57dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 58dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project syncmsg msg; 59dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project struct stat st; 60dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 61dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project msg.stat.id = ID_STAT; 62dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 63dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(lstat(path, &st)) { 64dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project msg.stat.mode = 0; 65dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project msg.stat.size = 0; 66dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project msg.stat.time = 0; 67dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 68dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project msg.stat.mode = htoll(st.st_mode); 69dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project msg.stat.size = htoll(st.st_size); 70dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project msg.stat.time = htoll(st.st_mtime); 71dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 72dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 73dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return writex(s, &msg.stat, sizeof(msg.stat)); 74dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 75dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 76dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic int do_list(int s, const char *path) 77dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 78dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project DIR *d; 79dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project struct dirent *de; 80dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project struct stat st; 81dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project syncmsg msg; 82dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int len; 83dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 84dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char tmp[1024 + 256 + 1]; 85dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *fname; 86dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 87dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project len = strlen(path); 88dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project memcpy(tmp, path, len); 89dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project tmp[len] = '/'; 90dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fname = tmp + len + 1; 91dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 92dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project msg.dent.id = ID_DENT; 93dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 94dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project d = opendir(path); 95dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(d == 0) goto done; 96dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 97dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project while((de = readdir(d))) { 98dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int len = strlen(de->d_name); 99dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 100dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* not supposed to be possible, but 101dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if it does happen, let's not buffer overrun */ 102dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(len > 256) continue; 103dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 104dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project strcpy(fname, de->d_name); 105dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(lstat(tmp, &st) == 0) { 106dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project msg.dent.mode = htoll(st.st_mode); 107dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project msg.dent.size = htoll(st.st_size); 108dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project msg.dent.time = htoll(st.st_mtime); 109dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project msg.dent.namelen = htoll(len); 110dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 111dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(writex(s, &msg.dent, sizeof(msg.dent)) || 112dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project writex(s, de->d_name, len)) { 113dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 114dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 115dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 116dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 117dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 118dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project closedir(d); 119dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 120dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectdone: 121dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project msg.dent.id = ID_DONE; 122dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project msg.dent.mode = 0; 123dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project msg.dent.size = 0; 124dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project msg.dent.time = 0; 125dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project msg.dent.namelen = 0; 126dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return writex(s, &msg.dent, sizeof(msg.dent)); 127dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 128dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 129dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic int fail_message(int s, const char *reason) 130dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 131dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project syncmsg msg; 132dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int len = strlen(reason); 133dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 134dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project D("sync: failure: %s\n", reason); 135dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 136dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project msg.data.id = ID_FAIL; 137dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project msg.data.size = htoll(len); 138dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(writex(s, &msg.data, sizeof(msg.data)) || 139dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project writex(s, reason, len)) { 140dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 141dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 142dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 143dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 144dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 145dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 146dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic int fail_errno(int s) 147dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 148dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return fail_message(s, strerror(errno)); 149dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 150dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 151dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic int handle_send_file(int s, char *path, mode_t mode, char *buffer) 152dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 153dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project syncmsg msg; 154dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project unsigned int timestamp = 0; 155dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int fd; 156dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 157dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fd = adb_open_mode(path, O_WRONLY | O_CREAT | O_EXCL, mode); 158dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(fd < 0 && errno == ENOENT) { 159dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project mkdirs(path); 160dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fd = adb_open_mode(path, O_WRONLY | O_CREAT | O_EXCL, mode); 161dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 162dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(fd < 0 && errno == EEXIST) { 163dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fd = adb_open_mode(path, O_WRONLY, mode); 164dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 165dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(fd < 0) { 166dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(fail_errno(s)) 167dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 168dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fd = -1; 169dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 170dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 171dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for(;;) { 172dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project unsigned int len; 173dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 174dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(readx(s, &msg.data, sizeof(msg.data))) 175dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project goto fail; 176dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 177dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(msg.data.id != ID_DATA) { 178dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(msg.data.id == ID_DONE) { 179dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project timestamp = ltohl(msg.data.size); 180dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 181dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 182dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fail_message(s, "invalid data message"); 183dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project goto fail; 184dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 185dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project len = ltohl(msg.data.size); 186dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(len > SYNC_DATA_MAX) { 187dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fail_message(s, "oversize data message"); 188dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project goto fail; 189dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 190dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(readx(s, buffer, len)) 191dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project goto fail; 192dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 193dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(fd < 0) 194dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project continue; 195dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(writex(fd, buffer, len)) { 196408fa57864c01113deaa213e5c1848a9c594ae92JP Abgrall int saved_errno = errno; 197dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_close(fd); 198dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_unlink(path); 199dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fd = -1; 200408fa57864c01113deaa213e5c1848a9c594ae92JP Abgrall errno = saved_errno; 201dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(fail_errno(s)) return -1; 202dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 203dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 204dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 205dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(fd >= 0) { 206dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project struct utimbuf u; 207dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_close(fd); 208dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project u.actime = timestamp; 209dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project u.modtime = timestamp; 210dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project utime(path, &u); 211dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 212dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project msg.status.id = ID_OKAY; 213dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project msg.status.msglen = 0; 214dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(writex(s, &msg.status, sizeof(msg.status))) 215dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 216dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 217dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 218dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 219dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectfail: 220dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(fd >= 0) 221dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_close(fd); 222dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_unlink(path); 223dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 224dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 225dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 226dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef HAVE_SYMLINKS 227dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic int handle_send_link(int s, char *path, char *buffer) 228dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 229dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project syncmsg msg; 230dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project unsigned int len; 231dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int ret; 232dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 233dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(readx(s, &msg.data, sizeof(msg.data))) 234dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 235dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 236dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(msg.data.id != ID_DATA) { 237dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fail_message(s, "invalid data message: expected ID_DATA"); 238dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 239dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 240dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 241dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project len = ltohl(msg.data.size); 242dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(len > SYNC_DATA_MAX) { 243dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fail_message(s, "oversize data message"); 244dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 245dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 246dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(readx(s, buffer, len)) 247dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 248dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 249dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ret = symlink(buffer, path); 250dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(ret && errno == ENOENT) { 251dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project mkdirs(path); 252dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ret = symlink(buffer, path); 253dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 254dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(ret) { 255dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fail_errno(s); 256dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 257dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 258dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 259dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(readx(s, &msg.data, sizeof(msg.data))) 260dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 261dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 262dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(msg.data.id == ID_DONE) { 263dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project msg.status.id = ID_OKAY; 264dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project msg.status.msglen = 0; 265dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(writex(s, &msg.status, sizeof(msg.status))) 266dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 267dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 268dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fail_message(s, "invalid data message: expected ID_DONE"); 269dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 270dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 271dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 272dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 273dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 274dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif /* HAVE_SYMLINKS */ 275dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 276dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic int do_send(int s, char *path, char *buffer) 277dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 278dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *tmp; 279dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project mode_t mode; 280dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int is_link, ret; 281dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 282dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project tmp = strrchr(path,','); 283dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(tmp) { 284dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *tmp = 0; 285dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project errno = 0; 286dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project mode = strtoul(tmp + 1, NULL, 0); 287dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifndef HAVE_SYMLINKS 288dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project is_link = 0; 289dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#else 290dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project is_link = S_ISLNK(mode); 291dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 292dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project mode &= 0777; 293dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 294dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(!tmp || errno) { 295dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project mode = 0644; 296dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project is_link = 0; 297dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 298dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 299dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_unlink(path); 300dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 301dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 302dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef HAVE_SYMLINKS 303dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(is_link) 304dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ret = handle_send_link(s, path, buffer); 305dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project else { 306dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#else 307dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { 308dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 309dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* copy user permission bits to "group" and "other" permissions */ 310dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project mode |= ((mode >> 3) & 0070); 311dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project mode |= ((mode >> 3) & 0007); 312dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 313dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ret = handle_send_file(s, path, mode, buffer); 314dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 315dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 316dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return ret; 317dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 318dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 319dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic int do_recv(int s, const char *path, char *buffer) 320dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 321dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project syncmsg msg; 322dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int fd, r; 323dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 324dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fd = adb_open(path, O_RDONLY); 325dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(fd < 0) { 326dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(fail_errno(s)) return -1; 327dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 328dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 329dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 330dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project msg.data.id = ID_DATA; 331dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for(;;) { 332dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project r = adb_read(fd, buffer, SYNC_DATA_MAX); 333dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(r <= 0) { 334dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(r == 0) break; 335dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(errno == EINTR) continue; 336dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project r = fail_errno(s); 337dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_close(fd); 338dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return r; 339dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 340dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project msg.data.size = htoll(r); 341dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(writex(s, &msg.data, sizeof(msg.data)) || 342dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project writex(s, buffer, r)) { 343dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_close(fd); 344dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 345dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 346dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 347dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 348dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_close(fd); 349dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 350dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project msg.data.id = ID_DONE; 351dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project msg.data.size = 0; 352dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(writex(s, &msg.data, sizeof(msg.data))) { 353dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 354dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 355dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 356dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 357dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 358dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 359dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid file_sync_service(int fd, void *cookie) 360dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 361dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project syncmsg msg; 362dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char name[1025]; 363dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project unsigned namelen; 364dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 365dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *buffer = malloc(SYNC_DATA_MAX); 366dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(buffer == 0) goto fail; 367dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 368dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for(;;) { 369dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project D("sync: waiting for command\n"); 370dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 371dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(readx(fd, &msg.req, sizeof(msg.req))) { 372dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fail_message(fd, "command read failure"); 373dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 374dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 375dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project namelen = ltohl(msg.req.namelen); 376dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(namelen > 1024) { 377dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fail_message(fd, "invalid namelen"); 378dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 379dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 380dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(readx(fd, name, namelen)) { 381dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fail_message(fd, "filename read failure"); 382dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 383dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 384dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project name[namelen] = 0; 385dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 386dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project msg.req.namelen = 0; 387dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project D("sync: '%s' '%s'\n", (char*) &msg.req, name); 388dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 389dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project switch(msg.req.id) { 390dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case ID_STAT: 391dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(do_stat(fd, name)) goto fail; 392dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 393dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case ID_LIST: 394dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(do_list(fd, name)) goto fail; 395dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 396dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case ID_SEND: 397dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(do_send(fd, name, buffer)) goto fail; 398dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 399dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case ID_RECV: 400dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(do_recv(fd, name, buffer)) goto fail; 401dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 402dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case ID_QUIT: 403dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project goto fail; 404dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project default: 405dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fail_message(fd, "unknown command"); 406dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project goto fail; 407dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 408dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 409dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 410dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectfail: 411dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(buffer != 0) free(buffer); 412dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project D("sync: done\n"); 413dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_close(fd); 414dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 415