示例#1
0
文件: zqs.c 项目: JamesLinus/inferno
static uchar*
unsqzseg(int fd, uchar *wp, long ns, ulong top)
{
	Squeeze sq3, sq4;

	if(ns == 0)
		return wp;
	if(rdtab(fd, &sq3, 0) < 0)
		return nil;
	if(rdtab(fd, &sq4, 8) < 0)
		return nil;
	fprint(2, "tables: %d %d\n", sq3.n, sq4.n);
	if(read(fd, bigb, ns) != ns)
		return nil;
	return unsqueeze(wp, bigb, bigb+ns, &sq3, &sq4, top);
}
示例#2
0
dsk_err_t sq_open(COMPRESS_DATA *self)
{
	SQ_COMPRESS_DATA *sq_self;
	dsk_err_t err;
	unsigned short magic;

	
	/* Sanity check: Is this meant for our driver? */
	if (self->cd_class != &cc_sq) return DSK_ERR_BADPTR;
	sq_self = (SQ_COMPRESS_DATA *)self;
	sq_self->sq_truename = NULL;
	sq_self->fp_in = NULL;
	sq_self->fp_out = NULL; 

	/* Open the file to decompress */
	err = comp_fopen(self, &sq_self->fp_in);
	if (err) return DSK_ERR_NOTME;

	/* Check for SQ signature */
	err = readu(sq_self, &magic);
	if (err) 	/* v1.1.11 Don't leak file handles */
	{
		fclose(sq_self->fp_in);
		return err;
	}

	if (magic != MAGIC)
	{
		fclose(sq_self->fp_in);
		return DSK_ERR_NOTME;
	}
	/* OK. This is a Squeezed file. Decompress it. */
	rewind(sq_self->fp_in);
	err = comp_mktemp(self, &sq_self->fp_out);

	if (!err) err = unsqueeze(sq_self);
	fclose(sq_self->fp_in);
	if (sq_self->fp_out) fclose(sq_self->fp_out);
	if (err && sq_self->sq_truename) free(sq_self->sq_truename);
	return err;	
}