Esempio n. 1
0
/***************************************
 * MSPACK_DESTROY_CAB_DECOMPRESSOR
 ***************************************
 * destructor
 */
void mspack_destroy_cab_decompressor(struct mscab_decompressor *base) {
  struct mscab_decompressor_p *this = (struct mscab_decompressor_p *) base;
  if (this) {
    struct mspack_system *sys = this->system;
    cabd_free_decomp(this);
    if (this->d) {
      if (this->d->infh) sys->close(this->d->infh);
      sys->free(this->d);
    }
    sys->free(this);
  }
}
Esempio n. 2
0
void mspack_destroy_cab_decompressor(struct mscab_decompressor *base) {
  struct mscab_decompressor_p *handle = (struct mscab_decompressor_p *) base;
  if (handle) {
    struct mspack_system *sys = handle->system;
    cabd_free_decomp(handle);
    if (handle->d) {
      if (handle->d->infh) sys->close(handle->d->infh);
      sys->free(handle->d);
    }
    sys->free(handle);
  }
}
Esempio n. 3
0
static int cabd_init_decomp(struct mscab_decompressor_p *handle, unsigned int ct)
{
  struct mspack_file *fh = (struct mspack_file *) handle;

  if (!handle || !handle->d) {
    return handle->error = MSPACK_ERR_ARGS;
  }

  cabd_free_decomp(handle);

  handle->d->comp_type = ct;

  switch (ct & cffoldCOMPTYPE_MASK) {
  case cffoldCOMPTYPE_MSZIP:
    handle->d->decompress = (int (*)(void *, off_t)) &mszipd_decompress;
    handle->d->state = mszipd_init(&handle->d->sys, fh, fh,
				 handle->param[MSCABD_PARAM_DECOMPBUF],
				 handle->param[MSCABD_PARAM_FIXMSZIP]);
    break;
  default:
    return handle->error = MSPACK_ERR_DATAFORMAT;
  }
  return handle->error = (handle->d->state) ? MSPACK_ERR_OK : MSPACK_ERR_NOMEMORY;
}
Esempio n. 4
0
/***************************************
 * CABD_CLOSE
 ***************************************
 * frees all memory associated with a given mscabd_cabinet.
 */
static void cabd_close(struct mscab_decompressor *base,
		       struct mscabd_cabinet *origcab)
{
  struct mscab_decompressor_p *this = (struct mscab_decompressor_p *) base;
  struct mscabd_folder_data *dat, *ndat;
  struct mscabd_cabinet *cab, *ncab;
  struct mscabd_folder *fol, *nfol;
  struct mscabd_file *fi, *nfi;
  struct mspack_system *sys;

  if (!base) return;
  sys = this->system;

  this->error = MSPACK_ERR_OK;

  while (origcab) {
    /* free files */
    for (fi = origcab->files; fi; fi = nfi) {
      nfi = fi->next;
      sys->free(fi->filename);
      sys->free(fi);
    }

    /* free folders */
    for (fol = origcab->folders; fol; fol = nfol) {
      nfol = fol->next;

      /* free folder decompression state if it has been decompressed */
      if (this->d && (this->d->folder == (struct mscabd_folder_p *) fol)) {
	if (this->d->infh) sys->close(this->d->infh);
	cabd_free_decomp(this);
	sys->free(this->d);
	this->d = NULL;
      }

      /* free folder data segments */
      for (dat = ((struct mscabd_folder_p *)fol)->data.next; dat; dat = ndat) {
	ndat = dat->next;
	sys->free(dat);
      }
      sys->free(fol);
    }

    /* free predecessor cabinets (and the original cabinet's strings) */
    for (cab = origcab; cab; cab = ncab) {
      ncab = cab->prevcab;
      sys->free(cab->prevname);
      sys->free(cab->nextname);
      sys->free(cab->previnfo);
      sys->free(cab->nextinfo);
      if (cab != origcab) sys->free(cab);
    }

    /* free successor cabinets */
    for (cab = origcab->nextcab; cab; cab = ncab) {
      ncab = cab->nextcab;
      sys->free(cab->prevname);
      sys->free(cab->nextname);
      sys->free(cab->previnfo);
      sys->free(cab->nextinfo);
      sys->free(cab);
    }

    /* free actual cabinet structure */
    cab = origcab->next;
    sys->free(origcab);

    /* repeat full procedure again with the cab->next pointer (if set) */
    origcab = cab;
  }
}
Esempio n. 5
0
static void cabd_close(struct mscab_decompressor *base,
		       struct mscabd_cabinet *origcab)
{
  struct mscab_decompressor_p *handle = (struct mscab_decompressor_p *) base;
  struct mscabd_folder_data *dat, *ndat;
  struct mscabd_cabinet *cab, *ncab;
  struct mscabd_folder *fol, *nfol;
  struct mscabd_file *fi, *nfi;
  struct mspack_system *sys;

  if (!base) return;
  sys = handle->system;

  handle->error = MSPACK_ERR_OK;

  while (origcab) {
    /* free files */
    for (fi = origcab->files; fi; fi = nfi) {
      nfi = fi->next;
      sys->free(fi->filename);
      sys->free(fi);
    }

    for (fol = origcab->folders; fol; fol = nfol) {
      nfol = fol->next;

      if (handle->d && (handle->d->folder == (struct mscabd_folder_p *) fol)) {
	if (handle->d->infh) sys->close(handle->d->infh);
	cabd_free_decomp(handle);
	sys->free(handle->d);
	handle->d = NULL;
      }

      for (dat = ((struct mscabd_folder_p *)fol)->data.next; dat; dat = ndat) {
	ndat = dat->next;
	sys->free(dat);
      }
      sys->free(fol);
    }

    for (cab = origcab; cab; cab = ncab) {
      ncab = cab->prevcab;
      sys->free(cab->prevname);
      sys->free(cab->nextname);
      sys->free(cab->previnfo);
      sys->free(cab->nextinfo);
      if (cab != origcab) sys->free(cab);
    }

    for (cab = origcab->nextcab; cab; cab = ncab) {
      ncab = cab->nextcab;
      sys->free(cab->prevname);
      sys->free(cab->nextname);
      sys->free(cab->previnfo);
      sys->free(cab->nextinfo);
      sys->free(cab);
    }

    cab = origcab->next;
    sys->free(origcab);

    origcab = cab;
  }
}