#include "project.h" static struct known_struct { GUID g; char *name; } known_guids[] = { { GUID_TYPE_EMPTY, "empty"}, { GUID_TYPE_SYSTEM, "EFI SYSTEM"}, { GUID_TYPE_LINUX_EXT3, "linux-ext3"}, { GUID_TYPE_LINUX_SWAP, "linux-swap"}, { GUID_TYPE_APPLE_HFS, "apple-hfs"}, { 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; } 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 ((*a) && (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; defalt: return -1; } } for (i = 0; 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/random", O_RDONLY); read (fd, &ret, sizeof (ret)); close (fd); return ret; }