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; }
/* 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; }