int cmd_mmc_backup_raw_partition(const char *partition, const char *filename)
{
    if (partition[0] != '/') {
        mmc_scan_partitions();
        const MmcPartition *p;
        p = mmc_find_partition_by_name(partition);
        if (p == NULL)
            return -1;
        return mmc_raw_dump(p, filename);
    }
    else {
        return mmc_raw_dump_internal(partition, filename);
    }
}
int cmd_mmc_backup_raw_partition(const char *partition, const char *filename)
{
    if (partition[0] != '/') {
        mmc_scan_partitions();
        const MmcPartition *p;
        p = mmc_find_partition_by_name(partition);
        if (p == NULL)
            return -1;
        return mmc_raw_dump(p, filename);
    }
    else 
    {
        unsigned sz = 0;

#if defined(MTK_BOOT_DEVICE_NAME) && defined(MTK_BOOT_DEVICE_SIZE)
        if (strcmp(partition, STR(MTK_BOOT_DEVICE_NAME)) == 0) {
            sz = MTK_BOOT_DEVICE_SIZE;
            printf("MTK_BOOT_DEVICE: %s; Size: 0x%x\n", partition, sz);
        }
#endif

#if defined(MTK_RECOVERY_DEVICE_NAME) && defined(MTK_RECOVERY_DEVICE_SIZE)
        if (strcmp(partition, STR(MTK_RECOVERY_DEVICE_NAME)) == 0) {
            sz = MTK_RECOVERY_DEVICE_SIZE;
            printf("MTK_RECOVERY_DEVICE: %s; Size: 0x%x\n", partition, sz);
        }
#endif

#if defined(MTK_UBOOT_DEVICE_NAME) && defined(MTK_UBOOT_DEVICE_SIZE)
        if (strcmp(partition, STR(MTK_UBOOT_DEVICE_NAME)) == 0) {
            sz = MTK_UBOOT_DEVICE_SIZE;
            printf("MTK_UBOOT_DEVICE: %s; Size: 0x%x\n", partition, sz);
        }
#endif
        
        return mmc_raw_dump_internal(partition, filename, sz);
    }
}
// TODO: refactor this to not be a giant copy paste mess
int
mmc_raw_dump (const MmcPartition *partition, char *out_file) {
    return mmc_raw_dump_internal(partition->device_index, out_file);
}