Rizin
unix-like reverse engineering framework and cli tools
zip_set_file_compression.c File Reference
#include "zipint.h"

Go to the source code of this file.

Functions

ZIP_EXTERN int zip_set_file_compression (zip_t *za, zip_uint64_t idx, zip_int32_t method, zip_uint32_t flags)
 

Function Documentation

◆ zip_set_file_compression()

ZIP_EXTERN int zip_set_file_compression ( zip_t za,
zip_uint64_t  idx,
zip_int32_t  method,
zip_uint32_t  flags 
)

Definition at line 39 of file zip_set_file_compression.c.

39  {
40  zip_entry_t *e;
41  zip_int32_t old_method;
42 
43  if (idx >= za->nentry) {
45  return -1;
46  }
47 
48  if (ZIP_IS_RDONLY(za)) {
50  return -1;
51  }
52 
53  if (!zip_compression_method_supported(method, true)) {
55  return -1;
56  }
57 
58  e = za->entry + idx;
59 
60  old_method = (e->orig == NULL ? ZIP_CM_DEFAULT : e->orig->comp_method);
61 
62  /* TODO: do we want to recompress if level is set? Only if it's
63  * different than what bit flags tell us, but those are not
64  * defined for all compression methods, or not directly mappable
65  * to levels */
66 
67  if (method == old_method) {
68  if (e->changes) {
69  e->changes->changed &= ~ZIP_DIRENT_COMP_METHOD;
70  e->changes->compression_level = 0;
71  if (e->changes->changed == 0) {
72  _zip_dirent_free(e->changes);
73  e->changes = NULL;
74  }
75  }
76  }
77  else {
78  if (e->changes == NULL) {
79  if ((e->changes = _zip_dirent_clone(e->orig)) == NULL) {
81  return -1;
82  }
83  }
84 
85  e->changes->comp_method = method;
86  e->changes->compression_level = (zip_uint16_t)flags;
87  e->changes->changed |= ZIP_DIRENT_COMP_METHOD;
88  }
89 
90  return 0;
91 }
#define e(frag)
#define NULL
Definition: cris-opc.c:27
ZIP_EXTERN void zip_error_set(zip_error_t *_Nullable, int, int)
Definition: zip_error.c:126
ZIP_EXTERN int zip_compression_method_supported(zip_int32_t method, int compress)
#define ZIP_ER_MEMORY
Definition: zip.h:119
#define ZIP_CM_DEFAULT
Definition: zip.h:148
#define ZIP_ER_RDONLY
Definition: zip.h:130
#define ZIP_ER_COMPNOTSUPP
Definition: zip.h:121
#define ZIP_ER_INVAL
Definition: zip.h:123
int idx
Definition: setup.py:197
static struct sockaddr static addrlen static backlog const void static flags void flags
Definition: sfsocketcall.h:123
Definition: zipint.h:408
zip_error_t error
Definition: zipint.h:281
zip_entry_t * entry
Definition: zipint.h:294
zip_uint64_t nentry
Definition: zipint.h:292
zip_dirent_t * _zip_dirent_clone(const zip_dirent_t *sde)
Definition: zip_dirent.c:215
void _zip_dirent_free(zip_dirent_t *zde)
Definition: zip_dirent.c:258
int32_t zip_int32_t
Definition: zipconf.h:36
uint16_t zip_uint16_t
Definition: zipconf.h:35
#define ZIP_IS_RDONLY(za)
Definition: zipint.h:479
#define ZIP_DIRENT_COMP_METHOD
Definition: zipint.h:316
zip_t * za
Definition: ziptool.c:79

References _zip_dirent_clone(), _zip_dirent_free(), e, zip::entry, zip::error, flags, setup::idx, zip::nentry, NULL, za, ZIP_CM_DEFAULT, zip_compression_method_supported(), ZIP_DIRENT_COMP_METHOD, ZIP_ER_COMPNOTSUPP, ZIP_ER_INVAL, ZIP_ER_MEMORY, ZIP_ER_RDONLY, zip_error_set(), and ZIP_IS_RDONLY.

Referenced by set_file_compression().