#include "project.h" static struct known_struct { GUID g; char *name; } known_guids[] = { { GUID_TYPE_EMPTY, "empty"}, { GUID_TYPE_SYSTEM, "EFI SYSTEM"}, { GUID_TYPE_NEW_LINUX_EXT3, "new-linux-ext3"}, { GUID_TYPE_LINUX_EXT3, "linux-ext3"}, { GUID_TYPE_LINUX_EXT3, "windows-ntfs"}, { GUID_TYPE_LINUX_LVM, "linux-lvm"}, { GUID_TYPE_LINUX_RAID, "linux-raid"}, { GUID_TYPE_LINUX_SWAP, "linux-swap"}, { GUID_TYPE_APPLE_HFS, "apple-hfs"}, { GUID_TYPE_APPLE_RECOVERY, "apple-recovery"}, { GUID_TYPE_APPLE_RAID, "apple-raid"}, { GUID_TYPE_APPLE_BOOTER, "apple-booter"}, { GUID_TYPE_APPLE_TV, "apple-tv"}, { { 0}, NULL} }; int guid_cmp (GUID * a, GUID * b) { return memcmp (a, b, sizeof (GUID)); } #define GUIDTOARETSIZE 80 char * guid_to_a (GUID g) { char *ret = malloc (GUIDTOARETSIZE); struct known_struct *ptr = known_guids; snprintf (ret, GUIDTOARETSIZE, "%02X%02X%02X%02X-%02X%02X-%02X%02X-%02X%02X-%02X%02X%02X%02X%02X%02X", g.d[3], g.d[2], g.d[1], g.d[0], g.d[5], g.d[4], g.d[7], g.d[6], g.d[8], g.d[9], g.d[10], g.d[11], g.d[12], g.d[13], g.d[14], g.d[15]); while (ptr->name) { if (!guid_cmp (&g, &ptr->g)) { strcat (ret, " ("); strcat (ret, ptr->name); strcat (ret, ")"); } ptr++; } return ret; } char * guid_to_a_simple (GUID g) { char *ret = malloc (GUIDTOARETSIZE); struct known_struct *ptr = known_guids; while (ptr->name) { if (!guid_cmp (&g, &ptr->g)) { strcpy (ret, ptr->name); return ret; } ptr++; } snprintf (ret, GUIDTOARETSIZE, "%02X%02X%02X%02X-%02X%02X-%02X%02X-%02X%02X-%02X%02X%02X%02X%02X%02X", g.d[3], g.d[2], g.d[1], g.d[0], g.d[5], g.d[4], g.d[7], g.d[6], g.d[8], g.d[9], g.d[10], g.d[11], g.d[12], g.d[13], g.d[14], g.d[15]); return ret; } int a_to_guid (char *a, GUID * g) { struct known_struct *ptr = known_guids; int digit[32], ndigits = 0, i; while (ptr->name) { if (!strcmp (a, ptr->name)) { memcpy (g, &ptr->g, sizeof (GUID)); return 0; } ptr++; } while (ndigits != 32) { switch (*a) { case ' ': case '\t': case '\n': case '\r': case '-': break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': digit[ndigits++] = (*a) - '0'; break; case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': digit[ndigits++] = ((*a) - 'A') + 0xA; break; case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': digit[ndigits++] = ((*a) - 'a') + 0xa; break; default: return -1; } a++; } for (i = 0; i < 4; ++i) { g->d[3 - i] = (digit[(i << 1)] << 4) | digit[(i << 1) + 1]; } for (i = 0; i < 2; ++i) { g->d[5 - i] = (digit[((i + 4) << 1)] << 4) | digit[((i + 4) << 1) + 1]; g->d[7 - i] = (digit[((i + 6) << 1)] << 4) | digit[((i + 6) << 1) + 1]; } for (i = 8; i < 16; ++i) { g->d[i] = (digit[(i << 1)] << 4) | digit[(i << 1) + 1]; } return 0; } GUID guid_random (void) { GUID ret; int fd = open ("/dev/urandom", O_RDONLY); read (fd, &ret, sizeof (ret)); close (fd); return ret; }