Index: utility/efidecompress.c |
diff --git a/utility/efidecompress.c b/utility/efidecompress.c |
index 8ec4a089799ef5e2da4898f3e25dc574b5afbe8f..5e7e14d7b831771619b8c74d333f04f2593b577f 100644 |
--- a/utility/efidecompress.c |
+++ b/utility/efidecompress.c |
@@ -1006,3 +1006,157 @@ Returns: |
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 |