1 // Copyright 2014 The Android Open Source Project
2 //
3 // This software is licensed under the terms of the GNU General Public
4 // License version 2, as published by the Free Software Foundation, and
5 // may be copied, distributed, and modified under those terms.
6 //
7 // This program is distributed in the hope that it will be useful,
8 // but WITHOUT ANY WARRANTY; without even the implied warranty of
9 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 // GNU General Public License for more details.
11
12 #include "android/filesystems/partition_types.h"
13
14 #include "android/filesystems/ext4_utils.h"
15 #include "android/utils/panic.h"
16 #include "android/utils/path.h"
17
18 #include <errno.h>
19
20 namespace {
21
22 const struct {
23 const char* name;
24 AndroidPartitionType value;
25 } kPartitionTypeMap[] = {
26 { "unknown", ANDROID_PARTITION_TYPE_UNKNOWN },
27 { "yaffs2", ANDROID_PARTITION_TYPE_YAFFS2 },
28 { "ext4", ANDROID_PARTITION_TYPE_EXT4 },
29 };
30
31 const size_t kPartitionTypeMapSize =
32 sizeof(kPartitionTypeMap) / sizeof(kPartitionTypeMap[0]);
33
34 } // namespace
35
androidPartitionType_toString(AndroidPartitionType part_type)36 const char* androidPartitionType_toString(AndroidPartitionType part_type) {
37 for (size_t n = 0; n < kPartitionTypeMapSize; ++n) {
38 if (kPartitionTypeMap[n].value == part_type) {
39 return kPartitionTypeMap[n].name;
40 }
41 }
42 APANIC("Invalid partition type value %d", part_type);
43 return "unknown";
44 }
45
androidPartitionType_fromString(const char * part_type)46 AndroidPartitionType androidPartitionType_fromString(const char* part_type) {
47 for (size_t n = 0; n < kPartitionTypeMapSize; ++n) {
48 if (!strcmp(kPartitionTypeMap[n].name, part_type)) {
49 return kPartitionTypeMap[n].value;
50 }
51 }
52 return ANDROID_PARTITION_TYPE_UNKNOWN;
53 }
54
androidPartitionType_probeFile(const char * image_file)55 AndroidPartitionType androidPartitionType_probeFile(const char* image_file) {
56 if (!path_exists(image_file)) {
57 return ANDROID_PARTITION_TYPE_UNKNOWN;
58 }
59 if (android_pathIsExt4PartitionImage(image_file)) {
60 return ANDROID_PARTITION_TYPE_EXT4;
61 }
62 // Assume YAFFS2, since there is little way to be sure for now.
63 // NOTE: An empty file is a valid Yaffs2 file!
64 return ANDROID_PARTITION_TYPE_YAFFS2;
65 }
66
67
androidPartitionType_makeEmptyFile(AndroidPartitionType part_type,uint64_t part_size,const char * part_file)68 int androidPartitionType_makeEmptyFile(AndroidPartitionType part_type,
69 uint64_t part_size,
70 const char* part_file) {
71 switch (part_type) {
72 case ANDROID_PARTITION_TYPE_YAFFS2:
73 // Any empty file is a valid YAFFS2 partition, |part_size|
74 // can be ignored here.
75 if (path_empty_file(part_file) < 0) {
76 return -errno;
77 }
78 return 0;
79
80 case ANDROID_PARTITION_TYPE_EXT4:
81 return android_createEmptyExt4Image(part_file, part_size, NULL);
82
83 default:
84 return -EINVAL;
85 }
86 }
87