+ if (header != CORE_MAGIC)
+ goto lose;
+
+ maybe_initialize_runtime_options(fd);
+
+ close(fd);
+ return pos;
+ }
+
+lose:
+ if (fd != -1)
+ close(fd);
+
+ return -1;
+}
+
+/* If more platforms doesn't support overlapping mmap rename this
+ * def to something like ifdef nommapoverlap */
+/* currently hpux only */
+#ifdef LISP_FEATURE_HPUX
+os_vm_address_t copy_core_bytes(int fd, os_vm_offset_t offset,
+ os_vm_address_t addr, int len)
+{
+ unsigned char buf[4096];
+ int c,x;
+ int old_fd = lseek(fd, 0, SEEK_CUR);
+
+ if(len & (4096-1)){
+ fprintf(stderr, "cant copy a slice of core because slice-length is not of page size(4096)\n");
+ exit(-1);
+ }
+ if(old_fd < 0){
+ fprintf(stderr, "cant perform lseek() on corefile\n");
+ }
+ lseek(fd, offset, SEEK_SET);
+ if(fd < 0){
+ fprintf(stderr, "cant perform lseek(%u,%lu,SEEK_SET) on corefile\n", fd, offset);
+ }
+ for(x = 0; x < len; x += 4096){
+ c = read(fd, buf, 4096);
+ if(c != 4096){
+ fprintf(stderr, "cant read memory area from corefile at position %lu, got %d\n", offset + x, c);
+ exit(-1);
+ }
+ memcpy(addr+x, buf, 4096);
+ }
+ os_flush_icache(addr, len);
+ return addr;
+}
+#endif
+
+#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;
+
+static void
+process_directory(int fd, lispobj *ptr, int count, os_vm_offset_t file_offset)