New -append_partition pseudo partition_number "all" und pseudo type_code "revoke"

This commit is contained in:
2023-08-07 15:26:51 +02:00
parent aaaa0a99c4
commit 0b7e4f934e
5 changed files with 272 additions and 138 deletions

View File

@ -303,45 +303,74 @@ int Xorriso_option_append_partition(struct XorrisO *xorriso, char *partno_text,
static char *part_type_names[] = {"FAT12", "FAT16", "Linux", "", NULL};
static int part_type_codes[] = { 0x01, 0x06, 0x83, 0x00};
sscanf(partno_text, "%d", &partno);
if(partno < 1 || partno > Xorriso_max_appended_partitionS) {
sprintf(xorriso->info_text,
"-append_partition: Partition number '%s' is out of range (1...%d)",
partno_text, Xorriso_max_appended_partitionS);
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
return(0);
}
for(i= 0; part_type_names[i] != NULL; i++)
if(strcmp(part_type_names[i], type_text) == 0)
break;
if(part_type_names[i] != NULL)
type_code= part_type_codes[i];
if(type_code < 0) {
ret= Xorriso_parse_type_guid(xorriso, type_text, guid, &type_code, 0);
if(ret > 0)
guid_valid= 1;
}
if(type_code < 0) {
tpt= type_text;
if(strncmp(tpt, "0x", 2) == 0)
tpt+= 2;
else
goto bad_type;
unum= 0xffffffff;
sscanf(tpt, "%X", &unum);
if(unum > 0xff) {
bad_type:;
if(strcmp(partno_text, "all") == 0) {
if(strcmp(type_text, "revoke") != 0 && image_path[0] != 0) {
sprintf(xorriso->info_text,
"-append_partition: Partition type '%s' is out of range (0x00...0xff or GUID)",
type_text);
"-append_partition: Pseudo partition number 'all' works only with type code 'revoke' or empty disk path");
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
return(0);
}
partno= -1;
} else {
sscanf(partno_text, "%d", &partno);
if(partno < 1 || partno > Xorriso_max_appended_partitionS) {
sprintf(xorriso->info_text,
"-append_partition: Partition number '%s' is out of range (1...%d)",
partno_text, Xorriso_max_appended_partitionS);
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
return(0);
}
type_code= unum;
}
disable= (image_path[0] == 0);
if(strcmp(type_text, "revoke") == 0) {
disable= 1;
} else {
for(i= 0; part_type_names[i] != NULL; i++)
if(strcmp(part_type_names[i], type_text) == 0)
break;
if(part_type_names[i] != NULL)
type_code= part_type_codes[i];
if(type_code < 0) {
ret= Xorriso_parse_type_guid(xorriso, type_text, guid, &type_code, 0);
if(ret > 0)
guid_valid= 1;
}
if(type_code < 0) {
tpt= type_text;
if(strncmp(tpt, "0x", 2) == 0)
tpt+= 2;
else
goto bad_type;
unum= 0xffffffff;
sscanf(tpt, "%X", &unum);
if(unum > 0xff) {
bad_type:;
sprintf(xorriso->info_text,
"-append_partition: Partition type '%s' is out of range (0x00...0xff or GUID)",
type_text);
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
return(0);
}
type_code= unum;
}
disable= (image_path[0] == 0);
}
if(partno == -1) {
/* All partitions */
set_changed= 0;
for(i= 0; i < Xorriso_max_appended_partitionS; i++) {
/* For now only pseudo-type 'revoke' works for all partitions */
if(xorriso->appended_partitions[i - 1] != NULL) {
if(xorriso->appended_partitions[i - 1][0] != 0)
set_changed= 1;
free(xorriso->appended_partitions[i - 1]);
xorriso->appended_partitions[i - 1]= NULL;
}
}
goto work_done;
}
set_changed= 1;
if(xorriso->appended_partitions[partno - 1] != NULL) {
if(strcmp(xorriso->appended_partitions[partno - 1], image_path) == 0)
@ -354,6 +383,7 @@ bad_type:;
}
if(disable)
goto work_done;
xorriso->appended_partitions[partno - 1]= strdup(image_path);
if(xorriso->appended_partitions[partno - 1] == NULL) {
Xorriso_no_malloc_memory(xorriso, NULL, 0);