#!/bin/bash
PATH=/bin:/usr/bin:/sbin:/usr/sbin
+SUPERFS=
HALFS=
ROOTFS=
DATAFS=
done
}
+function map_from_super()
+{
+ local part_name="$1"
+ local part_table="$2"
+ echo "$part_table" | /usr/sbin/dmsetup create "$part_name" &>/dev/null
+ if [ $? = 0 ]
+ then
+ echo "/dev/mapper/$part_name"
+ return 0
+ else
+ echo "WARNING : SUPER FOUND BUT $part_name NOT FOUND" >&2
+ return 1
+ fi
+}
+
function find_partitions()
{
P_SLOT=$([[ $(</proc/cmdline) =~ partition_ab=([ab]) ]]; echo ${BASH_REMATCH[1]})
IFS=$'\n'
BLKID_LINES=($(/sbin/blkid))
- ROOTFS=`get_blk_dev_path "PARTLABEL=\"rootfs${P_SUFFIX}\""`
+ SUPERFS=`get_blk_dev_path "PARTLABEL=\"super\""`
+ if [ x$SUPERFS = "x" ]
+ then
+ SUPERFS=`get_blk_dev_path "LABEL=\"super\""`
+ fi
+
+ if [ x$SUPERFS != "x" ]
+ then
+ PARSE_DYNPARTS=`/usr/sbin/parse-dynparts "$SUPERFS" --list-tables`
+
+ while IFS=$IFS_BACKUP read -r part_name part_table; do
+ if [ "$part_name" = "rootfs${P_SUFFIX}" ]
+ then
+ ROOTFS=`map_from_super "$part_name" "$part_table"`
+ fi
+
+ if [ "$part_name" = "hal${P_SUFFIX}" ]
+ then
+ HALFS=`map_from_super "$part_name" "$part_table"`
+ fi
+ done << PARSE_DYNPARTS_INPUT
+$PARSE_DYNPARTS
+PARSE_DYNPARTS_INPUT
+ fi
+
+ if [ x$ROOTFS = "x" ]
+ then
+ ROOTFS=`get_blk_dev_path "PARTLABEL=\"rootfs${P_SUFFIX}\""`
+ fi
if [ x$ROOTFS = "x" ]
then
ROOTFS=`get_blk_dev_path "LABEL=\"rootfs\""`
MODULES=`get_blk_dev_path "LABEL=\"modules\""`
fi
- HALFS=`get_blk_dev_path "PARTLABEL=\"hal${P_SUFFIX}\""`
+ if [ x$HALFS = "x" ]
+ then
+ HALFS=`get_blk_dev_path "PARTLABEL=\"hal${P_SUFFIX}\""`
+ fi
if [ x$HALFS = "x" ]
then
HALFS=`get_blk_dev_path "LABEL=\"hal\""`
using std::cout;
using std::endl;
-constexpr std::string_view kDmPrefix = "dynpart-";
-
int main(int argc, char* argv[]) {
- if (argc != 2) {
- cerr << "Usage: dmsetup create --concise \"$(" << argv[0] << " device)\""
+ if (argc < 2 || argc > 4 || (argc == 3 && std::string_view(argv[2]).compare("--list-tables"))) {
+ cerr << "Usage: dmsetup create --concise \"$(" << argv[0] << " device)\"" << endl
+ << "Alternatively, you can use --list-tables option to get partitions tables line"
+ << " by line which you can provide to dmsetup create."
<< endl;
return 1;
}
+ bool list_tables = (argc == 3) ? true : false;
+
auto metadata = ReadMetadata(argv[1], 0);
if (!metadata) {
cerr << "Failed to parse metadata from \"" << argv[1] << "\"" << endl;
}
std::ostringstream line;
- bool read_only = partition.attributes & LP_PARTITION_ATTR_READONLY;
- line << kDmPrefix << GetPartitionName(partition) << ",,,"
- << (read_only ? "ro" : "rw");
+
+ if (list_tables)
+ line << GetPartitionName(partition) << " ";
+ else {
+ bool read_only = partition.attributes & LP_PARTITION_ATTR_READONLY;
+ line << GetPartitionName(partition) << ",,," << (read_only ? "ro," : "rw,");
+ }
uint64_t sector = 0;
for (size_t i = 0; i < partition.num_extents; i++) {
const auto& extent = metadata->extents[partition.first_extent_index + i];
switch (extent.target_type) {
case LP_TARGET_TYPE_ZERO:
- line << "," << sector << " " << extent.num_sectors << " zero";
+ line << sector << " " << extent.num_sectors << " zero";
break;
case LP_TARGET_TYPE_LINEAR: {
if (extent.target_source != 0) {
return 1;
}
- line << "," << sector << " " << extent.num_sectors << " linear "
+ if (i && !list_tables) line << ",";
+ if (i && list_tables) line << "\\n";
+
+ line << sector << " " << extent.num_sectors << " linear "
<< argv[1] << " " << extent.target_data;
break;
}
sector += extent.num_sectors;
}
- if (!table.empty()) table += ";";
+ if (!table.empty() && list_tables) table += "\n";
+ if (!table.empty() && !list_tables) table += ";";
table += line.str();
}