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

Go to the source code of this file.

Functions

ZIP_EXTERN int zip_file_replace (zip_t *za, zip_uint64_t idx, zip_source_t *source, zip_flags_t flags)
 
zip_int64_t _zip_file_replace (zip_t *za, zip_uint64_t idx, const char *name, zip_source_t *source, zip_flags_t flags)
 

Function Documentation

◆ _zip_file_replace()

zip_int64_t _zip_file_replace ( zip_t za,
zip_uint64_t  idx,
const char *  name,
zip_source_t source,
zip_flags_t  flags 
)

Definition at line 55 of file zip_file_replace.c.

55  {
56  zip_uint64_t za_nentry_prev;
57 
58  if (ZIP_IS_RDONLY(za)) {
60  return -1;
61  }
62 
63  za_nentry_prev = za->nentry;
64  if (idx == ZIP_UINT64_MAX) {
65  zip_int64_t i = -1;
66 
67  if (flags & ZIP_FL_OVERWRITE)
69 
70  if (i == -1) {
71  /* create and use new entry, used by zip_add */
72  if ((i = _zip_add_entry(za)) < 0)
73  return -1;
74  }
75  idx = (zip_uint64_t)i;
76  }
77 
78  if (name && _zip_set_name(za, idx, name, flags) != 0) {
79  if (za->nentry != za_nentry_prev) {
81  za->nentry = za_nentry_prev;
82  }
83  return -1;
84  }
85 
86  /* does not change any name related data, so we can do it here;
87  * needed for a double add of the same file name */
89 
90  if (za->entry[idx].orig != NULL && (za->entry[idx].changes == NULL || (za->entry[idx].changes->changed & ZIP_DIRENT_COMP_METHOD) == 0)) {
91  if (za->entry[idx].changes == NULL) {
94  return -1;
95  }
96  }
97 
100  }
101 
102  za->entry[idx].source = source;
103 
104  return (zip_int64_t)idx;
105 }
lzma_index ** i
Definition: index.h:629
#define NULL
Definition: cris-opc.c:27
ZIP_EXTERN void zip_error_set(zip_error_t *_Nullable, int, int)
Definition: zip_error.c:126
#define ZIP_ER_MEMORY
Definition: zip.h:119
#define ZIP_FL_OVERWRITE
Definition: zip.h:90
#define ZIP_ER_RDONLY
Definition: zip.h:130
const char * source
Definition: lz4.h:699
int idx
Definition: setup.py:197
static struct sockaddr static addrlen static backlog const void static flags void flags
Definition: sfsocketcall.h:123
Definition: z80asm.h:102
zip_int32_t comp_method
Definition: zipint.h:336
zip_uint32_t changed
Definition: zipint.h:327
zip_dirent_t * orig
Definition: zipint.h:409
zip_source_t * source
Definition: zipint.h:411
zip_dirent_t * changes
Definition: zipint.h:410
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_int64_t _zip_add_entry(zip_t *za)
Definition: zip_add_entry.c:43
zip_dirent_t * _zip_dirent_clone(const zip_dirent_t *sde)
Definition: zip_dirent.c:215
void _zip_entry_finalize(zip_entry_t *e)
Definition: zip_entry.c:38
zip_int64_t _zip_name_locate(zip_t *za, const char *fname, zip_flags_t flags, zip_error_t *error)
int _zip_set_name(zip_t *za, zip_uint64_t idx, const char *name, zip_flags_t flags)
Definition: zip_set_name.c:42
void _zip_unchange_data(zip_entry_t *ze)
uint64_t zip_uint64_t
Definition: zipconf.h:39
#define ZIP_UINT64_MAX
Definition: zipconf.h:55
int64_t zip_int64_t
Definition: zipconf.h:38
#define ZIP_IS_RDONLY(za)
Definition: zipint.h:479
#define ZIP_CM_REPLACED_DEFAULT
Definition: zipint.h:72
#define ZIP_DIRENT_COMP_METHOD
Definition: zipint.h:316
zip_t * za
Definition: ziptool.c:79

References _zip_add_entry(), _zip_dirent_clone(), _zip_entry_finalize(), _zip_name_locate(), _zip_set_name(), _zip_unchange_data(), zip_dirent::changed, zip_entry::changes, zip_dirent::comp_method, zip::entry, zip::error, flags, i, setup::idx, zip::nentry, NULL, zip_entry::orig, zip_entry::source, source, za, ZIP_CM_REPLACED_DEFAULT, ZIP_DIRENT_COMP_METHOD, ZIP_ER_MEMORY, ZIP_ER_RDONLY, zip_error_set(), ZIP_FL_OVERWRITE, ZIP_IS_RDONLY, and ZIP_UINT64_MAX.

Referenced by zip_dir_add(), zip_file_add(), and zip_file_replace().

◆ zip_file_replace()

ZIP_EXTERN int zip_file_replace ( zip_t za,
zip_uint64_t  idx,
zip_source_t source,
zip_flags_t  flags 
)

Definition at line 39 of file zip_file_replace.c.

39  {
40  if (idx >= za->nentry || source == NULL) {
42  return -1;
43  }
44 
45  if (_zip_file_replace(za, idx, NULL, source, flags) == -1)
46  return -1;
47 
48  return 0;
49 }
#define ZIP_ER_INVAL
Definition: zip.h:123
zip_int64_t _zip_file_replace(zip_t *za, zip_uint64_t idx, const char *name, zip_source_t *source, zip_flags_t flags)

References _zip_file_replace(), zip::error, flags, setup::idx, zip::nentry, NULL, source, za, ZIP_ER_INVAL, and zip_error_set().

Referenced by replace_file_contents(), and zip_replace().