file_sync_client.c revision 7a5e2bd0621ee0b1c66d8f4c21497ffb62feff42
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 462dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic int mkdirs(char *name) 463dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 464dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int ret; 465dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *x = 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); 527dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project mkdirs((char *)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 stat(stat_path, &st); 701dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 702dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (S_ISDIR(st.st_mode)) { 703dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ci = mkcopyinfo(lpath, rpath, name, 1); 704dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ci->next = dirlist; 705dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project dirlist = ci; 706dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 707dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ci = mkcopyinfo(lpath, rpath, name, 0); 708dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(lstat(ci->src, &st)) { 709dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr,"cannot stat '%s': %s\n", ci->src, strerror(errno)); 71014e28d39f7f094225c1ddae8fa43bd792c621a8fElliott Hughes free(ci); 711408fa57864c01113deaa213e5c1848a9c594ae92JP Abgrall closedir(d); 712dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 713dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 714dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(!S_ISREG(st.st_mode) && !S_ISLNK(st.st_mode)) { 715dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "skipping special file '%s'\n", ci->src); 716dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project free(ci); 717dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 718dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ci->time = st.st_mtime; 719dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ci->mode = st.st_mode; 720dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ci->size = st.st_size; 721dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ci->next = *filelist; 722dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *filelist = ci; 723dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 724dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 725dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 726dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 727dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project closedir(d); 728dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 729dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for(ci = dirlist; ci != 0; ci = next) { 730dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project next = ci->next; 731dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project local_build_list(filelist, ci->src, ci->dst); 732dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project free(ci); 733dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 734dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 735dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 736dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 737dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 738dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 739705c944c0e2a50150ffb41707b6b3daebb45cf79Anthony Newnamstatic int copy_local_dir_remote(int fd, const char *lpath, const char *rpath, int checktimestamps, int listonly) 740dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 741dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project copyinfo *filelist = 0; 742dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project copyinfo *ci, *next; 743dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int pushed = 0; 744dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int skipped = 0; 745dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 746dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if((lpath[0] == 0) || (rpath[0] == 0)) return -1; 747dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(lpath[strlen(lpath) - 1] != '/') { 748dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int tmplen = strlen(lpath)+2; 749dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *tmp = malloc(tmplen); 750dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(tmp == 0) return -1; 751dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project snprintf(tmp, tmplen, "%s/",lpath); 752dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project lpath = tmp; 753dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 754dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(rpath[strlen(rpath) - 1] != '/') { 755dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int tmplen = strlen(rpath)+2; 756dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *tmp = malloc(tmplen); 757dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(tmp == 0) return -1; 758dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project snprintf(tmp, tmplen, "%s/",rpath); 759dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project rpath = tmp; 760dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 761dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 762dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(local_build_list(&filelist, lpath, rpath)) { 763dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 764dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 765dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 766dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(checktimestamps){ 767dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for(ci = filelist; ci != 0; ci = ci->next) { 768dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(sync_start_readtime(fd, ci->dst)) { 769dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 770dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 771dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 772dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for(ci = filelist; ci != 0; ci = ci->next) { 773dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project unsigned int timestamp, mode, size; 774dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(sync_finish_readtime(fd, ×tamp, &mode, &size)) 775dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 776dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(size == ci->size) { 777dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* for links, we cannot update the atime/mtime */ 778dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if((S_ISREG(ci->mode & mode) && timestamp == ci->time) || 779dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project (S_ISLNK(ci->mode & mode) && timestamp >= ci->time)) 780dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ci->flag = 1; 781dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 782dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 783dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 784dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for(ci = filelist; ci != 0; ci = next) { 785dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project next = ci->next; 786dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(ci->flag == 0) { 787705c944c0e2a50150ffb41707b6b3daebb45cf79Anthony Newnam fprintf(stderr,"%spush: %s -> %s\n", listonly ? "would " : "", ci->src, ci->dst); 788705c944c0e2a50150ffb41707b6b3daebb45cf79Anthony Newnam if(!listonly && 78976f2a93b18e0d321d527cb64c2b2c4281e1cf70fMark Lindner sync_send(fd, ci->src, ci->dst, ci->time, ci->mode, 0 /* no verify APK */, 79076f2a93b18e0d321d527cb64c2b2c4281e1cf70fMark Lindner 0 /* no show progress */)) { 791dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 792dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 793dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project pushed++; 794dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 795dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project skipped++; 796dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 797dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project free(ci); 798dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 799dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 800dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr,"%d file%s pushed. %d file%s skipped.\n", 801dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project pushed, (pushed == 1) ? "" : "s", 802dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project skipped, (skipped == 1) ? "" : "s"); 803dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 804dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 805dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 806dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 807dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 80876f2a93b18e0d321d527cb64c2b2c4281e1cf70fMark Lindnerint do_sync_push(const char *lpath, const char *rpath, int verifyApk, int show_progress) 809dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 810dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project struct stat st; 811dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project unsigned mode; 812dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int fd; 813dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 814dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fd = adb_connect("sync:"); 815dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(fd < 0) { 816dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr,"error: %s\n", adb_error()); 817dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 818dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 819dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 820dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(stat(lpath, &st)) { 821dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr,"cannot stat '%s': %s\n", lpath, strerror(errno)); 822dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sync_quit(fd); 823dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 824dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 825dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 826dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(S_ISDIR(st.st_mode)) { 827dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project BEGIN(); 828705c944c0e2a50150ffb41707b6b3daebb45cf79Anthony Newnam if(copy_local_dir_remote(fd, lpath, rpath, 0, 0)) { 829dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 830dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 831dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project END(); 832dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sync_quit(fd); 833dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 834dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 835dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(sync_readmode(fd, rpath, &mode)) { 836dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 837dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 838dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if((mode != 0) && S_ISDIR(mode)) { 839dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* if we're copying a local file to a remote directory, 840dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ** we *really* want to copy to remotedir + "/" + localfilename 841dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 842dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const char *name = adb_dirstop(lpath); 843dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(name == 0) { 844dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project name = lpath; 845dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 846dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project name++; 847dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 848dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int tmplen = strlen(name) + strlen(rpath) + 2; 849dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *tmp = malloc(strlen(name) + strlen(rpath) + 2); 850dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(tmp == 0) return 1; 851dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project snprintf(tmp, tmplen, "%s/%s", rpath, name); 852dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project rpath = tmp; 853dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 854dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project BEGIN(); 85576f2a93b18e0d321d527cb64c2b2c4281e1cf70fMark Lindner if(sync_send(fd, lpath, rpath, st.st_mtime, st.st_mode, verifyApk, show_progress)) { 856dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 857dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 858dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project END(); 859dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sync_quit(fd); 860dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 861dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 862dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 863dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 864dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 865dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 866dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 867dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 868dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttypedef struct { 869dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project copyinfo **filelist; 870dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project copyinfo **dirlist; 871dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const char *rpath; 872dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const char *lpath; 873dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} sync_ls_build_list_cb_args; 874dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 875dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid 876dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectsync_ls_build_list_cb(unsigned mode, unsigned size, unsigned time, 877dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const char *name, void *cookie) 878dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 879dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sync_ls_build_list_cb_args *args = (sync_ls_build_list_cb_args *)cookie; 880dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project copyinfo *ci; 881dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 882dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (S_ISDIR(mode)) { 883dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project copyinfo **dirlist = args->dirlist; 884dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 885dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* Don't try recursing down "." or ".." */ 886dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (name[0] == '.') { 887dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (name[1] == '\0') return; 888dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if ((name[1] == '.') && (name[2] == '\0')) return; 889dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 890dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 891dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ci = mkcopyinfo(args->rpath, args->lpath, name, 1); 892dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ci->next = *dirlist; 893dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *dirlist = ci; 894dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else if (S_ISREG(mode) || S_ISLNK(mode)) { 895dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project copyinfo **filelist = args->filelist; 896dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 897dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ci = mkcopyinfo(args->rpath, args->lpath, name, 0); 898dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ci->time = time; 899dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ci->mode = mode; 900dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ci->size = size; 901dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ci->next = *filelist; 902dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *filelist = ci; 903dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 904dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "skipping special file '%s'\n", name); 905dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 906dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 907dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 908dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic int remote_build_list(int syncfd, copyinfo **filelist, 909dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const char *rpath, const char *lpath) 910dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 911dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project copyinfo *dirlist = NULL; 912dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sync_ls_build_list_cb_args args; 913dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 914dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project args.filelist = filelist; 915dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project args.dirlist = &dirlist; 916dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project args.rpath = rpath; 917dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project args.lpath = lpath; 918dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 919dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* Put the files/dirs in rpath on the lists. */ 920dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (sync_ls(syncfd, rpath, sync_ls_build_list_cb, (void *)&args)) { 921dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 922dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 923dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 924dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* Recurse into each directory we found. */ 925dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project while (dirlist != NULL) { 926dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project copyinfo *next = dirlist->next; 927dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (remote_build_list(syncfd, filelist, dirlist->src, dirlist->dst)) { 928dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 929dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 930dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project free(dirlist); 931dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project dirlist = next; 932dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 933dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 934dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 935dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 936dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 937de8ff4adcaa487259f9ddcd0eab4d1117d1cca71Lajos Molnarstatic int set_time_and_mode(const char *lpath, unsigned int time, unsigned int mode) 938de8ff4adcaa487259f9ddcd0eab4d1117d1cca71Lajos Molnar{ 9397a5e2bd0621ee0b1c66d8f4c21497ffb62feff42Greg Hackmann struct utimbuf times = { time, time }; 9407a5e2bd0621ee0b1c66d8f4c21497ffb62feff42Greg Hackmann int r1 = utime(lpath, ×); 941de8ff4adcaa487259f9ddcd0eab4d1117d1cca71Lajos Molnar 942de8ff4adcaa487259f9ddcd0eab4d1117d1cca71Lajos Molnar /* use umask for permissions */ 943de8ff4adcaa487259f9ddcd0eab4d1117d1cca71Lajos Molnar mode_t mask=umask(0000); 944de8ff4adcaa487259f9ddcd0eab4d1117d1cca71Lajos Molnar umask(mask); 945de8ff4adcaa487259f9ddcd0eab4d1117d1cca71Lajos Molnar int r2 = chmod(lpath, mode & ~mask); 946de8ff4adcaa487259f9ddcd0eab4d1117d1cca71Lajos Molnar 947de8ff4adcaa487259f9ddcd0eab4d1117d1cca71Lajos Molnar return r1 ? : r2; 948de8ff4adcaa487259f9ddcd0eab4d1117d1cca71Lajos Molnar} 949de8ff4adcaa487259f9ddcd0eab4d1117d1cca71Lajos Molnar 950dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic int copy_remote_dir_local(int fd, const char *rpath, const char *lpath, 951de8ff4adcaa487259f9ddcd0eab4d1117d1cca71Lajos Molnar int copy_attrs) 952dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 953dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project copyinfo *filelist = 0; 954dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project copyinfo *ci, *next; 955dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int pulled = 0; 956dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int skipped = 0; 957dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 958dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* Make sure that both directory paths end in a slash. */ 959dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (rpath[0] == 0 || lpath[0] == 0) return -1; 960dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (rpath[strlen(rpath) - 1] != '/') { 961dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int tmplen = strlen(rpath) + 2; 962dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *tmp = malloc(tmplen); 963dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (tmp == 0) return -1; 964dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project snprintf(tmp, tmplen, "%s/", rpath); 965dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project rpath = tmp; 966dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 967dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (lpath[strlen(lpath) - 1] != '/') { 968dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int tmplen = strlen(lpath) + 2; 969dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *tmp = malloc(tmplen); 970dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (tmp == 0) return -1; 971dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project snprintf(tmp, tmplen, "%s/", lpath); 972dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project lpath = tmp; 973dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 974dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 975dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "pull: building file list...\n"); 976dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* Recursively build the list of files to copy. */ 977dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (remote_build_list(fd, &filelist, rpath, lpath)) { 978dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 979dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 980dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 981dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for (ci = filelist; ci != 0; ci = next) { 982dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project next = ci->next; 983dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (ci->flag == 0) { 984dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "pull: %s -> %s\n", ci->src, ci->dst); 98576f2a93b18e0d321d527cb64c2b2c4281e1cf70fMark Lindner if (sync_recv(fd, ci->src, ci->dst, 0 /* no show progress */)) { 986dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 987dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 988de8ff4adcaa487259f9ddcd0eab4d1117d1cca71Lajos Molnar 989de8ff4adcaa487259f9ddcd0eab4d1117d1cca71Lajos Molnar if (copy_attrs && set_time_and_mode(ci->dst, ci->time, ci->mode)) { 990de8ff4adcaa487259f9ddcd0eab4d1117d1cca71Lajos Molnar return 1; 991de8ff4adcaa487259f9ddcd0eab4d1117d1cca71Lajos Molnar } 992dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project pulled++; 993dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 994dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project skipped++; 995dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 996dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project free(ci); 997dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 998dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 999dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "%d file%s pulled. %d file%s skipped.\n", 1000dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project pulled, (pulled == 1) ? "" : "s", 1001dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project skipped, (skipped == 1) ? "" : "s"); 1002dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1003dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 1004dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 1005dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1006de8ff4adcaa487259f9ddcd0eab4d1117d1cca71Lajos Molnarint do_sync_pull(const char *rpath, const char *lpath, int show_progress, int copy_attrs) 1007dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 1008de8ff4adcaa487259f9ddcd0eab4d1117d1cca71Lajos Molnar unsigned mode, time; 1009dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project struct stat st; 1010dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1011dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int fd; 1012dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1013dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fd = adb_connect("sync:"); 1014dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(fd < 0) { 1015dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr,"error: %s\n", adb_error()); 1016dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 1017dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1018dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1019de8ff4adcaa487259f9ddcd0eab4d1117d1cca71Lajos Molnar if(sync_readtime(fd, rpath, &time, &mode)) { 1020dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 1021dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1022dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(mode == 0) { 1023dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr,"remote object '%s' does not exist\n", rpath); 1024dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 1025dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1026dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1027457d81cec12fce6e38c0dcd94d33d06036c2618aMatt Fischer if(S_ISREG(mode) || S_ISLNK(mode) || S_ISCHR(mode) || S_ISBLK(mode)) { 1028dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(stat(lpath, &st) == 0) { 1029dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(S_ISDIR(st.st_mode)) { 1030dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* if we're copying a remote file to a local directory, 1031dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ** we *really* want to copy to localdir + "/" + remotefilename 1032dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 1033dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const char *name = adb_dirstop(rpath); 1034dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(name == 0) { 1035dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project name = rpath; 1036dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 1037dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project name++; 1038dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1039dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int tmplen = strlen(name) + strlen(lpath) + 2; 1040dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *tmp = malloc(tmplen); 1041dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(tmp == 0) return 1; 1042dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project snprintf(tmp, tmplen, "%s/%s", lpath, name); 1043dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project lpath = tmp; 1044dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1045dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1046dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project BEGIN(); 104776f2a93b18e0d321d527cb64c2b2c4281e1cf70fMark Lindner if (sync_recv(fd, rpath, lpath, show_progress)) { 1048dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 1049dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 1050de8ff4adcaa487259f9ddcd0eab4d1117d1cca71Lajos Molnar if (copy_attrs && set_time_and_mode(lpath, time, mode)) 1051de8ff4adcaa487259f9ddcd0eab4d1117d1cca71Lajos Molnar return 1; 1052dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project END(); 1053dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sync_quit(fd); 1054dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 1055dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1056dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else if(S_ISDIR(mode)) { 1057dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project BEGIN(); 1058de8ff4adcaa487259f9ddcd0eab4d1117d1cca71Lajos Molnar if (copy_remote_dir_local(fd, rpath, lpath, copy_attrs)) { 1059dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 1060dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 1061dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project END(); 1062dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sync_quit(fd); 1063dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 1064dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1065dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 1066dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr,"remote object '%s' not a file or directory\n", rpath); 1067dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 1068dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1069dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 1070dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1071705c944c0e2a50150ffb41707b6b3daebb45cf79Anthony Newnamint do_sync_sync(const char *lpath, const char *rpath, int listonly) 1072dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 1073dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr,"syncing %s...\n",rpath); 1074dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1075dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int fd = adb_connect("sync:"); 1076dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(fd < 0) { 1077dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr,"error: %s\n", adb_error()); 1078dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 1079dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1080dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1081dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project BEGIN(); 1082705c944c0e2a50150ffb41707b6b3daebb45cf79Anthony Newnam if(copy_local_dir_remote(fd, lpath, rpath, 1, listonly)){ 1083dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 1084dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 1085dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project END(); 1086dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sync_quit(fd); 1087dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 1088dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1089dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 1090