int
zlib_write_compress_header(FILE *fd, guint32 blocksize, gulong *checksum, guint32 *compressed_size)
{
	gsize written = 0;
	
	GByteArray *headers = NULL;
	int status = 1;
	headers = g_byte_array_new();	

#define HEADER_APPEND(V, S) g_byte_array_append(headers,(guint8*)V, S);

	headers = HEADER_APPEND(&magic, sizeof(magic)); /* char[8] */
	headers = HEADER_APPEND(&blocksize, sizeof(blocksize)); /* guint32 */

	written = fwrite(headers->data, headers->len, 1, fd);

	if (written != 1) {
		DEBUG("Failed to write compression headers");
		goto end;
	}

	*compressed_size = *compressed_size + headers->len;
	
	*checksum = adler32(0, NULL, 0);

	status = 0;

end:

	if(headers)
		g_byte_array_free(headers, TRUE);

	return status;
}
示例#2
0
int
lzo_write_compress_header(FILE *file, lzo_uint32 blocksize, gulong *checksum, lzo_uint32 *compressed_size)
{
	lzo_uint32 flags = LZO_FLAG_CHECKSUM;       /* do compute a checksum */
	char method = LZO_METHOD;
	char level = LZO_LEVEL;
	gsize written = 0;

	GByteArray *headers = NULL;
	headers = g_byte_array_new();	

#define HEADER_APPEND(V, S) g_byte_array_append(headers,(guint8*)V, S);

	headers = HEADER_APPEND(&lzo_magic, sizeof(lzo_magic)); /* char[7] */
	headers = HEADER_APPEND(&flags, sizeof(flags)); /* guint32 */
	headers = HEADER_APPEND(&method, sizeof(method)); /* char */
	headers = HEADER_APPEND(&level, sizeof(level)); /* char */
	headers = HEADER_APPEND(&blocksize, sizeof(blocksize)); /* guint32 */

	written = fwrite(headers->data, headers->len, 1, file);

	if (written != 1) {
		ERROR("Failed to write headers\n");
		if(headers)
			g_byte_array_free(headers, TRUE);
		return 1;
	}

	*compressed_size = *compressed_size + headers->len;
	lzo_uint32 cheksum32 = 0;
	cheksum32 = lzo_adler32(0, NULL, 0);
	*checksum = cheksum32;
	if(headers)
		g_byte_array_free(headers, TRUE);
	return 0;
}