aboutsummaryrefslogtreecommitdiffstats
path: root/src/guid.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/guid.c')
-rw-r--r--src/guid.c122
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;
+}