예제 #1
0
파일: compsq.c 프로젝트: damieng/johnelliot
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;	
}
예제 #2
0
/* See if a file can be decompressed */
static dsk_err_t comp_icreat(COMPRESS_DATA **cd, const char *filename, int nc)
{
        COMPRESS_CLASS *cc = classes[nc];
        dsk_err_t err;
    FILE *fp;

        if (!cc) return DSK_ERR_BADPTR;

        (*cd) = dsk_malloc(cc->cc_selfsize);
        if (!*cd) return DSK_ERR_NOMEM;
    memset((*cd), 0, cc->cc_selfsize);
        err = comp_construct(*cd, filename);
    (*cd)->cd_class = cc;
    if (err == DSK_ERR_OK) err = (cc->cc_creat)(*cd);
/* Stake out our claim to the temporary file. */
        if (err == DSK_ERR_OK) err = comp_mktemp(*cd, &fp);
    if (fp) fclose(fp);
    if (err == DSK_ERR_OK) return err;
    
        comp_free (*cd);
        *cd = NULL;
        return err;
}