zmem.c 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. // SPDX-License-Identifier: GPL-2.0
  2. #include <linux/zlib.h>
  3. /* bits taken from ppc */
  4. extern void *avail_ram, *end_avail;
  5. void gunzip(void *dst, int dstlen, unsigned char *src, int *lenp);
  6. static void exit(void)
  7. {
  8. for (;;);
  9. }
  10. static void *zalloc(unsigned int size)
  11. {
  12. void *p = avail_ram;
  13. size = (size + 7) & -8;
  14. avail_ram += size;
  15. if (avail_ram > end_avail) {
  16. //puts("oops... out of memory\n");
  17. //pause();
  18. exit ();
  19. }
  20. return p;
  21. }
  22. #define HEAD_CRC 2
  23. #define EXTRA_FIELD 4
  24. #define ORIG_NAME 8
  25. #define COMMENT 0x10
  26. #define RESERVED 0xe0
  27. #define DEFLATED 8
  28. void gunzip (void *dst, int dstlen, unsigned char *src, int *lenp)
  29. {
  30. z_stream s;
  31. int r, i, flags;
  32. /* skip header */
  33. i = 10;
  34. flags = src[3];
  35. if (src[2] != DEFLATED || (flags & RESERVED) != 0) {
  36. //puts("bad gzipped data\n");
  37. exit();
  38. }
  39. if ((flags & EXTRA_FIELD) != 0)
  40. i = 12 + src[10] + (src[11] << 8);
  41. if ((flags & ORIG_NAME) != 0)
  42. while (src[i++] != 0)
  43. ;
  44. if ((flags & COMMENT) != 0)
  45. while (src[i++] != 0)
  46. ;
  47. if ((flags & HEAD_CRC) != 0)
  48. i += 2;
  49. if (i >= *lenp) {
  50. //puts("gunzip: ran out of data in header\n");
  51. exit();
  52. }
  53. s.workspace = zalloc(zlib_inflate_workspacesize());
  54. r = zlib_inflateInit2(&s, -MAX_WBITS);
  55. if (r != Z_OK) {
  56. //puts("inflateInit2 returned "); puthex(r); puts("\n");
  57. exit();
  58. }
  59. s.next_in = src + i;
  60. s.avail_in = *lenp - i;
  61. s.next_out = dst;
  62. s.avail_out = dstlen;
  63. r = zlib_inflate(&s, Z_FINISH);
  64. if (r != Z_OK && r != Z_STREAM_END) {
  65. //puts("inflate returned "); puthex(r); puts("\n");
  66. exit();
  67. }
  68. *lenp = s.next_out - (unsigned char *) dst;
  69. zlib_inflateEnd(&s);
  70. }