Bug #2674 ยป installer-gpt.patch
| etc/defaults/uuids | ||
|---|---|---|
|
#
|
||
|
a19d880f-05fc-4d3b-a006-743f0f84911e "Linux Raid"
|
||
|
0657fd6d-a4ab-43c4-84e5-0933c84b4f4f "Linux Swap"
|
||
|
0fc63daf-8483-4772-8e79-3d69d8477de4 "Linux Filesystem Data"
|
||
|
e6d6d379-f507-44c2-a23c-238f2a3df928 "Linux LVM"
|
||
|
48465300-0000-11aa-aa11-00306543ecac "Apple HFS"
|
||
| share/installer/cmdnames.conf | ||
|---|---|---|
|
DISKLABEL64=sbin/disklabel64
|
||
|
DUMPON=sbin/dumpon
|
||
|
FDISK=sbin/fdisk
|
||
|
GPT=sbin/gpt
|
||
|
HAMMER=sbin/hammer
|
||
|
IFCONFIG=sbin/ifconfig
|
||
|
MOUNT=sbin/mount
|
||
| usr.sbin/installer/dfuibe_installer/flow.c | ||
|---|---|---|
|
slice_get_number(storage_get_selected_slice(a->s)),
|
||
|
slice_get_desc(storage_get_selected_slice(a->s)),
|
||
|
disk_get_desc(storage_get_selected_disk(a->s)))) {
|
||
|
if (!format_slice(a)) {
|
||
|
if (disk_get_gptsliced(storage_get_selected_disk(a->s))) {
|
||
|
inform(a->c, _("You must set the type of this GPT partition"
|
||
|
" to DragonFly Label64 yourself if not already done."
|
||
|
" Also, GPT booting is not supported yet."));
|
||
|
state = state_ask_fs;
|
||
|
} else if (!format_slice(a)) {
|
||
|
inform(a->c, _("Primary partition #%d was "
|
||
|
"not correctly formatted, and may "
|
||
|
"now be in an inconsistent state. "
|
||
| usr.sbin/installer/libinstaller/diskutil.c | ||
|---|---|---|
|
d->desc = NULL;
|
||
|
d->serno = NULL;
|
||
|
d->we_formatted = 0;
|
||
|
d->gpt_sliced = 0;
|
||
|
d->capacity = 0;
|
||
|
d->cylinders = -1; /* -1 indicates "we don't know" */
|
||
| ... | ... | |
|
}
|
||
|
void
|
||
|
disk_set_gptsliced(struct disk *d, int gptsliced)
|
||
|
{
|
||
|
d->gpt_sliced = gptsliced;
|
||
|
}
|
||
|
int
|
||
|
disk_get_gptsliced(const struct disk *d)
|
||
|
{
|
||
|
return(d->gpt_sliced);
|
||
|
}
|
||
|
void
|
||
|
disk_set_geometry(struct disk *d, int cyl, int hd, int sec)
|
||
|
{
|
||
|
d->cylinders = cyl;
|
||
| ... | ... | |
|
*/
|
||
|
struct slice *
|
||
|
slice_new(struct disk *d, int number, int type, int flags,
|
||
|
unsigned long start, unsigned long size)
|
||
|
unsigned long start, unsigned long size, char *desc)
|
||
|
{
|
||
|
struct slice *s;
|
||
|
const char *sysid_desc = NULL;
|
||
| ... | ... | |
|
s->start = start;
|
||
|
s->size = size;
|
||
|
for (i = 0; ; i++) {
|
||
|
if (part_types[i].type == type) {
|
||
|
sysid_desc = part_types[i].name;
|
||
|
break;
|
||
|
if (disk_get_gptsliced(d)) {
|
||
|
sysid_desc = strdup(desc);
|
||
|
} else {
|
||
|
for (i = 0; ; i++) {
|
||
|
if (part_types[i].type == type) {
|
||
|
sysid_desc = part_types[i].name;
|
||
|
break;
|
||
|
}
|
||
|
if (part_types[i].type == 255)
|
||
|
break;
|
||
|
}
|
||
|
if (sysid_desc == NULL) {
|
||
|
snprintf(unknown, 256, "??? Unknown, sysid = %d", type);
|
||
|
sysid_desc = unknown;
|
||
|
}
|
||
|
if (part_types[i].type == 255)
|
||
|
break;
|
||
|
}
|
||
|
if (sysid_desc == NULL) {
|
||
|
snprintf(unknown, 256, "??? Unknown, sysid = %d", type);
|
||
|
sysid_desc = unknown;
|
||
|
}
|
||
|
asprintf(&s->desc, "%ldM - %ldM: %s",
|
||
| usr.sbin/installer/libinstaller/diskutil.h | ||
|---|---|---|
|
int sectors; /* (sectors per track) */
|
||
|
long capacity; /* capacity in megabytes */
|
||
|
int we_formatted; /* did we format it ourselves? */
|
||
|
int gpt_sliced; /* slices are of gpt type */
|
||
|
};
|
||
|
struct slice {
|
||
| ... | ... | |
|
struct slice *disk_slice_first(const struct disk *);
|
||
|
void disk_set_formatted(struct disk *, int);
|
||
|
int disk_get_formatted(const struct disk *);
|
||
|
void disk_set_gptsliced(struct disk *, int);
|
||
|
int disk_get_gptsliced(const struct disk *);
|
||
|
void disk_set_geometry(struct disk *, int, int, int);
|
||
|
void disk_get_geometry(const struct disk *, int *, int *, int *);
|
||
|
struct slice *slice_new(struct disk *, int, int, int,
|
||
|
unsigned long, unsigned long);
|
||
|
unsigned long, unsigned long, char *);
|
||
|
struct slice *slice_find(const struct disk *, int);
|
||
|
struct slice *slice_next(const struct slice *);
|
||
|
int slice_get_number(const struct slice *);
|
||
| usr.sbin/installer/libinstaller/survey.c | ||
|---|---|---|
|
#include <sys/types.h>
|
||
|
#include <sys/sysctl.h>
|
||
|
#include <ctype.h>
|
||
|
#include <stdio.h>
|
||
|
#include <string.h>
|
||
| ... | ... | |
|
a->os_root, cmd_name(a, "ECHO"), a->tmp);
|
||
|
command_set_log_mode(cmd, COMMAND_LOG_SILENT);
|
||
|
/*
|
||
|
* Probe the disk with gpt.
|
||
|
*/
|
||
|
cmd = command_add(cmds, "%s%s '@GPT_SLICES' >>%ssurvey.txt",
|
||
|
a->os_root, cmd_name(a, "ECHO"), a->tmp);
|
||
|
command_set_log_mode(cmd, COMMAND_LOG_SILENT);
|
||
|
cmd = command_add(cmds, "%s%s show %s 2>/dev/null >>%ssurvey.txt || %s%s '' >>%ssurvey.txt",
|
||
|
a->os_root, cmd_name(a, "GPT"),
|
||
|
disk,
|
||
|
a->tmp,
|
||
|
a->os_root, cmd_name(a, "ECHO"),
|
||
|
a->tmp);
|
||
|
cmd = command_add(cmds, "%s%s '@END' >>%ssurvey.txt",
|
||
|
a->os_root, cmd_name(a, "ECHO"), a->tmp);
|
||
|
command_set_log_mode(cmd, COMMAND_LOG_SILENT);
|
||
|
aura_dict_next(di);
|
||
|
}
|
||
| ... | ... | |
|
fprintfo(log, "| Found slice #%d, sysid %d, "
|
||
|
"start %ld, size %ld\n", sliceno, type, start, size);
|
||
|
*/
|
||
|
slice_new(d, sliceno, type, flags, start, size);
|
||
|
if (type == 0xee)
|
||
|
disk_set_gptsliced(d, 1);
|
||
|
else if (!disk_get_gptsliced(d))
|
||
|
slice_new(d, sliceno, type, flags, start, size, NULL);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
} else if (strcmp(line, "@GPT_SLICES") == 0) {
|
||
|
/*
|
||
|
* start size index contents
|
||
|
* 0 1 - PMBR
|
||
|
* 1 1 - Pri GPT header
|
||
|
* 2 32 - Pri GPT table
|
||
|
* 34 2014 -
|
||
|
* 2048 974848 0 GPT part - EFI System
|
||
|
*/
|
||
|
while (d != NULL && strcmp(line, "@END") != 0 && fgets_chomp(line, 255, f)) {
|
||
|
if (strstr(line, "start") && strstr(line, "contents")) {
|
||
|
/* ignore it */
|
||
|
} else if (disk_get_gptsliced(d)) {
|
||
|
char *s = line;
|
||
|
unsigned long start, size;
|
||
|
int sliceno;
|
||
|
start = strtoul(s, &s, 10);
|
||
|
if (!s || !start) continue;
|
||
|
size = strtoul(s, &s, 10);
|
||
|
if (!s || !size) continue;
|
||
|
while (isspace(*s)) s++;
|
||
|
if (!isdigit(*s)) continue;
|
||
|
sliceno = (int)strtol(s, &s, 10);
|
||
|
if (!s) continue;
|
||
|
while (isspace(*s)) s++;
|
||
|
if (!strncmp(s, "GPT part - ", 11)) s += 11;
|
||
|
slice_new(d, sliceno, 0, 0, start, size, s);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||