#include "kexec-zlib.h" #include "kexec.h" #ifdef HAVE_LIBZ #define _GNU_SOURCE #include #include #include #include #include #include #include #include #include #include #include char *zlib_decompress_file(const char *filename, off_t *r_size) { gzFile fp; int errnum; const char *msg; char *buf; off_t size, allocated; ssize_t result; if (!filename) { *r_size = 0; return 0; } fp = gzopen(filename, "rb"); if (fp == 0) { msg = gzerror(fp, &errnum); if (errnum == Z_ERRNO) { msg = strerror(errno); } fprintf(stderr, "Cannot open `%s': %s\n", filename, msg); return NULL; } size = 0; allocated = 65536; buf = xmalloc(allocated); do { if (size == allocated) { allocated <<= 1; buf = xrealloc(buf, allocated); } result = gzread(fp, buf + size, allocated - size); if (result < 0) { if ((errno == EINTR) || (errno == EAGAIN)) continue; msg = gzerror(fp, &errnum); if (errnum == Z_ERRNO) { msg = strerror(errno); } die ("read on %s of %ld bytes failed: %s\n", filename, (allocated - size) + 0UL, msg); } size += result; } while(result > 0); result = gzclose(fp); if (result != Z_OK) { msg = gzerror(fp, &errnum); if (errnum == Z_ERRNO) { msg = strerror(errno); } die ("Close of %s failed: %s\n", filename, msg); } *r_size = size; return buf; } #else char *zlib_decompress_file(const char *UNUSED(filename), off_t *UNUSED(r_size)) { return NULL; } #endif /* HAVE_ZLIB */