BlobCore *BlobCore::readBlob(std::FILE *file, uint32_t magic, size_t minSize, size_t maxSize) { BlobCore header; if (::fread(&header, sizeof(header), 1, file) == 1) if (header.validateBlob(magic, minSize, maxSize)) if (BlobCore *blob = (BlobCore *)malloc(header.length())) { memcpy(blob, &header, sizeof(header)); if (::fread(blob+1, header.length() - sizeof(header), 1, file) == 1) return blob; free(blob); errno = EINVAL; } return NULL; }
BlobCore *BlobCore::readBlob(int fd, uint32_t magic, size_t minSize, size_t maxSize) { BlobCore header; if (::read(fd, &header, sizeof(header)) == sizeof(header)) if (header.validateBlob(magic, minSize, maxSize)) if (BlobCore *blob = (BlobCore *)malloc(header.length())) { memcpy(blob, &header, sizeof(header)); size_t remainder = header.length() - sizeof(header); if (::read(fd, blob+1, remainder) == ssize_t(remainder)) return blob; free(blob); errno = EINVAL; } return NULL; }