18ae2335a3c93d0c00e998fdec18f64dfe43b94cbMathias Agopian/*
28ae2335a3c93d0c00e998fdec18f64dfe43b94cbMathias Agopian * Copyright (C) 2009 The Android Open Source Project
38ae2335a3c93d0c00e998fdec18f64dfe43b94cbMathias Agopian *
48ae2335a3c93d0c00e998fdec18f64dfe43b94cbMathias Agopian * Licensed under the Apache License, Version 2.0 (the "License");
58ae2335a3c93d0c00e998fdec18f64dfe43b94cbMathias Agopian * you may not use this file except in compliance with the License.
68ae2335a3c93d0c00e998fdec18f64dfe43b94cbMathias Agopian * You may obtain a copy of the License at
78ae2335a3c93d0c00e998fdec18f64dfe43b94cbMathias Agopian *
88ae2335a3c93d0c00e998fdec18f64dfe43b94cbMathias Agopian *      http://www.apache.org/licenses/LICENSE-2.0
98ae2335a3c93d0c00e998fdec18f64dfe43b94cbMathias Agopian *
108ae2335a3c93d0c00e998fdec18f64dfe43b94cbMathias Agopian * Unless required by applicable law or agreed to in writing, software
118ae2335a3c93d0c00e998fdec18f64dfe43b94cbMathias Agopian * distributed under the License is distributed on an "AS IS" BASIS,
128ae2335a3c93d0c00e998fdec18f64dfe43b94cbMathias Agopian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
138ae2335a3c93d0c00e998fdec18f64dfe43b94cbMathias Agopian * See the License for the specific language governing permissions and
148ae2335a3c93d0c00e998fdec18f64dfe43b94cbMathias Agopian * limitations under the License.
158ae2335a3c93d0c00e998fdec18f64dfe43b94cbMathias Agopian */
16d2110dbce071a236b6176de344ca797b737542ebJoe Onorato
17b13b9bdad2baf6ad1ec2e56b6b7598fa20f55fc4Mathias Agopian#include <androidfw/BackupHelpers.h>
18d2110dbce071a236b6176de344ca797b737542ebJoe Onorato#include <utils/String8.h>
19d2110dbce071a236b6176de344ca797b737542ebJoe Onorato
20d2110dbce071a236b6176de344ca797b737542ebJoe Onorato#include <fcntl.h>
21d2110dbce071a236b6176de344ca797b737542ebJoe Onorato#include <stdio.h>
22d2110dbce071a236b6176de344ca797b737542ebJoe Onorato#include <string.h>
23d2110dbce071a236b6176de344ca797b737542ebJoe Onorato
24d2110dbce071a236b6176de344ca797b737542ebJoe Onoratousing namespace android;
25d2110dbce071a236b6176de344ca797b737542ebJoe Onorato
26d2110dbce071a236b6176de344ca797b737542ebJoe Onorato#include <unistd.h>
27d2110dbce071a236b6176de344ca797b737542ebJoe Onorato
28d2110dbce071a236b6176de344ca797b737542ebJoe Onoratoint
29d2110dbce071a236b6176de344ca797b737542ebJoe Onoratousage(int argc, const char** argv)
30d2110dbce071a236b6176de344ca797b737542ebJoe Onorato{
31d2110dbce071a236b6176de344ca797b737542ebJoe Onorato    const char* p = argv[0];
32d2110dbce071a236b6176de344ca797b737542ebJoe Onorato
33d2110dbce071a236b6176de344ca797b737542ebJoe Onorato    fprintf(stderr, "%s: Backs up your data.\n"
34d2110dbce071a236b6176de344ca797b737542ebJoe Onorato                    "\n"
35d2110dbce071a236b6176de344ca797b737542ebJoe Onorato                    "usage: %s\n"
36d2110dbce071a236b6176de344ca797b737542ebJoe Onorato                    "  Prints all of the data that can be backed up to stdout.\n"
37d2110dbce071a236b6176de344ca797b737542ebJoe Onorato                    "\n"
38d2110dbce071a236b6176de344ca797b737542ebJoe Onorato                    "usage: %s list FILE\n"
39d2110dbce071a236b6176de344ca797b737542ebJoe Onorato                    "  Lists the backup entities in the file.\n"
40d2110dbce071a236b6176de344ca797b737542ebJoe Onorato                    "\n"
41d2110dbce071a236b6176de344ca797b737542ebJoe Onorato                    "usage: %s print NAME FILE\n"
42d2110dbce071a236b6176de344ca797b737542ebJoe Onorato                    "  Prints the entity named NAME in FILE.\n",
43d2110dbce071a236b6176de344ca797b737542ebJoe Onorato                    p, p, p, p);
44d2110dbce071a236b6176de344ca797b737542ebJoe Onorato    return 1;
45d2110dbce071a236b6176de344ca797b737542ebJoe Onorato}
46d2110dbce071a236b6176de344ca797b737542ebJoe Onorato
47d2110dbce071a236b6176de344ca797b737542ebJoe Onoratoint
48d2110dbce071a236b6176de344ca797b737542ebJoe Onoratoperform_full_backup()
49d2110dbce071a236b6176de344ca797b737542ebJoe Onorato{
50d2110dbce071a236b6176de344ca797b737542ebJoe Onorato    printf("this would have written all of your data to stdout\n");
51d2110dbce071a236b6176de344ca797b737542ebJoe Onorato    return 0;
52d2110dbce071a236b6176de344ca797b737542ebJoe Onorato}
53d2110dbce071a236b6176de344ca797b737542ebJoe Onorato
54d2110dbce071a236b6176de344ca797b737542ebJoe Onoratoint
55d2110dbce071a236b6176de344ca797b737542ebJoe Onoratoperform_list(const char* filename)
56d2110dbce071a236b6176de344ca797b737542ebJoe Onorato{
57d2110dbce071a236b6176de344ca797b737542ebJoe Onorato    int err;
58d2110dbce071a236b6176de344ca797b737542ebJoe Onorato    int fd;
59d2110dbce071a236b6176de344ca797b737542ebJoe Onorato
60d2110dbce071a236b6176de344ca797b737542ebJoe Onorato    fd = open(filename, O_RDONLY);
61d2110dbce071a236b6176de344ca797b737542ebJoe Onorato    if (fd == -1) {
62d2110dbce071a236b6176de344ca797b737542ebJoe Onorato        fprintf(stderr, "Error opening: %s\n", filename);
63d2110dbce071a236b6176de344ca797b737542ebJoe Onorato        return 1;
64d2110dbce071a236b6176de344ca797b737542ebJoe Onorato    }
65d2110dbce071a236b6176de344ca797b737542ebJoe Onorato
66d2110dbce071a236b6176de344ca797b737542ebJoe Onorato    BackupDataReader reader(fd);
675f15d151b5101fadfe6cba1e8f4aa6367e8c603eJoe Onorato    bool done;
68d2110dbce071a236b6176de344ca797b737542ebJoe Onorato    int type;
69d2110dbce071a236b6176de344ca797b737542ebJoe Onorato
705f15d151b5101fadfe6cba1e8f4aa6367e8c603eJoe Onorato    while (reader.ReadNextHeader(&done, &type) == 0) {
715f15d151b5101fadfe6cba1e8f4aa6367e8c603eJoe Onorato        if (done) {
725f15d151b5101fadfe6cba1e8f4aa6367e8c603eJoe Onorato            break;
735f15d151b5101fadfe6cba1e8f4aa6367e8c603eJoe Onorato        }
74d2110dbce071a236b6176de344ca797b737542ebJoe Onorato        switch (type) {
75d2110dbce071a236b6176de344ca797b737542ebJoe Onorato            case BACKUP_HEADER_ENTITY_V1:
76d2110dbce071a236b6176de344ca797b737542ebJoe Onorato            {
77d2110dbce071a236b6176de344ca797b737542ebJoe Onorato                String8 key;
78d2110dbce071a236b6176de344ca797b737542ebJoe Onorato                size_t dataSize;
79d2110dbce071a236b6176de344ca797b737542ebJoe Onorato                err = reader.ReadEntityHeader(&key, &dataSize);
80d2110dbce071a236b6176de344ca797b737542ebJoe Onorato                if (err == 0) {
81d2110dbce071a236b6176de344ca797b737542ebJoe Onorato                    printf("   entity: %s (%d bytes)\n", key.string(), dataSize);
82d2110dbce071a236b6176de344ca797b737542ebJoe Onorato                } else {
83d2110dbce071a236b6176de344ca797b737542ebJoe Onorato                    printf("   Error reading entity header\n");
84d2110dbce071a236b6176de344ca797b737542ebJoe Onorato                }
85d2110dbce071a236b6176de344ca797b737542ebJoe Onorato                break;
86d2110dbce071a236b6176de344ca797b737542ebJoe Onorato            }
87d2110dbce071a236b6176de344ca797b737542ebJoe Onorato            default:
88d2110dbce071a236b6176de344ca797b737542ebJoe Onorato            {
89d2110dbce071a236b6176de344ca797b737542ebJoe Onorato                printf("Unknown chunk type: 0x%08x\n", type);
90d2110dbce071a236b6176de344ca797b737542ebJoe Onorato                break;
91d2110dbce071a236b6176de344ca797b737542ebJoe Onorato            }
92d2110dbce071a236b6176de344ca797b737542ebJoe Onorato        }
93d2110dbce071a236b6176de344ca797b737542ebJoe Onorato    }
94d2110dbce071a236b6176de344ca797b737542ebJoe Onorato
95d2110dbce071a236b6176de344ca797b737542ebJoe Onorato    return 0;
96d2110dbce071a236b6176de344ca797b737542ebJoe Onorato}
97d2110dbce071a236b6176de344ca797b737542ebJoe Onorato
98d2110dbce071a236b6176de344ca797b737542ebJoe Onoratoint perform_print(const char* entityname, const char* filename)
99d2110dbce071a236b6176de344ca797b737542ebJoe Onorato{
100d2110dbce071a236b6176de344ca797b737542ebJoe Onorato    printf("perform_print(%s, %s);", entityname, filename);
101d2110dbce071a236b6176de344ca797b737542ebJoe Onorato    return 0;
102d2110dbce071a236b6176de344ca797b737542ebJoe Onorato}
103d2110dbce071a236b6176de344ca797b737542ebJoe Onorato
104d2110dbce071a236b6176de344ca797b737542ebJoe Onoratoint
105d2110dbce071a236b6176de344ca797b737542ebJoe Onoratomain(int argc, const char** argv)
106d2110dbce071a236b6176de344ca797b737542ebJoe Onorato{
107d2110dbce071a236b6176de344ca797b737542ebJoe Onorato    if (argc <= 1) {
108d2110dbce071a236b6176de344ca797b737542ebJoe Onorato        return perform_full_backup();
109d2110dbce071a236b6176de344ca797b737542ebJoe Onorato    }
110d2110dbce071a236b6176de344ca797b737542ebJoe Onorato    if (argc == 3 && 0 == strcmp(argv[1], "list")) {
111d2110dbce071a236b6176de344ca797b737542ebJoe Onorato        return perform_list(argv[2]);
112d2110dbce071a236b6176de344ca797b737542ebJoe Onorato    }
113d2110dbce071a236b6176de344ca797b737542ebJoe Onorato    if (argc == 4 && 0 == strcmp(argv[1], "print")) {
114d2110dbce071a236b6176de344ca797b737542ebJoe Onorato        return perform_print(argv[2], argv[3]);
115d2110dbce071a236b6176de344ca797b737542ebJoe Onorato    }
116d2110dbce071a236b6176de344ca797b737542ebJoe Onorato    return usage(argc, argv);
117d2110dbce071a236b6176de344ca797b737542ebJoe Onorato}
118d2110dbce071a236b6176de344ca797b737542ebJoe Onorato
119