svn commit: r300080 - head/sys/boot/ficl
Warner Losh
imp at FreeBSD.org
Tue May 17 21:25:19 UTC 2016
Author: imp
Date: Tue May 17 21:25:18 2016
New Revision: 300080
URL: https://svnweb.freebsd.org/changeset/base/300080
Log:
Implement uuid-to-string and uuid-from-string. uuid-from-string takes
a string, interprets it as a standard UUID, and returns a binary from
of the UUID. uuid-to-string does the reverse. The binary UUID is in
allocated memory, so you'll need to free it with 'free' after you are
done using it. It won't be automatically garbage collected. Likewise
with the string...
MFC After: 3 days
Modified:
head/sys/boot/ficl/loader.c
Modified: head/sys/boot/ficl/loader.c
==============================================================================
--- head/sys/boot/ficl/loader.c Tue May 17 21:24:10 2016 (r300079)
+++ head/sys/boot/ficl/loader.c Tue May 17 21:25:18 2016 (r300080)
@@ -45,6 +45,7 @@
#endif
#include "bootstrap.h"
#include <string.h>
+#include <uuid.h>
#include "ficl.h"
/* FreeBSD's loader interaction words and extras
@@ -59,6 +60,8 @@
* pnpdevices ( -- addr )
* pnphandlers ( -- addr )
* ccall ( [[...[p10] p9] ... p1] n addr -- result )
+ * uuid-from-string ( addr n -- addr' )
+ * uuid-to-string ( addr' -- addr n )
* .# ( value -- )
*/
@@ -350,6 +353,75 @@ ficlCcall(FICL_VM *pVM)
return;
}
+void
+ficlUuidFromString(FICL_VM *pVM)
+{
+#ifndef TESTMAIN
+ char *uuid;
+ uint32_t status;
+#endif
+ char *uuidp;
+ int uuids;
+ uuid_t *u;
+
+#if FICL_ROBUST > 1
+ vmCheckStack(pVM, 2, 0);
+#endif
+
+ uuids = stackPopINT(pVM->pStack);
+ uuidp = (char *) stackPopPtr(pVM->pStack);
+
+#ifndef TESTMAIN
+ uuid = (char *)ficlMalloc(uuids + 1);
+ if (!uuid)
+ vmThrowErr(pVM, "Error: out of memory");
+ strncpy(uuid, uuidp, uuids);
+ uuid[uuids] = '\0';
+
+ u = (uuid_t *)ficlMalloc(sizeof (*u));
+
+ uuid_from_string(uuid, u, &status);
+ ficlFree(uuid);
+ if (status != uuid_s_ok) {
+ ficlFree(u);
+ u = NULL;
+ }
+#else
+ u = NULL;
+#endif
+ stackPushPtr(pVM->pStack, u);
+
+
+ return;
+}
+
+void
+ficlUuidToString(FICL_VM *pVM)
+{
+#ifndef TESTMAIN
+ char *uuid;
+ uint32_t status;
+#endif
+ uuid_t *u;
+
+#if FICL_ROBUST > 1
+ vmCheckStack(pVM, 1, 0);
+#endif
+
+ u = (uuid_t *)stackPopPtr(pVM->pStack);
+
+#ifndef TESTMAIN
+ uuid_to_string(u, &uuid, &status);
+ if (status != uuid_s_ok) {
+ stackPushPtr(pVM->pStack, uuid);
+ stackPushINT(pVM->pStack, strlen(uuid));
+ } else
+#endif
+ stackPushINT(pVM->pStack, -1);
+
+ return;
+}
+
/**************************************************************************
f i c l E x e c F D
** reads in text from file fd and passes it to ficlExec()
@@ -920,6 +992,8 @@ void ficlCompilePlatform(FICL_SYSTEM *pS
dictAppendWord(dp, "copyout", ficlCopyout, FW_DEFAULT);
dictAppendWord(dp, "findfile", ficlFindfile, FW_DEFAULT);
dictAppendWord(dp, "ccall", ficlCcall, FW_DEFAULT);
+ dictAppendWord(dp, "uuid-from-string", ficlUuidFromString, FW_DEFAULT);
+ dictAppendWord(dp, "uuid-to-string", ficlUuidToString, FW_DEFAULT);
#ifndef TESTMAIN
#ifdef __i386__
dictAppendWord(dp, "outb", ficlOutb, FW_DEFAULT);
More information about the svn-src-head
mailing list