+#ifdef LISP_FEATURE_SB_CORE_COMPRESSION
+# define ZLIB_BUFFER_SIZE (1u<<16)
+os_vm_address_t inflate_core_bytes(int fd, os_vm_offset_t offset,
+ os_vm_address_t addr, int len)
+{
+ z_stream stream;
+ unsigned char buf[ZLIB_BUFFER_SIZE];
+ int ret;
+
+ if (-1 == lseek(fd, offset, SEEK_SET)) {
+ lose("Unable to lseek() on corefile\n");
+ }
+
+ stream.zalloc = NULL;
+ stream.zfree = NULL;
+ stream.opaque = NULL;
+ stream.avail_in = 0;
+ stream.next_in = buf;
+
+ ret = inflateInit(&stream);
+ if (ret != Z_OK)
+ lose("zlib error %i\n", ret);
+
+ stream.next_out = (void*)addr;
+ stream.avail_out = len;
+ do {
+ ssize_t count = read(fd, buf, sizeof(buf));
+ if (count < 0)
+ lose("unable to read core file (errno = %i)\n", errno);
+ stream.next_in = buf;
+ stream.avail_in = count;
+ if (count == 0) break;
+ ret = inflate(&stream, Z_NO_FLUSH);
+ switch (ret) {
+ case Z_STREAM_END:
+ break;
+ case Z_OK:
+ if (stream.avail_out == 0)
+ lose("Runaway gzipped core directory... aborting\n");
+ if (stream.avail_in > 0)
+ lose("zlib inflate returned without fully"
+ "using up input buffer... aborting\n");
+ break;
+ default:
+ lose("zlib inflate error: %i\n", ret);
+ break;
+ }
+ } while (ret != Z_STREAM_END);
+
+ if (stream.avail_out > 0) {
+ if (stream.avail_out >= os_vm_page_size)
+ fprintf(stderr, "Warning: gzipped core directory significantly"
+ "shorter than expected (%lu bytes)", (unsigned long)stream.avail_out);
+ /* Is this needed? */
+ memset(stream.next_out, 0, stream.avail_out);
+ }
+
+ inflateEnd(&stream);
+ return addr;
+}
+# undef ZLIB_BUFFER_SIZE
+#endif
+
+int merge_core_pages = -1;
+