Build EFI compression utilities on host

Change-Id: Ia135e3dd3d67ac6ed64bc104e86a0692f7d8be33

Build eficompress and efidecompress utilities on host.

Change-Id: I2d6723ac0d1673b555a7ae27f7ddbe830dcc75ef

R=rpangler@chromium.org
BUG=chromium-os:13037
TEST=none

Review URL: http://codereview.chromium.org/6880176
diff --git a/utility/efidecompress.c b/utility/efidecompress.c
index 8ec4a08..5e7e14d 100644
--- a/utility/efidecompress.c
+++ b/utility/efidecompress.c
@@ -1006,3 +1006,157 @@
           2
           );
 }
+
+
+#ifdef STANDALONE
+int main(int argc, char *argv[])
+{
+  char *progname;
+  int retval = 1;
+
+  progname = strrchr(argv[0], '/');
+  if (progname)
+    progname++;
+  else
+    progname = argv[0];
+
+  if (argc != 3)
+  {
+    fprintf(stderr, "\nUsage:  %s INFILE OUTFILE\n\n", progname);
+    exit(1);
+  }
+
+  char *infile = argv[1];
+  char *outfile = argv[2];
+
+  struct stat istat;
+  if (0 != stat(infile, &istat)) {
+    fprintf(stderr, "%s: can't stat %s: %s\n",
+            progname,
+            infile,
+            strerror(errno));
+    exit(1);
+  }
+  uint32_t isize = (uint32_t)istat.st_size;
+
+  printf("%s is %d bytes\n", infile, isize);
+
+  FILE *ifp = fopen(infile, "rb");
+  if (!ifp)
+  {
+    fprintf(stderr, "%s: can't read %s: %s\n",
+            progname,
+            infile,
+            strerror(errno));
+    exit(1);
+  }
+  printf("opened %s\n", infile);
+
+  // read input file into buffer
+  uint8_t *ibuf = malloc(isize);
+  if (!ibuf) {
+    fprintf(stderr, "%s: can't allocate %d bytes: %s\n",
+            progname,
+            isize,
+            strerror(errno));
+    goto done1;
+  }
+  if (1 != fread(ibuf, isize, 1, ifp)) {
+    fprintf(stderr, "%s: can't read %d bytes: %s\n",
+            progname,
+            isize,
+            strerror(errno));
+    goto done2;
+  }
+
+
+  // Determine required parameters
+  uint32_t ssize=0, osize=0;
+  EFI_STATUS r = GetInfo(ibuf, isize, &osize, &ssize);
+  if (r != EFI_SUCCESS) {
+    fprintf(stderr, "%s: GetInfo failed with code %d\n",
+            progname,
+            r);
+    goto done2;
+  }
+  printf("need %d bytes of scratch to produce %d bytes of data\n",
+         ssize, osize);
+
+  uint8_t *sbuf = malloc(ssize);
+  if (!sbuf) {
+    fprintf(stderr, "%s: can't allocate %d bytes: %s\n",
+            progname,
+            ssize,
+            strerror(errno));
+    goto done2;
+  }
+
+  uint8_t *obuf = malloc(osize);
+  if (!obuf) {
+    fprintf(stderr, "%s: can't allocate %d bytes: %s\n",
+            progname,
+            osize,
+            strerror(errno));
+    goto done3;
+  }
+
+  // Try new version first
+  r = TianoDecompress(ibuf, isize, obuf, osize, sbuf, ssize);
+  if (r != EFI_SUCCESS) {
+    fprintf(stderr, "%s: TianoDecompress failed with code %d\n",
+            progname,
+            r);
+
+    // Try old version
+    r = EfiDecompress(ibuf, isize, obuf, osize, sbuf, ssize);
+    if (r != EFI_SUCCESS) {
+      fprintf(stderr, "%s: TianoDecompress failed with code %d\n",
+              progname,
+              r);
+      goto done4;
+    }
+  }
+
+  printf("Uncompressed %d bytes to %d bytes\n", isize, osize);
+
+  // Write it out
+  FILE *ofp = fopen(outfile, "wb");
+  if (!ofp)
+  {
+    fprintf(stderr, "%s: can't open %s for writing: %s\n",
+            progname,
+            outfile,
+            strerror(errno));
+    goto done4;
+  }
+  printf("opened %s\n", outfile);
+
+  if (1 != fwrite(obuf, osize, 1, ofp)) {
+    fprintf(stderr, "%s: can't write %d bytes: %s\n",
+            progname,
+            osize,
+            strerror(errno));
+    goto done5;
+  }
+
+  printf("wrote %d bytes to %s\n", osize, outfile);
+  retval = 0;
+
+done5:
+  fclose(ofp);
+
+done4:
+  free(obuf);
+
+done3:
+  free(sbuf);
+
+done2:
+  free(ibuf);
+
+done1:
+  fclose(ifp);
+
+  return retval;
+}
+#endif // STANDALONE