Rizin
unix-like reverse engineering framework and cli tools
zip_unchange.c File Reference
#include <stdlib.h>
#include "zipint.h"

Go to the source code of this file.

Functions

ZIP_EXTERN int zip_unchange (zip_t *za, zip_uint64_t idx)
 
int _zip_unchange (zip_t *za, zip_uint64_t idx, int allow_duplicates)
 

Function Documentation

◆ _zip_unchange()

int _zip_unchange ( zip_t za,
zip_uint64_t  idx,
int  allow_duplicates 
)

Definition at line 47 of file zip_unchange.c.

47  {
48  zip_int64_t i;
49  bool renamed;
50 
51  if (idx >= za->nentry) {
53  return -1;
54  }
55 
57  if (!allow_duplicates && (renamed || za->entry[idx].deleted)) {
58  const char *orig_name = NULL;
59  const char *changed_name = NULL;
60 
61  if (za->entry[idx].orig != NULL) {
62  if ((orig_name = _zip_get_name(za, idx, ZIP_FL_UNCHANGED, &za->error)) == NULL) {
63  return -1;
64  }
65 
66  i = _zip_name_locate(za, orig_name, 0, NULL);
67  if (i >= 0 && (zip_uint64_t)i != idx) {
69  return -1;
70  }
71  }
72 
73  if (renamed) {
74  if ((changed_name = _zip_get_name(za, idx, 0, &za->error)) == NULL) {
75  return -1;
76  }
77  }
78 
79  if (orig_name) {
80  if (_zip_hash_add(za->names, (const zip_uint8_t *)orig_name, idx, 0, &za->error) == false) {
81  return -1;
82  }
83  }
84  if (changed_name) {
85  if (_zip_hash_delete(za->names, (const zip_uint8_t *)changed_name, &za->error) == false) {
86  _zip_hash_delete(za->names, (const zip_uint8_t *)orig_name, NULL);
87  return -1;
88  }
89  }
90  }
91 
93  za->entry[idx].changes = NULL;
94 
96 
97  return 0;
98 }
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_EXISTS
Definition: zip.h:115
#define ZIP_ER_INVAL
Definition: zip.h:123
#define ZIP_FL_UNCHANGED
Definition: zip.h:79
int idx
Definition: setup.py:197
zip_uint32_t changed
Definition: zipint.h:327
zip_dirent_t * orig
Definition: zipint.h:409
zip_dirent_t * changes
Definition: zipint.h:410
bool deleted
Definition: zipint.h:412
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_hash_t * names
Definition: zipint.h:300
void _zip_dirent_free(zip_dirent_t *zde)
Definition: zip_dirent.c:258
const char * _zip_get_name(zip_t *za, zip_uint64_t idx, zip_flags_t flags, zip_error_t *error)
Definition: zip_get_name.c:47
bool _zip_hash_delete(zip_hash_t *hash, const zip_uint8_t *name, zip_error_t *error)
Definition: zip_hash.c:264
bool _zip_hash_add(zip_hash_t *hash, const zip_uint8_t *name, zip_uint64_t index, zip_flags_t flags, zip_error_t *error)
Definition: zip_hash.c:205
zip_int64_t _zip_name_locate(zip_t *za, const char *fname, zip_flags_t flags, zip_error_t *error)
void _zip_unchange_data(zip_entry_t *ze)
uint64_t zip_uint64_t
Definition: zipconf.h:39
uint8_t zip_uint8_t
Definition: zipconf.h:33
int64_t zip_int64_t
Definition: zipconf.h:38
#define ZIP_DIRENT_FILENAME
Definition: zipint.h:317
zip_t * za
Definition: ziptool.c:79

References _zip_dirent_free(), _zip_get_name(), _zip_hash_add(), _zip_hash_delete(), _zip_name_locate(), _zip_unchange_data(), zip_dirent::changed, zip_entry::changes, zip_entry::deleted, zip::entry, zip::error, i, setup::idx, zip::names, zip::nentry, NULL, zip_entry::orig, za, ZIP_DIRENT_FILENAME, ZIP_ER_EXISTS, ZIP_ER_INVAL, zip_error_set(), and ZIP_FL_UNCHANGED.

Referenced by zip_delete(), zip_unchange(), and zip_unchange_all().

◆ zip_unchange()

ZIP_EXTERN int zip_unchange ( zip_t za,
zip_uint64_t  idx 
)

Definition at line 41 of file zip_unchange.c.

41  {
42  return _zip_unchange(za, idx, 0);
43 }
int _zip_unchange(zip_t *za, zip_uint64_t idx, int allow_duplicates)
Definition: zip_unchange.c:47

References _zip_unchange(), setup::idx, and za.

Referenced by unchange_one().