diff options
Diffstat (limited to 'src/guid.c')
-rw-r--r-- | src/guid.c | 122 |
1 files changed, 122 insertions, 0 deletions
diff --git a/src/guid.c b/src/guid.c new file mode 100644 index 0000000..d9d5dcb --- /dev/null +++ b/src/guid.c @@ -0,0 +1,122 @@ +#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"}, + { {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; + } + + 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 random_guid(void) +{ +GUID ret; + +int fd=open("/dev/random",O_RDONLY); +read(fd,&ret,sizeof(ret)); +close(fd); +return ret; +} |