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

Go to the source code of this file.

Functions

ZIP_EXTERN int zip_file_set_comment (zip_t *za, zip_uint64_t idx, const char *comment, zip_uint16_t len, zip_flags_t flags)
 

Function Documentation

◆ zip_file_set_comment()

ZIP_EXTERN int zip_file_set_comment ( zip_t za,
zip_uint64_t  idx,
const char *  comment,
zip_uint16_t  len,
zip_flags_t  flags 
)

Definition at line 41 of file zip_file_set_comment.c.

41  {
42  zip_entry_t *e;
43  zip_string_t *cstr;
44  int changed;
45 
46  if (_zip_get_dirent(za, idx, 0, NULL) == NULL)
47  return -1;
48 
49  if (ZIP_IS_RDONLY(za)) {
51  return -1;
52  }
53 
54  if (len > 0 && comment == NULL) {
56  return -1;
57  }
58 
59  if (len > 0) {
60  if ((cstr = _zip_string_new((const zip_uint8_t *)comment, len, flags, &za->error)) == NULL)
61  return -1;
64  }
65  else
66  cstr = NULL;
67 
68  e = za->entry + idx;
69 
70  if (e->changes) {
71  _zip_string_free(e->changes->comment);
72  e->changes->comment = NULL;
73  e->changes->changed &= ~ZIP_DIRENT_COMMENT;
74  }
75 
76  if (e->orig && e->orig->comment)
77  changed = !_zip_string_equal(e->orig->comment, cstr);
78  else
79  changed = (cstr != NULL);
80 
81  if (changed) {
82  if (e->changes == NULL) {
83  if ((e->changes = _zip_dirent_clone(e->orig)) == NULL) {
85  _zip_string_free(cstr);
86  return -1;
87  }
88  }
89  e->changes->comment = cstr;
90  e->changes->changed |= ZIP_DIRENT_COMMENT;
91  }
92  else {
93  _zip_string_free(cstr);
94  if (e->changes && e->changes->changed == 0) {
95  _zip_dirent_free(e->changes);
96  e->changes = NULL;
97  }
98  }
99 
100  return 0;
101 }
size_t len
Definition: 6502dis.c:15
#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
#define ZIP_ER_MEMORY
Definition: zip.h:119
#define ZIP_FL_ENC_GUESS
Definition: zip.h:82
#define ZIP_ER_RDONLY
Definition: zip.h:130
#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
enum zip_encoding_type encoding
Definition: zipint.h:421
zip_error_t error
Definition: zipint.h:281
zip_entry_t * entry
Definition: zipint.h:294
zip_dirent_t * _zip_dirent_clone(const zip_dirent_t *sde)
Definition: zip_dirent.c:215
zip_dirent_t * _zip_get_dirent(zip_t *za, zip_uint64_t idx, zip_flags_t flags, zip_error_t *error)
Definition: zip_dirent.c:1064
void _zip_dirent_free(zip_dirent_t *zde)
Definition: zip_dirent.c:258
zip_string_t * _zip_string_new(const zip_uint8_t *raw, zip_uint16_t length, zip_flags_t flags, zip_error_t *error)
Definition: zip_string.c:121
void _zip_string_free(zip_string_t *s)
Definition: zip_string.c:69
int _zip_string_equal(const zip_string_t *a, const zip_string_t *b)
Definition: zip_string.c:55
zip_encoding_type_t _zip_guess_encoding(zip_string_t *str, zip_encoding_type_t expected_encoding)
Definition: zip_utf-8.c:100
uint8_t zip_uint8_t
Definition: zipconf.h:33
#define ZIP_IS_RDONLY(za)
Definition: zipint.h:479
#define ZIP_FL_ENCODING_ALL
Definition: zipint.h:249
#define ZIP_DIRENT_COMMENT
Definition: zipint.h:318
@ ZIP_ENCODING_UTF8_GUESSED
Definition: zipint.h:257
@ ZIP_ENCODING_UTF8_KNOWN
Definition: zipint.h:256
@ ZIP_ENCODING_UNKNOWN
Definition: zipint.h:254
zip_t * za
Definition: ziptool.c:79

References _zip_dirent_clone(), _zip_dirent_free(), _zip_get_dirent(), _zip_guess_encoding(), _zip_string_equal(), _zip_string_free(), _zip_string_new(), e, zip_string::encoding, zip::entry, zip::error, flags, setup::idx, len, NULL, za, ZIP_DIRENT_COMMENT, ZIP_ENCODING_UNKNOWN, ZIP_ENCODING_UTF8_GUESSED, ZIP_ENCODING_UTF8_KNOWN, ZIP_ER_INVAL, ZIP_ER_MEMORY, ZIP_ER_RDONLY, zip_error_set(), ZIP_FL_ENC_GUESS, ZIP_FL_ENCODING_ALL, and ZIP_IS_RDONLY.

Referenced by set_file_comment(), and zip_set_file_comment().