summaryrefslogtreecommitdiff
path: root/errlog.c
diff options
context:
space:
mode:
authorMathieu Trudel-Lapierre <mathieu.trudel-lapierre@canonical.com>2017-09-13 12:09:40 -0700
committerMathieu Trudel-Lapierre <mathieu.trudel-lapierre@canonical.com>2017-09-13 12:09:40 -0700
commit8de1d1dc3a96fec12e97eff6ca5b728e606764b1 (patch)
tree4f251a469423bb40dd7f5da9d74cf638c89832cb /errlog.c
parenta97c2654996184b9a327630bc020f24f70a8b0da (diff)
parentb6f94dbeacfc6f0a507413096189304c58dbe66c (diff)
downloadefi-boot-shim-8de1d1dc3a96fec12e97eff6ca5b728e606764b1.tar.gz
efi-boot-shim-8de1d1dc3a96fec12e97eff6ca5b728e606764b1.zip
Updated version 13~git1505328970.9c1c35c5 from 'upstream/13_git1505328970.9c1c35c5'
with Debian dir 676fec75f526e6b8072deb5302628d27abfc7449
Diffstat (limited to 'errlog.c')
-rw-r--r--errlog.c87
1 files changed, 87 insertions, 0 deletions
diff --git a/errlog.c b/errlog.c
new file mode 100644
index 00000000..34351fc2
--- /dev/null
+++ b/errlog.c
@@ -0,0 +1,87 @@
+/*
+ * errlog.c
+ * Copyright 2017 Peter Jones <pjones@redhat.com>
+ *
+ * Distributed under terms of the GPLv3 license.
+ */
+
+#include "shim.h"
+
+#ifdef LogError
+#undef LogError
+#endif
+
+static CHAR16 **errs = NULL;
+static UINTN nerrs = 0;
+
+EFI_STATUS
+VLogError(const char *file, int line, const char *func, CHAR16 *fmt, va_list args)
+{
+ va_list args2;
+ UINTN size = 0, size2;
+ CHAR16 **newerrs;
+
+ size = SPrint(NULL, 0, L"%a:%d %a() ", file, line, func);
+ va_copy(args2, args);
+ size2 = VSPrint(NULL, 0, fmt, args2);
+ va_end(args2);
+
+ newerrs = ReallocatePool(errs, (nerrs + 1) * sizeof(*errs),
+ (nerrs + 3) * sizeof(*errs));
+ if (!newerrs)
+ return EFI_OUT_OF_RESOURCES;
+
+ newerrs[nerrs] = AllocatePool(size*2+2);
+ if (!newerrs[nerrs])
+ return EFI_OUT_OF_RESOURCES;
+ newerrs[nerrs+1] = AllocatePool(size2*2+2);
+ if (!newerrs[nerrs+1])
+ return EFI_OUT_OF_RESOURCES;
+
+ SPrint(newerrs[nerrs], size*2+2, L"%a:%d %a() ", file, line, func);
+ va_copy(args2, args);
+ VSPrint(newerrs[nerrs+1], size2*2+2, fmt, args2);
+ va_end(args2);
+
+ nerrs += 2;
+ newerrs[nerrs] = NULL;
+ errs = newerrs;
+
+ return EFI_SUCCESS;
+}
+
+EFI_STATUS
+LogError(const char *file, int line, const char *func, CHAR16 *fmt, ...)
+{
+ va_list args;
+ EFI_STATUS status;
+
+ va_start(args, fmt);
+ status = VLogError(file, line, func, fmt, args);
+ va_end(args);
+
+ return status;
+}
+
+VOID
+PrintErrors(VOID)
+{
+ UINTN i;
+
+ for (i = 0; i < nerrs; i++)
+ Print(L"%s", errs[i]);
+}
+
+VOID
+ClearErrors(VOID)
+{
+ UINTN i;
+
+ for (i = 0; i < nerrs; i++)
+ FreePool(errs[i]);
+ FreePool(errs);
+ nerrs = 0;
+ errs = NULL;
+}
+
+// vim:fenc=utf-8:tw=75