backup.cpp revision d2110dbce071a236b6176de344ca797b737542eb
1 2#include <utils/backup_helpers.h> 3#include <utils/String8.h> 4 5#include <fcntl.h> 6#include <stdio.h> 7#include <string.h> 8 9using namespace android; 10 11#include <unistd.h> 12 13int 14usage(int argc, const char** argv) 15{ 16 const char* p = argv[0]; 17 18 fprintf(stderr, "%s: Backs up your data.\n" 19 "\n" 20 "usage: %s\n" 21 " Prints all of the data that can be backed up to stdout.\n" 22 "\n" 23 "usage: %s list FILE\n" 24 " Lists the backup entities in the file.\n" 25 "\n" 26 "usage: %s print NAME FILE\n" 27 " Prints the entity named NAME in FILE.\n", 28 p, p, p, p); 29 return 1; 30} 31 32int 33perform_full_backup() 34{ 35 printf("this would have written all of your data to stdout\n"); 36 return 0; 37} 38 39int 40perform_list(const char* filename) 41{ 42 int err; 43 int fd; 44 45 fd = open(filename, O_RDONLY); 46 if (fd == -1) { 47 fprintf(stderr, "Error opening: %s\n", filename); 48 return 1; 49 } 50 51 BackupDataReader reader(fd); 52 int type; 53 54 while (reader.ReadNextHeader(&type) == 0) { 55 switch (type) { 56 case BACKUP_HEADER_APP_V1: 57 { 58 String8 packageName; 59 int cookie; 60 err = reader.ReadAppHeader(&packageName, &cookie); 61 if (err == 0) { 62 printf("App header: %s 0x%08x (%d)\n", packageName.string(), cookie, cookie); 63 } else { 64 printf("Error reading app header\n"); 65 } 66 break; 67 } 68 case BACKUP_HEADER_ENTITY_V1: 69 { 70 String8 key; 71 size_t dataSize; 72 err = reader.ReadEntityHeader(&key, &dataSize); 73 if (err == 0) { 74 printf(" entity: %s (%d bytes)\n", key.string(), dataSize); 75 } else { 76 printf(" Error reading entity header\n"); 77 } 78 break; 79 } 80 case BACKUP_FOOTER_APP_V1: 81 { 82 int cookie; 83 err = reader.ReadAppFooter(&cookie); 84 if (err == 0) { 85 printf(" App footer: 0x%08x (%d)\n", cookie, cookie); 86 } else { 87 printf(" Error reading entity header\n"); 88 } 89 break; 90 } 91 default: 92 { 93 printf("Unknown chunk type: 0x%08x\n", type); 94 break; 95 } 96 } 97 } 98 99 return 0; 100} 101 102int perform_print(const char* entityname, const char* filename) 103{ 104 printf("perform_print(%s, %s);", entityname, filename); 105 return 0; 106} 107 108int 109main(int argc, const char** argv) 110{ 111 if (argc <= 1) { 112 return perform_full_backup(); 113 } 114 if (argc == 3 && 0 == strcmp(argv[1], "list")) { 115 return perform_list(argv[2]); 116 } 117 if (argc == 4 && 0 == strcmp(argv[1], "print")) { 118 return perform_print(argv[2], argv[3]); 119 } 120 return usage(argc, argv); 121} 122 123