file_sync_client.c revision 686bce6390db802bfd2cb4e78f9270596b6decb2
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 <stdio.h> 18dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <stdlib.h> 19dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <string.h> 20dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <errno.h> 21dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <sys/stat.h> 22dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <sys/time.h> 23dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <time.h> 24dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <dirent.h> 25dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <limits.h> 26dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <sys/types.h> 27dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <zipfile/zipfile.h> 287a5e2bd0621ee0b1c66d8f4c21497ffb62feff42Greg Hackmann#include <utime.h> 29dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 30dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "sysdeps.h" 31dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "adb.h" 32dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "adb_client.h" 33dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "file_sync_service.h" 34dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 35dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 36d9a1430ff2b2d2a52b586dfba1db5ac0128dd85bJeff Smithstatic unsigned long long total_bytes; 37dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic long long start_time; 38dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 39dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic long long NOW() 40dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 41dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project struct timeval tv; 42dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project gettimeofday(&tv, 0); 43dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return ((long long) tv.tv_usec) + 44dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1000000LL * ((long long) tv.tv_sec); 45dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 46dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 47dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void BEGIN() 48dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 49dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project total_bytes = 0; 50dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project start_time = NOW(); 51dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 52dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 53dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void END() 54dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 55dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project long long t = NOW() - start_time; 56dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(total_bytes == 0) return; 57dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 58dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (t == 0) /* prevent division by 0 :-) */ 59dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project t = 1000000; 60dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 61ee878753f915a0176ea411b71bdffde064e24ae0Mike Lockwood fprintf(stderr,"%lld KB/s (%lld bytes in %lld.%03llds)\n", 62d9a1430ff2b2d2a52b586dfba1db5ac0128dd85bJeff Smith ((total_bytes * 1000000LL) / t) / 1024LL, 63d9a1430ff2b2d2a52b586dfba1db5ac0128dd85bJeff Smith total_bytes, (t / 1000000LL), (t % 1000000LL) / 1000LL); 64dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 65dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 6676f2a93b18e0d321d527cb64c2b2c4281e1cf70fMark Lindnerstatic const char* transfer_progress_format = "\rTransferring: %llu/%llu (%d%%)"; 6776f2a93b18e0d321d527cb64c2b2c4281e1cf70fMark Lindner 6876f2a93b18e0d321d527cb64c2b2c4281e1cf70fMark Lindnerstatic void print_transfer_progress(unsigned long long bytes_current, 6976f2a93b18e0d321d527cb64c2b2c4281e1cf70fMark Lindner unsigned long long bytes_total) { 7076f2a93b18e0d321d527cb64c2b2c4281e1cf70fMark Lindner if (bytes_total == 0) return; 7176f2a93b18e0d321d527cb64c2b2c4281e1cf70fMark Lindner 7276f2a93b18e0d321d527cb64c2b2c4281e1cf70fMark Lindner fprintf(stderr, transfer_progress_format, bytes_current, bytes_total, 7376f2a93b18e0d321d527cb64c2b2c4281e1cf70fMark Lindner (int) (bytes_current * 100 / bytes_total)); 7476f2a93b18e0d321d527cb64c2b2c4281e1cf70fMark Lindner 7576f2a93b18e0d321d527cb64c2b2c4281e1cf70fMark Lindner if (bytes_current == bytes_total) { 7676f2a93b18e0d321d527cb64c2b2c4281e1cf70fMark Lindner fputc('\n', stderr); 7776f2a93b18e0d321d527cb64c2b2c4281e1cf70fMark Lindner } 7876f2a93b18e0d321d527cb64c2b2c4281e1cf70fMark Lindner 7976f2a93b18e0d321d527cb64c2b2c4281e1cf70fMark Lindner fflush(stderr); 8076f2a93b18e0d321d527cb64c2b2c4281e1cf70fMark Lindner} 8176f2a93b18e0d321d527cb64c2b2c4281e1cf70fMark Lindner 82dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid sync_quit(int fd) 83dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 84dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project syncmsg msg; 85dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 86dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project msg.req.id = ID_QUIT; 87dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project msg.req.namelen = 0; 88dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 89dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project writex(fd, &msg.req, sizeof(msg.req)); 90dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 91dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 92dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttypedef void (*sync_ls_cb)(unsigned mode, unsigned size, unsigned time, const char *name, void *cookie); 93dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 94dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint sync_ls(int fd, const char *path, sync_ls_cb func, void *cookie) 95dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 96dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project syncmsg msg; 97dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char buf[257]; 98dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int len; 99dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 100dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project len = strlen(path); 101dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(len > 1024) goto fail; 102dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 103dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project msg.req.id = ID_LIST; 104dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project msg.req.namelen = htoll(len); 105dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 106dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(writex(fd, &msg.req, sizeof(msg.req)) || 107dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project writex(fd, path, len)) { 108dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project goto fail; 109dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 110dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 111dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for(;;) { 112dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(readx(fd, &msg.dent, sizeof(msg.dent))) break; 113dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(msg.dent.id == ID_DONE) return 0; 114dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(msg.dent.id != ID_DENT) break; 115dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 116dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project len = ltohl(msg.dent.namelen); 117dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(len > 256) break; 118dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 119dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(readx(fd, buf, len)) break; 120dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project buf[len] = 0; 121dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 122dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project func(ltohl(msg.dent.mode), 123dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ltohl(msg.dent.size), 124dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ltohl(msg.dent.time), 125dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project buf, cookie); 126dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 127dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 128dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectfail: 129dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_close(fd); 130dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 131dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 132dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 133dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttypedef struct syncsendbuf syncsendbuf; 134dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 135dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstruct syncsendbuf { 136dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project unsigned id; 137dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project unsigned size; 138dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char data[SYNC_DATA_MAX]; 139dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}; 140dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 141dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic syncsendbuf send_buffer; 142dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 143de8ff4adcaa487259f9ddcd0eab4d1117d1cca71Lajos Molnarint sync_readtime(int fd, const char *path, unsigned int *timestamp, 144de8ff4adcaa487259f9ddcd0eab4d1117d1cca71Lajos Molnar unsigned int *mode) 145dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 146dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project syncmsg msg; 147dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int len = strlen(path); 148dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 149dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project msg.req.id = ID_STAT; 150dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project msg.req.namelen = htoll(len); 151dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 152dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(writex(fd, &msg.req, sizeof(msg.req)) || 153dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project writex(fd, path, len)) { 154dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 155dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 156dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 157dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(readx(fd, &msg.stat, sizeof(msg.stat))) { 158dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 159dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 160dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 161dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(msg.stat.id != ID_STAT) { 162dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 163dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 164dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 165dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *timestamp = ltohl(msg.stat.time); 166de8ff4adcaa487259f9ddcd0eab4d1117d1cca71Lajos Molnar *mode = ltohl(msg.stat.mode); 167dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 168dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 169dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 170dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic int sync_start_readtime(int fd, const char *path) 171dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 172dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project syncmsg msg; 173dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int len = strlen(path); 174dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 175dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project msg.req.id = ID_STAT; 176dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project msg.req.namelen = htoll(len); 177dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 178dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(writex(fd, &msg.req, sizeof(msg.req)) || 179dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project writex(fd, path, len)) { 180dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 181dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 182dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 183dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 184dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 185dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 186dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic int sync_finish_readtime(int fd, unsigned int *timestamp, 187f6330a2eeb78c0971f33feee7fd1ee06472a7dbaDavid 'Digit' Turner unsigned int *mode, unsigned int *size) 188dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 189dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project syncmsg msg; 190dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 191dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(readx(fd, &msg.stat, sizeof(msg.stat))) 192dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 193dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 194dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(msg.stat.id != ID_STAT) 195dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 196dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 197dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *timestamp = ltohl(msg.stat.time); 198dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *mode = ltohl(msg.stat.mode); 199dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *size = ltohl(msg.stat.size); 200dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 201dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 202dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 203dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 204dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint sync_readmode(int fd, const char *path, unsigned *mode) 205dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 206dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project syncmsg msg; 207dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int len = strlen(path); 208dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 209dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project msg.req.id = ID_STAT; 210dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project msg.req.namelen = htoll(len); 211dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 212dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(writex(fd, &msg.req, sizeof(msg.req)) || 213dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project writex(fd, path, len)) { 214dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 215dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 216dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 217dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(readx(fd, &msg.stat, sizeof(msg.stat))) { 218dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 219dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 220dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 221dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(msg.stat.id != ID_STAT) { 222dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 223dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 224dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 225dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *mode = ltohl(msg.stat.mode); 226dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 227dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 228dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 22976f2a93b18e0d321d527cb64c2b2c4281e1cf70fMark Lindnerstatic int write_data_file(int fd, const char *path, syncsendbuf *sbuf, int show_progress) 230dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 231dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int lfd, err = 0; 23276f2a93b18e0d321d527cb64c2b2c4281e1cf70fMark Lindner unsigned long long size = 0; 233dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 234dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project lfd = adb_open(path, O_RDONLY); 235dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(lfd < 0) { 236dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr,"cannot open '%s': %s\n", path, strerror(errno)); 237dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 238dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 239dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 24076f2a93b18e0d321d527cb64c2b2c4281e1cf70fMark Lindner if (show_progress) { 24176f2a93b18e0d321d527cb64c2b2c4281e1cf70fMark Lindner // Determine local file size. 24276f2a93b18e0d321d527cb64c2b2c4281e1cf70fMark Lindner struct stat st; 243de8ff4adcaa487259f9ddcd0eab4d1117d1cca71Lajos Molnar if (fstat(lfd, &st)) { 24476f2a93b18e0d321d527cb64c2b2c4281e1cf70fMark Lindner fprintf(stderr,"cannot stat '%s': %s\n", path, strerror(errno)); 24576f2a93b18e0d321d527cb64c2b2c4281e1cf70fMark Lindner return -1; 24676f2a93b18e0d321d527cb64c2b2c4281e1cf70fMark Lindner } 24776f2a93b18e0d321d527cb64c2b2c4281e1cf70fMark Lindner 24876f2a93b18e0d321d527cb64c2b2c4281e1cf70fMark Lindner size = st.st_size; 24976f2a93b18e0d321d527cb64c2b2c4281e1cf70fMark Lindner } 25076f2a93b18e0d321d527cb64c2b2c4281e1cf70fMark Lindner 251dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sbuf->id = ID_DATA; 252dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for(;;) { 253dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int ret; 254dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 255dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ret = adb_read(lfd, sbuf->data, SYNC_DATA_MAX); 256dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(!ret) 257dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 258dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 259dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(ret < 0) { 260dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(errno == EINTR) 261dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project continue; 262dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr,"cannot read '%s': %s\n", path, strerror(errno)); 263dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 264dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 265dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 266dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sbuf->size = htoll(ret); 267dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(writex(fd, sbuf, sizeof(unsigned) * 2 + ret)){ 268dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project err = -1; 269dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 270dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 271dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project total_bytes += ret; 27276f2a93b18e0d321d527cb64c2b2c4281e1cf70fMark Lindner 27376f2a93b18e0d321d527cb64c2b2c4281e1cf70fMark Lindner if (show_progress) { 27476f2a93b18e0d321d527cb64c2b2c4281e1cf70fMark Lindner print_transfer_progress(total_bytes, size); 27576f2a93b18e0d321d527cb64c2b2c4281e1cf70fMark Lindner } 276dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 277dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 278dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_close(lfd); 279dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return err; 280dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 281dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 28276f2a93b18e0d321d527cb64c2b2c4281e1cf70fMark Lindnerstatic int write_data_buffer(int fd, char* file_buffer, int size, syncsendbuf *sbuf, 28376f2a93b18e0d321d527cb64c2b2c4281e1cf70fMark Lindner int show_progress) 284dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 285dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int err = 0; 286dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int total = 0; 287dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 288dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sbuf->id = ID_DATA; 289dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project while (total < size) { 290dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int count = size - total; 291dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (count > SYNC_DATA_MAX) { 292dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project count = SYNC_DATA_MAX; 293dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 294dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 295dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project memcpy(sbuf->data, &file_buffer[total], count); 296dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sbuf->size = htoll(count); 297dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(writex(fd, sbuf, sizeof(unsigned) * 2 + count)){ 298dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project err = -1; 299dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 300dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 301dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project total += count; 302dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project total_bytes += count; 30376f2a93b18e0d321d527cb64c2b2c4281e1cf70fMark Lindner 30476f2a93b18e0d321d527cb64c2b2c4281e1cf70fMark Lindner if (show_progress) { 30576f2a93b18e0d321d527cb64c2b2c4281e1cf70fMark Lindner print_transfer_progress(total, size); 30676f2a93b18e0d321d527cb64c2b2c4281e1cf70fMark Lindner } 307dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 308dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 309dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return err; 310dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 311dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 312dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef HAVE_SYMLINKS 313dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic int write_data_link(int fd, const char *path, syncsendbuf *sbuf) 314dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 315dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int len, ret; 316dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 317dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project len = readlink(path, sbuf->data, SYNC_DATA_MAX-1); 318dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(len < 0) { 319dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "error reading link '%s': %s\n", path, strerror(errno)); 320dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 321dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 322dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sbuf->data[len] = '\0'; 323dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 324dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sbuf->size = htoll(len + 1); 325dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sbuf->id = ID_DATA; 326dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 327dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ret = writex(fd, sbuf, sizeof(unsigned) * 2 + len + 1); 328dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(ret) 329dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 330dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 331dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project total_bytes += len + 1; 332dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 333dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 334dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 335dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 336dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 337dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic int sync_send(int fd, const char *lpath, const char *rpath, 33876f2a93b18e0d321d527cb64c2b2c4281e1cf70fMark Lindner unsigned mtime, mode_t mode, int verifyApk, int show_progress) 339dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 340dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project syncmsg msg; 341dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int len, r; 342dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project syncsendbuf *sbuf = &send_buffer; 343dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char* file_buffer = NULL; 344dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int size = 0; 345dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char tmp[64]; 346dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 347dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project len = strlen(rpath); 348dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(len > 1024) goto fail; 349dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 350dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project snprintf(tmp, sizeof(tmp), ",%d", mode); 351dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project r = strlen(tmp); 352dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 353dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (verifyApk) { 354dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int lfd; 355dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project zipfile_t zip; 356dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project zipentry_t entry; 357dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int amt; 358dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 359dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // if we are transferring an APK file, then sanity check to make sure 360dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // we have a real zip file that contains an AndroidManifest.xml 361dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // this requires that we read the entire file into memory. 362dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project lfd = adb_open(lpath, O_RDONLY); 363dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(lfd < 0) { 364dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr,"cannot open '%s': %s\n", lpath, strerror(errno)); 365dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 366dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 367dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 368dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project size = adb_lseek(lfd, 0, SEEK_END); 369dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (size == -1 || -1 == adb_lseek(lfd, 0, SEEK_SET)) { 370dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "error seeking in file '%s'\n", lpath); 371dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_close(lfd); 372dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 373dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 374dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 375dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project file_buffer = (char *)malloc(size); 376dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (file_buffer == NULL) { 377dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "could not allocate buffer for '%s'\n", 378dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project lpath); 379dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_close(lfd); 380dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 381dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 382dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project amt = adb_read(lfd, file_buffer, size); 383dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (amt != size) { 384dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "error reading from file: '%s'\n", lpath); 385dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_close(lfd); 386dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project free(file_buffer); 387dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 388dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 389dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 390dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_close(lfd); 391dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 392dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project zip = init_zipfile(file_buffer, size); 393dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (zip == NULL) { 394dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "file '%s' is not a valid zip file\n", 395dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project lpath); 396dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project free(file_buffer); 397dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 398dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 399dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 400dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project entry = lookup_zipentry(zip, "AndroidManifest.xml"); 401dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project release_zipfile(zip); 402dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (entry == NULL) { 403dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "file '%s' does not contain AndroidManifest.xml\n", 404dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project lpath); 405dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project free(file_buffer); 406dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 407dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 408dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 409dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 410dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project msg.req.id = ID_SEND; 411dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project msg.req.namelen = htoll(len + r); 412dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 413dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(writex(fd, &msg.req, sizeof(msg.req)) || 414dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project writex(fd, rpath, len) || writex(fd, tmp, r)) { 415dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project free(file_buffer); 416dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project goto fail; 417dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 418dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 419dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (file_buffer) { 42076f2a93b18e0d321d527cb64c2b2c4281e1cf70fMark Lindner write_data_buffer(fd, file_buffer, size, sbuf, show_progress); 421dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project free(file_buffer); 422dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else if (S_ISREG(mode)) 42376f2a93b18e0d321d527cb64c2b2c4281e1cf70fMark Lindner write_data_file(fd, lpath, sbuf, show_progress); 424dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef HAVE_SYMLINKS 425dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project else if (S_ISLNK(mode)) 426dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project write_data_link(fd, lpath, sbuf); 427dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 428dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project else 429dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project goto fail; 430dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 431dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project msg.data.id = ID_DONE; 432dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project msg.data.size = htoll(mtime); 433dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(writex(fd, &msg.data, sizeof(msg.data))) 434dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project goto fail; 435dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 436dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(readx(fd, &msg.status, sizeof(msg.status))) 437dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 438dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 439dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(msg.status.id != ID_OKAY) { 440dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(msg.status.id == ID_FAIL) { 441dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project len = ltohl(msg.status.msglen); 442dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(len > 256) len = 256; 443dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(readx(fd, sbuf->data, len)) { 444dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 445dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 446dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sbuf->data[len] = 0; 447dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else 448dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project strcpy(sbuf->data, "unknown reason"); 449dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 450dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr,"failed to copy '%s' to '%s': %s\n", lpath, rpath, sbuf->data); 451dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 452dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 453dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 454dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 455dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 456dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectfail: 457dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr,"protocol failure\n"); 458dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_close(fd); 459dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 460dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 461dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 46260299dfd6a5dca059a079bc8e11d45a1fecf02d0Mark Salyzynstatic int mkdirs(const char *name) 463dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 464dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int ret; 46560299dfd6a5dca059a079bc8e11d45a1fecf02d0Mark Salyzyn char *x = (char *)name + 1; 466dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 467dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for(;;) { 468dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project x = adb_dirstart(x); 469dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(x == 0) return 0; 470dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *x = 0; 471dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ret = adb_mkdir(name, 0775); 472dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *x = OS_PATH_SEPARATOR; 473dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if((ret < 0) && (errno != EEXIST)) { 474dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return ret; 475dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 476dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project x++; 477dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 478dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 479dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 480dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 48176f2a93b18e0d321d527cb64c2b2c4281e1cf70fMark Lindnerint sync_recv(int fd, const char *rpath, const char *lpath, int show_progress) 482dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 483dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project syncmsg msg; 484dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int len; 485dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int lfd = -1; 486dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *buffer = send_buffer.data; 487dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project unsigned id; 48876f2a93b18e0d321d527cb64c2b2c4281e1cf70fMark Lindner unsigned long long size = 0; 489dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 490dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project len = strlen(rpath); 491dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(len > 1024) return -1; 492dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 49376f2a93b18e0d321d527cb64c2b2c4281e1cf70fMark Lindner if (show_progress) { 49476f2a93b18e0d321d527cb64c2b2c4281e1cf70fMark Lindner // Determine remote file size. 49576f2a93b18e0d321d527cb64c2b2c4281e1cf70fMark Lindner syncmsg stat_msg; 49676f2a93b18e0d321d527cb64c2b2c4281e1cf70fMark Lindner stat_msg.req.id = ID_STAT; 49776f2a93b18e0d321d527cb64c2b2c4281e1cf70fMark Lindner stat_msg.req.namelen = htoll(len); 49876f2a93b18e0d321d527cb64c2b2c4281e1cf70fMark Lindner 49976f2a93b18e0d321d527cb64c2b2c4281e1cf70fMark Lindner if (writex(fd, &stat_msg.req, sizeof(stat_msg.req)) || 50076f2a93b18e0d321d527cb64c2b2c4281e1cf70fMark Lindner writex(fd, rpath, len)) { 50176f2a93b18e0d321d527cb64c2b2c4281e1cf70fMark Lindner return -1; 50276f2a93b18e0d321d527cb64c2b2c4281e1cf70fMark Lindner } 50376f2a93b18e0d321d527cb64c2b2c4281e1cf70fMark Lindner 50476f2a93b18e0d321d527cb64c2b2c4281e1cf70fMark Lindner if (readx(fd, &stat_msg.stat, sizeof(stat_msg.stat))) { 50576f2a93b18e0d321d527cb64c2b2c4281e1cf70fMark Lindner return -1; 50676f2a93b18e0d321d527cb64c2b2c4281e1cf70fMark Lindner } 50776f2a93b18e0d321d527cb64c2b2c4281e1cf70fMark Lindner 50876f2a93b18e0d321d527cb64c2b2c4281e1cf70fMark Lindner if (stat_msg.stat.id != ID_STAT) return -1; 50976f2a93b18e0d321d527cb64c2b2c4281e1cf70fMark Lindner 51076f2a93b18e0d321d527cb64c2b2c4281e1cf70fMark Lindner size = ltohl(stat_msg.stat.size); 51176f2a93b18e0d321d527cb64c2b2c4281e1cf70fMark Lindner } 51276f2a93b18e0d321d527cb64c2b2c4281e1cf70fMark Lindner 513dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project msg.req.id = ID_RECV; 514dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project msg.req.namelen = htoll(len); 515dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(writex(fd, &msg.req, sizeof(msg.req)) || 516dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project writex(fd, rpath, len)) { 517dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 518dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 519dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 520dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(readx(fd, &msg.data, sizeof(msg.data))) { 521dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 522dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 523dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project id = msg.data.id; 524dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 525dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if((id == ID_DATA) || (id == ID_DONE)) { 526dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_unlink(lpath); 52760299dfd6a5dca059a079bc8e11d45a1fecf02d0Mark Salyzyn mkdirs(lpath); 528dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project lfd = adb_creat(lpath, 0644); 529dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(lfd < 0) { 530dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr,"cannot create '%s': %s\n", lpath, strerror(errno)); 531dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 532dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 533dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project goto handle_data; 534dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 535dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project goto remote_error; 536dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 537dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 538dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for(;;) { 539dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(readx(fd, &msg.data, sizeof(msg.data))) { 540dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 541dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 542dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project id = msg.data.id; 543dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 544dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project handle_data: 545dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project len = ltohl(msg.data.size); 546dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(id == ID_DONE) break; 547dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(id != ID_DATA) goto remote_error; 548dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(len > SYNC_DATA_MAX) { 549dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr,"data overrun\n"); 550dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_close(lfd); 551dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 552dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 553dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 554dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(readx(fd, buffer, len)) { 555dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_close(lfd); 556dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 557dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 558dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 559dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(writex(lfd, buffer, len)) { 560dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr,"cannot write '%s': %s\n", rpath, strerror(errno)); 561dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_close(lfd); 562dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 563dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 564dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 565dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project total_bytes += len; 56676f2a93b18e0d321d527cb64c2b2c4281e1cf70fMark Lindner 56776f2a93b18e0d321d527cb64c2b2c4281e1cf70fMark Lindner if (show_progress) { 56876f2a93b18e0d321d527cb64c2b2c4281e1cf70fMark Lindner print_transfer_progress(total_bytes, size); 56976f2a93b18e0d321d527cb64c2b2c4281e1cf70fMark Lindner } 570dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 571dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 572dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_close(lfd); 573dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 574dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 575dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectremote_error: 576dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_close(lfd); 577dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project adb_unlink(lpath); 578dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 579dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(id == ID_FAIL) { 580dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project len = ltohl(msg.data.size); 581dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(len > 256) len = 256; 582dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(readx(fd, buffer, len)) { 583dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 584dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 585dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project buffer[len] = 0; 586dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 587dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project memcpy(buffer, &id, 4); 588dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project buffer[4] = 0; 589dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// strcpy(buffer,"unknown reason"); 590dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 591dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr,"failed to copy '%s' to '%s': %s\n", rpath, lpath, buffer); 592dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 593dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 594dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 595dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 596dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 597dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* --- */ 598dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 599dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 600dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void do_sync_ls_cb(unsigned mode, unsigned size, unsigned time, 601dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const char *name, void *cookie) 602dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 603dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project printf("%08x %08x %08x %s\n", mode, size, time, name); 604dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 605dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 606dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint do_sync_ls(const char *path) 607dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 608dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int fd = adb_connect("sync:"); 609dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(fd < 0) { 610dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr,"error: %s\n", adb_error()); 611dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 612dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 613dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 614dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(sync_ls(fd, path, do_sync_ls_cb, 0)) { 615dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 616dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 617dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sync_quit(fd); 618dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 619dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 620dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 621dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 622dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttypedef struct copyinfo copyinfo; 623dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 624dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstruct copyinfo 625dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 626dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project copyinfo *next; 627dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const char *src; 628dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const char *dst; 629dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project unsigned int time; 630dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project unsigned int mode; 631dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project unsigned int size; 632dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int flag; 633dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project //char data[0]; 634dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}; 635dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 636dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectcopyinfo *mkcopyinfo(const char *spath, const char *dpath, 637dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const char *name, int isdir) 638dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 639dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int slen = strlen(spath); 640dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int dlen = strlen(dpath); 641dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int nlen = strlen(name); 642dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int ssize = slen + nlen + 2; 643dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int dsize = dlen + nlen + 2; 644dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 645dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project copyinfo *ci = malloc(sizeof(copyinfo) + ssize + dsize); 646dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(ci == 0) { 647dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr,"out of memory\n"); 648dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project abort(); 649dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 650dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 651dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ci->next = 0; 652dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ci->time = 0; 653dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ci->mode = 0; 654dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ci->size = 0; 655dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ci->flag = 0; 656dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ci->src = (const char*)(ci + 1); 657dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ci->dst = ci->src + ssize; 658dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project snprintf((char*) ci->src, ssize, isdir ? "%s%s/" : "%s%s", spath, name); 659dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project snprintf((char*) ci->dst, dsize, isdir ? "%s%s/" : "%s%s", dpath, name); 660dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 661dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// fprintf(stderr,"mkcopyinfo('%s','%s')\n", ci->src, ci->dst); 662dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return ci; 663dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 664dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 665dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 666dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic int local_build_list(copyinfo **filelist, 667dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const char *lpath, const char *rpath) 668dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 669dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project DIR *d; 670dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project struct dirent *de; 671dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project struct stat st; 672dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project copyinfo *dirlist = 0; 673dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project copyinfo *ci, *next; 674dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 675dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// fprintf(stderr,"local_build_list('%s','%s')\n", lpath, rpath); 676dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 677dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project d = opendir(lpath); 678dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(d == 0) { 679dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr,"cannot open '%s': %s\n", lpath, strerror(errno)); 680dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 681dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 682dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 683dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project while((de = readdir(d))) { 684dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char stat_path[PATH_MAX]; 685dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *name = de->d_name; 686dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 687dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(name[0] == '.') { 688dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(name[1] == 0) continue; 689dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if((name[1] == '.') && (name[2] == 0)) continue; 690dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 691dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 692dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* 693dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * We could use d_type if HAVE_DIRENT_D_TYPE is defined, but reiserfs 694dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * always returns DT_UNKNOWN, so we just use stat() for all cases. 695dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 696dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (strlen(lpath) + strlen(de->d_name) + 1 > sizeof(stat_path)) 697dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project continue; 698dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project strcpy(stat_path, lpath); 699dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project strcat(stat_path, de->d_name); 700dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 701686bce6390db802bfd2cb4e78f9270596b6decb2Daniel Rosenberg if(!lstat(stat_path, &st)) { 702686bce6390db802bfd2cb4e78f9270596b6decb2Daniel Rosenberg if (S_ISDIR(st.st_mode)) { 703686bce6390db802bfd2cb4e78f9270596b6decb2Daniel Rosenberg ci = mkcopyinfo(lpath, rpath, name, 1); 704686bce6390db802bfd2cb4e78f9270596b6decb2Daniel Rosenberg ci->next = dirlist; 705686bce6390db802bfd2cb4e78f9270596b6decb2Daniel Rosenberg dirlist = ci; 706dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 707686bce6390db802bfd2cb4e78f9270596b6decb2Daniel Rosenberg ci = mkcopyinfo(lpath, rpath, name, 0); 708686bce6390db802bfd2cb4e78f9270596b6decb2Daniel Rosenberg if(lstat(ci->src, &st)) { 709686bce6390db802bfd2cb4e78f9270596b6decb2Daniel Rosenberg fprintf(stderr,"cannot stat '%s': %s\n", ci->src, strerror(errno)); 710686bce6390db802bfd2cb4e78f9270596b6decb2Daniel Rosenberg free(ci); 711686bce6390db802bfd2cb4e78f9270596b6decb2Daniel Rosenberg closedir(d); 712686bce6390db802bfd2cb4e78f9270596b6decb2Daniel Rosenberg return -1; 713686bce6390db802bfd2cb4e78f9270596b6decb2Daniel Rosenberg } 714686bce6390db802bfd2cb4e78f9270596b6decb2Daniel Rosenberg if(!S_ISREG(st.st_mode) && !S_ISLNK(st.st_mode)) { 715686bce6390db802bfd2cb4e78f9270596b6decb2Daniel Rosenberg fprintf(stderr, "skipping special file '%s'\n", ci->src); 716686bce6390db802bfd2cb4e78f9270596b6decb2Daniel Rosenberg free(ci); 717686bce6390db802bfd2cb4e78f9270596b6decb2Daniel Rosenberg } else { 718686bce6390db802bfd2cb4e78f9270596b6decb2Daniel Rosenberg ci->time = st.st_mtime; 719686bce6390db802bfd2cb4e78f9270596b6decb2Daniel Rosenberg ci->mode = st.st_mode; 720686bce6390db802bfd2cb4e78f9270596b6decb2Daniel Rosenberg ci->size = st.st_size; 721686bce6390db802bfd2cb4e78f9270596b6decb2Daniel Rosenberg ci->next = *filelist; 722686bce6390db802bfd2cb4e78f9270596b6decb2Daniel Rosenberg *filelist = ci; 723686bce6390db802bfd2cb4e78f9270596b6decb2Daniel Rosenberg } 724dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 725686bce6390db802bfd2cb4e78f9270596b6decb2Daniel Rosenberg } else { 726686bce6390db802bfd2cb4e78f9270596b6decb2Daniel Rosenberg fprintf(stderr, "cannot lstat '%s': %s\n",stat_path , strerror(errno)); 727dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 728dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 729dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 730dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project closedir(d); 731dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 732dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for(ci = dirlist; ci != 0; ci = next) { 733dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project next = ci->next; 734dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project local_build_list(filelist, ci->src, ci->dst); 735dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project free(ci); 736dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 737dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 738dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 739dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 740dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 741dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 742705c944c0e2a50150ffb41707b6b3daebb45cf79Anthony Newnamstatic int copy_local_dir_remote(int fd, const char *lpath, const char *rpath, int checktimestamps, int listonly) 743dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 744dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project copyinfo *filelist = 0; 745dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project copyinfo *ci, *next; 746dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int pushed = 0; 747dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int skipped = 0; 748dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 749dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if((lpath[0] == 0) || (rpath[0] == 0)) return -1; 750dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(lpath[strlen(lpath) - 1] != '/') { 751dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int tmplen = strlen(lpath)+2; 752dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *tmp = malloc(tmplen); 753dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(tmp == 0) return -1; 754dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project snprintf(tmp, tmplen, "%s/",lpath); 755dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project lpath = tmp; 756dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 757dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(rpath[strlen(rpath) - 1] != '/') { 758dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int tmplen = strlen(rpath)+2; 759dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *tmp = malloc(tmplen); 760dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(tmp == 0) return -1; 761dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project snprintf(tmp, tmplen, "%s/",rpath); 762dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project rpath = tmp; 763dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 764dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 765dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(local_build_list(&filelist, lpath, rpath)) { 766dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 767dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 768dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 769dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(checktimestamps){ 770dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for(ci = filelist; ci != 0; ci = ci->next) { 771dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(sync_start_readtime(fd, ci->dst)) { 772dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 773dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 774dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 775dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for(ci = filelist; ci != 0; ci = ci->next) { 776dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project unsigned int timestamp, mode, size; 777dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(sync_finish_readtime(fd, ×tamp, &mode, &size)) 778dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 779dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(size == ci->size) { 780dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* for links, we cannot update the atime/mtime */ 781dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if((S_ISREG(ci->mode & mode) && timestamp == ci->time) || 782dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project (S_ISLNK(ci->mode & mode) && timestamp >= ci->time)) 783dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ci->flag = 1; 784dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 785dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 786dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 787dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for(ci = filelist; ci != 0; ci = next) { 788dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project next = ci->next; 789dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(ci->flag == 0) { 790705c944c0e2a50150ffb41707b6b3daebb45cf79Anthony Newnam fprintf(stderr,"%spush: %s -> %s\n", listonly ? "would " : "", ci->src, ci->dst); 791705c944c0e2a50150ffb41707b6b3daebb45cf79Anthony Newnam if(!listonly && 79276f2a93b18e0d321d527cb64c2b2c4281e1cf70fMark Lindner sync_send(fd, ci->src, ci->dst, ci->time, ci->mode, 0 /* no verify APK */, 79376f2a93b18e0d321d527cb64c2b2c4281e1cf70fMark Lindner 0 /* no show progress */)) { 794dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 795dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 796dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project pushed++; 797dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 798dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project skipped++; 799dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 800dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project free(ci); 801dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 802dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 803dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr,"%d file%s pushed. %d file%s skipped.\n", 804dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project pushed, (pushed == 1) ? "" : "s", 805dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project skipped, (skipped == 1) ? "" : "s"); 806dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 807dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 808dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 809dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 810dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 81176f2a93b18e0d321d527cb64c2b2c4281e1cf70fMark Lindnerint do_sync_push(const char *lpath, const char *rpath, int verifyApk, int show_progress) 812dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 813dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project struct stat st; 814dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project unsigned mode; 815dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int fd; 816dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 817dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fd = adb_connect("sync:"); 818dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(fd < 0) { 819dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr,"error: %s\n", adb_error()); 820dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 821dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 822dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 823dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(stat(lpath, &st)) { 824dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr,"cannot stat '%s': %s\n", lpath, strerror(errno)); 825dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sync_quit(fd); 826dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 827dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 828dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 829dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(S_ISDIR(st.st_mode)) { 830dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project BEGIN(); 831705c944c0e2a50150ffb41707b6b3daebb45cf79Anthony Newnam if(copy_local_dir_remote(fd, lpath, rpath, 0, 0)) { 832dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 833dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 834dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project END(); 835dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sync_quit(fd); 836dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 837dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 838dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(sync_readmode(fd, rpath, &mode)) { 839dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 840dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 841dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if((mode != 0) && S_ISDIR(mode)) { 842dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* if we're copying a local file to a remote directory, 843dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ** we *really* want to copy to remotedir + "/" + localfilename 844dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 845dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const char *name = adb_dirstop(lpath); 846dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(name == 0) { 847dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project name = lpath; 848dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 849dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project name++; 850dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 851dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int tmplen = strlen(name) + strlen(rpath) + 2; 852dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *tmp = malloc(strlen(name) + strlen(rpath) + 2); 853dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(tmp == 0) return 1; 854dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project snprintf(tmp, tmplen, "%s/%s", rpath, name); 855dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project rpath = tmp; 856dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 857dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project BEGIN(); 85876f2a93b18e0d321d527cb64c2b2c4281e1cf70fMark Lindner if(sync_send(fd, lpath, rpath, st.st_mtime, st.st_mode, verifyApk, show_progress)) { 859dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 860dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 861dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project END(); 862dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sync_quit(fd); 863dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 864dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 865dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 866dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 867dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 868dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 869dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 870dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 871dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttypedef struct { 872dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project copyinfo **filelist; 873dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project copyinfo **dirlist; 874dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const char *rpath; 875dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const char *lpath; 876dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} sync_ls_build_list_cb_args; 877dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 878dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid 879dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectsync_ls_build_list_cb(unsigned mode, unsigned size, unsigned time, 880dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const char *name, void *cookie) 881dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 882dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sync_ls_build_list_cb_args *args = (sync_ls_build_list_cb_args *)cookie; 883dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project copyinfo *ci; 884dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 885dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (S_ISDIR(mode)) { 886dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project copyinfo **dirlist = args->dirlist; 887dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 888dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* Don't try recursing down "." or ".." */ 889dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (name[0] == '.') { 890dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (name[1] == '\0') return; 891dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if ((name[1] == '.') && (name[2] == '\0')) return; 892dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 893dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 894dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ci = mkcopyinfo(args->rpath, args->lpath, name, 1); 895dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ci->next = *dirlist; 896dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *dirlist = ci; 897dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else if (S_ISREG(mode) || S_ISLNK(mode)) { 898dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project copyinfo **filelist = args->filelist; 899dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 900dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ci = mkcopyinfo(args->rpath, args->lpath, name, 0); 901dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ci->time = time; 902dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ci->mode = mode; 903dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ci->size = size; 904dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ci->next = *filelist; 905dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *filelist = ci; 906dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 907dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "skipping special file '%s'\n", name); 908dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 909dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 910dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 911dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic int remote_build_list(int syncfd, copyinfo **filelist, 912dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const char *rpath, const char *lpath) 913dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 914dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project copyinfo *dirlist = NULL; 915dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sync_ls_build_list_cb_args args; 916dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 917dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project args.filelist = filelist; 918dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project args.dirlist = &dirlist; 919dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project args.rpath = rpath; 920dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project args.lpath = lpath; 921dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 922dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* Put the files/dirs in rpath on the lists. */ 923dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (sync_ls(syncfd, rpath, sync_ls_build_list_cb, (void *)&args)) { 924dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 925dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 926dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 927dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* Recurse into each directory we found. */ 928dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project while (dirlist != NULL) { 929dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project copyinfo *next = dirlist->next; 930dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (remote_build_list(syncfd, filelist, dirlist->src, dirlist->dst)) { 931dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 932dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 933dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project free(dirlist); 934dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project dirlist = next; 935dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 936dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 937dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 938dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 939dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 940de8ff4adcaa487259f9ddcd0eab4d1117d1cca71Lajos Molnarstatic int set_time_and_mode(const char *lpath, unsigned int time, unsigned int mode) 941de8ff4adcaa487259f9ddcd0eab4d1117d1cca71Lajos Molnar{ 9427a5e2bd0621ee0b1c66d8f4c21497ffb62feff42Greg Hackmann struct utimbuf times = { time, time }; 9437a5e2bd0621ee0b1c66d8f4c21497ffb62feff42Greg Hackmann int r1 = utime(lpath, ×); 944de8ff4adcaa487259f9ddcd0eab4d1117d1cca71Lajos Molnar 945de8ff4adcaa487259f9ddcd0eab4d1117d1cca71Lajos Molnar /* use umask for permissions */ 946de8ff4adcaa487259f9ddcd0eab4d1117d1cca71Lajos Molnar mode_t mask=umask(0000); 947de8ff4adcaa487259f9ddcd0eab4d1117d1cca71Lajos Molnar umask(mask); 948de8ff4adcaa487259f9ddcd0eab4d1117d1cca71Lajos Molnar int r2 = chmod(lpath, mode & ~mask); 949de8ff4adcaa487259f9ddcd0eab4d1117d1cca71Lajos Molnar 950de8ff4adcaa487259f9ddcd0eab4d1117d1cca71Lajos Molnar return r1 ? : r2; 951de8ff4adcaa487259f9ddcd0eab4d1117d1cca71Lajos Molnar} 952de8ff4adcaa487259f9ddcd0eab4d1117d1cca71Lajos Molnar 953dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic int copy_remote_dir_local(int fd, const char *rpath, const char *lpath, 954de8ff4adcaa487259f9ddcd0eab4d1117d1cca71Lajos Molnar int copy_attrs) 955dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 956dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project copyinfo *filelist = 0; 957dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project copyinfo *ci, *next; 958dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int pulled = 0; 959dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int skipped = 0; 960dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 961dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* Make sure that both directory paths end in a slash. */ 962dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (rpath[0] == 0 || lpath[0] == 0) return -1; 963dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (rpath[strlen(rpath) - 1] != '/') { 964dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int tmplen = strlen(rpath) + 2; 965dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *tmp = malloc(tmplen); 966dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (tmp == 0) return -1; 967dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project snprintf(tmp, tmplen, "%s/", rpath); 968dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project rpath = tmp; 969dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 970dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (lpath[strlen(lpath) - 1] != '/') { 971dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int tmplen = strlen(lpath) + 2; 972dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *tmp = malloc(tmplen); 973dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (tmp == 0) return -1; 974dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project snprintf(tmp, tmplen, "%s/", lpath); 975dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project lpath = tmp; 976dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 977dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 978dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "pull: building file list...\n"); 979dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* Recursively build the list of files to copy. */ 980dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (remote_build_list(fd, &filelist, rpath, lpath)) { 981dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 982dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 983dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 984dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for (ci = filelist; ci != 0; ci = next) { 985dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project next = ci->next; 986dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (ci->flag == 0) { 987dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "pull: %s -> %s\n", ci->src, ci->dst); 98876f2a93b18e0d321d527cb64c2b2c4281e1cf70fMark Lindner if (sync_recv(fd, ci->src, ci->dst, 0 /* no show progress */)) { 989dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 990dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 991de8ff4adcaa487259f9ddcd0eab4d1117d1cca71Lajos Molnar 992de8ff4adcaa487259f9ddcd0eab4d1117d1cca71Lajos Molnar if (copy_attrs && set_time_and_mode(ci->dst, ci->time, ci->mode)) { 993de8ff4adcaa487259f9ddcd0eab4d1117d1cca71Lajos Molnar return 1; 994de8ff4adcaa487259f9ddcd0eab4d1117d1cca71Lajos Molnar } 995dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project pulled++; 996dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 997dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project skipped++; 998dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 999dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project free(ci); 1000dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1001dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1002dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "%d file%s pulled. %d file%s skipped.\n", 1003dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project pulled, (pulled == 1) ? "" : "s", 1004dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project skipped, (skipped == 1) ? "" : "s"); 1005dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1006dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 1007dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 1008dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1009de8ff4adcaa487259f9ddcd0eab4d1117d1cca71Lajos Molnarint do_sync_pull(const char *rpath, const char *lpath, int show_progress, int copy_attrs) 1010dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 1011de8ff4adcaa487259f9ddcd0eab4d1117d1cca71Lajos Molnar unsigned mode, time; 1012dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project struct stat st; 1013dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1014dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int fd; 1015dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1016dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fd = adb_connect("sync:"); 1017dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(fd < 0) { 1018dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr,"error: %s\n", adb_error()); 1019dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 1020dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1021dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1022de8ff4adcaa487259f9ddcd0eab4d1117d1cca71Lajos Molnar if(sync_readtime(fd, rpath, &time, &mode)) { 1023dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 1024dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1025dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(mode == 0) { 1026dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr,"remote object '%s' does not exist\n", rpath); 1027dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 1028dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1029dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1030457d81cec12fce6e38c0dcd94d33d06036c2618aMatt Fischer if(S_ISREG(mode) || S_ISLNK(mode) || S_ISCHR(mode) || S_ISBLK(mode)) { 1031dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(stat(lpath, &st) == 0) { 1032dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(S_ISDIR(st.st_mode)) { 1033dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* if we're copying a remote file to a local directory, 1034dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ** we *really* want to copy to localdir + "/" + remotefilename 1035dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 1036dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const char *name = adb_dirstop(rpath); 1037dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(name == 0) { 1038dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project name = rpath; 1039dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 1040dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project name++; 1041dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1042dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int tmplen = strlen(name) + strlen(lpath) + 2; 1043dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *tmp = malloc(tmplen); 1044dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(tmp == 0) return 1; 1045dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project snprintf(tmp, tmplen, "%s/%s", lpath, name); 1046dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project lpath = tmp; 1047dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1048dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1049dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project BEGIN(); 105076f2a93b18e0d321d527cb64c2b2c4281e1cf70fMark Lindner if (sync_recv(fd, rpath, lpath, show_progress)) { 1051dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 1052dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 1053de8ff4adcaa487259f9ddcd0eab4d1117d1cca71Lajos Molnar if (copy_attrs && set_time_and_mode(lpath, time, mode)) 1054de8ff4adcaa487259f9ddcd0eab4d1117d1cca71Lajos Molnar return 1; 1055dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project END(); 1056dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sync_quit(fd); 1057dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 1058dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1059dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else if(S_ISDIR(mode)) { 1060dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project BEGIN(); 1061de8ff4adcaa487259f9ddcd0eab4d1117d1cca71Lajos Molnar if (copy_remote_dir_local(fd, rpath, lpath, copy_attrs)) { 1062dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 1063dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 1064dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project END(); 1065dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sync_quit(fd); 1066dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 1067dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1068dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 1069dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr,"remote object '%s' not a file or directory\n", rpath); 1070dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 1071dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1072dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 1073dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1074705c944c0e2a50150ffb41707b6b3daebb45cf79Anthony Newnamint do_sync_sync(const char *lpath, const char *rpath, int listonly) 1075dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 1076dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr,"syncing %s...\n",rpath); 1077dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1078dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int fd = adb_connect("sync:"); 1079dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(fd < 0) { 1080dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr,"error: %s\n", adb_error()); 1081dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 1082dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1083dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1084dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project BEGIN(); 1085705c944c0e2a50150ffb41707b6b3daebb45cf79Anthony Newnam if(copy_local_dir_remote(fd, lpath, rpath, 1, listonly)){ 1086dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 1087dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 1088dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project END(); 1089dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sync_quit(fd); 1090dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 1091dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1092dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 1093