static void recover_service(int s, void *cookie) { unsigned char buf[4096]; unsigned count = (unsigned) cookie; int fd; fd = adb_creat("/tmp/update", 0644); if(fd < 0) { adb_close(s); return; } while(count > 0) { unsigned xfer = (count > 4096) ? 4096 : count; if(readx(s, buf, xfer)) break; if(writex(fd, buf, xfer)) break; count -= xfer; } if(count == 0) { writex(s, "OKAY", 4); } else { writex(s, "FAIL", 4); } adb_close(fd); adb_close(s); fd = adb_creat("/tmp/update.begin", 0644); adb_close(fd); }
static int backup(int argc, char** argv) { char buf[4096]; char default_name[32]; const char* filename = strcpy(default_name, "./backup.ab"); int fd, outFd; int i, j; /* find, extract, and use any -f argument */ for (i = 1; i < argc; i++) { if (!strcmp("-f", argv[i])) { if (i == argc-1) { fprintf(stderr, "adb: -f passed with no filename\n"); return usage(); } filename = argv[i+1]; for (j = i+2; j <= argc; ) { argv[i++] = argv[j++]; } argc -= 2; argv[argc] = NULL; } } /* bare "adb backup" or "adb backup -f filename" are not valid invocations */ if (argc < 2) return usage(); adb_unlink(filename); mkdirs((char *)filename); outFd = adb_creat(filename, 0640); if (outFd < 0) { fprintf(stderr, "adb: unable to open file %s\n", filename); return -1; } snprintf(buf, sizeof(buf), "backup"); for (argc--, argv++; argc; argc--, argv++) { strncat(buf, ":", sizeof(buf) - strlen(buf) - 1); strncat(buf, argv[0], sizeof(buf) - strlen(buf) - 1); } D("backup. filename=%s buf=%s\n", filename, buf); fd = adb_connect(buf); if (fd < 0) { fprintf(stderr, "adb: unable to connect for backup\n"); adb_close(outFd); return -1; } printf("Now unlock your device and confirm the backup operation.\n"); copy_to_file(fd, outFd); adb_close(fd); adb_close(outFd); return 0; }
void test_mkdirs(const std::string basepath) { // Test creating a directory hierarchy. EXPECT_TRUE(mkdirs(basepath)); // Test finding an existing directory hierarchy. EXPECT_TRUE(mkdirs(basepath)); const std::string filepath = basepath + "/file"; // Verify that the hierarchy was created by trying to create a file in it. EXPECT_NE(-1, adb_creat(filepath.c_str(), 0600)); // If a file exists where we want a directory, the operation should fail. EXPECT_FALSE(mkdirs(filepath)); }
int sync_recv(int fd, const char *rpath, const char *lpath, int show_progress) { syncmsg msg; int len; int lfd = -1; char *buffer = send_buffer.data; unsigned id; unsigned long long size = 0; len = strlen(rpath); if(len > 1024) return -1; if (show_progress) { // Determine remote file size. syncmsg stat_msg; stat_msg.req.id = ID_STAT; stat_msg.req.namelen = htoll(len); if (writex(fd, &stat_msg.req, sizeof(stat_msg.req)) || writex(fd, rpath, len)) { return -1; } if (readx(fd, &stat_msg.stat, sizeof(stat_msg.stat))) { return -1; } if (stat_msg.stat.id != ID_STAT) return -1; size = ltohl(stat_msg.stat.size); } msg.req.id = ID_RECV; msg.req.namelen = htoll(len); if(writex(fd, &msg.req, sizeof(msg.req)) || writex(fd, rpath, len)) { return -1; } if(readx(fd, &msg.data, sizeof(msg.data))) { return -1; } id = msg.data.id; if((id == ID_DATA) || (id == ID_DONE)) { adb_unlink(lpath); mkdirs(lpath); lfd = adb_creat(lpath, 0644); if(lfd < 0) { fprintf(stderr,"cannot create '%s': %s\n", lpath, strerror(errno)); return -1; } goto handle_data; } else { goto remote_error; } for(;;) { if(readx(fd, &msg.data, sizeof(msg.data))) { return -1; } id = msg.data.id; handle_data: len = ltohl(msg.data.size); if(id == ID_DONE) break; if(id != ID_DATA) goto remote_error; if(len > SYNC_DATA_MAX) { fprintf(stderr,"data overrun\n"); adb_close(lfd); return -1; } if(readx(fd, buffer, len)) { adb_close(lfd); return -1; } if(writex(lfd, buffer, len)) { fprintf(stderr,"cannot write '%s': %s\n", rpath, strerror(errno)); adb_close(lfd); return -1; } total_bytes += len; if (show_progress) { print_transfer_progress(total_bytes, size); } } adb_close(lfd); return 0; remote_error: adb_close(lfd); adb_unlink(lpath); if(id == ID_FAIL) { len = ltohl(msg.data.size); if(len > 256) len = 256; if(readx(fd, buffer, len)) { return -1; } buffer[len] = 0; } else { memcpy(buffer, &id, 4); buffer[4] = 0; // strcpy(buffer,"unknown reason"); } fprintf(stderr,"failed to copy '%s' to '%s': %s\n", rpath, lpath, buffer); return 0; }
void test_mkdirs(const std::string basepath) { EXPECT_TRUE(mkdirs(basepath)); EXPECT_NE(-1, adb_creat(basepath.c_str(), 0600)); EXPECT_FALSE(mkdirs(basepath + "/subdir/")); }